Source code of Windows XP (NT5)
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.
|
|
/*==========================================================================
* * Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. * * File: vvm.h * Content: Virtual Vertex Machine declarations * * ***************************************************************************/ #ifndef __VVM_H__
#define __VVM_H__
#include "d3dhalp.h"
class CVShaderCodeI; extern HRESULT ComputeShaderCodeSize(CONST DWORD* pCode, DWORD* pdwCodeOnlySize, DWORD* pdwCodeAndCommentSize, DWORD* pdwNumConstDefs);
// Number of vertices in batch to process
const DWORD VVMVERTEXBATCH = 16; //-----------------------------------------------------------------------------
// Internal word of the vertual vertex machine
//
struct VVM_WORD { union { struct { D3DVALUE x, y, z, w; }; D3DVALUE v[4]; }; }; //-----------------------------------------------------------------------------
struct VVM_REGISTERS { VVM_REGISTERS() {m_c = NULL;} ~VVM_REGISTERS() {delete [] m_c;} // Input registers
VVM_WORD m_v[D3DVS_INPUTREG_MAX_V1_1][VVMVERTEXBATCH]; // Temporary registers
VVM_WORD m_r[D3DVS_TEMPREG_MAX_V1_1][VVMVERTEXBATCH]; // Constant registers. Allocated dynamically, base on MaxVertexShaderConst
// cap
VVM_WORD* m_c; // Address registers
VVM_WORD m_a[D3DVS_ADDRREG_MAX_V1_1][VVMVERTEXBATCH]; // Output register file
VVM_WORD m_output[3][VVMVERTEXBATCH]; // Attribute register file
VVM_WORD m_color[D3DVS_ATTROUTREG_MAX_V1_1][VVMVERTEXBATCH]; // Output texture registers
VVM_WORD m_texture[D3DVS_TCRDOUTREG_MAX_V1_1][VVMVERTEXBATCH]; }; //-----------------------------------------------------------------------------
//
// CVShaderCode: Vertex Shader Code
//
//-----------------------------------------------------------------------------
class CVShaderCode: public CPSGPShader { public: CVShaderCode() {}; virtual ~CVShaderCode() {};
virtual DWORD InstCount( void ) { return 0; }; virtual DWORD* InstTokens( DWORD Inst ) { return NULL; }; virtual char* InstDisasm( DWORD Inst ) { return NULL; }; virtual DWORD* InstComment( DWORD Inst ) { return NULL; }; virtual DWORD InstCommentSize( DWORD Inst ) { return 0; }; }; //-----------------------------------------------------------------------------
// Vertex Virtual Machine object
//
//-----------------------------------------------------------------------------
const UINT __MAX_SRC_OPERANDS = 5;
class CVertexVM { public: CVertexVM(); ~CVertexVM(); void Init(UINT MaxVertexShaderConst); // Parses binary shader representatio, compiles is and returns
// compiled object
CVShaderCode* CreateShader(CVElement* pElements, DWORD dwNumElements, DWORD* code); HRESULT SetActiveShader(CVShaderCode* code); CVShaderCode* GetActiveShader() {return (CVShaderCode*)m_pCurrentShader;} HRESULT ExecuteShader(LPD3DFE_PROCESSVERTICES pv, UINT vertexCount); HRESULT GetDataPointer(DWORD dwMemType, VVM_WORD ** pData); // Set internal registers to user data
HRESULT SetData(DWORD RegType, DWORD start, DWORD count, LPVOID buffer); // Get data from internal registers
HRESULT GetData(DWORD RegType, DWORD start, DWORD count, LPVOID buffer); VVM_REGISTERS* GetRegisters(); DWORD GetCurInstIndex() {return m_CurInstIndex; }
// Number of allocated constant registers
UINT m_MaxVertexShaderConst; protected: void InstMov(); void InstAdd(); void InstMad(); void InstMul(); void InstRcp(); void InstRsq(); void InstDP3(); void InstDP4(); void InstMin(); void InstMax(); void InstSlt(); void InstSge(); void InstExp(); void InstLog(); void InstExpP(); void InstLogP(); void InstLit(); void InstDst(); void InstFrc(); void InstM4x4(); void InstM4x3(); void InstM3x4(); void InstM3x3(); void InstM3x2(); void EvalDestination(); void EvalSource(DWORD index); void EvalSource(DWORD index, DWORD count); VVM_WORD* GetDataAddr(DWORD dwRegType, DWORD dwElementIndex); void ValidateShader(CVShaderCodeI* shader, DWORD* orgShader); void PrintInstCount(); UINT GetNumSrcOperands(UINT opcode); UINT GetInstructionLength(DWORD Inst); UINT GetRegisterUsage(UINT opcode, UINT SourceIndex);
// Virtual machine registers
VVM_REGISTERS m_reg; // Current shader code
CVShaderCodeI* m_pCurrentShader; // Current token during parsing
DWORD* m_pdwCurToken; // Pointer to destination operand
VVM_WORD* m_pDest; // Offset in the register file for destination operand
DWORD m_dwOffset; // Write mask for destination operand
DWORD m_WriteMask; // Current instruction (about to be executed)
DWORD m_CurInstIndex; // Source operands
VVM_WORD m_Source[__MAX_SRC_OPERANDS][VVMVERTEXBATCH]; // How many vertices to process in a batch
UINT m_count; // m_count * sizeof(VVM_WORD)
UINT m_BatchSize;
// Initialized flags
#if DBG
// Constant registers
BOOL m_c_initialized[D3DVS_CONSTREG_MAX_V1_1]; #endif // DBG
friend class D3DFE_PVFUNCSI; friend class CD3DHal; };
#endif // __VVM_H__
|