Leaked source code of windows server 2003
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.
 
 
 
 
 
 

233 lines
8.2 KiB

/******************************Module*Header*********************************\
*
* *******************
* * D3D SAMPLE CODE *
* *******************
*
* Module Name: d3dcntxt.h
*
* Content: D3D Context management related definitions and macros
*
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
\*****************************************************************************/
#ifdef __DCONTEXT
#pragma message ("FILE : "__FILE__" : Multiple inclusion")
#endif
#define __DCONTEXT
#ifndef __SOFTCOPY
#include "d3dsoft.h"
#endif
#ifndef __TEXTURES
#include "d3dtext.h"
#endif
//-----------------------------------------------------------------------------
// Context indexing structure
//-----------------------------------------------------------------------------
#define MAX_CONTEXT_NUM 200
extern UINT_PTR ContextSlots[];
//-----------------------------------------------------------------------------
// Context validation macros
//-----------------------------------------------------------------------------
#define RC_MAGIC_DISABLE 0xd3d00000
#define RC_MAGIC_NO 0xd3d00100
#define IS_D3DCONTEXT_VALID(ptr) \
( ((ptr) != NULL) && ((ptr)->Hdr.MagicNo == RC_MAGIC_NO) )
#define CHK_CONTEXT(pCtxt, retVar, funcname) \
if (!IS_D3DCONTEXT_VALID(pCtxt)) { \
retVar = D3DHAL_CONTEXT_BAD; \
DBG_D3D((0,"Context not valid in %s",funcname)); \
return (DDHAL_DRIVER_HANDLED); \
}
// Defines for the dwDirtyFlags field of our context
#define CONTEXT_DIRTY_ALPHABLEND 2
#define CONTEXT_DIRTY_ZBUFFER 4
#define CONTEXT_DIRTY_TEXTURE 8
#define CONTEXT_DIRTY_MULTITEXTURE 16
#define DIRTY_ALPHABLEND pContext->dwDirtyFlags |= CONTEXT_DIRTY_ALPHABLEND;
#define DIRTY_TEXTURE pContext->dwDirtyFlags |= CONTEXT_DIRTY_TEXTURE;
#define DIRTY_ZBUFFER pContext->dwDirtyFlags |= CONTEXT_DIRTY_ZBUFFER;
#define DIRTY_MULTITEXTURE pContext->dwDirtyFlags |= CONTEXT_DIRTY_MULTITEXTURE;
//-----------------------------------------------------------------------------
// Context rendering state tracking
//-----------------------------------------------------------------------------
// Flags to keep track of various rendering states or conditions in a D3D context
// these are tracked in the Hdr.Flags field
#define CTXT_HAS_GOURAUD_ENABLED (1 << 0)
#define CTXT_HAS_ZBUFFER_ENABLED (1 << 1)
#define CTXT_HAS_SPECULAR_ENABLED (1 << 2)
#define CTXT_HAS_FOGGING_ENABLED (1 << 3)
#define CTXT_HAS_PERSPECTIVE_ENABLED (1 << 4)
#define CTXT_HAS_TEXTURE_ENABLED (1 << 5)
#define CTXT_HAS_ALPHABLEND_ENABLED (1 << 6)
#define CTXT_HAS_MONO_ENABLED (1 << 7)
#define CTXT_HAS_WRAPU_ENABLED (1 << 8)
#define CTXT_HAS_WRAPV_ENABLED (1 << 9)
// Use the alpha value to calculate a stipple pattern
#define CTXT_HAS_ALPHASTIPPLE_ENABLED (1 << 10)
#define CTXT_HAS_ZWRITE_ENABLED (1 << 11)
// Enable last point on lines
#define CTXT_HAS_LASTPIXEL_ENABLED (1 << 12)
#if D3D_STATEBLOCKS
//-----------------------------------------------------------------------------
// State sets structure definitions
//-----------------------------------------------------------------------------
#define FLAG DWORD
#define FLAG_SIZE (8*sizeof(DWORD))
typedef struct _P2StateSetRec {
DWORD dwHandle;
DWORD bCompressed;
union {
struct {
// Stored state block info (uncompressed)
DWORD RenderStates[MAX_STATE];
DWORD TssStates[D3DTSS_TEXTURETRANSFORMFLAGS+1];
FLAG bStoredRS[(MAX_STATE + FLAG_SIZE)/ FLAG_SIZE];
FLAG bStoredTSS[(D3DTSS_TEXTURETRANSFORMFLAGS + FLAG_SIZE) / FLAG_SIZE];
} uc;
struct {
// Stored state block info (compressed)
DWORD dwNumRS;
DWORD dwNumTSS;
struct {
DWORD dwType;
DWORD dwValue;
} pair[1];
} cc;
} u;
} P2StateSetRec;
#define SSPTRS_PERPAGE (4096/sizeof(P2StateSetRec *))
#define FLAG_SET(flag, number) \
flag[ (number) / FLAG_SIZE ] |= (1 << ((number) % FLAG_SIZE))
#define IS_FLAG_SET(flag, number) \
(flag[ (number) / FLAG_SIZE ] & (1 << ((number) % FLAG_SIZE) ))
#endif //D3D_STATEBLOCKS
//-----------------------------------------------------------------------------
// Context structure definitions
//-----------------------------------------------------------------------------
typedef struct _D3DContextHeader {
unsigned long MagicNo; // Magic number to verify validity of pointer
UINT_PTR pSelf; // 32 Bit pointer to this structure
unsigned long Flags;
unsigned long FillMode;
// Software copy of Registers for permedia
__P2RegsSoftwareCopy SoftCopyP2Regs;
} D3DCONTEXTHEADER;
typedef struct _TextureCacheManager *PTextureCacheManager;
typedef struct _permedia_d3dcontext {
// The magic number MUST come at the start of the structure
D3DCONTEXTHEADER Hdr;
// Stored surface info
UINT_PTR RenderSurfaceHandle;
UINT_PTR ZBufferHandle;
ULONG ulPackedPP;
// handle on Permedia register state context
P2CtxtPtr hPermediaContext;
PPDev ppdev; // The card we are running on.
BOOL bCanChromaKey;
// Stippling state
BOOL bKeptStipple;
DWORD LastAlpha;
BYTE CurrentStipple[8];
DWORD RenderCommand;
DWORD RenderStates[MAX_STATE];
DWORD TssStates[D3DTSS_TEXTURETRANSFORMFLAGS+1]; // D3D DX6 TSS States
DWORD dwWrap[8]; // D3D DX6 Wrap flags
DWORD dwDirtyFlags;
// Texture filtering modes
BOOL bMagFilter; // Filter the magnified textures
BOOL bMinFilter; // Filter the minified textures
// Misc. state
D3DCULL CullMode;
DWORD FakeBlendNum;
D3DStateSet overrides; // To overide states in rendering
// Texture data & sizes (for Permedia setup) of our CurrentTextureHandle
FLOAT DeltaHeightScale;
FLOAT DeltaWidthScale;
DWORD MaxTextureXi;
FLOAT MaxTextureXf;
DWORD MaxTextureYi;
FLOAT MaxTextureYf;
DWORD CurrentTextureHandle;
//@@BEGIN_DDKSPLIT
#if D3D_POINTSPRITES
// Point sprite support
BOOL bPointSpriteEnabled;
FLOAT fPointSize;
#endif // D3D_POINTSPRITES
//@@END_DDKSPLIT
#if D3D_STATEBLOCKS
BOOL bStateRecMode; // Toggle for executing or recording states
P2StateSetRec *pCurrSS; // Ptr to SS currently being recorded
P2StateSetRec **pIndexTableSS; // Pointer to table of indexes
DWORD dwMaxSSIndex; // size of table of indexes
#endif
DWORD PixelOffset; // Offset in pixels to start of the rendering buffer
DWORD LowerChromaColor; // Last lower bound chroma key for this context
DWORD UpperChromaColor; // Last upper bound chroma key for this context
PTextureCacheManager pTextureManager;
LPDWLIST pHandleList;
LPVOID pDDLcl; // Local surface pointer used as a ID
} PERMEDIA_D3DCONTEXT ;
//-----------------------------------------------------------------------------
// Context switching
//-----------------------------------------------------------------------------
// Code to do a context switch. If we aren't DMAing we need to resend the
// registers on each context switch to work around the Permedia bug. In the
// DMA case, these registers will be inserted at the start of the buffer.
#define SET_CURRENT_D3D_CONTEXT(ctxt) \
if(ctxt != ppdev->permediaInfo->pCurrentCtxt) \
{ \
P2SwitchContext(ppdev, ctxt); \
}
HRESULT
SetupPermediaRenderTarget(PERMEDIA_D3DCONTEXT* pContext);