[PATCH 1/2] d3dx9_36: Improved constant table parsing
Travis Athougies
iammisc at gmail.com
Tue Nov 30 18:28:22 CST 2010
Minor (but necessary) improvements to constant table parsing in d3dx9. Additional test cases to follow.
---
dlls/d3dx9_36/shader.c | 20 +++++++++++++++++---
1 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index e2efe53..4d1ac86 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -994,10 +994,11 @@ static HRESULT parse_ctab_constant_type(const D3DXSHADER_TYPEINFO *type, ctab_co
constant->desc.Type = type->Type;
constant->desc.Rows = type->Rows;
constant->desc.Columns = type->Columns;
+ constant->desc.Elements = type->Elements;
constant->desc.StructMembers = type->StructMembers;
- TRACE("class = %d, type = %d, rows = %d, columns = %d, struct_members = %d\n",
- constant->desc.Class, constant->desc.Type,
+ TRACE("class = %d, type = %d, rows = %d, columns = %d, elements = %d, struct_members = %d\n",
+ constant->desc.Class, constant->desc.Type, constant->desc.Elements,
constant->desc.Rows, constant->desc.Columns, constant->desc.StructMembers);
if ((constant->desc.Class == D3DXPC_STRUCT) && constant->desc.StructMembers)
@@ -1095,11 +1096,24 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD* byte_code,
object->constants[i].desc.Name = object->ctab + constant_info[i].Name;
object->constants[i].desc.RegisterSet = constant_info[i].RegisterSet;
object->constants[i].desc.RegisterIndex = constant_info[i].RegisterIndex;
- object->constants[i].desc.RegisterCount = 0;
+ object->constants[i].desc.RegisterCount = constant_info[i].RegisterCount;
+ object->constants[i].desc.DefaultValue = object->ctab + constant_info[i].DefaultValue;
+
hr = parse_ctab_constant_type((LPD3DXSHADER_TYPEINFO)(object->ctab + constant_info[i].TypeInfo),
&object->constants[i]);
if (hr != D3D_OK)
goto error;
+
+ if (constant_info[i].RegisterSet != D3DXRS_FLOAT4)
+ FIXME("Don't know how to calculate Bytes for non D3DXRS_FLOAT4 constants\n");
+
+ /* D3DXRS_FLOAT4 has a base size of 4 (not taking into account dimensions and element count) */
+ object->constants[i].desc.Bytes = 4;
+
+ /* Take into account dimensions and elements */
+ object->constants[i].desc.Bytes *= object->constants[i].desc.Elements;
+ object->constants[i].desc.Bytes *= object->constants[i].desc.Rows *
+ object->constants[i].desc.Columns;
}
*constant_table = (LPD3DXCONSTANTTABLE)object;
--
1.7.0.4
More information about the wine-patches
mailing list