Rico Schüller : d3dcompiler: Parse member types.
Alexandre Julliard
julliard at winehq.org
Tue Mar 1 11:07:14 CST 2011
Module: wine
Branch: master
Commit: a300481187cb237ea34ca3ec3e4a68b069793d96
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a300481187cb237ea34ca3ec3e4a68b069793d96
Author: Rico Schüller <kgbricola at web.de>
Date: Mon Feb 28 19:47:24 2011 +0100
d3dcompiler: Parse member types.
---
dlls/d3dcompiler_43/d3dcompiler_private.h | 8 +++
dlls/d3dcompiler_43/reflection.c | 94 ++++++++++++++++++++++++++---
2 files changed, 94 insertions(+), 8 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 4d90def..9a5274b 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -75,6 +75,14 @@ struct d3dcompiler_shader_reflection_type
struct d3dcompiler_shader_reflection *reflection;
D3D11_SHADER_TYPE_DESC desc;
+ struct d3dcompiler_shader_reflection_type_member *members;
+};
+
+struct d3dcompiler_shader_reflection_type_member
+{
+ char *name;
+ DWORD offset;
+ struct d3dcompiler_shader_reflection_type *type;
};
struct d3dcompiler_shader_reflection_variable
diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index 157e791..5c063b9 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -31,6 +31,8 @@ enum D3DCOMPILER_SIGNATURE_ELEMENT_SIZE
D3DCOMPILER_SIGNATURE_ELEMENT_SIZE7 = 7,
};
+static struct d3dcompiler_shader_reflection_type *get_reflection_type(struct d3dcompiler_shader_reflection *reflection, const char *data, DWORD offset);
+
const struct ID3D11ShaderReflectionConstantBufferVtbl d3dcompiler_shader_reflection_constant_buffer_vtbl;
const struct ID3D11ShaderReflectionVariableVtbl d3dcompiler_shader_reflection_variable_vtbl;
const struct ID3D11ShaderReflectionTypeVtbl d3dcompiler_shader_reflection_type_vtbl;
@@ -81,17 +83,17 @@ static BOOL copy_value(const char *ptr, void **value, DWORD size)
return TRUE;
}
-void *d3dcompiler_rb_alloc(size_t size)
+static void *d3dcompiler_rb_alloc(size_t size)
{
return HeapAlloc(GetProcessHeap(), 0, size);
}
-void *d3dcompiler_rb_realloc(void *ptr, size_t size)
+static void *d3dcompiler_rb_realloc(void *ptr, size_t size)
{
return HeapReAlloc(GetProcessHeap(), 0, ptr, size);
}
-void d3dcompiler_rb_free(void *ptr)
+static void d3dcompiler_rb_free(void *ptr)
{
HeapFree(GetProcessHeap(), 0, ptr);
}
@@ -104,12 +106,29 @@ static int d3dcompiler_shader_reflection_type_compare(const void *key, const str
return *id - t->id;
}
+static void free_type_member(struct d3dcompiler_shader_reflection_type_member *member)
+{
+ if (member)
+ {
+ HeapFree(GetProcessHeap(), 0, member->name);
+ }
+}
+
static void d3dcompiler_shader_reflection_type_destroy(struct wine_rb_entry *entry, void *context)
{
struct d3dcompiler_shader_reflection_type *t = WINE_RB_ENTRY_VALUE(entry, struct d3dcompiler_shader_reflection_type, entry);
+ unsigned int i;
TRACE("reflection type %p.\n", t);
+ if (t->members)
+ {
+ for (i = 0; i < t->desc.Members; ++i)
+ {
+ free_type_member(&t->members[i]);
+ }
+ }
+
HeapFree(GetProcessHeap(), 0, t);
}
@@ -985,12 +1004,45 @@ static HRESULT d3dcompiler_parse_stat(struct d3dcompiler_shader_reflection *r, c
return E_FAIL;
}
+static HRESULT d3dcompiler_parse_type_members(struct d3dcompiler_shader_reflection *ref,
+ struct d3dcompiler_shader_reflection_type_member *member, const char *data, const char **ptr)
+{
+ DWORD offset;
+
+ read_dword(ptr, &offset);
+ if (!copy_name(data + offset, &member->name))
+ {
+ ERR("Failed to copy name.\n");
+ return E_OUTOFMEMORY;
+ }
+ TRACE("Member name: %s.\n", debugstr_a(member->name));
+
+ read_dword(ptr, &offset);
+ TRACE("Member type offset: %x\n", offset);
+
+ member->type = get_reflection_type(ref, data, offset);
+ if (!member->type)
+ {
+ ERR("Failed to get member type\n");
+ HeapFree(GetProcessHeap(), 0, member->name);
+ return E_FAIL;
+ }
+
+ read_dword(ptr, &member->offset);
+ TRACE("Member offset %x\n", member->offset);
+
+ return S_OK;
+}
+
static HRESULT d3dcompiler_parse_type(struct d3dcompiler_shader_reflection_type *type, const char *data, DWORD offset)
{
const char *ptr = data + offset;
DWORD temp;
D3D11_SHADER_TYPE_DESC *desc;
unsigned int i;
+ struct d3dcompiler_shader_reflection_type_member *members;
+ HRESULT hr;
+ DWORD member_offset;
desc = &type->desc;
@@ -1009,19 +1061,45 @@ static HRESULT d3dcompiler_parse_type(struct d3dcompiler_shader_reflection_type
desc->Members = temp >> 16;
TRACE("Elements %u, Members %u\n", desc->Elements, desc->Members);
- read_dword(&ptr, &temp);
- TRACE("Member Offset %u\n", temp);
+ read_dword(&ptr, &member_offset);
+ TRACE("Member Offset %u\n", member_offset);
if ((type->reflection->target & 0xffff) >= 0x500)
skip_dword_unknown(&ptr, 4);
- /* todo: Parse type members */
- for (i = 0; i < desc->Members; ++i)
+ if (desc->Members)
{
- skip_dword_unknown(&ptr, 3);
+ const char *ptr2 = data + member_offset;
+
+ members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*members));
+ if (!members)
+ {
+ ERR("Failed to allocate type memory.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ for (i = 0; i < desc->Members; ++i)
+ {
+ hr = d3dcompiler_parse_type_members(type->reflection, &members[i], data, &ptr2);
+ if (hr != S_OK)
+ {
+ FIXME("Failed to parse type members.");
+ goto err_out;
+ }
+ }
}
+ type->members = members;
+
return S_OK;
+
+err_out:
+ for (i = 0; i < desc->Members; ++i)
+ {
+ free_type_member(&members[i]);
+ }
+ HeapFree(GetProcessHeap(), 0, members);
+ return hr;
}
static struct d3dcompiler_shader_reflection_type *get_reflection_type(struct d3dcompiler_shader_reflection *reflection, const char *data, DWORD offset)
More information about the wine-cvs
mailing list