Rico Schüller : d3dcompiler: Parse reflection constant buffers.

Alexandre Julliard julliard at winehq.org
Mon Feb 21 10:56:58 CST 2011


Module: wine
Branch: master
Commit: 3f6c54f26306dee49064c20e7c780d1f49ffbbf8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3f6c54f26306dee49064c20e7c780d1f49ffbbf8

Author: Rico Schüller <kgbricola at web.de>
Date:   Sun Feb 20 21:21:11 2011 +0100

d3dcompiler: Parse reflection constant buffers.

---

 dlls/d3dcompiler_43/d3dcompiler_private.h |   14 ++++
 dlls/d3dcompiler_43/reflection.c          |  106 +++++++++++++++++++++++++++-
 2 files changed, 116 insertions(+), 4 deletions(-)

diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index bc99322..bec51e5 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -64,6 +64,19 @@ struct d3dcompiler_shader_signature
     char *string_data;
 };
 
+struct d3dcompiler_shader_reflection_constant_buffer
+{
+    ID3D11ShaderReflectionConstantBuffer ID3D11ShaderReflectionConstantBuffer_iface;
+
+    struct d3dcompiler_shader_reflection *reflection;
+
+    char *name;
+    D3D_CBUFFER_TYPE type;
+    UINT variable_count;
+    UINT size;
+    UINT flags;
+};
+
 /* ID3D11ShaderReflection */
 struct d3dcompiler_shader_reflection
 {
@@ -109,6 +122,7 @@ struct d3dcompiler_shader_reflection
     struct d3dcompiler_shader_signature *pcsg;
     char *resource_string;
     D3D11_SHADER_INPUT_BIND_DESC *bound_resources;
+    struct d3dcompiler_shader_reflection_constant_buffer *constant_buffers;
 };
 
 /* reflection handling */
diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index e1ba543..b382d83 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -63,6 +63,11 @@ static void free_signature(struct d3dcompiler_shader_signature *sig)
     HeapFree(GetProcessHeap(), 0, sig->string_data);
 }
 
+static void free_constant_buffer(struct d3dcompiler_shader_reflection_constant_buffer *cb)
+{
+    HeapFree(GetProcessHeap(), 0, cb->name);
+}
+
 static void reflection_cleanup(struct d3dcompiler_shader_reflection *ref)
 {
     TRACE("Cleanup %p\n", ref);
@@ -85,6 +90,17 @@ static void reflection_cleanup(struct d3dcompiler_shader_reflection *ref)
         HeapFree(GetProcessHeap(), 0, ref->pcsg);
     }
 
+    if (ref->constant_buffers)
+    {
+        unsigned int i;
+
+        for (i = 0; i < ref->constant_buffer_count; ++i)
+        {
+            free_constant_buffer(&ref->constant_buffers[i]);
+        }
+    }
+
+    HeapFree(GetProcessHeap(), 0, ref->constant_buffers);
     HeapFree(GetProcessHeap(), 0, ref->bound_resources);
     HeapFree(GetProcessHeap(), 0, ref->resource_string);
     HeapFree(GetProcessHeap(), 0, ref->creator);
@@ -427,6 +443,40 @@ const struct ID3D11ShaderReflectionVtbl d3dcompiler_shader_reflection_vtbl =
     d3dcompiler_shader_reflection_GetThreadGroupSize,
 };
 
+/* ID3D11ShaderReflectionConstantBuffer methods */
+
+static HRESULT STDMETHODCALLTYPE d3dcompiler_shader_reflection_constant_buffer_GetDesc(
+        ID3D11ShaderReflectionConstantBuffer *iface, D3D11_SHADER_BUFFER_DESC *desc)
+{
+    FIXME("iface %p, desc %p stub!\n", iface, desc);
+
+    return E_NOTIMPL;
+}
+
+static ID3D11ShaderReflectionVariable * STDMETHODCALLTYPE d3dcompiler_shader_reflection_constant_buffer_GetVariableByIndex(
+        ID3D11ShaderReflectionConstantBuffer *iface, UINT index)
+{
+    FIXME("iface %p, index %u stub!\n", iface, index);
+
+    return NULL;
+}
+
+static ID3D11ShaderReflectionVariable * STDMETHODCALLTYPE d3dcompiler_shader_reflection_constant_buffer_GetVariableByName(
+        ID3D11ShaderReflectionConstantBuffer *iface, LPCSTR name)
+{
+    FIXME("iface %p, name %s stub!\n", iface, name);
+
+    return NULL;
+}
+
+const struct ID3D11ShaderReflectionConstantBufferVtbl d3dcompiler_shader_reflection_constant_buffer_vtbl =
+{
+    /* ID3D11ShaderReflectionConstantBuffer methods */
+    d3dcompiler_shader_reflection_constant_buffer_GetDesc,
+    d3dcompiler_shader_reflection_constant_buffer_GetVariableByIndex,
+    d3dcompiler_shader_reflection_constant_buffer_GetVariableByName,
+};
+
 static HRESULT d3dcompiler_parse_stat(struct d3dcompiler_shader_reflection *r, const char *data, DWORD data_size)
 {
     const char *ptr = data;
@@ -542,11 +592,10 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
     const char *ptr = data;
     DWORD size = data_size >> 2;
     DWORD offset, cbuffer_offset, resource_offset, creator_offset;
-    unsigned int i;
-    unsigned int string_data_offset;
-    unsigned int string_data_size;
+    unsigned int i, string_data_offset, string_data_size;
     char *string_data = NULL, *creator = NULL;
     D3D11_SHADER_INPUT_BIND_DESC *bound_resources = NULL;
+    struct d3dcompiler_shader_reflection_constant_buffer *constant_buffers = NULL;
     HRESULT hr;
 
     TRACE("Size %u\n", size);
@@ -640,15 +689,64 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
         }
     }
 
-    /* todo: Parse Constant buffers */
+    if (r->constant_buffer_count)
+    {
+        constant_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, r->constant_buffer_count * sizeof(*constant_buffers));
+        if (!constant_buffers)
+        {
+            ERR("Failed to allocate constant buffer memory.\n");
+            hr = E_OUTOFMEMORY;
+            goto err_out;
+        }
+
+        ptr = data + cbuffer_offset;
+        for (i = 0; i < r->constant_buffer_count; i++)
+        {
+            struct d3dcompiler_shader_reflection_constant_buffer *cb = &constant_buffers[i];
+
+            cb->ID3D11ShaderReflectionConstantBuffer_iface.lpVtbl = &d3dcompiler_shader_reflection_constant_buffer_vtbl;
+            cb->reflection = r;
+
+            read_dword(&ptr, &offset);
+            if (!copy_name(data + offset, &cb->name))
+            {
+                ERR("Failed to copy name.\n");
+                hr = E_OUTOFMEMORY;
+                goto err_out;
+            }
+            TRACE("Name: %s.\n", debugstr_a(cb->name));
+
+            read_dword(&ptr, &cb->variable_count);
+            TRACE("Variable count: %u\n", cb->variable_count);
+
+            /* todo: Parse variables */
+            read_dword(&ptr, &offset);
+            FIXME("Variable offset: %x\n", offset);
+
+            read_dword(&ptr, &cb->size);
+            TRACE("Cbuffer size: %u\n", cb->size);
+
+            read_dword(&ptr, &cb->flags);
+            TRACE("Cbuffer flags: %u\n", cb->flags);
+
+            read_dword(&ptr, &cb->type);
+            TRACE("Cbuffer type: %#x\n", cb->type);
+        }
+    }
 
     r->creator = creator;
     r->resource_string = string_data;
     r->bound_resources = bound_resources;
+    r->constant_buffers = constant_buffers;
 
     return S_OK;
 
 err_out:
+    for (i = 0; i < r->constant_buffer_count; ++i)
+    {
+        free_constant_buffer(&constant_buffers[i]);
+    }
+    HeapFree(GetProcessHeap(), 0, constant_buffers);
     HeapFree(GetProcessHeap(), 0, bound_resources);
     HeapFree(GetProcessHeap(), 0, string_data);
     HeapFree(GetProcessHeap(), 0, creator);




More information about the wine-cvs mailing list