📄 span.h
字号:
// textures)
INT16 iShiftU, iShiftV; // LOD 0 log2 size (valid for power-of-2
// size only)
INT16 iShiftPitch[SPANTEX_MAXCLOD]; // log2 pitch for each LOD
UINT16 uMaskU, uMaskV; // LOD 0 (1<<log2(size))-1
// Variables for arithmetic address computation. Computed by DoTexAddrSetup.
INT16 iFlipMaskU, iFlipMaskV;
INT16 iClampMinU, iClampMinV;
INT16 iClampMaxU, iClampMaxV;
INT16 iClampEnU, iClampEnV;
LPDIRECTDRAWSURFACE pSurf[SPANTEX_MAXCLOD]; // Added for TextureGetSurf
// and Lock/Unlock Texture
} D3DI_SPANTEX, *PD3DI_SPANTEX;
// Color structure for blending etc. with enough room for 8.8 colors.
// Even for 8 bit colors, this is convenient for lining up the colors
// as we desire in MMX for 16 bit multiplies
typedef struct tagD3DI_RASTCOLOR
{
UINT16 uB, uG, uR, uA;
} D3DI_RASTCOLOR, *PD3DI_RASTCOLOR;
// This structure has all the temporary storage needed for all the iterated
// values to route the span information between the layers.
// TBD there is lots more to add here, do texture mapping first
typedef struct tagD3DI_SPANITER
{
// make the colors use the same order as RASTCOLOR above
UINT16 uBB, uBG, uBR, uBA; // 8.8 blended color
UINT16 uFogB, uFogG, uFogR, uFog; // 8.8 fog color, 0.16 fog value
INT16 iFogBDX, iFogGDX, iFogRDX, iDFog; // 1.7.8 fog color deltas
UINT32 uZDeferred; // storage for Z for deferred Z write
union
{
INT32 iU1; // 1.15.16
FLOAT fU1;
};
union
{
INT32 iV1; // 1.15.16
FLOAT fV1;
};
union
{
INT32 iU2; // 1.15.16
FLOAT fU2;
};
union
{
INT32 iV2; // 1.15.16
FLOAT fV2;
};
D3DCOLOR TexCol[2]; // [Texture]
INT32 iDW; // to remember last delta W in
UINT16 uDitherOffset;
INT16 iXStep; // 1 or -1
INT16 iSpecialW; // negative for first or last 3 pixels of span
INT16 bStencilPass; // 1 if stencil test passed, otherwise 0
union
{
INT32 iOoW; // previous OoW to pass between texaddr stages
FLOAT fOoW;
};
} D3DI_SPANITER, *PD3DI_SPANITER;
// Z compare macro
// This does depend on the result of a compare being 0 or 1 (for the final XOR, since C
// doesn't have a logical XOR), but this has been true on all processors and
// compilers for some time.
#define ZCMP16(p, g, b) \
((((((INT32)(g) - (INT32)(b)) & (p)->iZAndMask) - (p)->iZNeg) >= 0) ^ (p)->iZXorMask)
// Assumes the most significant bit of Z is 0 (31 bit Z)
#define ZCMP32(p, g, b) \
((((((INT32)(g) - (INT32)(b)) & (p)->iZAndMask) - (p)->iZNeg) >= 0) ^ (p)->iZXorMask)
// Alpha Test compare macro
#define ACMP(p, g, b) \
((((((INT32)(g) - (INT32)(b)) & (p)->iAAndMask) - (p)->iANeg) >= 0) ^ (p)->iAXorMask)
// Stencil Test compare macro
#define SCMP(p, g, b) \
((((((INT32)(g) - (INT32)(b)) & (p)->iSAndMask) - (p)->iSNeg) >= 0) ^ (p)->iSXorMask)
// Helper macro that converts [0, 0xff] to [0, 5], linearly
#define RGB8_CHANNEL(rgb) ((((rgb) * 5) + 0x80) >> 8)
// Defines conversion from 24 bit RGB to 8 bit palette index. Each color has 6 values
// resulting in 6**3 == 216 required colors in the palette.
#define MAKE_RGB8(r, g, b) (RGB8_CHANNEL(r) * 36 \
+ RGB8_CHANNEL(g) * 6 \
+ RGB8_CHANNEL(b))
// forward declaration of D3DI_RASTCTX
struct tagD3DI_RASTCTX;
typedef struct tagD3DI_RASTCTX D3DI_RASTCTX;
typedef struct tagD3DI_RASTCTX *PD3DI_RASTCTX;
typedef CONST struct tagD3DI_RASTCTX *PCD3DI_RASTCTX;
// typedef for each rendering layer
// note that the RASTCTX is changed because of the D3DI_SPANITER values
typedef void (CDECL *PFNSPANLAYER)(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP,
PD3DI_RASTSPAN pS);
// typedef texture read functions
// this is an actual function so it can be called multiple times
// note that the RASTCTX is changed because of the D3DI_SPANITER values
typedef D3DCOLOR (CDECL *PFNTEXREAD)(INT32 iU, INT32 iV, INT32 iShiftU,
PUINT8 pBits, PD3DI_SPANTEX pTex);
// Typedef for span rendering function pointers.
typedef HRESULT (CDECL *PFNRENDERSPANS)(PD3DI_RASTCTX pCtx);
// typedef for alpha blending functions.
typedef void (CDECL *PFNBLENDFUNC)(PUINT16 pR, PUINT16 pG, PUINT16 pB,
PUINT16 pA, D3DCOLOR DestC,
PD3DI_RASTCTX pCtx);
// typedef for buffer read functions.
typedef D3DCOLOR (CDECL *PFNBUFREAD)(PUINT8 pBits);
// typedef for texture blend get functions.
typedef void (CDECL *PFNTEXBLENDGET)(PD3DI_RASTCOLOR pArg1,
PD3DI_RASTCOLOR pArg2,
PD3DI_RASTCOLOR pInput,
PD3DI_RASTCTX pCtx, PD3DI_RASTSPAN pS,
INT32 iTex);
// typedef for texture blend get functions.
typedef void (CDECL *PFNTEXBLENDOP)(PD3DI_RASTCOLOR pOut,
PD3DI_RASTCOLOR pArg1,
PD3DI_RASTCOLOR pArg2,
PD3DI_RASTCTX pCtx, PD3DI_RASTSPAN pS,
INT32 iTex);
// Prototype for set of bead selections.
typedef enum tagD3DI_BEADSET
{
D3DIBS_CMMX = 1, // C emulation of MMX beads
D3DIBS_MMX = 2, // MMX beads
D3DIBS_C = 3, // C beads
D3DIBS_RAMP = 4, // Ramp beads
D3DIBS_MMXASRGB = 5, // MMX selected for RGB rasterizer
} D3DI_BEADSET;
// General span scanning context
struct tagD3DI_RASTCTX
{
UINT32 dwSize;
//////////////////////////////////////////////////////////////////////
// Temporary storage for span rendering routines. Could be global.
// Not set by caller, and not changed by SpanInit.
//
D3DI_SPANITER SI;
//////////////////////////////////////////////////////////////////////
// Data that must be set by caller before a SpanInit.
//
// we may want to put a pointer to a DDSURFACEDESC or something like it
// instead of this
PUINT8 pSurfaceBits;
INT iSurfaceStride;
INT iSurfaceStep;
INT iSurfaceBitCount;
INT iSurfaceType; // or however we end up expressing this
PUINT32 pRampMap; // pointer to ramp map, if necessary
LPDIRECTDRAWSURFACE pDDS;
PUINT8 pZBits;
INT iZStride;
INT iZStep;
INT iZBitCount;
LPDIRECTDRAWSURFACE pDDSZ;
// Clip area.
RECT Clip;
// Sign of face area that should be culled. Zero is clockwise,
// one is CCW and everything else means no culling.
UINT uCullFaceSign;
union
{
DWORD pdwRenderState[D3DHAL_MAX_RSTATES_AND_STAGES];
FLOAT pfRenderState[D3DHAL_MAX_RSTATES_AND_STAGES];
};
// Since we are adjusting the order of texIdx in the vertex to suit that
// defined in state TEXCOORDINDEX, we need a copy of adjusted WRAP state.
// This is declared immediately after pdwRenderState so that we can share
// a register with it in the assembly code.
// WARNING WARNING - THIS ABSOLUTELY NEEDS TO BE FOLLOWING pdwRenderState
// IMMEDIATELY. ASM CODE DEPENDS ON THIS.
DWORD pdwWrap[2];
// first texture object contains information for texture for first pair
// of texture coordinates, second contains texture for second pair of
// texture coordinates, etc.
PD3DI_SPANTEX pTexture[2];
// Number of active textures. 0 - texture off; 1 - pTexture[0] is valid
// 2 - both pTexture[0] and pTexture[1] are valid
UINT cActTex;
// Dirty bits for render states.
// BUGBUG - We can reduce the size to have one bit for each group of
// states when we implement the light weighted beed chooser.
// Right now, it's set by SetRenderState and cleared after SpanInit is
// called. The bit corresponding to D3DHAL_MAX_RSTATES_AND_STAGES is set
// whenever a state is changed.
UINT8 StatesDirtyBits[RAST_DIRTYBITS_SIZE];
#if (RAST_DIRTYBITS_SIZE & 1) != 0
// Pad following fields to a DWORD boundary.
INT8 StatesDirtyBitsPad0;
#endif
#if (RAST_DIRTYBITS_SIZE & 2) != 0
// Pad following fields to a DWORD boundary.
INT16 StatesDirtyBitsPad1;
#endif
// Version# of the D3DDevice corresponding to this Context
UINT32 uDevVer;
//////////////////////////////////////////////////////////////////////
// Data is set by SpanInit given the input above.
//
// Span rendering entry point.
PFNRENDERSPANS pfnRenderSpans;
// function pointers for the beads
PFNSPANLAYER pfnBegin;
PFNSPANLAYER pfnLoopEnd;
PFNSPANLAYER pfnTestPassEnd;
PFNSPANLAYER pfnTestFailEnd;
PFNSPANLAYER pfnTex1AddrEnd;
PFNTEXREAD pfnTexRead[2];
PFNSPANLAYER pfnTex2AddrEnd;
PFNSPANLAYER pfnTexBlendEnd;
PFNTEXBLENDGET pfnTexBlendGetColor[2];
PFNTEXBLENDGET pfnTexBlendGetAlpha[2];
PFNTEXBLENDOP pfnTexBlendOpColor[2];
PFNTEXBLENDOP pfnTexBlendOpAlpha[2];
PFNSPANLAYER pfnColorGenEnd;
PFNSPANLAYER pfnAlphaTestPassEnd;
PFNSPANLAYER pfnAlphaTestFailEnd;
PFNBLENDFUNC pfnSrcBlend;
PFNBLENDFUNC pfnDestBlend;
PFNBUFREAD pfnBufRead;
PFNSPANLAYER pfnColorBlendEnd;
// Optional bead that can be called after every pixel for rasterizers
// which loop beads rather than returning.
PFNSPANLAYER pfnPixelEnd;
// Optional bead that can be called after every span for rasterizers
// which loop spans rather than returning.
PFNSPANLAYER pfnSpanEnd;
// arithmetic Z variables
INT32 iZAndMask, iZNeg, iZXorMask;
// arithmetic Alpha test variables. These could be 16 bits, if we ever really want
// to save space
INT32 iAAndMask, iANeg, iAXorMask;
// 8.8 Alpha reference value
INT32 iARef;
// arithmetic stencil test variables. These could be 16 bits, if we ever really want
// to save space
INT32 iSAndMask, iSNeg, iSXorMask;
// Pointer to first RASTPRIM.
PD3DI_RASTPRIM pPrim;
// Pointer to next context.
PD3DI_RASTCTX pNext;
// Current BeadTable to use
D3DI_BEADSET BeadSet;
// Bit 0 set disables ml1, etc.
#define MMX_FP_DISABLE_MASK_NUM 1
DWORD dwMMXFPDisableMask[MMX_FP_DISABLE_MASK_NUM];
// RampLightingDriver, should be NULL except for RampRast and 8 bit palettized RGB
// output surface cases.
LPVOID pRampDrv;
// RAMP_RANGE_INFO RampInfo;
DWORD RampBase;
DWORD RampSize;
PUINT32 pTexRampMap;
BOOL bRampSpecular;
#ifdef DBG
#define NAME_LEN 128
char szTest[NAME_LEN];
char szTestFail[NAME_LEN];
char szTex1Addr[NAME_LEN];
char szTexRead[2][NAME_LEN];
char szTex2Addr[NAME_LEN];
char szTexBlend[NAME_LEN];
char szColorGen[NAME_LEN];
char szAlphaTest[NAME_LEN];
char szColorBlend[NAME_LEN];
char szSrcBlend[NAME_LEN];
char szDestBlend[NAME_LEN];
char szBufRead[NAME_LEN];
char szBufWrite[NAME_LEN];
#undef NAME_LEN
#endif
};
// Data passed to the span rendering functions looks like this:
//
// RASTCTX
// |-> RASTPRIM
// | | RASTSPAN
// | | RASTSPAN (as many as RASTPRIM.uSpans says there are)
// | RASTPRIM
// | | RASTSPAN
// | NULL
// RASTCTX
// |-> RASTPRIM
// | | RASTSPAN
// | NULL
// NULL
//
// The given RASTCTX is the head of a list of contexts. Each context
// points to a list of RASTPRIMs. Each RASTPRIM structure is immediately
// followed by RASTPRIM.uSpans RASTSPAN structures.
// Prototype for state validation call.
HRESULT SpanInit(PD3DI_RASTCTX pCtx);
// This is used to pack a FVF vertex into one understand by OptRast so it
// does not need to figure out where to get the data it needs. This struct
// can be modified to accommodate more data and it can be broken into more
// specilized and smalled structs.
// Right now, it is an extension of D3DTLVERTEX, and the extra uv is at the
// very end so that OptRast can treat it as a D3DTLVERTEX if only the first
// part of the data needs to be accessed.
typedef struct _RAST_GENERIC_VERTEX {
union {
D3DVALUE sx; /* Screen coordinates */
D3DVALUE dvSX;
};
union {
D3DVALUE sy;
D3DVALUE dvSY;
};
union {
D3DVALUE sz;
D3DVALUE dvSZ;
};
union {
D3DVALUE rhw; /* Reciprocal of homogeneous w */
D3DVALUE dvRHW;
};
union {
D3DCOLOR color; /* Vertex color */
D3DCOLOR dcColor;
};
union {
D3DCOLOR specular; /* Specular component of vertex */
D3DCOLOR dcSpecular;
};
union {
D3DVALUE tu; /* Texture coordinates */
D3DVALUE dvTU;
};
union {
D3DVALUE tv;
D3DVALUE dvTV;
};
union {
D3DVALUE tu2; /* second Texture coordinates */
D3DVALUE dvTU2;
};
union {
D3DVALUE tv2;
D3DVALUE dvTV2;
};
}RAST_GENERIC_VERTEX, *PRAST_GENERIC_VERTEX;
// Vertex types supported by OptRast
typedef enum _RAST_VERTEX_TYPE
{
RAST_TLVERTEX = 1, /* (Legacy) TL vertex */
RAST_GENVERTEX = 2, /* Generic FVF vertex */
RAST_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */
}RAST_VERTEX_TYPE;
#include <poppack.h>
#ifdef __cplusplus
}
#endif
#endif // _SPAN_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -