Annotation of ntddk/src/video/displays/vga256/driver.h, revision 1.1

1.1     ! root        1: /******************************Module*Header*******************************\
        !             2: * Module Name: driver.h
        !             3: *
        !             4: * Contains prototypes for the 256 colour VGA driver.
        !             5: *
        !             6: * NOTE: Must mirror driver.inc!
        !             7: *
        !             8: * Copyright (c) 1992 Microsoft Corporation
        !             9: \**************************************************************************/
        !            10: 
        !            11: #ifndef _DRIVER_
        !            12: #define _DRIVER_
        !            13: 
        !            14: #include "stdlib.h"
        !            15: #include "stddef.h"
        !            16: #include "windows.h"
        !            17: #include "winddi.h"
        !            18: #include "devioctl.h"
        !            19: #include "ntddvdeo.h"
        !            20: 
        !            21: #include "debug.h"
        !            22: 
        !            23: typedef struct _PDEV PDEV, *PPDEV;
        !            24: 
        !            25: //
        !            26: // Sizes assumed for 1-window and 2 RW-window banks.
        !            27: //
        !            28: 
        !            29: #define BANK_SIZE_1_WINDOW      0x10000L
        !            30: #define BANK_SIZE_2RW_WINDOW    0x08000L
        !            31: 
        !            32: //
        !            33: // Temporary buffer must be at least as large as a bank.
        !            34: // Must also be a multiple of 4.
        !            35: //
        !            36: 
        !            37: #define TMP_BUFFER_SIZE         (BANK_SIZE_1_WINDOW)
        !            38: 
        !            39: /**************************************************************************\
        !            40: *
        !            41: * Specifies desired justification for requestion scan line within bank window
        !            42: *
        !            43: \**************************************************************************/
        !            44: 
        !            45: typedef enum {
        !            46:     JustifyTop = 0,
        !            47:     JustifyBottom,
        !            48: } BANK_JUST;
        !            49: 
        !            50: /**************************************************************************\
        !            51: *
        !            52: * Specifies which window is to be mapped by two-window bank handler.
        !            53: *
        !            54: \**************************************************************************/
        !            55: 
        !            56: typedef enum {
        !            57:     MapSourceBank = 0,
        !            58:     MapDestBank,
        !            59: } BANK_JUST;
        !            60: 
        !            61: /**************************************************************************\
        !            62: *
        !            63: * Bank clipping info
        !            64: *
        !            65: \**************************************************************************/
        !            66: 
        !            67: typedef struct {
        !            68:     RECTL rclBankBounds;    // describes pixels addressable in this bank
        !            69:     ULONG ulBankOffset;     // offset of bank start from bitmap start, if
        !            70:                             // the bitmap were linearly addressable
        !            71: } BANK_INFO, *PBANK_INFO;
        !            72: 
        !            73: /**************************************************************************\
        !            74: *
        !            75: * Bank control function vector
        !            76: *
        !            77: \**************************************************************************/
        !            78: 
        !            79: typedef VOID (*PFN_PlanarEnable)();
        !            80: typedef VOID (*PFN_PlanarDisable)();
        !            81: typedef VOID (*PFN_PlanarControl)(PPDEV, ULONG, BANK_JUST);
        !            82: typedef VOID (*PFN_PlanarControl2)(PPDEV, ULONG, BANK_JUST, ULONG);
        !            83: typedef VOID (*PFN_PlanarNext)(PPDEV);
        !            84: typedef VOID (*PFN_PlanarNext2)(PPDEV, ULONG);
        !            85: typedef VOID (*PFN_BankControl)(PPDEV, ULONG, BANK_JUST);
        !            86: typedef VOID (*PFN_BankControl2)(PPDEV, ULONG, BANK_JUST, ULONG);
        !            87: typedef VOID (*PFN_BankNext)(PPDEV);
        !            88: typedef VOID (*PFN_BankNext2)(PPDEV, ULONG);
        !            89: 
        !            90: /**************************************************************************\
        !            91: *
        !            92: * Miscellaneous driver flags
        !            93: *
        !            94: \**************************************************************************/
        !            95: 
        !            96: #define DRIVER_PLANAR_CAPABLE   0x01L
        !            97: #define DRIVER_USE_OFFSCREEN    0x02L  // if not set, don't use offscreen memory
        !            98:                                        //   for long operations (because the
        !            99:                                        //   memory won't be refreshed)
        !           100: #define DRIVER_HAS_OFFSCREEN    0x04L  // if not set, can't use any offscreen
        !           101:                                        //   memory
        !           102: 
        !           103: /**************************************************************************\
        !           104: *
        !           105: * Bank status flags
        !           106: *
        !           107: \**************************************************************************/
        !           108: 
        !           109: #define BANK_BROKEN_RASTER1     0x01L // If bank1 or read bank has broken raster
        !           110: #define BANK_BROKEN_RASTER2     0x02L // If bank2 or write bank has broken raster
        !           111: #define BANK_BROKEN_RASTERS    (BANK_BROKEN_RASTER1 | BANK_BROKEN_RASTER2)
        !           112: #define BANK_PLANAR             0x04L // If in planar mode
        !           113: 
        !           114: /**************************************************************************\
        !           115: *
        !           116: * Structure for maintaining a realized brush:
        !           117: *
        !           118: \**************************************************************************/
        !           119: 
        !           120: extern const ULONG gaaulPlanarPat[][8]; // Hatch brushes in preferred format
        !           121: 
        !           122: #define RBRUSH_BLACKWHITE       0x001L  // Black and white brush
        !           123: #define RBRUSH_2COLOR           0x002L  // 2 color brush
        !           124: #define RBRUSH_NCOLOR           0x004L  // n color brush
        !           125: #define RBRUSH_4PELS_WIDE       0x008L  // Brush is 4xN
        !           126: 
        !           127: #define BRUSH_SIZE              64      // An 8x8 8bpp brush needs 64 bytes
        !           128: #define BRUSH_MAX_CACHE_SIZE    330     // Maximum brush cache size (chose 330
        !           129:                                         //  so that BRUSHCACHEENTRY array
        !           130:                                         //  would fit entirely in 1 page)
        !           131: 
        !           132: typedef struct _RBRUSH
        !           133: {
        !           134:     FLONG       fl;                     // Flags
        !           135:     LONG        xBrush;                 // Realized brush's x brush origin
        !           136: 
        !           137:     // Info for 2 color brushes:
        !           138: 
        !           139:     ULONG       ulFgColor;              // Foreground color
        !           140:     ULONG       ulBkColor;              // Background color
        !           141: 
        !           142:     // Info for n color brushes:
        !           143: 
        !           144:     LONG        cy;                     // Height of pattern
        !           145:     LONG        cyLog2;                 // log2 of the height
        !           146:     LONG        iCache;                 // Cache entry index.  Zero is not
        !           147:                                         //  a valid index.
        !           148: 
        !           149:     // Pattern in preferred format:
        !           150: 
        !           151:     ULONG       aulPattern[BRUSH_SIZE / sizeof(ULONG)];
        !           152: 
        !           153: } RBRUSH;                           /* rb */
        !           154: 
        !           155: typedef struct _BRUSHCACHEENTRY
        !           156: {
        !           157:     RBRUSH*     prbVerifyRealization;   // We never dereference this pointer
        !           158:                                         //  to find a brush realization;
        !           159:                                         //  it is only ever used in a compare
        !           160:                                         //  to verify that for a realized brush,
        !           161:                                         //  its off-screen cache entry is still
        !           162:                                         //  valid.
        !           163:     LONG        yCache;                 // Scan where entry's bits live
        !           164:     LONG        ulCache;                // Offset to cache entry from screen
        !           165:                                         //  start (assuming planar format --
        !           166:                                         //  if you want the non-planar offset,
        !           167:                                         //  multiply by 4)
        !           168: 
        !           169: } BRUSHCACHEENTRY;                  /* bce */
        !           170: 
        !           171: /**************************************************************************\
        !           172: *
        !           173: * Physical device data structure
        !           174: *
        !           175: \**************************************************************************/
        !           176: 
        !           177: // ***********************************************************
        !           178: // *** MUST match the assembler version in i386\driver.inc ***
        !           179: // ***********************************************************
        !           180: 
        !           181: typedef struct _PDEV
        !           182: {
        !           183:     FLONG       fl;                     // Driver flags (DRIVER_xxx)
        !           184:     HANDLE      hDriver;                // Handle to \Device\Screen
        !           185:     HDEV        hdevEng;                // Engine's handle to PDEV
        !           186:     HSURF       hsurfEng;               // Engine's handle to surface
        !           187:     HANDLE      hsurfBm;                // Handle to the "punt" surface
        !           188:     SURFOBJ*    pSurfObj;               // pointer to the locked "punt" surface
        !           189: 
        !           190:     HPALETTE    hpalDefault;            // Handle to the default palette for device.
        !           191: 
        !           192:     PBYTE       pjScreen;               // This is pointer to base screen address
        !           193:     ULONG       cxScreen;               // Visible screen width
        !           194:     ULONG       cyScreen;               // Visible screen height
        !           195:     ULONG       ulMode;                 // Mode the mini-port driver is in.
        !           196:     LONG        lDeltaScreen;           // Distance from one scan to the next.
        !           197: 
        !           198:     FLONG       flRed;                  // For bitfields device, Red Mask
        !           199:     FLONG       flGreen;                // For bitfields device, Green Mask
        !           200:     FLONG       flBlue;                 // For bitfields device, Blue Mask
        !           201:     ULONG       ulBitCount;             // # of bits per pel -- can be only 8
        !           202: 
        !           203:     DDAOBJ*     pdda;                   // DDA drawing object for trapezoids
        !           204: 
        !           205:     GDIINFO*    pGdiInfo;               // Pointer to temporary buffer for GDIINFO struct
        !           206:     DEVINFO*    pDevInfo;               // Pointer to temporary buffer for DEVINFO struct
        !           207: 
        !           208:     ULONG       ulrm0_wmX;              // Four values (one per byte) to set
        !           209:                                         //  GC5 to to select read mode 0
        !           210:                                         //  together with write modes 0-3
        !           211: 
        !           212:     BYTE*       pjGlyphFlipTableBase;   // Base allocated address for flip
        !           213:                                         //  table; the pointer we use is this
        !           214:                                         //  pointer rounded up to the nearest
        !           215:                                         //  256-byte boundary
        !           216:     BYTE*       pjGlyphFlipTable;       // Pointer to table used to flip glyph
        !           217:                                         //  bits 0-3 and 4-7
        !           218:     PALETTEENTRY* pPal;                 // If this is pal managed, this is the pal
        !           219: 
        !           220: // Off screen save stuff:
        !           221: 
        !           222:     HBITMAP     hbmTmp;                 // Handle to temporary buffer
        !           223:     SURFOBJ*    psoTmp;                 // Temporary surface
        !           224:     PVOID       pvTmp;                  // Pointer to temporary buffer
        !           225:     ULONG       cyTmp;                  // # of scans in temporary surface
        !           226: 
        !           227: // Brush cache:
        !           228: 
        !           229:     LONG                iCache;         // Index for next brush to be allocated
        !           230:     LONG                iCacheLast;     // Last valid cache index (so the
        !           231:                                         //  number of entries in cache is
        !           232:                                         //  iCacheLast + 1)
        !           233:     BRUSHCACHEENTRY*    pbceCache;      // Pointer to allocated cache
        !           234: 
        !           235: // Bank manager stuff common between planar and non-planar modes:
        !           236: 
        !           237:     LONG        cTotalScans;            // Number of usable on and off-screen
        !           238:                                         //  scans
        !           239:     PVIDEO_BANK_SELECT pBankInfo;       // Bank info for current mode returned
        !           240:                                         //  by miniport
        !           241: 
        !           242:     FLONG       flBank;                 // Flags for current bank state
        !           243: 
        !           244:     ULONG       ulBitmapSize;           // Length of bitmap if there were no
        !           245:                                         //  banking, in CPU addressable bytes
        !           246:     ULONG       ulWindowBank[2];        // Current banks mapped into windows
        !           247:                                         //  0 & 1
        !           248:     PVOID       pvBitmapStart;          // Single-window bitmap start pointer
        !           249:                                         //  (adjusted as necessary to make
        !           250:                                         //  window map in at proper offset)
        !           251:     PVOID       pvBitmapStart2Window[2];// Double-window window 0 and 1 bitmap
        !           252:                                         // start
        !           253: 
        !           254: // Non-planar mode specific bank management control stuff:
        !           255: 
        !           256:     VIDEO_BANK_TYPE  vbtBankingType;        // Type of banking
        !           257:     PFN              pfnBankSwitchCode;     // Pointer to bank switch code
        !           258: 
        !           259:     LONG             lNextScan;             // Offset to next bank in bytes
        !           260:     BYTE*            pjJustifyTopBank;      // Pointer to lookup table for
        !           261:                                             //  converting scans to banks
        !           262:     BANK_INFO*       pbiBankInfo;           // Array of bank clip info
        !           263:     ULONG            ulJustifyBottomOffset; // # of scans from top to bottom
        !           264:                                             //  of bank, for bottom justifying
        !           265:     ULONG            iLastBank;             // Index of last valid bank in
        !           266:                                             //  pbiBankInfo table
        !           267:     ULONG            ulBank2RWSkip;         // Offset from one bank index to next
        !           268:                                             //  to make two 32K banks appear to be
        !           269:                                             //  one seamless 64K bank
        !           270: 
        !           271:     PFN_BankControl  pfnBankControl;        // Pointer to bank control function
        !           272:     PFN_BankControl2 pfnBankControl2Window; // Pointer to double-window bank
        !           273:                                             //  control function
        !           274:     PFN_BankNext     pfnBankNext;           // Pointer to next bank function
        !           275:     PFN_BankNext2    pfnBankNext2Window;    // Pointer to double-window next
        !           276:                                             //  bank function
        !           277: 
        !           278:     RECTL            rcl1WindowClip;        // Single-window banking clip rect
        !           279:     RECTL            rcl2WindowClip[2];     // Double-window banking clip rects for
        !           280:                                             //  windows 0 & 1
        !           281: 
        !           282: // Planar mode specific bank management control stuff:
        !           283: 
        !           284:     VIDEO_BANK_TYPE    vbtPlanarType;       // Type of planar banking
        !           285: 
        !           286:     PFN                pfnPlanarSwitchCode; // Pointer to planar bank switch
        !           287:                                             //  code
        !           288: 
        !           289:     LONG               lPlanarNextScan;     // Offset to next planar bank in
        !           290:                                             //  bytes
        !           291:     BYTE*              pjJustifyTopPlanar;  // Pointer to lookup table for
        !           292:                                             //  converting scans to banks
        !           293:     BANK_INFO*         pbiPlanarInfo;       // Array of bank clip info
        !           294:     ULONG              ulPlanarBottomOffset;// # of scans from top to bottom
        !           295:                                             //  of bank, for bottom justifying
        !           296:     ULONG              iLastPlanar;         // Index of last valid bank in
        !           297:                                             //  pbiPlanarInfo table
        !           298:     ULONG              ulPlanar2RWSkip;     // Offset from one bank index to next
        !           299:                                             //  to make two 32K banks appear to be
        !           300:                                             //  one seamless 64K bank
        !           301: 
        !           302:     PFN_PlanarControl  pfnPlanarControl;    // Planar one window bank control
        !           303:     PFN_PlanarControl2 pfnPlanarControl2;   // Planar two window bank control
        !           304: 
        !           305:     PFN_PlanarNext     pfnPlanarNext;       // Planar one window next bank
        !           306:     PFN_PlanarNext2    pfnPlanarNext2;      // Planar two window next bank
        !           307: 
        !           308:     RECTL              rcl1PlanarClip;      // Single-window banking clip rect
        !           309:     RECTL              rcl2PlanarClip[2];   // Double-window banking clip rects for
        !           310:                                             //  windows 0 & 1
        !           311: 
        !           312:     PFN_PlanarEnable   pfnPlanarEnable;     // Function to enable planar mode
        !           313:     PFN_PlanarDisable  pfnPlanarDisable;    // Function to disable planar mode
        !           314: 
        !           315: // Smart bank manager stuff:
        !           316: 
        !           317:     LONG        iLastScan;              // Last scan we want to enumerate
        !           318:     PVOID       pvSaveScan0;            // Surface's original pvScan0
        !           319:     RECTL       rclSaveBounds;          // Clip Object's original bounds
        !           320:     CLIPOBJ*    pcoNull;                // Points to an empty clip object
        !           321:                                         //  we can use when we're given a
        !           322:                                         //  NULL CLIPOBJ pointer
        !           323:     BYTE        iSaveDComplexity;       // Clip Object's original complexity
        !           324:     BYTE        fjSaveOptions;          // Clip Object's original flags
        !           325:     BYTE        ajFiller[2];            // Pack dword alignment
        !           326: 
        !           327: // NOTE: This stuff must come at the end of the structure, so that we don't
        !           328: //       have to declare an array size in the ASM version:
        !           329: 
        !           330:     ULONG       cPatterns;              // Count of bitmap patterns created
        !           331:     HBITMAP     ahbmPat[HS_DDI_MAX];    // Engine handles to standard patterns
        !           332: };                                  /* pdev */
        !           333: 
        !           334: // Palette stuff:
        !           335: 
        !           336: #define MAX_CLUT_SIZE (sizeof(VIDEO_CLUT) + (sizeof(ULONG) * 256))
        !           337: 
        !           338: // Size of the driver extra information in the DEVMODe structure passed
        !           339: // to and from the display driver
        !           340: 
        !           341: #define DRIVER_EXTRA_SIZE 0
        !           342: 
        !           343: // When calling vEnumStart, make sure you set bAll to FALSE.  This will tell
        !           344: // the Engine to only enumerate rectangles in rclBounds.
        !           345: 
        !           346: // Hooks and Driver function table.
        !           347: 
        !           348: #define HOOKS_BMF8BPP   (HOOK_BITBLT   | HOOK_TEXTOUT    | HOOK_FILLPATH | \
        !           349:                          HOOK_COPYBITS | HOOK_STROKEPATH | HOOK_PAINT | \
        !           350:                          HOOK_STRETCHBLT)
        !           351: 
        !           352: #define BB_RECT_LIMIT   50
        !           353: 
        !           354: typedef struct _BBENUM
        !           355: {
        !           356:     ULONG   c;
        !           357:     RECTL   arcl[BB_RECT_LIMIT];
        !           358: } BBENUM;
        !           359: 
        !           360: typedef struct _BBENUMTRAP
        !           361: {
        !           362:     ULONG     c;
        !           363:     TRAPEZOID atrap[BB_RECT_LIMIT];
        !           364: } BBENUMTRAP;
        !           365: 
        !           366: #define MAX_DDA_RECTS   50  // most rects we want enumerated by DDAOBJ at once
        !           367: 
        !           368: typedef struct _DDAENUM
        !           369: {
        !           370:     LONG    yTop;
        !           371:     LONG    yBottom;
        !           372:     LONG    axPairs[MAX_DDA_RECTS];
        !           373: } DDAENUM;
        !           374: 
        !           375: #define TO_RECT_LIMIT   20
        !           376: 
        !           377: typedef struct _TEXTENUM
        !           378: {
        !           379:     ULONG       c;
        !           380:     RECTL       arcl[TO_RECT_LIMIT];
        !           381: } TEXTENUM;
        !           382: 
        !           383: // Initialization stuff:
        !           384: 
        !           385: BOOL bEnableBanking(PPDEV);
        !           386: VOID vDisableBanking(PPDEV);
        !           387: BOOL bInitPDEV(PPDEV,PDEVMODEW);
        !           388: BOOL bInitSURF(PPDEV,BOOL);
        !           389: BOOL bInitPaletteInfo(PPDEV);
        !           390: BOOL bInit256ColorPalette(PPDEV);
        !           391: BOOL bInitPatterns(PPDEV, INT);
        !           392: VOID vInitBrushCache(PPDEV);
        !           393: VOID vDisablePalette(PPDEV);
        !           394: VOID vDisablePatterns(PPDEV);
        !           395: VOID vDisableSURF(PPDEV);
        !           396: VOID vDisableBrushCache(PPDEV);
        !           397: VOID vResetBrushCache(PPDEV);
        !           398: VOID vInitRegs(PPDEV);
        !           399: DWORD getAvailableModes(HANDLE, PVIDEO_MODE_INFORMATION *, DWORD *);
        !           400: 
        !           401: // Smart bank manager stuff:
        !           402: 
        !           403: CLIPOBJ* pcoBankStart(PPDEV, RECTL*, SURFOBJ*, CLIPOBJ*);
        !           404: BOOL     bBankEnum(PPDEV, SURFOBJ*, CLIPOBJ*);
        !           405: VOID     vBankStartBltSrc(PPDEV, SURFOBJ*, POINTL*, RECTL*, POINTL*, RECTL*);
        !           406: BOOL     bBankEnumBltSrc(PPDEV, SURFOBJ*, POINTL*, RECTL*, POINTL*, RECTL*);
        !           407: VOID     vBankStartBltDest(PPDEV, SURFOBJ*, POINTL*, RECTL*, POINTL*, RECTL*);
        !           408: BOOL     bBankEnumBltDest(PPDEV, SURFOBJ*, POINTL*, RECTL*, POINTL*, RECTL*);
        !           409: 
        !           410: // Fill routines:
        !           411: 
        !           412: typedef union _RBRUSH_COLOR {
        !           413:     RBRUSH* prb;
        !           414:     ULONG   iSolidColor;
        !           415: } RBRUSH_COLOR;          /* rbc */
        !           416: 
        !           417: typedef VOID (*PFNFILL)(PPDEV, ULONG, PRECTL, MIX, RBRUSH_COLOR, POINTL*);
        !           418: 
        !           419: VOID vTrgBlt(PPDEV, ULONG, PRECTL, MIX, RBRUSH_COLOR, POINTL*);
        !           420: VOID vMonoPat(PPDEV, ULONG, PRECTL, MIX, RBRUSH_COLOR, POINTL*);
        !           421: VOID vColorPat(PPDEV, ULONG, PRECTL, MIX, RBRUSH_COLOR, POINTL*);
        !           422: 
        !           423: // Other prototypes:
        !           424: 
        !           425: BOOL b2ColorBrush(ULONG* pvBits, BYTE* pjFgColor, BYTE* pjBkColor);
        !           426: VOID vPlanarCopyBits(PPDEV, RECTL*, POINTL*);
        !           427: BOOL bIntersectRect(RECTL*, RECTL*, RECTL*);
        !           428: VOID vSetWriteModes(ULONG *);
        !           429: VOID vClearMemDword(PULONG * pulBuffer, ULONG ulDwordCount);
        !           430: VOID vSrcCopy8bpp(PPDEV, RECTL*, POINTL*, LONG, VOID*);
        !           431: VOID vFastLine(PPDEV, PATHOBJ*, LONG, ULONG);
        !           432: 
        !           433: #endif // _DRIVER_

unix.superglobalmegacorp.com

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