Annotation of ntddk/src/video/displays/vga/driver.h, revision 1.1.1.1

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: driver.h
                      3: *
                      4: * driver prototypes
                      5: *
                      6: * Copyright (c) 1992 Microsoft Corporation
                      7: \**************************************************************************/
                      8: 
                      9: #include "stddef.h"
                     10: #include "windows.h"
                     11: #include "winddi.h"
                     12: #include <devioctl.h>
                     13: #include <ntddvdeo.h>
                     14: 
                     15: #include "debug.h"
                     16: 
                     17: #include "brush.h"
                     18: /* gflDrv */
                     19: 
                     20: #define DRV_ENABLED_ONCE        0x00000001
                     21: #define DRV_ENABLED_PDEV        0x00000002
                     22: 
                     23: // # of bytes at end of display memory required for the pointer work and save
                     24: // areas
                     25: 
                     26: //BUGBUG  not really sure about these
                     27: #define POINTER_WORK_AREA_SIZE   1024
                     28: #define POINTER_SAVE_AREA_SIZE   256
                     29: 
                     30: #define MIN_TEMP_BUFFER_SIZE    0x4000  // Minimum size of buffer used to
                     31:                                         //  build text (may be bigger because
                     32:                                         //  it's shared with blt buffer)
                     33: 
                     34: // Space required for working storage when working with banking on adapters
                     35: // that support only one window, with no independent read and write bank
                     36: // selection. The largest supported bank is 64K; this constant provides for
                     37: // storing four 64K planes.
                     38: 
                     39: #define BANK_BUFFER_PLANE_SIZE  0x10000
                     40: #define BANK_BUFFER_SIZE_1RW    (((ULONG)BANK_BUFFER_PLANE_SIZE)*4)
                     41: #define PLANE_0_OFFSET          0
                     42: #define PLANE_1_OFFSET          BANK_BUFFER_PLANE_SIZE
                     43: #define PLANE_2_OFFSET          (BANK_BUFFER_PLANE_SIZE*2)
                     44: #define PLANE_3_OFFSET          (BANK_BUFFER_PLANE_SIZE*3)
                     45: 
                     46: // Space required for working storage when working with banking on adapters
                     47: // that support one readable window and one writable window, but not two
                     48: // independently read/write addressable windows. This is space for storing
                     49: // one bank's worth of edge words for each of four planes, or for the text
                     50: // building buffer, whichever is larger.
                     51: 
                     52: #define BANK_MAX_HEIGHT 512     // tallest supported bank
                     53: #define BANK_BUFFER_SIZE_1R1W   (max((((ULONG)BANK_MAX_HEIGHT)*4*2), \
                     54:                                     MIN_TEMP_BUFFER_SIZE))
                     55: 
                     56: // On a 2RW or unbanked adapter, just make space for the text building buffer.
                     57: #define BANK_BUFFER_SIZE_UNBANKED MIN_TEMP_BUFFER_SIZE
                     58: #define BANK_BUFFER_SIZE_2RW      MIN_TEMP_BUFFER_SIZE
                     59: 
                     60: // Amount of space to reserve for saved screen bits buffer preallocated at
                     61: // EnablePDEV time, so we usually won't have to allocate and deallocate the
                     62: // memory. 36K should be big enough for most menus (not 32K because the big
                     63: // system menu on consoles is just slightly larger than 32K).
                     64: #define PREALLOC_SSB_SIZE   0x10000
                     65: 
                     66: /* This device can have only one PDEV */
                     67: 
                     68: #define DRV_ONE_PDEV    1
                     69: 
                     70: 
                     71: //
                     72: // Sizes assumed for 1-window and 2 RW-window banks.
                     73: //
                     74: #define BANK_SIZE_1_WINDOW      0x10000
                     75: #define BANK_SIZE_2RW_WINDOW    0x08000
                     76: 
                     77: //
                     78: // The following value allows us to set rounding for cursor exclusion.
                     79: //
                     80: 
                     81: #define POINTER_ROUNDING_SIZE 8
                     82: 
                     83: #define POINTER_ROUND (POINTER_ROUNDING_SIZE - 1)
                     84: #define POINTER_MASK  (-POINTER_ROUNDING_SIZE)
                     85: 
                     86: //
                     87: // Determines the size of the DriverExtra information in the DEVMODE
                     88: // structure passed to and from the display driver.
                     89: //
                     90: 
                     91: #define DRIVER_EXTRA_SIZE 0
                     92: 
                     93: //
                     94: // Miscellaneous driver flags in pdev.fl
                     95: // Must be mirrored in i386\driver.inc
                     96: //
                     97: 
                     98: #define DRIVER_USE_OFFSCREEN    0x02L  // if not set, don't use offscreen memory
                     99: 
                    100: //
                    101: // General Rectangle Enumeration structure
                    102: //
                    103: 
                    104: #define ENUM_RECT_LIMIT   50
                    105: 
                    106: typedef struct _RECT_ENUM
                    107: {
                    108:     ULONG   c;
                    109:     RECTL   arcl[ENUM_RECT_LIMIT];
                    110: } RECT_ENUM;
                    111: 
                    112: 
                    113: /**************************************************************************\
                    114: *
                    115: * Descriptor for a saved screen bits block
                    116: *
                    117: \**************************************************************************/
                    118: 
                    119: typedef struct  _SAVED_SCREEN_BITS
                    120: {
                    121:     BOOL  bFlags;
                    122:     PBYTE pjBuffer;  // pointer to save buffer start
                    123:     ULONG ulSize;    // size of save buffer (per plane; display memory only)
                    124:     ULONG ulSaveWidthInBytes; // # of bytes across save area (including
                    125:                               //  partial edge bytes, if any)
                    126:     ULONG ulDelta;   // # of bytes from end of one saved scan's saved bits to
                    127:                      //  start of next (system memory only)
                    128:     PVOID pvNextSSB; // pointer to next saved screen bits block
                    129:                      // for system memory blocks, saved bits start immediately
                    130:                      //  after this structure
                    131: } SAVED_SCREEN_BITS, *PSAVED_SCREEN_BITS;
                    132: #define SSB_IN_ADAPTER_MEMORY   0x01    // true if block saved in adapter mem
                    133: #define SSB_IN_PREALLOC_BUFFER  0x02    // true if block saved in preallocated
                    134:                                         //  buffer
                    135: 
                    136: /**************************************************************************\
                    137: *
                    138: * Bank clipping info
                    139: *
                    140: \**************************************************************************/
                    141: 
                    142: typedef struct {
                    143:     RECTL rclBankBounds;    // describes pixels addressable in this bank
                    144:     ULONG ulBankOffset;     // offset of bank start from bitmap start, if
                    145:                             // the bitmap were linearly addressable
                    146: } BANK_INFO, *PBANK_INFO;
                    147: 
                    148: 
                    149: /**************************************************************************\
                    150: *
                    151: * Bank control function vector
                    152: *
                    153: \**************************************************************************/
                    154: 
                    155: typedef VOID (*PFN_BankControl)(PDEVSURF, ULONG, BANK_JUST);
                    156: 
                    157: 
                    158: /**************************************************************************\
                    159: *
                    160: * Physical device description block
                    161: *
                    162: \**************************************************************************/
                    163: 
                    164: #define CURSOR_DOWN      0x00000001
                    165: #define CURSOR_COLOR     0x00000004
                    166: #define CURSOR_HW        0x00000010
                    167: #define CURSOR_HW_ACTIVE 0x00000020
                    168: #define CURSOR_ANIMATE   0x00000040
                    169: 
                    170: // The XYPAIR structure is used to allow ATOMIC read/write of the cursor
                    171: // position.  NEVER, NEVER, NEVER get or set the cursor position without
                    172: // doing this.  There is no semaphore protection of this data structure,
                    173: // nor will there ever be any. [donalds]
                    174: 
                    175: typedef struct  _XYPAIR
                    176: {
                    177:     USHORT  x;
                    178:     USHORT  y;
                    179: } XYPAIR;
                    180: 
                    181: // Must be mirrored in i386\strucs.inc
                    182: 
                    183: typedef struct  _PDEV
                    184: {
                    185:     FLONG   fl;                         // Driver flags (DRIVER_xxx)
                    186:     IDENT   ident;                      // Identifier
                    187:     HANDLE  hDriver;                    // Handle to the miniport
                    188:     HDEV    hdevEng;                    // Engine's handle to PDEV
                    189:     HSURF   hsurfEng;                   // Engine's handle to surface
                    190:     PVOID   pdsurf;                     // Associated surface
                    191:     SIZEL   sizlSurf;                   // Displayed size of the surface
                    192:     DWORD   ulIs386;                    // 1 if 386, 0 if 486 or higher
                    193:     PBYTE   pjScreen;                   // Pointer to the frame buffer base
                    194:     XYPAIR  xyCursor;                   // Where the cursor should be
                    195:     POINTL  ptlExtent;                  // Cursor extent
                    196:     ULONG   cExtent;                    // Effective cursor extent.
                    197:     XYPAIR  xyHotSpot;                  // Cursor hot spot
                    198:     FLONG   flCursor;                   // Cursor status
                    199:     DEVINFO devinfo;                    // Device info
                    200:     HBITMAP ahbmPat[HS_DDI_MAX];        // Engine handles to standard patterns
                    201:     GDIINFO GdiInfo;                    // Device capabilities
                    202:     ULONG   ulModeNum;                  // Mode index for current VGA mode
                    203:     PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // HW Pointer Attributes
                    204:     ULONG   XorMaskStartOffset;         // Start offset of hardware pointer
                    205:                                         //  XOR mask relative to AND mask for
                    206:                                         //  passing to HW pointer
                    207:     DWORD   cjPointerAttributes;        // Size of buffer allocated
                    208:     DWORD   flPreallocSSBBufferInUse;   // True if preallocated saved screen
                    209:                                         //  bits buffer is in use
                    210:     PUCHAR  pjPreallocSSBBuffer;        // Pointer to preallocated saved screen
                    211:                                         //  bits buffer, if there is one
                    212:     ULONG   ulPreallocSSBSize;          // Size of preallocated saved screen
                    213:                                         //  bits buffer
                    214:     VIDEO_POINTER_CAPABILITIES PointerCapabilities; // HW pointer abilities
                    215:     PUCHAR  pucDIB4ToVGAConvBuffer;     // Pointer to DIB4->VGA conversion
                    216:                                         //  table buffer
                    217:     PUCHAR  pucDIB4ToVGAConvTables;     // Pointer to DIB4->VGA conversion
                    218:                                         //  table start in buffer (must be on a
                    219:                                         //  256-byte boundary)
                    220: } PDEV, *PPDEV;
                    221: 
                    222: 
                    223: /**************************************************************************\
                    224: *
                    225: * Specifies desired justification for requestion scan line within bank window
                    226: *
                    227: \**************************************************************************/
                    228: 
                    229: typedef enum {
                    230:     JustifyTop = 0,
                    231:     JustifyBottom,
                    232: } BANK_JUST;
                    233: 
                    234: 
                    235: /**************************************************************************\
                    236: *
                    237: * Specifies which window is to be mapped by two-window bank handler.
                    238: *
                    239: \**************************************************************************/
                    240: 
                    241: typedef enum {
                    242:     MapSourceBank = 0,
                    243:     MapDestBank,
                    244: } BANK_JUST;
                    245: 
                    246: 
                    247: /**************************************************************************\
                    248: *
                    249: * Definition of a surface as seen and used by the various VGA drivers
                    250: *
                    251: \**************************************************************************/
                    252: 
                    253: // Must be mirrored in i386\strucs.inc
                    254: 
                    255: typedef struct _DEVSURF                 /* dsurf */
                    256: {
                    257:     IDENT       ident;                  // Identifier for debugging ease
                    258:     ULONG       flSurf;                 // DS_ flags as defined below
                    259:     BYTE        iColor;                 // Solid color surface if DS_SOLIDBRUSH
                    260: 
                    261: // If DS_SOLIDBRUSH, the following fields are undefined and not guaranteed to
                    262: // have been allocated!
                    263: 
                    264:     BYTE        iFormat;                // BMF_*, BMF_PHYSDEVICE
                    265:     BYTE        jReserved1;             // Reserved
                    266:     BYTE        jReserved2;             // Reserved
                    267:     PPDEV       ppdev;                  // Pointer to associated PDEV
                    268:     SIZEL       sizlSurf;               // Size of the surface
                    269:     SIZE_T      lNextScan;              // Offset from scan  "n" to "n+1"
                    270:     SIZE_T      lNextPlane;             // Offset from plane "n" to "n+1"
                    271:     PVOID       pvScan0;                // Pointer to scan 0 of bitmap
                    272:                                         //  (actual address of start of bank,
                    273:                                         //  for banked VGA surface)
                    274:     PVOID       pvStart;                // Pointer to start of bitmap
                    275:     PVOID       pvConv;                 // Pointer to DIB/Planer conversion buffer
                    276:                                         // Banking variables; used only for
                    277:                                         //  banked VGA surfaces
                    278:     PVIDEO_BANK_SELECT pBankSelectInfo; // Pointer to bank select info
                    279:                                         //  returned by miniport
                    280:     ULONG       ulBank2RWSkip;          // Offset from one bank index to next
                    281:                                         //  to make two 32K banks appear to be
                    282:                                         //  one seamless 64K bank
                    283:     PFN         pfnBankSwitchCode;      // Pointer to bank switch code
                    284:     VIDEO_BANK_TYPE vbtBankingType;     // Type of banking
                    285:     ULONG       ulBitmapSize;           // Length of bitmap if there were no
                    286:                                         //  banking, in CPU addressable bytes
                    287:     ULONG       ulPtrBankScan;          // Last scan line in pointer work bank
                    288:     RECTL       rcl1WindowClip;         // Single-window banking clip rect
                    289:     RECTL       rcl2WindowClip[2];      // Double-window banking clip rects for
                    290:                                         //  windows 0 & 1
                    291:     ULONG       ulWindowBank[2];        // Current banks mapped into windows
                    292:                                         //  0 & 1 (used in 2 window mode only)
                    293:     PBANK_INFO  pbiBankInfo;            // Pointer to array of bank clip info
                    294:     ULONG       ulBankInfoLength;       // Length of pbiBankInfo, in entries
                    295:     PBANK_INFO  pbiBankInfo2RW;         // Same as above, but for 2RW window
                    296:     ULONG       ulBankInfo2RWLength;    // case
                    297:     PFN_BankControl pfnBankControl;     // Pointer to bank control function
                    298:     PFN_BankControl pfnBankControl2Window; // Pointer to double-window bank
                    299:                                         //  control function
                    300:     PVOID       pvBitmapStart;          // Single-window bitmap start pointer
                    301:                                         //  (adjusted as necessary to make
                    302:                                         //  window map in at proper offset)
                    303:     PVOID       pvBitmapStart2Window[2]; // Double-window window 0 and 1 bitmap
                    304:                                          // start
                    305:     PVOID       pvBankBufferPlane0;     // Pointer to temp buffer capable of
                    306:                                         //  storing one full bank for plane 0
                    307:                                         //  for 1 R/W case; capable of storing
                    308:                                         //  one full bank height of edge bytes
                    309:                                         //  for all four planes for the 1R/1W
                    310:                                         //  case. Also used to point to text
                    311:                                         //  building buffer in all cases
                    312:                                         // This is the pointer used to dealloc
                    313:                                         //  bank working storage for all four
                    314:                                         //  planes
                    315:                                         // The following 3 pointers used by
                    316:                                         //  1 R/W banked devices
                    317:     PVOID       pvBankBufferPlane1;     // Like above, but for plane 1
                    318:     PVOID       pvBankBufferPlane2;     // Like above, but for plane 2
                    319:     PVOID       pvBankBufferPlane3;     // Like above, but for plane 3
                    320:     ULONG       ulTempBufferSize;       // Full size of temp buffer pointed to
                    321:                                         //  by pvBankBufferPlane0
                    322: 
                    323:     ULONG       ajBits[1];              // Bits will start here for device bitmaps
                    324:     PSAVED_SCREEN_BITS ssbList;         // Pointer to start of linked list of
                    325:                                         //  saved screen bit blocks
                    326:     PBYTE       pjAdapterHeapStart;     // First byte of display memory
                    327:                                         //  available for temporary storage
                    328:     PBYTE       pjAdapterHeapEnd;       // Last byte of display memory
                    329:                                         //  available for temporary storage
                    330:     PBYTE       pjAdapterHeapTop;       // Last byte of display memory
                    331:                                         // currently available for temporary
                    332:                                         // storage
                    333: } DEVSURF, * PDEVSURF;
                    334: 
                    335: 
                    336: // Identifier stored in ds.ident for debugging
                    337: 
                    338: #define PDEV_IDENT      ('V' + ('P' << 8) + ('D' << 16) + ('V' << 24))
                    339: #define DEVSURF_IDENT   ('V' + ('S' << 8) + ('R' << 16) + ('F' << 24))
                    340: 
                    341: 
                    342: // Definition of the BMF_PHYSDEVICE format type
                    343: 
                    344: #define BMF_PHYSDEVICE  0xFF
                    345: 
                    346: 
                    347: // Flags for flSurf
                    348: 
                    349: #define DS_SOLIDBRUSH   0x00000001      // Surface is a solid color representing a brush
                    350: #define DS_GREYBRUSH    0x00000002      // Surface is a grey color representing a brush
                    351: #define DS_BRUSH        0x00000004      // Surface is a brush
                    352: #define DS_DIB          0x00000008      // Surface is supporting an Engine DIB
                    353: 
                    354: /**************************************************************************\
                    355: *
                    356: * Function prototypes shared by all C files.
                    357: *
                    358: \**************************************************************************/
                    359: 
                    360: 
                    361: VOID vInitRegs(void);
                    362: BOOL bInitVGA(PPDEV, BOOL);
                    363: BOOL bInitPDEV(PPDEV, DEVMODEW *, GDIINFO *, DEVINFO *);
                    364: 
                    365: DWORD getAvailableModes(HANDLE, PVIDEO_MODE_INFORMATION *, DWORD *);
                    366: typedef VOID (*PFN_ScreenToScreenBlt)(PDEVSURF, PRECTL, PPOINTL, INT);
                    367: 
                    368: VOID vDIB2VGA( DEVSURF * pdsurfDst, DEVSURF * pdsurfSrc,
                    369:               RECTL * prclDst, POINTL * pptlSrc, UCHAR * pucConv);
                    370: BOOL DrvIntersectRect(PRECTL prcDst, PRECTL prcSrc1, PRECTL prcSrc2);
                    371: FLONG flClipRect(PRECTL,PRECTL,PRECTL);
                    372: VOID vMonoPatBlt(PDEVSURF,ULONG,PRECTL,MIX, BRUSHINST *,PPOINTL);
                    373: VOID vClrPatBlt(PDEVSURF,ULONG,PRECTL,MIX, BRUSHINST *,PPOINTL);
                    374: VOID vTrgBlt(PDEVSURF,ULONG,PRECTL,MIX,ULONG);
                    375: VOID vAlignedSrcCopy(PDEVSURF,PRECTL,PPOINTL,INT);
                    376: VOID vNonAlignedSrcCopy(PDEVSURF,PRECTL,PPOINTL,INT);
                    377: VOID vDibToDev(PDEVSURF pdsurf, SURFOBJ *pso, PVOID pvConv);
                    378: VOID vConvertVGA2DIB(PDEVSURF, LONG, LONG, VOID *, LONG, LONG, ULONG, ULONG,
                    379:     LONG, ULONG, ULONG *);
                    380: BOOL SimCopyBits(SURFOBJ *psoTrg, SURFOBJ *psoSrc, CLIPOBJ *pco,
                    381:                  XLATEOBJ *pxlo, PRECTL prclTrg, PPOINTL pptlSrc);
                    382: VOID vConvertVGA2DIB(PDEVSURF, LONG, LONG, VOID *, LONG, LONG, ULONG, ULONG, LONG,
                    383:     ULONG, ULONG *);
                    384: BOOL bRleBlt(SURFOBJ *,SURFOBJ *, CLIPOBJ *, XLATEOBJ *, RECTL *, POINTL *);
                    385: VOID vSetDIB4ToVGATables(UCHAR *);
                    386: BOOL DrvFillPath (SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, BRUSHOBJ *pbo,
                    387:     POINTL *pptlBrush, MIX mix, FLONG flOptions);
                    388: VOID vClearMemDword(ULONG * pulBuffer, ULONG ulDwordCount);
                    389: VOID vForceBank0(PPDEV ppdev);
                    390: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.