Rico Schüller : d3d10: Improve parse_fx10_type().
Alexandre Julliard
julliard at winehq.org
Mon Oct 26 10:08:37 CDT 2009
Module: wine
Branch: master
Commit: 7e1ad91ea4d0b61abe36bdd0e69a0dd437a205e4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7e1ad91ea4d0b61abe36bdd0e69a0dd437a205e4
Author: Rico Schüller <kgbricola at web.de>
Date: Sun Oct 25 17:11:46 2009 +0100
d3d10: Improve parse_fx10_type().
---
dlls/d3d10/effect.c | 146 +++++++++++++++++++++++++++++----------------------
1 files changed, 83 insertions(+), 63 deletions(-)
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 2a0dfb7..08c6f05 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -352,6 +352,8 @@ static HRESULT parse_fx10_type(struct d3d10_effect_type *t, const char *ptr, con
{
DWORD unknown0;
DWORD offset;
+ DWORD typeinfo;
+ unsigned int i;
read_dword(&ptr, &offset);
TRACE("Type name at offset %#x.\n", offset);
@@ -378,84 +380,102 @@ static HRESULT parse_fx10_type(struct d3d10_effect_type *t, const char *ptr, con
read_dword(&ptr, &t->size_packed);
TRACE("Packed size %#x.\n", t->size_packed);
- if (unknown0 == 1)
+ switch (unknown0)
{
- DWORD tmp;
+ case 1:
+ t->member_count = 0;
- t->member_count = 0;
+ read_dword(&ptr, &typeinfo);
+ t->column_count = (typeinfo & D3D10_FX10_TYPE_COLUMN_MASK) >> D3D10_FX10_TYPE_COLUMN_SHIFT;
+ t->row_count = (typeinfo & D3D10_FX10_TYPE_ROW_MASK) >> D3D10_FX10_TYPE_ROW_SHIFT;
+ t->basetype = d3d10_variable_type((typeinfo & D3D10_FX10_TYPE_BASETYPE_MASK) >> D3D10_FX10_TYPE_BASETYPE_SHIFT, FALSE);
+ t->type_class = d3d10_variable_class((typeinfo & D3D10_FX10_TYPE_CLASS_MASK) >> D3D10_FX10_TYPE_CLASS_SHIFT, typeinfo & D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK);
- read_dword(&ptr, &tmp);
- t->column_count = (tmp & D3D10_FX10_TYPE_COLUMN_MASK) >> D3D10_FX10_TYPE_COLUMN_SHIFT;
- t->row_count = (tmp & D3D10_FX10_TYPE_ROW_MASK) >> D3D10_FX10_TYPE_ROW_SHIFT;
- t->basetype = d3d10_variable_type((tmp & D3D10_FX10_TYPE_BASETYPE_MASK) >> D3D10_FX10_TYPE_BASETYPE_SHIFT, FALSE);
- t->type_class = d3d10_variable_class((tmp & D3D10_FX10_TYPE_CLASS_MASK) >> D3D10_FX10_TYPE_CLASS_SHIFT, tmp & D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK);
+ TRACE("Type description: %#x.\n", typeinfo);
+ TRACE("\tcolumns: %u.\n", t->column_count);
+ TRACE("\trows: %u.\n", t->row_count);
+ TRACE("\tbasetype: %s.\n", debug_d3d10_shader_variable_type(t->basetype));
+ TRACE("\tclass: %s.\n", debug_d3d10_shader_variable_class(t->type_class));
+ TRACE("\tunknown bits: %#x.\n", typeinfo & ~(D3D10_FX10_TYPE_COLUMN_MASK | D3D10_FX10_TYPE_ROW_MASK
+ | D3D10_FX10_TYPE_BASETYPE_MASK | D3D10_FX10_TYPE_CLASS_MASK | D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK));
+ break;
- TRACE("Type description: %#x.\n", tmp);
- TRACE("\tcolumns: %u.\n", t->column_count);
- TRACE("\trows: %u.\n", t->row_count);
- TRACE("\tbasetype: %s.\n", debug_d3d10_shader_variable_type(t->basetype));
- TRACE("\tclass: %s.\n", debug_d3d10_shader_variable_class(t->type_class));
- TRACE("\tunknown bits: %#x.\n", tmp & ~(D3D10_FX10_TYPE_COLUMN_MASK | D3D10_FX10_TYPE_ROW_MASK
- | D3D10_FX10_TYPE_BASETYPE_MASK | D3D10_FX10_TYPE_CLASS_MASK | D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK));
- }
- else if (unknown0 == 3)
- {
- unsigned int i;
+ case 2:
+ TRACE("Type is an object.\n");
- TRACE("Type is a structure.\n");
+ t->member_count = 0;
+ t->column_count = 0;
+ t->row_count = 0;
+ t->type_class = D3D10_SVC_OBJECT;
- read_dword(&ptr, &t->member_count);
- TRACE("Member count: %u.\n", t->member_count);
+ read_dword(&ptr, &typeinfo);
+ t->basetype = d3d10_variable_type(typeinfo, TRUE);
- t->column_count = 0;
- t->row_count = 0;
- t->basetype = 0;
- t->type_class = D3D10_SVC_STRUCT;
+ TRACE("Type description: %#x.\n", typeinfo);
+ TRACE("\tbasetype: %s.\n", debug_d3d10_shader_variable_type(t->basetype));
+ TRACE("\tclass: %s.\n", debug_d3d10_shader_variable_class(t->type_class));
+ break;
- t->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, t->member_count * sizeof(*t->members));
- if (!t->members)
- {
- ERR("Failed to allocate members memory.\n");
- return E_OUTOFMEMORY;
- }
+ case 3:
+ TRACE("Type is a structure.\n");
- for (i = 0; i < t->member_count; ++i)
- {
- struct d3d10_effect_type_member *typem = &t->members[i];
+ read_dword(&ptr, &t->member_count);
+ TRACE("Member count: %u.\n", t->member_count);
- read_dword(&ptr, &offset);
- TRACE("Member name at offset %#x.\n", offset);
+ t->column_count = 0;
+ t->row_count = 0;
+ t->basetype = 0;
+ t->type_class = D3D10_SVC_STRUCT;
- if (!copy_name(data + offset, &typem->name))
+ t->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, t->member_count * sizeof(*t->members));
+ if (!t->members)
{
- ERR("Failed to copy name.\n");
+ ERR("Failed to allocate members memory.\n");
return E_OUTOFMEMORY;
}
- TRACE("Member name: %s.\n", debugstr_a(typem->name));
-
- read_dword(&ptr, &offset);
- TRACE("Member semantic at offset %#x.\n", offset);
- if (!copy_name(data + offset, &typem->semantic))
+ for (i = 0; i < t->member_count; ++i)
{
- ERR("Failed to copy semantic.\n");
- return E_OUTOFMEMORY;
+ struct d3d10_effect_type_member *typem = &t->members[i];
+
+ read_dword(&ptr, &offset);
+ TRACE("Member name at offset %#x.\n", offset);
+
+ if (!copy_name(data + offset, &typem->name))
+ {
+ ERR("Failed to copy name.\n");
+ return E_OUTOFMEMORY;
+ }
+ TRACE("Member name: %s.\n", debugstr_a(typem->name));
+
+ read_dword(&ptr, &offset);
+ TRACE("Member semantic at offset %#x.\n", offset);
+
+ if (!copy_name(data + offset, &typem->semantic))
+ {
+ ERR("Failed to copy semantic.\n");
+ return E_OUTOFMEMORY;
+ }
+ TRACE("Member semantic: %s.\n", debugstr_a(typem->semantic));
+
+ read_dword(&ptr, &typem->buffer_offset);
+ TRACE("Member offset in struct: %#x.\n", typem->buffer_offset);
+
+ read_dword(&ptr, &offset);
+ TRACE("Member type info at offset %#x.\n", offset);
+
+ typem->type = get_fx10_type(t->effect, data, offset);
+ if (!typem->type)
+ {
+ ERR("Failed to get variable type.\n");
+ return E_FAIL;
+ }
}
- TRACE("Member semantic: %s.\n", debugstr_a(typem->semantic));
-
- read_dword(&ptr, &typem->buffer_offset);
- TRACE("Member offset in struct: %#x.\n", typem->buffer_offset);
-
- read_dword(&ptr, &offset);
- TRACE("Member type info at offset %#x.\n", offset);
+ break;
- typem->type = get_fx10_type(t->effect, data, offset);
- if (!typem->type)
- {
- ERR("Failed to get variable type.\n");
- return E_FAIL;
- }
- }
+ default:
+ FIXME("Unhandled case %#x.\n", unknown0);
+ return E_FAIL;
}
if (t->element_count)
More information about the wine-cvs
mailing list