You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
368 lines
15 KiB
368 lines
15 KiB
/******************************Module*Header**********************************\
|
|
*
|
|
* *******************
|
|
* * GDI SAMPLE CODE *
|
|
* *******************
|
|
*
|
|
* Module Name: driver.h
|
|
*
|
|
* Contains definitions and typedefs common to all driver
|
|
* components.
|
|
*
|
|
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
|
|
* Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
|
|
\*****************************************************************************/
|
|
#ifndef __DRIVER__H__
|
|
#define __DRIVER__H__
|
|
|
|
typedef struct _PDev PDev; // Handy forward declaration
|
|
typedef struct _Surf Surf; // Handy forward declaration
|
|
typedef struct _GFNPB GFNPB; // Handy forward declaration
|
|
|
|
typedef VOID (GFN)(GFNPB*);
|
|
typedef BOOL (GFNLINE)(PDev*, LONG, LONG, LONG, LONG);
|
|
typedef BOOL (GFNINIS)(PDev*, ULONG, DWORD, RECTL*);
|
|
typedef VOID (GFNRSTS)(PDev*);
|
|
|
|
typedef struct _P2DMA P2DMA;
|
|
typedef struct tagP2CtxtRec *P2CtxtPtr;
|
|
typedef struct _hw_data *HwDataPtr;
|
|
|
|
// Four byte tag used for tracking memory allocations on a per source
|
|
// file basis. (characters are in reverse order). Note if you add any
|
|
// new files which call ENGALLOCMEM remember to update this list. This also
|
|
// applies if you want to make the allocation tagging more granular than
|
|
// file level.
|
|
|
|
#define ALLOC_TAG_3D2P '3d2p' // Allocations from d3d.c
|
|
#define ALLOC_TAG_6D2P '6d2p' // Allocations from d3ddx6.c
|
|
#define ALLOC_TAG_SD2P 'sd2p' // Allocations from d3dstate.c
|
|
#define ALLOC_TAG_TD2P 'td2p' // Allocations from d3dtxman.c
|
|
#define ALLOC_TAG_US2P 'us2p' // Allocations from ddsurf.c
|
|
#define ALLOC_TAG_ED2P 'ed2p' // Allocations from debug.c
|
|
#define ALLOC_TAG_NE2P 'ne2p' // Allocations from enable.c
|
|
#define ALLOC_TAG_IF2P 'if2p' // Allocations from fillpath.c
|
|
#define ALLOC_TAG_EH2P 'eh2p' // Alloactions from heap.c
|
|
#define ALLOC_TAG_WH2P 'wh2p' // Allocations from hwinit.c
|
|
#define ALLOC_TAG_XC2P 'xc2p' // Allocations from p2ctxt.c
|
|
#define ALLOC_TAG_AP2P 'ap2p' // Allocations from palette.c
|
|
#define ALLOC_TAG_EP2P 'ep2p' // Allocations from permedia.c
|
|
#define ALLOC_TAG_XT2P 'xt2p' // Allocations from textout.c
|
|
|
|
|
|
//
|
|
// Miscellaneous shared stuff
|
|
//
|
|
#define DLL_NAME L"perm2dll" // Name of the DLL in UNICODE
|
|
#define STANDARD_DEBUG_PREFIX "PERM2DLL: "// All debug output is prefixed
|
|
// by this string
|
|
|
|
#define DRIVER_EXTRA_SIZE 0 // Size of the DriverExtra information in
|
|
// the DEVMODE structure
|
|
#define TMP_BUFFER_SIZE 8192 // Size in bytes of 'pvTmpBuffer'.
|
|
// Has to be at least enough to store an
|
|
// entire scan line (i.e., 6400 for
|
|
// 1600x1200x32).
|
|
|
|
#define MAX_CLUT_SIZE (sizeof(VIDEO_CLUT) + (sizeof(ULONG) * 256))
|
|
|
|
|
|
#define INPUT_BUFFER_SIZE (1024 * 64) // Size in bytes
|
|
|
|
//@@BEGIN_DDKSPLIT
|
|
|
|
#define MULTITHREADED 0
|
|
#define MT_LOG_LEVEL 6
|
|
|
|
#if MULTITHREADED && DBG
|
|
#define ASSERTLOCK(xppdev, func) \
|
|
{ \
|
|
EngAcquireSemaphore((xppdev)->hsemLock); \
|
|
if ((xppdev)->ulLockCount < 1) \
|
|
{ \
|
|
DebugPrint(-1000, __FILE__ ":%d:" #func ": bad lock count", __LINE__); \
|
|
EngDebugBreak(); \
|
|
} \
|
|
EngReleaseSemaphore((xppdev)->hsemLock); \
|
|
}
|
|
#else
|
|
#define ASSERTLOCK(xppdev, func)
|
|
#endif
|
|
//@@END_DDKSPLIT
|
|
|
|
//
|
|
// Status flags
|
|
//
|
|
typedef enum
|
|
{
|
|
// STAT_* indicates that the resource actually exists
|
|
STAT_BRUSH_CACHE = 0x0002, // Brush cache successfully allocated
|
|
STAT_DEV_BITMAPS = 0x0004, // Device Bitmaps are allowed
|
|
|
|
// ENABLE_* indicates whether resource is currently available
|
|
ENABLE_BRUSH_CACHE = 0x0020, // Brush cache disabled
|
|
ENABLE_DEV_BITMAPS = 0x0040, // Device Bitmaps disabled
|
|
|
|
} /*STATUS*/;
|
|
typedef int Status;
|
|
|
|
//
|
|
// The Physical Device data structure
|
|
//
|
|
typedef struct _PDev
|
|
{
|
|
BYTE* pjScreen; // Points to base screen address
|
|
ULONG iBitmapFormat; // BMF_8BPP or BMF_16BPP or BMF_32BPP
|
|
// (our current colour depth)
|
|
CAPS flCaps; // Capabilities flags
|
|
Status flStatus; // Status flags
|
|
BOOL bEnabled; // In graphics mode (not full-screen)
|
|
|
|
HANDLE hDriver; // Handle to \Device\Screen
|
|
HDEV hdevEng; // Engine's handle to PDev
|
|
HSURF hsurfScreen; // Engine's handle to screen surface
|
|
Surf* pdsurfScreen; // Our private DSURF for the screen
|
|
Surf* pdsurfOffScreen; // Our private DSURF for the back buffer
|
|
|
|
LONG cxScreen; // Visible screen width
|
|
LONG cyScreen; // Visible screen height
|
|
LONG cxMemory; // Width of Video RAM
|
|
LONG cyMemory; // Height of Video RAM
|
|
ULONG ulMode; // Mode the mini-port driver is in.
|
|
LONG lDelta; // Distance from one scan to the next.
|
|
|
|
FLONG flHooks; // What we're hooking from GDI
|
|
|
|
LONG cjPelSize; // 4/2/1 for 32/16/8 bpp
|
|
LONG cPelSize; // 2/1/0 for 32/16/8 bpp
|
|
DWORD bPixShift; // 2/1/0 for 32/16/8 bpp
|
|
DWORD bBppShift; // 0/1/2 for 32/16/8 bpp
|
|
DWORD dwBppMask; // 0/1/3 for 32/16/8 bpp
|
|
|
|
ULONG ulWhite; // 0xff if 8bpp, 0xffff if 16bpp,
|
|
// 0xffffffff if 32bpp
|
|
ULONG* pulCtrlBase[2]; // Mapped control registers for this PDEV
|
|
// 2 entries to support Dual-TX
|
|
ULONG* pulDenseCtrlBase; // Dense mapping for direct draw
|
|
ULONG* pulRamdacBase; // Mapped control registers for the RAMDAC
|
|
VOID* pvTmpBuffer; // General purpose temporary buffer,
|
|
// TMP_BUFFER_SIZE bytes in size
|
|
// (Remember to synchronize if you use this
|
|
// for device bitmaps or async pointers)
|
|
LONG lVidMemHeight; // Height of Video RAM available to
|
|
// DirectDraw heap (cyScreen <= cyHeap
|
|
// <= cyMemory), including primary surface
|
|
LONG lVidMemWidth; // Width, in pixel, of Video RAM available
|
|
// to DDraw heap, including primary surface
|
|
LONG cBitsPerPel; // Bits per pel (8, 15, 16, 24 or 32)
|
|
UCHAR* pjIoBase; // Mapped IO port base for this PDEV
|
|
|
|
ULONG ulPermFormat; // permedia format type of primary
|
|
ULONG ulPermFormatEx; // permedia extended format bit of primary
|
|
|
|
DWORD dwAccelLevel; // Acceleration level setting
|
|
POINTL ptlOrigin; // Origin of desktop in multi-mon dev space
|
|
|
|
//
|
|
// Palette stuff:
|
|
//
|
|
PALETTEENTRY* pPal; // The palette if palette managed
|
|
HPALETTE hpalDefault; // GDI handle to the default palette.
|
|
FLONG flRed; // Red mask for 16/32bpp bitfields
|
|
FLONG flGreen; // Green mask for 16/32bpp bitfields
|
|
FLONG flBlue; // Blue mask for 16/32bpp bitfields
|
|
|
|
//
|
|
// Heap stuff for DDRAW managed off-screen memory
|
|
//
|
|
VIDEOMEMORY* pvmList; // Points to the video-memory heap list
|
|
// as supplied by DirectDraw, needed
|
|
// for heap allocations
|
|
ULONG cHeaps; // Count of video-memory heaps
|
|
ULONG iHeapUniq; // Incremented every time room is freed
|
|
// in the off-screen heap
|
|
|
|
Surf* psurfListHead; // Dbl Linked list of discardable bitmaps,
|
|
Surf* psurfListTail; // in order of oldest to newest
|
|
|
|
//
|
|
// Pointer stuff
|
|
//
|
|
|
|
LONG xPointerHot; // xHot of current hardware pointer
|
|
LONG yPointerHot; // yHot of current hardware pointer
|
|
|
|
ULONG ulHwGraphicsCursorModeRegister_45;
|
|
// Default value for index 45
|
|
PtrFlags flPointer; // Pointer state flags
|
|
VOID* pvPointerData; // Points to ajPointerData[0]
|
|
BYTE ajPointerData[POINTER_DATA_SIZE];
|
|
// Private work area for downloaded
|
|
// miniport pointer code
|
|
|
|
BOOL bPointerInitialized;// Flag to indicate if HW pointer has been
|
|
// initizlized
|
|
|
|
// Brush stuff:
|
|
|
|
BOOL bRealizeTransparent;// Hint to DrvRealizeBrush for whether
|
|
// the brush should be realized as
|
|
// transparent or not
|
|
LONG cPatterns; // Count of bitmap patterns created
|
|
LONG lNextCachedBrush; // Index for next brush to be allocated
|
|
LONG cBrushCache; // Total number of brushes cached
|
|
BrushEntry abeMono; // Keeps track of area stipple brush
|
|
BrushEntry abe[TOTAL_BRUSH_COUNT]; // Keeps track of brush cache
|
|
HBITMAP ahbmPat[HS_DDI_MAX];// Engine handles to standard patterns
|
|
|
|
ULONG ulBrushPackedPP; // Stride of brush as partial products
|
|
VIDEOMEMORY*pvmBrushHeap; // Heap from which brush cached was alloced
|
|
ULONG ulBrushVidMem; // Poitner to start of brush cache
|
|
|
|
// Hardware pointer cache stuff:
|
|
|
|
HWPointerCache HWPtrCache; // The cache data structure itself
|
|
LONG HWPtrLastCursor; // The index of the last cursor that we drew
|
|
LONG HWPtrPos_X; // The last X position of the cursor
|
|
LONG HWPtrPos_Y; // The last Y position of the cursor
|
|
|
|
HwDataPtr permediaInfo; // info about the interface to permedia2
|
|
|
|
LONG FrameBufferLength; // Length of framebuffer in bytes
|
|
|
|
// rendering routines
|
|
|
|
GFN* pgfnAlphaBlend;
|
|
GFN* pgfnConstantAlphaBlend;
|
|
GFN* pgfnCopyBlt;
|
|
GFN* pgfnCopyBltWithRop;
|
|
GFN* pgfnGradientFillTri;
|
|
GFN* pgfnGradientFillRect;
|
|
GFN* pgfnMonoOffset;
|
|
GFN* pgfnMonoPatFill;
|
|
GFN* pgfnPatFill;
|
|
GFN* pgfnPatRealize;
|
|
GFN* pgfnSolidFill;
|
|
GFN* pgfnSolidFillWithRop;
|
|
GFN* pgfnSourceFillRect;
|
|
GFN* pgfnTransparentBlt;
|
|
GFN* pgfnXferImage;
|
|
GFN* pgfnInvert;
|
|
|
|
|
|
// support for DrvStroke
|
|
// TODO: remove use of this implicit parameter passing
|
|
Surf* psurf; // this is an implicit parameter passed to various
|
|
// calls ... this needs to be removed.
|
|
|
|
// Direct draw stuff
|
|
|
|
P2CtxtPtr pDDContext; // DDRAW context
|
|
|
|
// Virtual address of start of screen
|
|
UINT_PTR dwScreenStart;
|
|
|
|
// DDraw/D3D DMA shared memory block
|
|
P2DMA *pP2dma;
|
|
|
|
// Current pixel format of display
|
|
DDPIXELFORMAT ddpfDisplay;
|
|
|
|
// Some P2 specific information
|
|
DWORD dwChipConfig; // image of P2 chip configuration
|
|
// some virtual addresses of the P2
|
|
// registers
|
|
ULONG *pCtrlBase; //
|
|
ULONG *pCoreBase; //
|
|
ULONG *pGPFifo; //
|
|
|
|
// DirectDraw callbacks
|
|
DDHAL_DDCALLBACKS DDHALCallbacks;
|
|
DDHAL_DDSURFACECALLBACKS DDSurfCallbacks;
|
|
|
|
DWORD dwNewDDSurfaceOffset;
|
|
|
|
BOOL bDdExclusiveMode; // TRUE if DDraw is in ExclusiveMode
|
|
BOOL bDdStereoMode; // TRUE if flip has switched us
|
|
// to stereo mode
|
|
BOOL bCanDoStereo; // This mode can do stereo
|
|
|
|
// These have to live here, as we could be running on 2 different cards
|
|
// on two different displays...!
|
|
UINT_PTR pD3DDriverData32;
|
|
UINT_PTR pD3DHALCallbacks32;
|
|
|
|
// Linear allocator defines
|
|
UINT_PTR dwGARTLin; // Linear address of Base of AGP Memory
|
|
UINT_PTR dwGARTDev; // High Linear address of Base of AGP Memory
|
|
UINT_PTR dwGARTLinBase; // The Linear base address passed into
|
|
// UpdateNonLocalVidMem
|
|
UINT_PTR dwGARTDevBase; // The High Linear base address passed into
|
|
// UpdateNonLocalVidMem
|
|
|
|
// HAL info structure.
|
|
DDHALINFO ddhi32;
|
|
|
|
PFND3DPARSEUNKNOWNCOMMAND pD3DParseUnknownCommand;
|
|
|
|
// New Input FIFO cached information
|
|
|
|
PULONG pulInFifoPtr;
|
|
PULONG pulInFifoStart;
|
|
PULONG pulInFifoEnd;
|
|
|
|
ULONG* dmaBufferVirtualAddress;
|
|
LARGE_INTEGER dmaBufferPhysicalAddress;
|
|
ULONG dmaCurrentBufferOffset;
|
|
ULONG dmaActiveBufferOffset;
|
|
|
|
ULONG* pulInputDmaCount;
|
|
ULONG* pulInputDmaAddress;
|
|
ULONG* pulFifo;
|
|
ULONG* pulOutputFifoCount;
|
|
ULONG* pulInputFifoCount;
|
|
|
|
BOOL bGdiContext;
|
|
|
|
BOOL bNeedSync;
|
|
BOOL bForceSwap;
|
|
|
|
#if DBG
|
|
ULONG ulReserved;
|
|
#endif
|
|
|
|
//
|
|
// On NT4.0 The psoScreen is the locked screen Surf we EngLockSurface
|
|
// on to in DrvEnableSurface which we EngUnlockSurface in
|
|
// DrvDisableSurface. On NT5.0 this should be NULL.
|
|
//
|
|
SURFOBJ *psoScreen;
|
|
|
|
//@@BEGIN_DDKSPLIT
|
|
#if MULTITHREADED
|
|
HSEMAPHORE hsemLock;
|
|
ULONG ulLockCount;
|
|
#endif
|
|
//@@END_DDKSPLIT
|
|
|
|
} PDev, *PPDev;
|
|
|
|
|
|
/*****************************************************************************\
|
|
* *
|
|
* NT 5.0 -> NT 4.0 single binary support: *
|
|
* *
|
|
\*****************************************************************************/
|
|
|
|
// Are we running on NT40 system
|
|
|
|
extern BOOL g_bOnNT40;
|
|
|
|
// Function to load thunks for new NT5.0 functionality. Called in
|
|
// DrvEnableDriver and implemented in thunks.c
|
|
|
|
extern BOOL bEnableThunks();
|
|
|
|
|
|
#endif // __DRIVER__
|
|
|