Created
March 2, 2016 00:22
-
-
Save rygorous/f3677a6a7be037d21f15 to your computer and use it in GitHub Desktop.
d3d9_reflect.cpp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// NOTE: We parse the constant table by hand since shadergen has to link against the | |
// Xenon (XBox 360) d3dx lib statically if Xbox builds are to be supported. That means | |
// we can't easily use non-Xenon D3DX from here. | |
// **** This part copy & pasted from D3DX headers (but it's a file format so it's consistent | |
// across versions) | |
//---------------------------------------------------------------------------- | |
// D3DXSHADER_CONSTANTTABLE: | |
// ------------------------- | |
// Shader constant information; included as an CTAB comment block inside | |
// shaders. All offsets are BYTE offsets from start of CONSTANTTABLE struct. | |
// Entries in the table are sorted by Name in ascending order. | |
//---------------------------------------------------------------------------- | |
typedef struct _D3DXSHADER_CONSTANTTABLE | |
{ | |
DWORD Size; // sizeof(D3DXSHADER_CONSTANTTABLE) | |
DWORD Creator; // LPCSTR offset | |
DWORD Version; // shader version | |
DWORD Constants; // number of constants | |
DWORD ConstantInfo; // D3DXSHADER_CONSTANTINFO[Constants] offset | |
DWORD Flags; // flags shader was compiled with | |
DWORD Target; // LPCSTR offset | |
} D3DXSHADER_CONSTANTTABLE, *LPD3DXSHADER_CONSTANTTABLE; | |
typedef struct _D3DXSHADER_CONSTANTINFO | |
{ | |
DWORD Name; // LPCSTR offset | |
WORD RegisterSet; // D3DXREGISTER_SET | |
WORD RegisterIndex; // register number | |
WORD RegisterCount; // number of registers | |
WORD Reserved; // reserved | |
DWORD TypeInfo; // D3DXSHADER_TYPEINFO offset | |
DWORD DefaultValue; // offset of default value | |
} D3DXSHADER_CONSTANTINFO, *LPD3DXSHADER_CONSTANTINFO; | |
typedef struct _D3DXSHADER_TYPEINFO | |
{ | |
WORD Class; // D3DXPARAMETER_CLASS | |
WORD Type; // D3DXPARAMETER_TYPE | |
WORD Rows; // number of rows (matrices) | |
WORD Columns; // number of columns (vectors and matrices) | |
WORD Elements; // array dimension | |
WORD StructMembers; // number of struct members | |
DWORD StructMemberInfo; // D3DXSHADER_STRUCTMEMBERINFO[Members] offset | |
} D3DXSHADER_TYPEINFO, *LPD3DXSHADER_TYPEINFO; | |
typedef struct _D3DXSHADER_STRUCTMEMBERINFO | |
{ | |
DWORD Name; // LPCSTR offset | |
DWORD TypeInfo; // D3DXSHADER_TYPEINFO offset | |
} D3DXSHADER_STRUCTMEMBERINFO, *LPD3DXSHADER_STRUCTMEMBERINFO; | |
// **** End of copy & pasted part | |
// ... | |
if (blob) { | |
DWORD *data = (DWORD *) blob->GetBufferPointer(); | |
if (memcmp(data + 2, "CTAB", 4) != 0) | |
codegen_error("Constant table not found!"); | |
BYTE *ctbase = (BYTE *) (data + 3); | |
D3DXSHADER_CONSTANTTABLE *ctab = (D3DXSHADER_CONSTANTTABLE *) ctbase; | |
D3DXSHADER_CONSTANTINFO *c = (D3DXSHADER_CONSTANTINFO *) (ctbase + ctab->ConstantInfo); | |
for (int j=0; j < sbcount(family->vars); j++) { | |
int k, ind = -1; | |
// find offset of constant | |
for (k=0; k < (int) ctab->Constants; k++) | |
if(strcmp(family->vars[j], (char *) (ctbase + c[k].Name)) == 0) | |
ind = c[k].RegisterIndex; | |
// use ind | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment