xref: /reactos/win32ss/drivers/displays/vga/vgaddi.h (revision c2c66aff)
1 #ifndef _VGADDI_PCH_
2 #define _VGADDI_PCH_
3 
4 #define _WINBASE_
5 #define _WINDOWS_H
6 #include <stdarg.h>
7 #include <windef.h>
8 #include <wingdi.h>
9 #include <winddi.h>
10 #include <winioctl.h>
11 #include <ntddvdeo.h>
12 #include <ioaccess.h>
13 
14 #include "vgavideo/vgavideo.h"
15 
16 #ifndef NDEBUG
17 #define DPRINT DbgPrint
18 #else
19 #define DPRINT
20 #endif
21 #define DPRINT1 DbgPrint
22 
23 /* FIXME - what a headers mess.... */
24 
25 #define DDKFASTAPI __fastcall
26 #define FASTCALL __fastcall
27 
28 ULONG DbgPrint(PCCH Format,...);
29 
30 static __inline BOOLEAN
RemoveEntryList(IN PLIST_ENTRY Entry)31 RemoveEntryList(
32   IN PLIST_ENTRY  Entry)
33 {
34   PLIST_ENTRY OldFlink;
35   PLIST_ENTRY OldBlink;
36 
37   OldFlink = Entry->Flink;
38   OldBlink = Entry->Blink;
39   OldFlink->Blink = OldBlink;
40   OldBlink->Flink = OldFlink;
41   return (OldFlink == OldBlink);
42 }
43 
44 static __inline VOID
InsertHeadList(IN PLIST_ENTRY ListHead,IN PLIST_ENTRY Entry)45 InsertHeadList(
46   IN PLIST_ENTRY  ListHead,
47   IN PLIST_ENTRY  Entry)
48 {
49   PLIST_ENTRY OldFlink;
50   OldFlink = ListHead->Flink;
51   Entry->Flink = OldFlink;
52   Entry->Blink = ListHead;
53   OldFlink->Blink = Entry;
54   ListHead->Flink = Entry;
55 }
56 
57 static __inline VOID
InitializeListHead(IN PLIST_ENTRY ListHead)58 InitializeListHead(
59   IN PLIST_ENTRY  ListHead)
60 {
61   ListHead->Flink = ListHead->Blink = ListHead;
62 }
63 
64 /***********************************************************/
65 
66 #define DS_SOLIDBRUSH  0x00000001
67 #define DS_GREYBRUSH   0x00000002
68 #define DS_BRUSH       0x00000004
69 #define DS_DIB         0x00000008
70 
71 #define POW2(stride) (!((stride) & ((stride)-1)))   // TRUE if stride is power of 2
72 #define BROKEN_RASTERS(stride,cy) ((!(POW2(stride))) && ((stride*cy) > 0x10000))
73 
74 #define ENUM_RECT_LIMIT   50
75 
76 typedef struct _RECT_ENUM
77 {
78   ULONG c;
79   RECTL arcl[ENUM_RECT_LIMIT];
80 } RECT_ENUM;
81 
82 // Cursor coordinates
83 typedef struct  _XYPAIR
84 {
85   USHORT  x;
86   USHORT  y;
87 } XYPAIR;
88 
89 typedef struct _SAVED_SCREEN_BITS
90 {
91   BOOL Free;
92   DWORD Offset;
93   ULONG Size;
94   LIST_ENTRY ListEntry;
95 } SAVED_SCREEN_BITS, *PSAVED_SCREEN_BITS;
96 
97 // Cursor states
98 #define CURSOR_COLOR     0x00000004
99 #define CURSOR_HW        0x00000010
100 #define CURSOR_HW_ACTIVE 0x00000020
101 #define CURSOR_ANIMATE   0x00000040
102 
103 typedef struct _PDEV
104 {
105   ULONG fl; // driver flags
106 
107   // Handles
108   HANDLE KMDriver;
109   HDEV   GDIDevHandle;   // engine's handle to PDEV
110   HSURF  SurfHandle;     // engine's handle to surface
111   PVOID  AssociatedSurf; // associated surface
112 
113   // Cursor
114   XYPAIR xyHotSpot; // cursor hotspot
115 
116   // Pointer
117   PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // HW Pointer Attributes
118   PSAVED_SCREEN_BITS ImageBehindCursor;
119   ULONG   XorMaskStartOffset;         // Start offset of hardware pointer
120                                       //  XOR mask relative to AND mask for
121                                       //  passing to HW pointer
122   DWORD   PointerAttributes;          // Size of buffer allocated
123   DWORD   flPreallocSSBBufferInUse;   // True if preallocated saved screen
124                                       //  bits buffer is in use
125   PUCHAR  pjPreallocSSBBuffer;        // Pointer to preallocated saved screen
126                                       //  bits buffer, if there is one
127   ULONG   ulPreallocSSBSize;          // Size of preallocated saved screen
128                                       //  bits buffer
129   VIDEO_POINTER_CAPABILITIES PointerCapabilities; // HW pointer abilities
130   PUCHAR  pucDIB4ToVGAConvBuffer;     // DIB4->VGA conversion table buffer
131   PUCHAR  pucDIB4ToVGAConvTables;     // Pointer to DIB4->VGA conversion
132 
133   // Misc
134   ULONG  ModeNum;   // mode index for current VGA mode
135 
136   SIZEL  sizeSurf;  // displayed size of the surface
137   PBYTE  fbScreen;  // pointer to the frame buffer
138   RECTL  SavedBitsRight;  // invisible part right of screen
139   RECTL  SavedBitsBottom; // invisible part at the bottom of the screen
140   BOOL   BitsSaved;       // TRUE if bits are currently saved
141   SIZEL  sizeMem;         // actual size (in pixels) of video memory
142   LONG   NumScansUsedByPointer; // # scans of offscreen memory used by
143 
144 } PDEV, *PPDEV;
145 
146 typedef struct {
147   RECTL BankBounds; // Pixels addressable in this bank
148   ULONG BankOffset; // Offset of bank start from bitmap start if linearly addressable
149 } BANK_INFO, *PBANK_INFO;
150 
151 typedef enum {
152   JustifyTop = 0,
153   JustifyBottom,
154 } BANK_JUST;
155 
156 // bank control function vector
157 //typedef VOID (*PFN_BankControl)(PDEVSURF, ULONG, BANK_JUST);
158 typedef VOID (*PFN_BankControl)(PVOID, ULONG, BANK_JUST);
159 
160 // DEVSURF -- definition of a surface as seen and used by the various VGA
161 // drivers
162 
163 typedef struct _DEVSURF
164 {
165   IDENT ident;  // Identifier for debugging ease
166   ULONG flSurf; // DS_ flags as defined below
167   BYTE  Color;  // Solid color surface if DS_SOLIDBRUSH
168 
169 // If DS_SOLIDBRUSH, the following fields are undefined and not guaranteed to
170 // have been allocated!
171 
172   BYTE  Format;     // BMF_*, BMF_PHYSDEVICE
173   BYTE  jReserved1; // Reserved
174   BYTE  jReserved2; // Reserved
175   PPDEV ppdev;      // Pointer to associated PDEV
176   SIZEL sizeSurf;   // Size of the surface
177   ULONG NextScan;   // Offset from scan  "n" to "n+1"
178   ULONG NextPlane;  // Offset from plane "n" to "n+1"
179   PVOID Scan0;      // Pointer to scan 0 of bitmap
180                     // (actual address of start of bank, for banked VGA surface)
181   PVOID StartBmp;   // Pointer to start of bitmap
182   PVOID Conv;       // Pointer to DIB/Planer conversion buffer
183 
184 // Banking variables; used only for banked VGA surfaces
185 
186   PVIDEO_BANK_SELECT BankSelectInfo;
187   ULONG       Bank2RWSkip;            // Offset from one bank index to next to make two 32K banks appear to be
188                                       // one seamless 64K bank
189   PFN         pfnBankSwitchCode;
190   VIDEO_BANK_TYPE BankingType;
191   ULONG       BitmapSize;             // Length of bitmap if there were no banking, in CPU addressable bytes
192   ULONG PtrBankScan;       // Last scan line in pointer work bank
193   RECTL WindowClip1;       // Single-window banking clip rect
194   RECTL WindowClip2[2];    // Double-window banking clip rects for
195                            //  windows 0 & 1
196   ULONG WindowBank[2];     // Current banks mapped into windows
197                            //  0 & 1 (used in 2 window mode only)
198   PBANK_INFO  BankInfo;         // Pointer to array of bank clip info
199   ULONG       BankInfoLength;    // Length of pbiBankInfo, in entries
200   PBANK_INFO  BankInfo2RW;      // Same as above, but for 2RW window
201   ULONG       BankInfo2RWLength; // case
202   PFN_BankControl pfnBankControl;     // Pointer to bank control function
203   PFN_BankControl pfnBankControl2Window; // Pointer to double-window bank
204                                       //  control function
205   PVOID BitmapStart;   // Single-window bitmap start pointer (adjusted as
206                        // necessary to make window map in at proper offset)
207   PVOID BitmapStart2Window[2];   // Double-window window 0 and 1 bitmap start
208   PVOID BankBufferPlane0;        // Pointer to temp buffer capable of
209                                  // storing one full bank for plane 0 for 1
210                                  // R/W case; capable of storing  one full
211                                  // bank height of edge bytes for all four
212                                  // planes for the 1R/1W case. Also used to
213                                  // point to text building buffer in all
214                                  // cases. This is the pointer used to
215                                  // dealloc bank working storage for all
216                                  // four planes
217 
218   // The following 3 pointers used by 1 R/W banked devices
219   PVOID       BankBufferPlane1; // Like above, but for plane 1
220   PVOID       BankBufferPlane2; // Like above, but for plane 2
221   PVOID       BankBufferPlane3; // Like above, but for plane 3
222   ULONG       TempBufferSize;   // Full size of temp buffer pointed to
223                                 // by pvBankBufferPlane0
224 
225   ULONG       ajBits[1];           // Bits will start here for device bitmaps
226   PSAVED_SCREEN_BITS ssbList;      // Pointer to start of linked list of
227                                     //  saved screen bit blocks
228 } DEVSURF, *PDEVSURF;
229 
230 typedef VOID (*PFN_ScreenToScreenBlt)(PDEVSURF, PRECTL, PPOINTL, INT);
231 
232 // BMF_PHYSDEVICE format type
233 
234 #define BMF_PHYSDEVICE  0xFF
235 #define BMF_DFB         0xFE
236 
237 // Identifiers used in debugging (DEVSURF.ident)
238 
239 #define PDEV_IDENT      ('V' + ('P' << 8) + ('D' << 16) + ('V' << 24))
240 #define DEVSURF_IDENT   ('V' + ('S' << 8) + ('R' << 16) + ('F' << 24))
241 
242 BOOL InitVGA(PPDEV ppdev, BOOL bFirst); // screen.c: initialize VGA mode
243 BOOL DeinitVGA(PPDEV ppdev); // screen.c: Free resources allocated in InitVGA
244 
245 #define DRIVER_EXTRA_SIZE 0
246 #define ALLOC_TAG  'agvD' // Dvga tag
247 #define DLL_NAME  L"vga" // DLL name in Unicode
248 
249 #define MAX_SCAN_WIDTH              2048  // pixels
250 #define DRIVER_OFFSCREEN_REFRESHED  0x04L // if not set, don't use offscreen memory
251 #define PLANAR_PELS_PER_CPU_ADDRESS 8
252 #define PACKED_PELS_PER_CPU_ADDRESS 2
253 
254 BOOL VGAtoGDI(
255   SURFOBJ *Dest, SURFOBJ *Source, SURFOBJ *Mask, XLATEOBJ *ColorTranslation,
256   RECTL   *DestRect, POINTL *SourcePoint);
257 
258 VOID
259 VGADDI_BltFromSavedScreenBits(ULONG DestX,
260 			      ULONG DestY,
261 			      PSAVED_SCREEN_BITS Src,
262 			      ULONG SizeX,
263 			      ULONG SizeY);
264 VOID
265 VGADDI_BltToSavedScreenBits(PSAVED_SCREEN_BITS Dest,
266 			    ULONG SourceX,
267 			    ULONG SourceY,
268 			    ULONG SizeX,
269 			    ULONG SizeY);
270 VOID
271 VGADDI_FreeSavedScreenBits(PSAVED_SCREEN_BITS SavedBits);
272 PSAVED_SCREEN_BITS
273 VGADDI_AllocSavedScreenBits(ULONG Size);
274 VOID
275 VGADDI_InitializeOffScreenMem(ULONG Start, ULONG Length);
276 
277 BOOL InitPointer(PPDEV ppdev);
278 DWORD getAvailableModes(HANDLE Driver,
279                         PVIDEO_MODE_INFORMATION *modeInformation,
280                         DWORD *ModeSize);
281 
282 VOID FASTCALL
283 vgaReadScan(int x, int y, int w, void *b);
284 
285 VOID FASTCALL
286 vgaWriteScan(int x, int y, int w, void *b);
287 
288 #endif /* _VGADDI_PCH_ */
289