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.
405 lines
13 KiB
405 lines
13 KiB
/******************************Module*Header*******************************\
|
|
*
|
|
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
* !! !!
|
|
* !! WARNING: NOT DDK SAMPLE CODE !!
|
|
* !! !!
|
|
* !! This source code is provided for completeness only and should not be !!
|
|
* !! used as sample code for display driver development. Only those sources !!
|
|
* !! marked as sample code for a given driver component should be used for !!
|
|
* !! development purposes. !!
|
|
* !! !!
|
|
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
*
|
|
* Module Name: glddtk.h
|
|
*
|
|
* Content:
|
|
*
|
|
* Copyright (c) 1994-1999 3Dlabs Inc. Ltd. All rights reserved.
|
|
* Copyright (c) 1995-2003 Microsoft Corporation. All rights reserved.
|
|
\*****************************************************************************/
|
|
|
|
#ifndef __DDSAMPTK_INCLUDED__
|
|
#define __DDSAMPTK_INCLUDED__
|
|
|
|
#pragma warning( disable: 4704)
|
|
|
|
#define P3R3DX_DLLNAME "p3r3dx.dll"
|
|
#define MAX_TEXTURE_FORMAT 35
|
|
|
|
// The Maximum possible screen widths for the cards
|
|
#define MAX_GLINT_PP_WIDTH 8192
|
|
#define MAX_PERMEDIA_PP_WIDTH 2048
|
|
|
|
// For comparing runtime versions
|
|
#define DX5_RUNTIME 0x00000500l
|
|
#define DX6_RUNTIME 0x00000600l
|
|
#define DX7_RUNTIME 0x00000700l
|
|
|
|
#ifdef W95_DDRAW
|
|
|
|
// Videoport needs to live in pThisDisplay, it may
|
|
// be on a second display card, etc.
|
|
#define MAX_AUTOFLIP_SURFACES 3
|
|
typedef struct tagPERMEDIA_VIDEOPORT
|
|
{
|
|
// The ID of this video port
|
|
DWORD dwPortID;
|
|
|
|
// Permedia VideoPort supports up to
|
|
// 3 autoflipping surfaces
|
|
DWORD dwNumSurfaces;
|
|
|
|
LPDDRAWI_DDRAWSURFACE_LCL lpSurf[MAX_AUTOFLIP_SURFACES];
|
|
DWORD dwSurfacePointer[MAX_AUTOFLIP_SURFACES];
|
|
|
|
// How are the signals setup?
|
|
DWORD dwStreamAFlags;
|
|
DWORD dwStreamBFlags;
|
|
|
|
// Height of the VideoBlanking interval
|
|
DWORD dwVBIHeight;
|
|
|
|
DWORD dwFieldHeight;
|
|
DWORD dwFieldWidth;
|
|
|
|
// Where are we currently reading from?
|
|
DWORD dwCurrentHostFrame;
|
|
|
|
// Is the video playing?
|
|
DWORD bActive;
|
|
|
|
// A mutex to take ownership of the videoport.
|
|
DWORD dwMutexA;
|
|
|
|
// For VP error checking
|
|
DWORD bResetStatus;
|
|
DWORD dwStartLine;
|
|
DWORD dwStartIndex;
|
|
DWORD dwStartLineTime;
|
|
DWORD dwErrorCount;
|
|
|
|
// Is the VideoPort active?
|
|
DWORD bCreated;
|
|
|
|
} PERMEDIA_VIDEOPORT;
|
|
#endif // W95_DDRAW
|
|
|
|
// Enumerated type for the style of buffer that is being used.
|
|
typedef enum tageBufferType
|
|
{
|
|
COMMAND_BUFFER = 0,
|
|
VERTEX_BUFFER = 1,
|
|
FORCE_DWORD_BUFFERTYPE_SIZE = 0xFFFFFFFF
|
|
} eBufferType;
|
|
|
|
typedef struct tagDRVRECT
|
|
{
|
|
#ifndef WIN32
|
|
DWORD left;
|
|
DWORD top;
|
|
DWORD right;
|
|
DWORD bottom;
|
|
#else
|
|
LONG left;
|
|
LONG top;
|
|
LONG right;
|
|
LONG bottom;
|
|
#endif
|
|
} DRVRECT;
|
|
|
|
typedef struct tagOVERLAYDATA
|
|
{
|
|
DRVRECT rcSrc;
|
|
DRVRECT rcDest;
|
|
|
|
#ifndef WIN32
|
|
DWORD dwOverlayPointer;
|
|
#else
|
|
FLATPTR pCurrentOverlay;
|
|
#endif
|
|
|
|
DWORD dwCurrentVideoBuffer;
|
|
DWORD dwVisibleOverlays;
|
|
|
|
} OVERLAYDATA;
|
|
|
|
typedef struct tagP3VERTEXBUFFERINFO
|
|
{
|
|
DWORD dwSequenceID;
|
|
DWORD bInUse;
|
|
eBufferType BufferType;
|
|
DWORD dwSize;
|
|
struct tagP3VERTEXBUFFERINFO* pNext;
|
|
struct tagP3VERTEXBUFFERINFO* pPrev;
|
|
} P3_VERTEXBUFFERINFO;
|
|
|
|
typedef struct
|
|
{
|
|
// Where we flipped from
|
|
FLATPTR fpFlipFrom;
|
|
|
|
// An ID for the flip
|
|
DWORD dwFlipID;
|
|
|
|
} FLIPRECORD;
|
|
typedef FLIPRECORD FAR *LPFLIPRECORD;
|
|
|
|
typedef struct _GlintDMABuffer
|
|
{
|
|
DWORD dwBuffSize;
|
|
DWORD dwBuffPhys;
|
|
ULONG_PTR dwBuffVirt;
|
|
DWORD dwSubBuff;
|
|
} GLDMABUFF, *LPGLDMABUFF;
|
|
|
|
// Function prototype to fire off a DMA operation
|
|
typedef DWORD (WINAPI *__StartDMA)(struct tagThunkedData* pThisDisplay,
|
|
DWORD dwContext, DWORD dwSize,
|
|
DWORD dwPhys, ULONG_PTR dwVirt,
|
|
DWORD dwEvent);
|
|
|
|
typedef struct tagThunkedData
|
|
{
|
|
ULONG_PTR control;
|
|
DWORD ramdac;
|
|
DWORD lpMMReg;
|
|
|
|
// The Mini VDD's DevNode
|
|
DWORD dwDevNode;
|
|
|
|
// Virt. Address of the start of screen memory
|
|
DWORD dwScreenFlatAddr;
|
|
|
|
// Virt. Address of the start of LB memory
|
|
DWORD dwLocalBuffer;
|
|
|
|
// Screen settings
|
|
DWORD dwScreenWidth;
|
|
DWORD dwScreenHeight;
|
|
DWORD cxMemory;
|
|
DWORD cyMemory;
|
|
|
|
// A lookup table for all the Partial Products
|
|
DWORD PPCodes[(MAX_GLINT_PP_WIDTH / 32) + 1];
|
|
|
|
// Memory to remove from the card (for debugging)
|
|
DWORD dwSubMemory;
|
|
|
|
// Virtual address of start of screen
|
|
DWORD dwScreenStart;
|
|
DWORD bPixShift;
|
|
DWORD bBppShift;
|
|
DWORD dwBppMask;
|
|
|
|
// Reset flag
|
|
DWORD bResetMode; // Has the mode been changed?
|
|
DWORD bStartOfDay; // Has the driver just been initialised?
|
|
|
|
DWORD bVFWEnabled; // Is Video For windows currently enabled?
|
|
|
|
DWORD bDDHeapManager; // Using the Linear Heap manager?
|
|
|
|
DWORD dwSetupThisDisplay; // Has this display been intialised (a ref count)?
|
|
|
|
DWORD dwBackBufferCount; // How many back buffers have we handed out on TX at 640x400?
|
|
DWORD EntriesLeft; // Number of entries left in FIFO (for debugging)
|
|
DWORD DMAEntriesLeft; // Number of entries left in DMA buffer (for debugging)
|
|
|
|
DWORD bFlippedSurface; // Has this card had a page flip?
|
|
DWORD ModeChangeCount;
|
|
|
|
// Current pixel format of display
|
|
DDPIXELFORMAT ddpfDisplay;
|
|
|
|
// Shared Display driver memory pointer
|
|
LPGLINTINFO pGLInfo;
|
|
|
|
#ifndef WIN32
|
|
DWORD pGlint;
|
|
#else
|
|
// Pointer to the actual glint registers.
|
|
FPGLREG pGlint;
|
|
#endif
|
|
|
|
// Is this card capable of AGP texturing?
|
|
DWORD bCanAGP;
|
|
|
|
// Flag to tell stretchblits whether to filter.
|
|
DWORD bFilterStretches;
|
|
|
|
// Overlay data
|
|
// This data has to be available at any times, because we are emulating it.
|
|
// Only one overlay at a time supported
|
|
|
|
DWORD bOverlayVisible; // TRUE if the overlay is visible.
|
|
DWORD OverlayDstRectL;
|
|
DWORD OverlayDstRectR;
|
|
DWORD OverlayDstRectT;
|
|
DWORD OverlayDstRectB; // where the overlay is on screen
|
|
DWORD OverlaySrcRectL;
|
|
DWORD OverlaySrcRectR;
|
|
DWORD OverlaySrcRectT;
|
|
DWORD OverlaySrcRectB; // which bit of the overlay is visible
|
|
ULONG_PTR OverlayDstSurfLcl; // the surface overlaid (usually the primary)
|
|
ULONG_PTR OverlaySrcSurfLcl; // the overlay surface
|
|
DWORD OverlayDstColourKey; // the overlaid surface's written-to colour key
|
|
DWORD OverlaySrcColourKey; // the overlay's transparent colour key
|
|
ULONG_PTR OverlayClipRgnMem; // buffer to hold a temporary clip region
|
|
DWORD OverlayClipRgnMemSize; // ...the size of the buffer
|
|
DWORD OverlayUpdateCountdown; // how many flips/unlocks before an update is done.
|
|
DWORD bOverlayFlippedThisVbl; // TRUE if overlay was flipped this VBL.
|
|
DWORD bOverlayUpdatedThisVbl; // TRUE if overlay was updated (not including flips) this VBL.
|
|
struct {
|
|
ULONG_PTR VidMem;
|
|
DWORD Pitch;
|
|
} OverlayTempSurf; // The temporary video buffer used by the overlay.
|
|
|
|
OVERLAYDATA P3Overlay;
|
|
DWORD dwOverlayFiltering; // TRUE if the overlay is filtering.
|
|
DWORD bOverlayPixelDouble; // TRUE if the screen is pixel-doubled.
|
|
|
|
#if W95_DDRAW
|
|
// Colour control variables.
|
|
DWORD ColConBrightness; // Brightness 0->10000, default 0 (ish)
|
|
DWORD ColConContrast; // Contrast 0->20000, default 10000
|
|
DWORD ColConGamma; // Gamma 1->500, default 100
|
|
#endif // W95_DDRAW
|
|
|
|
#if DX7_VIDMEM_VB
|
|
// DrawPrim temporary index buffer.
|
|
ULONG_PTR DrawPrimIndexBufferMem; // Pointer to the buffer.
|
|
DWORD DrawPrimIndexBufferMemSize; // Size of the buffer.
|
|
// DrawPrim temporary vertex buffer.
|
|
ULONG_PTR DrawPrimVertexBufferMem; // Pointer to the buffer.
|
|
DWORD DrawPrimVertexBufferMemSize; // Size of the buffer.
|
|
#endif // DX7_VIDMEM_VB
|
|
|
|
// Current RenderID.
|
|
DWORD dwRenderID;
|
|
// TRUE if the chip's render ID is valid.
|
|
DWORD bRenderIDValid;
|
|
// The RenderIDs of the last two Flips to be
|
|
// put into the DMA/FIFO/pipeline. See Flip32 for further info.
|
|
DWORD dwLastFlipRenderID;
|
|
DWORD dwLastFlipRenderID2;
|
|
|
|
// DirectDraw DMA variables
|
|
__StartDMA StartDMA; // Pointer to the StartDMA function
|
|
DWORD PartitionSize;
|
|
DWORD BufferLocked;
|
|
GLDMABUFF DMAInfo;
|
|
DWORD b2D_FIFOS; // DDRAW using FIFO's?
|
|
|
|
// These buffers hold counts that the driver is using
|
|
// to keep track of operations in the chip
|
|
|
|
#ifdef WIN32
|
|
P3_VERTEXBUFFERINFO* pRootCommandBuffer;
|
|
P3_VERTEXBUFFERINFO* pRootVertexBuffer;
|
|
#else
|
|
DWORD pRootCommandBuffer;
|
|
DWORD pRootVertexBuffer;
|
|
#endif
|
|
|
|
DWORD dwCurrentSequenceID;
|
|
|
|
// HINSTANCE of p3r3dx.dll
|
|
HINSTANCE hInstance;
|
|
|
|
// DirectDraw callbacks
|
|
DDHAL_DDCALLBACKS DDHALCallbacks;
|
|
DDHAL_DDSURFACECALLBACKS DDSurfCallbacks;
|
|
|
|
// D3D Callbacks
|
|
ULONG_PTR lpD3DGlobalDriverData;
|
|
ULONG_PTR lpD3DHALCallbacks;
|
|
ULONG_PTR lpD3DBufCallbacks;
|
|
#if W95_DDRAW
|
|
DDHAL_DDEXEBUFCALLBACKS DDExeBufCallbacks;
|
|
#endif
|
|
|
|
DWORD dwNumTextureFormats;
|
|
DDSURFACEDESC TextureFormats[MAX_TEXTURE_FORMAT];
|
|
|
|
DWORD dwDXVersion;
|
|
|
|
// These have to live here, as we could be running on 2 different cards
|
|
// on two different displays...!
|
|
DWORD pD3DDriverData16;
|
|
DWORD pD3DHALCallbacks16;
|
|
DWORD pD3DHALExecuteCallbacks16;
|
|
|
|
ULONG_PTR pD3DDriverData32;
|
|
ULONG_PTR pD3DHALCallbacks32;
|
|
ULONG_PTR pD3DHALExecuteCallbacks32;
|
|
|
|
// A linear allocator block for the local video heap
|
|
LinearAllocatorInfo LocalVideoHeap0Info;
|
|
LinearAllocatorInfo CachedCommandHeapInfo;
|
|
LinearAllocatorInfo CachedVertexHeapInfo;
|
|
|
|
DWORD dwGARTLin; // Linear address of Base of AGP Memory
|
|
DWORD dwGARTDev; // High Linear address of Base of AGP Memory
|
|
|
|
DWORD dwGARTLinBase; // The base address passed into the updatenonlocalvidmem call
|
|
DWORD dwGARTDevBase; // The base address passsed in
|
|
#if W95_DDRAW
|
|
// The Videoport for this display
|
|
PERMEDIA_VIDEOPORT VidPort;
|
|
|
|
#endif
|
|
|
|
#if WNT_DDRAW
|
|
|
|
#if (_WIN32_WINNT >= 0x500)
|
|
PFND3DPARSEUNKNOWNCOMMAND pD3DParseUnknownCommand;
|
|
#else
|
|
DWORD pD3DParseUnknownCommand;
|
|
#endif
|
|
#else // WNT_DDRAW
|
|
// DirectX 6 Support
|
|
#ifdef WIN32
|
|
//pointer to vertex buffer unknown command processing function
|
|
PFND3DPARSEUNKNOWNCOMMAND pD3DParseUnknownCommand;
|
|
#else
|
|
DWORD pD3DParseUnknownCommand; // ? Safe ?
|
|
#endif // WIN32
|
|
#endif // WNT_DDRAW
|
|
|
|
#if WNT_DDRAW
|
|
PPDEV ppdev; // Pointer to the NT globals
|
|
volatile DWORD * VBlankStatusPtr; // Pointer to VBlank status word (shared with miniport)
|
|
volatile DWORD * bOverlayEnabled; // Pointer to overlay enabled flag (shared with miniport)
|
|
volatile DWORD * bVBLANKUpdateOverlay; // Pointer to overlay update flag
|
|
volatile DWORD * VBLANKUpdateOverlayWidth; // Pointer to overlay width (shared with miniport)
|
|
volatile DWORD * VBLANKUpdateOverlayHeight; // Pointer to overlay height (shared with miniport)
|
|
|
|
#endif // WNT_DDRAW
|
|
|
|
#ifdef WIN32
|
|
HashTable* pDirectDrawLocalsHashTable;
|
|
HashTable* pMocompHashTable;
|
|
#else
|
|
DWORD pDirectDrawLocalsHashTable;
|
|
DWORD pMocompHashTable;
|
|
#endif
|
|
|
|
#ifdef WNT_DDRAW
|
|
DWORD pAGPHeap;
|
|
#else
|
|
#ifdef WIN32
|
|
// Pointer to AGP heap, used for logical texturing
|
|
LPVIDMEM pAGPHeap;
|
|
#endif
|
|
#endif
|
|
|
|
FLIPRECORD flipRecord;
|
|
|
|
DWORD dwFlushLogfile;
|
|
|
|
// HAL info structure. THIS MUST BE THE LAST THING IN THIS STRUCTURE
|
|
DDHALINFO ddhi32;
|
|
|
|
} P3_THUNKEDDATA;
|
|
#endif
|