xref: /plan9/sys/src/9/pc/screen.h (revision 1ee3cffaa7e3c1b699746f1d489ecd9b6a7d4d76)
17dd7cddfSDavid du Colombier typedef struct Cursor Cursor;
27dd7cddfSDavid du Colombier typedef struct Cursorinfo Cursorinfo;
37dd7cddfSDavid du Colombier struct Cursorinfo {
47dd7cddfSDavid du Colombier 	Cursor;
57dd7cddfSDavid du Colombier 	Lock;
67dd7cddfSDavid du Colombier };
7219b2ee8SDavid du Colombier 
87dd7cddfSDavid du Colombier /* devmouse.c */
99a747e4fSDavid du Colombier extern void mousetrack(int, int, int, int);
107dd7cddfSDavid du Colombier extern Point mousexy(void);
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier extern void mouseaccelerate(int);
137dd7cddfSDavid du Colombier extern int m3mouseputc(Queue*, int);
14aa46331bSDavid du Colombier extern int m5mouseputc(Queue*, int);
157dd7cddfSDavid du Colombier extern int mouseputc(Queue*, int);
167dd7cddfSDavid du Colombier 
177dd7cddfSDavid du Colombier extern Cursorinfo cursor;
187dd7cddfSDavid du Colombier extern Cursor arrow;
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier /*
217dd7cddfSDavid du Colombier  * Generic VGA registers.
227dd7cddfSDavid du Colombier  */
237dd7cddfSDavid du Colombier enum {
247dd7cddfSDavid du Colombier 	MiscW		= 0x03C2,	/* Miscellaneous Output (W) */
257dd7cddfSDavid du Colombier 	MiscR		= 0x03CC,	/* Miscellaneous Output (R) */
267dd7cddfSDavid du Colombier 	Status0		= 0x03C2,	/* Input status 0 (R) */
277dd7cddfSDavid du Colombier 	Status1		= 0x03DA,	/* Input Status 1 (R) */
287dd7cddfSDavid du Colombier 	FeatureR	= 0x03CA,	/* Feature Control (R) */
297dd7cddfSDavid du Colombier 	FeatureW	= 0x03DA,	/* Feature Control (W) */
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier 	Seqx		= 0x03C4,	/* Sequencer Index, Data at Seqx+1 */
327dd7cddfSDavid du Colombier 	Crtx		= 0x03D4,	/* CRT Controller Index, Data at Crtx+1 */
337dd7cddfSDavid du Colombier 	Grx		= 0x03CE,	/* Graphics Controller Index, Data at Grx+1 */
347dd7cddfSDavid du Colombier 	Attrx		= 0x03C0,	/* Attribute Controller Index and Data */
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier 	PaddrW		= 0x03C8,	/* Palette Address Register, write */
377dd7cddfSDavid du Colombier 	Pdata		= 0x03C9,	/* Palette Data Register */
387dd7cddfSDavid du Colombier 	Pixmask		= 0x03C6,	/* Pixel Mask Register */
397dd7cddfSDavid du Colombier 	PaddrR		= 0x03C7,	/* Palette Address Register, read */
407dd7cddfSDavid du Colombier 	Pstatus		= 0x03C7,	/* DAC Status (RO) */
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier 	Pcolours	= 256,		/* Palette */
437dd7cddfSDavid du Colombier 	Pred		= 0,
447dd7cddfSDavid du Colombier 	Pgreen		= 1,
457dd7cddfSDavid du Colombier 	Pblue		= 2,
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier 	Pblack		= 0x00,
487dd7cddfSDavid du Colombier 	Pwhite		= 0xFF,
497dd7cddfSDavid du Colombier };
507dd7cddfSDavid du Colombier 
516a9fc400SDavid du Colombier #define VGAMEM()	0xA0000
527dd7cddfSDavid du Colombier #define vgai(port)		inb(port)
537dd7cddfSDavid du Colombier #define vgao(port, data)	outb(port, data)
547dd7cddfSDavid du Colombier 
557dd7cddfSDavid du Colombier extern int vgaxi(long, uchar);
567dd7cddfSDavid du Colombier extern int vgaxo(long, uchar, uchar);
577dd7cddfSDavid du Colombier 
587dd7cddfSDavid du Colombier /*
597dd7cddfSDavid du Colombier  */
607dd7cddfSDavid du Colombier typedef struct VGAdev VGAdev;
617dd7cddfSDavid du Colombier typedef struct VGAcur VGAcur;
627dd7cddfSDavid du Colombier typedef struct VGAscr VGAscr;
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier struct VGAdev {
657dd7cddfSDavid du Colombier 	char*	name;
667dd7cddfSDavid du Colombier 
677dd7cddfSDavid du Colombier 	void	(*enable)(VGAscr*);
687dd7cddfSDavid du Colombier 	void	(*disable)(VGAscr*);
697dd7cddfSDavid du Colombier 	void	(*page)(VGAscr*, int);
704de34a7eSDavid du Colombier 	void	(*linear)(VGAscr*, int, int);
717dd7cddfSDavid du Colombier 	void	(*drawinit)(VGAscr*);
727dd7cddfSDavid du Colombier 	int	(*fill)(VGAscr*, Rectangle, ulong);
739a747e4fSDavid du Colombier 	void	(*ovlctl)(VGAscr*, Chan*, void*, int);
749a747e4fSDavid du Colombier 	int	(*ovlwrite)(VGAscr*, void*, int, vlong);
759a747e4fSDavid du Colombier 	void (*flush)(VGAscr*, Rectangle);
767dd7cddfSDavid du Colombier };
777dd7cddfSDavid du Colombier 
787dd7cddfSDavid du Colombier struct VGAcur {
797dd7cddfSDavid du Colombier 	char*	name;
807dd7cddfSDavid du Colombier 
817dd7cddfSDavid du Colombier 	void	(*enable)(VGAscr*);
827dd7cddfSDavid du Colombier 	void	(*disable)(VGAscr*);
837dd7cddfSDavid du Colombier 	void	(*load)(VGAscr*, Cursor*);
847dd7cddfSDavid du Colombier 	int	(*move)(VGAscr*, Point);
857dd7cddfSDavid du Colombier 
867dd7cddfSDavid du Colombier 	int	doespanning;
877dd7cddfSDavid du Colombier };
887dd7cddfSDavid du Colombier 
897dd7cddfSDavid du Colombier /*
907dd7cddfSDavid du Colombier  */
917dd7cddfSDavid du Colombier struct VGAscr {
927dd7cddfSDavid du Colombier 	Lock	devlock;
937dd7cddfSDavid du Colombier 	VGAdev*	dev;
944de34a7eSDavid du Colombier 	Pcidev*	pci;
957dd7cddfSDavid du Colombier 
967dd7cddfSDavid du Colombier 	VGAcur*	cur;
977dd7cddfSDavid du Colombier 	ulong	storage;
987dd7cddfSDavid du Colombier 	Cursor;
997dd7cddfSDavid du Colombier 
1007dd7cddfSDavid du Colombier 	int	useflush;
1017dd7cddfSDavid du Colombier 
1024de34a7eSDavid du Colombier 	ulong	paddr;		/* frame buffer */
1034de34a7eSDavid du Colombier 	void*	vaddr;
1047dd7cddfSDavid du Colombier 	int		apsize;
1057dd7cddfSDavid du Colombier 
1067dd7cddfSDavid du Colombier 	ulong	io;				/* device specific registers */
1074de34a7eSDavid du Colombier 	ulong	*mmio;
1087dd7cddfSDavid du Colombier 
1097dd7cddfSDavid du Colombier 	ulong	colormap[Pcolours][3];
1107dd7cddfSDavid du Colombier 	int	palettedepth;
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier 	Memimage* gscreen;
1137dd7cddfSDavid du Colombier 	Memdata* gscreendata;
1147dd7cddfSDavid du Colombier 	Memsubfont* memdefont;
1157dd7cddfSDavid du Colombier 
1167dd7cddfSDavid du Colombier 	int	(*fill)(VGAscr*, Rectangle, ulong);
1177dd7cddfSDavid du Colombier 	int	(*scroll)(VGAscr*, Rectangle, Rectangle);
1187dd7cddfSDavid du Colombier 	void	(*blank)(VGAscr*, int);
1197dd7cddfSDavid du Colombier 	ulong	id;	/* internal identifier for driver use */
1206a9fc400SDavid du Colombier 	int isblank;
121fb7f0c93SDavid du Colombier 	int overlayinit;
1227dd7cddfSDavid du Colombier };
1237dd7cddfSDavid du Colombier 
1247dd7cddfSDavid du Colombier extern VGAscr vgascreen[];
1257dd7cddfSDavid du Colombier 
1267dd7cddfSDavid du Colombier enum {
1277dd7cddfSDavid du Colombier 	Backgnd		= 0,	/* black */
1287dd7cddfSDavid du Colombier };
1297dd7cddfSDavid du Colombier 
1307dd7cddfSDavid du Colombier /* mouse.c */
1319a747e4fSDavid du Colombier extern void mousectl(Cmdbuf*);
1324de34a7eSDavid du Colombier extern void mouseresize(void);
1337dd7cddfSDavid du Colombier 
1347dd7cddfSDavid du Colombier /* screen.c */
1357dd7cddfSDavid du Colombier extern int		hwaccel;	/* use hw acceleration; default on */
1367dd7cddfSDavid du Colombier extern int		hwblank;	/* use hw blanking; default on */
1379a747e4fSDavid du Colombier extern int		panning;	/* use virtual screen panning; default off */
1389a747e4fSDavid du Colombier extern void addvgaseg(char*, ulong, ulong);
1399a747e4fSDavid du Colombier extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*);
1407dd7cddfSDavid du Colombier extern void	flushmemscreen(Rectangle);
1417dd7cddfSDavid du Colombier extern int	cursoron(int);
1427dd7cddfSDavid du Colombier extern void	cursoroff(int);
143219b2ee8SDavid du Colombier extern void	setcursor(Cursor*);
1447dd7cddfSDavid du Colombier extern int	screensize(int, int, int, ulong);
1457dd7cddfSDavid du Colombier extern int	screenaperture(int, int);
1467dd7cddfSDavid du Colombier extern Rectangle physgscreenr;	/* actual monitor size */
1477dd7cddfSDavid du Colombier extern void	blankscreen(int);
1487dd7cddfSDavid du Colombier 
1494de34a7eSDavid du Colombier extern VGAcur swcursor;
1504de34a7eSDavid du Colombier extern void swcursorinit(void);
1514de34a7eSDavid du Colombier extern void swcursorhide(void);
1524de34a7eSDavid du Colombier extern void swcursoravoid(Rectangle);
1534de34a7eSDavid du Colombier extern void swcursorunhide(void);
1544de34a7eSDavid du Colombier 
1557dd7cddfSDavid du Colombier /* devdraw.c */
1567dd7cddfSDavid du Colombier extern void	deletescreenimage(void);
1574de34a7eSDavid du Colombier extern void	resetscreenimage(void);
1587dd7cddfSDavid du Colombier extern int		drawhasclients(void);
1597dd7cddfSDavid du Colombier extern ulong	blanktime;
1609a747e4fSDavid du Colombier extern void	setscreenimageclipr(Rectangle);
1619a747e4fSDavid du Colombier extern void	drawflush(void);
1626a9fc400SDavid du Colombier extern int drawidletime(void);
1634de34a7eSDavid du Colombier extern QLock	drawlock;
1647dd7cddfSDavid du Colombier 
1657dd7cddfSDavid du Colombier /* vga.c */
1667dd7cddfSDavid du Colombier extern void	vgascreenwin(VGAscr*);
1677dd7cddfSDavid du Colombier extern void	vgaimageinit(ulong);
1684de34a7eSDavid du Colombier extern void	vgalinearpciid(VGAscr*, int, int);
1694de34a7eSDavid du Colombier extern void	vgalinearpci(VGAscr*);
1704de34a7eSDavid du Colombier extern void	vgalinearaddr(VGAscr*, ulong, int);
1717dd7cddfSDavid du Colombier 
1727dd7cddfSDavid du Colombier extern void	drawblankscreen(int);
1737dd7cddfSDavid du Colombier extern void	vgablank(VGAscr*, int);
1744de34a7eSDavid du Colombier 
1754de34a7eSDavid du Colombier extern Lock	vgascreenlock;
1764de34a7eSDavid du Colombier 
177*1ee3cffaSDavid du Colombier #define ishwimage(i)	(vgascreen[0].gscreendata && (i)->data->bdata == vgascreen[0].gscreendata->bdata)
178