📄 span.h
字号:
//----------------------------------------------------------------------------
//
// span.h
//
// Structures which define the interface between the edge walker to the
// span interpolator.
//
// Copyright (C) Microsoft Corporation, 1997.
//
//----------------------------------------------------------------------------
#ifndef _SPAN_H_
#define _SPAN_H_
#include <d3ditype.h>
#include <d3dhal.h>
#ifdef __cplusplus
extern "C" {
#endif
// TBD make this machine independent
// don't leave any space between the elements of these structures
// currently smallest element is a UINT16, may have to change this to pack(1)
// if UINT8's are used.
#include <pshpack2.h>
// Limits, shifts and scaling factors for RASTSPAN and RASTPRIM data.
// C_*_LIMIT is the constant integer form of the limit for cases where
// direct integer comparisons can be done.
#define Z_LIMIT g_fTwoPow31
#define C_Z_LIMIT 0x4f000000
#define Z16_FRAC_SHIFT 15
#define Z16_FRAC_SCALE g_fTwoPow15
#define OO_Z16_FRAC_SCALE g_fOoTwoPow15
#define Z16_SHIFT 31
#define Z16_SCALE g_fNearTwoPow31
#define OO_Z16_SCALE g_fOoNearTwoPow31
#define Z32_FRAC_SHIFT 0
#define Z32_FRAC_SCALE g_fOne
#define OO_Z32_FRAC_SCALE g_fOoNearTwoPow31
#define Z32_SHIFT 31
#define Z32_SCALE g_fNearTwoPow31
#define OO_Z32_SCALE g_fOoNearTwoPow31
#define TEX_LIMIT g_fTwoPow31
#define C_TEX_LIMIT 0x4f000000
#define TEX_SHIFT 20
#define TEX_SCALE g_fTwoPow20
#define OO_TEX_SCALE g_fOoTwoPow20
#define COLOR_LIMIT g_fTwoPow15
#define C_COLOR_LIMIT 0x47000000
#define COLOR_SHIFT 8
#define COLOR_SCALE g_fTwoPow8
#define INDEX_COLOR_LIMIT g_fTwoPow30
#define C_INDEX_COLOR_LIMIT 0x4e800000
#define INDEX_COLOR_SHIFT 16
#define INDEX_COLOR_SCALE g_fTwoPow16
#define INDEX_COLOR_VERTEX_SHIFT 8
// Shift to go from fixed-point value in vertex color to proper shift.
#define INDEX_COLOR_FIXED_SHIFT (INDEX_COLOR_SHIFT - INDEX_COLOR_VERTEX_SHIFT)
#define LOD_LIMIT g_fTwoPow15
#define C_LOD_LIMIT 0x47000000
#define LOD_SHIFT 11
#define LOD_SCALE g_fTwoPow11
#define LOD_MIN (-15)
#define OOW_LIMIT g_fTwoPow31
#define C_OOW_LIMIT 0x4f000000
#define OOW_SHIFT 31
#define OOW_SCALE g_fNearTwoPow31
#define OO_OOW_SCALE g_fOoNearTwoPow31
#define W_SHIFT 16
#define W_SCALE g_fTwoPow16
#define OO_W_SCALE g_fOoTwoPow16
#define OOW_W_SHIFT (OOW_SHIFT + W_SHIFT)
#define OOW_W_SCALE g_fTwoPow47
#define FOG_LIMIT g_fTwoPow15
#define C_FOG_LIMIT 0x47000000
#define FOG_SHIFT 8
#define FOG_SCALE g_fTwoPow8
#define FOG_ONE_SCALE g_fTwoPow16
#define FOG_255_SCALE g_fTwoPow8
#define TEX_FINAL_SHIFT 16
#define TEX_FINAL_FRAC_MASK (0xffff)
#define TEX_TO_FINAL_SHIFT (TEX_SHIFT - TEX_FINAL_SHIFT)
// Multiply with span W so that [U|V]oW times resulting W is in the
// final shift position. 1 / (W_SHIFT + TEX_TO_FINAL_SHIFT).
#define TEX_UVW_TO_FINAL_SCALE g_fOoTwoPow20
// Divide by span OoW so that [U|V]oW times resulting W is in the
// final shift position. OOW_SHIFT - TEX_TO_FINAL_SHIFT.
#define TEX_OOW_TO_FINAL_SCALE g_fTwoPow27
#define RAST_DIRTYBITS_SIZE ((D3DHAL_MAX_RSTATES_AND_STAGES >> 3) + 1)
/*
* Macro to compute D3DRENDERSTATE offset for a particular per-stage state.
* It's moved here after texture3 removal.
*/
#define D3DHAL_TSS_OFFSET( _Stage, _State ) \
((D3DRENDERSTATETYPE) \
(D3DHAL_TSS_RENDERSTATEBASE + \
((_Stage) * D3DHAL_TSS_STATESPERSTAGE) + (_State)))
/*
* Convenience texture map offsets for stages.
*/
#define D3DHAL_TSS_TEXTUREMAP0 D3DHAL_TSS_OFFSET(0, D3DTSS_TEXTUREMAP)
#define D3DHAL_TSS_TEXTUREMAP1 D3DHAL_TSS_OFFSET(1, D3DTSS_TEXTUREMAP)
#define D3DHAL_TSS_TEXTUREMAP2 D3DHAL_TSS_OFFSET(2, D3DTSS_TEXTUREMAP)
#define D3DHAL_TSS_TEXTUREMAP3 D3DHAL_TSS_OFFSET(3, D3DTSS_TEXTUREMAP)
#define D3DHAL_TSS_TEXTUREMAP4 D3DHAL_TSS_OFFSET(4, D3DTSS_TEXTUREMAP)
#define D3DHAL_TSS_TEXTUREMAP5 D3DHAL_TSS_OFFSET(5, D3DTSS_TEXTUREMAP)
#define D3DHAL_TSS_TEXTUREMAP6 D3DHAL_TSS_OFFSET(6, D3DTSS_TEXTUREMAP)
#define D3DHAL_TSS_TEXTUREMAP7 D3DHAL_TSS_OFFSET(7, D3DTSS_TEXTUREMAP)
// General per span data. This structure is designed to be qword aligned.
typedef struct tagD3DI_RASTSPAN
{
// Space separated things are quad words and are intended to be
// quad word aligned.
UINT16 uPix; // count of pixels to render
INT16 iDFog; // 1.7.8 delta fog
UINT16 uX; // 16.0 start X
UINT16 uY; // 16.0 start Y
INT16 iLOD; // 1.4.11 start LOD
INT16 iDLOD; // 1.4.11 delta LOD (so piecewise linear LOD interp
// is possible)
union
{
UINT32 uZ; // 16.15 start Z
FLOAT fZ;
};
// If texture stuff (iOoW, iUoW1, etc.) is 32 bits (even if we iterate
// them at 16 bits under MMX sometimes)
union
{
INT32 iW; // 1.15.16 first inverted W of span
FLOAT fW;
};
union
{
INT32 iOoW; // 1.31 start 1/W (signed since they are target
// of MMX multiply)
FLOAT fOoW;
};
union
{
INT32 iUoW1; // 1.11.20 first texture coordinates
FLOAT fUoW1;
};
union
{
INT32 iVoW1; // 1.11.20 first texture coordinates
FLOAT fVoW1;
};
union
{
struct
{
UINT16 uB, uG, uR, uA; // 8.8 start colors
};
struct
{
INT32 iIdx, iIdxA; // 1.8.16 ramp start color and alpha
};
};
UINT16 uBS, uGS, uRS; // 8.8 start specular colors
// Specular alpha is fog. This prevents specular color from
// being unioned with the texture 2 coordinates below.
UINT16 uFog; // 1.7.8 start fog value
union
{
INT32 iUoW2; // 1.11.20 second texture coordinates
FLOAT fUoW2;
};
union
{
INT32 iVoW2; // 1.11.20 second texture coordinates
FLOAT fVoW2;
};
// Pointers into surface and Z buffers interpolated by the edge walker.
PUINT8 pSurface;
PUINT8 pZ;
} D3DI_RASTSPAN, *PD3DI_RASTSPAN; // sizeof(D3DI_RASTSPAN) == 64
typedef CONST D3DI_RASTSPAN *PCD3DI_RASTSPAN;
// D3DI_RASTPRIM uFlags
#define D3DI_RASTPRIM_X_DEC (0x00000001L) // Else X increments.
// General per primitive for edge walking and span scanning.
// Can be expanded to suit the edge walker.
// The information the span rasterizer needs is sensitive to qwords for
// the MMX rasterizers.
typedef struct tagD3DI_RASTPRIM
{
UINT32 uFlags;
UINT16 uSpans; // count of spans
UINT16 uResvd1; // perhaps we want to expand uSpans to 32 bits,
// or perhaps 16 flag bits are enough
// X gradients
union
{
INT32 iDZDX; // 1.16.15
FLOAT fDZDX;
};
union
{
INT32 iDOoWDX; // 1.31
FLOAT fDOoWDX;
};
union
{
INT32 iDUoW1DX; // 1.11.20
FLOAT fDUoW1DX;
};
union
{
INT32 iDVoW1DX; // 1.11.20
FLOAT fDVoW1DX;
};
union
{
struct
{
INT16 iDBDX, iDGDX, iDRDX, iDADX; // 1.7.8
};
struct
{
FLOAT fDBDX, fDGDX, fDRDX, fDADX;
};
struct
{
INT32 iDIdxDX, iDIdxADX; // 1.8.16
};
};
struct
{
union
{
struct
{
INT16 iDBSDX, iDGSDX, iDRSDX; // 1.7.8
};
struct
{
FLOAT fDBSDX, fDGSDX, fDRSDX;
FLOAT fPad; // Padding to keep this set of attributes
// an even multiple of quadwords.
};
};
};
struct
{
union
{
INT32 iDUoW2DX; // 1.11.20
FLOAT fDUoW2DX;
};
union
{
INT32 iDVoW2DX; // 1.11.20
FLOAT fDVoW2DX;
};
};
// Y gradients for some attributes so that span routines
// can do per-pixel mipmapping.
union
{
INT32 iDUoW1DY; // 1.11.20
FLOAT fDUoW1DY;
};
union
{
INT32 iDVoW1DY; // 1.11.20
FLOAT fDVoW1DY;
};
union
{
INT32 iDUoW2DY; // 1.11.20
FLOAT fDUoW2DY;
};
union
{
INT32 iDVoW2DY; // 1.11.20
FLOAT fDVoW2DY;
};
union
{
INT32 iDOoWDY; // 1.31
FLOAT fDOoWDY;
};
struct tagD3DI_RASTPRIM *pNext;
// Pad to an even multiple of 32 bytes for cache alignment.
DWORD uPad[2];
// Anything else needed
} D3DI_RASTPRIM, *PD3DI_RASTPRIM;
typedef CONST D3DI_RASTPRIM *PCD3DI_RASTPRIM;
// D3DI_SPANTEX uFlags
#define D3DI_SPANTEX_HAS_TRANSPARENT (0x00000001L)
#define D3DI_SPANTEX_SURFACES_LOCKED (0x00000002L)
#define D3DI_SPANTEX_MAXMIPLEVELS_DIRTY (0x00000004L)
// Palette with alpha
#define D3DI_SPANTEX_ALPHAPALETTE (0x00000008L)
// D3DI_SPANTEX uFormat - NOTE: these enumerations match the sequence in the
// array of DDPIXELFORMAT structures defined for matching in texture creation
//
// NOTE: these must be kept consistent with the RRPixelFormats for the reference rasterizer
typedef enum _D3DI_SPANTEX_FORMAT
{
D3DI_SPTFMT_NULL = 0,
D3DI_SPTFMT_B8G8R8 = 1,
D3DI_SPTFMT_B8G8R8A8 = 2,
D3DI_SPTFMT_B8G8R8X8 = 3,
D3DI_SPTFMT_B5G6R5 = 4,
D3DI_SPTFMT_B5G5R5 = 5,
D3DI_SPTFMT_PALETTE4 = 6,
D3DI_SPTFMT_PALETTE8 = 7,
D3DI_SPTFMT_B5G5R5A1 = 8,
D3DI_SPTFMT_B4G4R4 = 9,
D3DI_SPTFMT_B4G4R4A4 =10,
D3DI_SPTFMT_L8 =11, /* 8 bit luminance-only */
D3DI_SPTFMT_L8A8 =12, /* 16 bit alpha-luminance */
D3DI_SPTFMT_U8V8 =13, /* 16 bit bump map format */
D3DI_SPTFMT_U5V5L6 =14, /* 16 bit bump map format with luminance */
D3DI_SPTFMT_U8V8L8 =15, /* 24 bit bump map format with luminance */
D3DI_SPTFMT_UYVY =16, /* UYVY format for PC98 compliance */
D3DI_SPTFMT_YUY2 =17, /* YUY2 format for PC98 compliance */
D3DI_SPTFMT_DXT1 =18, /* S3 texture compression technique 1 */
D3DI_SPTFMT_DXT2 =19, /* S3 texture compression technique 2 */
D3DI_SPTFMT_DXT3 =20, /* S3 texture compression technique 3 */
D3DI_SPTFMT_DXT4 =21, /* S3 texture compression technique 4 */
D3DI_SPTFMT_DXT5 =22, /* S3 texture compression technique 5 */
D3DI_SPTFMT_B2G3R3 =23, /* 8 bit RGB texture format */
D3DI_SPTFMT_Z16S0 =32,
D3DI_SPTFMT_Z24S8 =33,
D3DI_SPTFMT_Z15S1 =34,
D3DI_SPTFMT_Z32S0 =35,
D3DI_SPTFMT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */
} D3DI_SPANTEX_FORMAT;
// This encompasses all needed info about a chain of DD surfaces being used
// as a potentially mipmapped texture.
#define SPANTEX_MAXCLOD 11 // up to 2kx2k texture, all we can do with MMX INT16
// U's and V's
typedef struct tagD3DI_SPANTEX
{
UINT32 dwSize;
INT32 iGeneration; // incremented when the texture changes
UINT32 uFlags; // perspective, etc.
D3DI_SPANTEX_FORMAT Format; // pixel format of the texture
D3DTEXTUREADDRESS TexAddrU, TexAddrV; // texture address mode
D3DTEXTUREMAGFILTER uMagFilter;// TEX3 style filter information
D3DTEXTUREMINFILTER uMinFilter;// BUGBUG we could express this information more compactly
D3DTEXTUREMIPFILTER uMipFilter;
D3DCOLOR BorderColor; // border color for the texture
// (for D3DTADDRESS_BORDER)
D3DCOLOR TransparentColor; // color key on texture read
FLOAT fLODBias; // Texture3 LOD bias value.
PUINT8 pBits[SPANTEX_MAXCLOD]; // pointer for each LOD
#if (SPANTEX_MAXCLOD & 1) != 0
// Pad following fields to a DWORD boundary.
INT16 iPitchPad;
#endif
PUINT32 pRampmap; // set by ramp rasterizer, if necessary
PUINT32 pPalette; // pointer to palette, if necessary
INT32 iPaletteSize; // size of palette
INT32 cLOD; // contains count of levels - 1 (0 means 1 level)
// to use
INT32 cLODTex; // contains count of levels - 1 (0 means 1 level)
// that are actually in the texture
// cLODTex >= cLOD is always true
INT32 iMaxMipLevel; // index of largest mip map to use. 0 means use largest.
INT iMaxScaledLOD; // ((cLOD + 1) scaled by LOD_SCALE) - 1.
INT16 iSizeU, iSizeV; // LOD 0 size (only support power of 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -