102 lines
3.7 KiB
C
102 lines
3.7 KiB
C
|
//------------------------------------------------------------------------------
|
||
|
// DX9AsmToGL.h
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef DX9_ASM_TO_GL_H
|
||
|
#define DX9_ASM_TO_GL_H
|
||
|
|
||
|
#define DISASM_OK 0
|
||
|
#define DISASM_ERROR 1
|
||
|
|
||
|
#define MAX_SHADER_CONSTANTS 512
|
||
|
|
||
|
// option bits
|
||
|
#define D3DToGL_OptionUseEnvParams 0x01
|
||
|
#define D3DToGL_OptionDoFixupZ 0x02 // add insts to put Z in the right interval for GL
|
||
|
#define D3DToGL_OptionDoFixupY 0x04 // add insts to flip the Y over for GL
|
||
|
#define D3DToGL_OptionDoUserClipPlanes 0x08 // include OPTION vertex_program_2 and append DP4's to write into oCLP[0] and oCLP[1]
|
||
|
#define D3DToGL_OptionSpew 0x80000000
|
||
|
|
||
|
class D3DToGL_ASM
|
||
|
{
|
||
|
private:
|
||
|
// Pointers for dwToken stream management
|
||
|
uint32* m_pdwBaseToken;
|
||
|
uint32* m_pdwNextToken;
|
||
|
|
||
|
// Vertex shader or pixel shader, and version (necessary because some opcodes alias)
|
||
|
bool m_bVertexShader;
|
||
|
uint32 m_dwMinorVersion;
|
||
|
uint32 m_dwMajorVersion;
|
||
|
|
||
|
// Option flags
|
||
|
bool m_bUseEnvParams; // set D3DToGL_OptionUseEnvParams in 'options' to use
|
||
|
bool m_bDoFixupZ; // set D3DToGL_OptionDoFixupZ
|
||
|
bool m_bDoFixupY; // set D3DToGL_OptionDoFixupZ
|
||
|
bool m_bDoUserClipPlanes; // set D3DToGL_OptionDoUserClipPlanes
|
||
|
bool m_bSpew; // set D3DToGL_OptionSpew
|
||
|
|
||
|
// Various scratch temps needed to handle mis-matches in instruction sets between D3D and OpenGL
|
||
|
bool m_bNeedsD2AddTemp;
|
||
|
bool m_bNeedsNRMTemp;
|
||
|
bool m_bDeclareAddressReg;
|
||
|
bool m_bNeedsLerpTemp;
|
||
|
bool m_bNeedsSinCosDeclarations;
|
||
|
|
||
|
// Keep track of which vs outputs are used so we can declare them
|
||
|
bool m_bDeclareVSOPos;
|
||
|
bool m_bDeclareVSOFog;
|
||
|
uint32 m_dwTexCoordOutMask;
|
||
|
|
||
|
// Keep track of which temps are used so they can be declared
|
||
|
uint32 m_dwTempUsageMask;
|
||
|
bool m_bOutputColorRegister[2];
|
||
|
bool m_bOutputDepthRegister;
|
||
|
|
||
|
// Track constants so we know how to declare them
|
||
|
bool m_bConstantRegisterReferenced[MAX_SHADER_CONSTANTS];
|
||
|
bool m_bConstantRegisterDefined[MAX_SHADER_CONSTANTS];
|
||
|
|
||
|
// Track sampler types when declared so we can properly decorate TEX instructions
|
||
|
uint32 m_dwSamplerTypes[32];
|
||
|
|
||
|
// Track shadow sampler usage
|
||
|
int m_nShadowDepthSampler;
|
||
|
bool m_bDeclareShadowOption;
|
||
|
|
||
|
// Track attribute references
|
||
|
// init to 0xFFFFFFFF (unhit)
|
||
|
// index by (dwRegToken & D3DSP_REGNUM_MASK) in VS DCL insns
|
||
|
// fill with (usage<<4) | (usage index).
|
||
|
uint32 m_dwAttribMap[16];
|
||
|
|
||
|
// GLSL does indentation for readability
|
||
|
int m_NumIndentTabs;
|
||
|
|
||
|
// Utilities to aid in decoding token stream
|
||
|
uint32 GetNextToken( void );
|
||
|
void SkipTokens( uint32 numToSkip );
|
||
|
uint32 Opcode( uint32 dwToken );
|
||
|
uint32 OpcodeSpecificData( uint32 dwToken );
|
||
|
uint32 TextureType ( uint32 dwToken );
|
||
|
uint32 GetRegType( uint32 dwRegToken );
|
||
|
|
||
|
// Utilities for decoding tokens in to strings according to ASM syntax
|
||
|
void PrintOpcode( uint32 inst, char* buff, int nBufLen );
|
||
|
void PrintUsageAndIndexToString( uint32 dwToken, char* strUsageUsageIndexName, int nBufLen, bool bGLSL );
|
||
|
void PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, char *pRegisterName, int nBufLen, bool bGLSL, int *pARLDestReg );
|
||
|
void InsertMoveFromAddressRegister( char *pCode, int nCodeSize, int nARLComp0, int nARLComp1, int nARLComp2 );
|
||
|
void InsertMoveInstruction( char *pCode, int nCodeSize, int nARLComponent );
|
||
|
void FlagIndirectRegister( uint32 dwToken, int *pARLDestReg );
|
||
|
|
||
|
// Utilities for decoding tokens in to strings according to GLSL syntax
|
||
|
void OpenIntrinsic( uint32 inst, char* buff, int nBufLen );
|
||
|
void PrintIndentation( char *pBuf, int nBufLen );
|
||
|
|
||
|
public:
|
||
|
int TranslateShader( uint32* code, char *pDisassembledCode, int nBufLen, bool *bVertexShader, uint32 options, int32 nShadowDepthSampler, char *debugLabel );
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // DX9_ASM_TO_GL_H
|