Skip to content

Instantly share code, notes, and snippets.

@rygorous
Created March 2, 2016 00:22
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rygorous/f3677a6a7be037d21f15 to your computer and use it in GitHub Desktop.
Save rygorous/f3677a6a7be037d21f15 to your computer and use it in GitHub Desktop.
d3d9_reflect.cpp
// 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