Annotation of ntddk/src/video/displays/vga/driver.h, revision 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.