Rico Schüller : d3dcompiler: Add initial reflection parsing.

Alexandre Julliard julliard at winehq.org
Fri Dec 10 11:56:57 CST 2010


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

Author: Rico Schüller <kgbricola at web.de>
Date:   Fri Nov 26 12:43:51 2010 +0100

d3dcompiler: Add initial reflection parsing.

---

 dlls/d3dcompiler_43/d3dcompiler_43_main.c |   20 +++++++++++++---
 dlls/d3dcompiler_43/d3dcompiler_private.h |    4 ++-
 dlls/d3dcompiler_43/reflection.c          |   34 +++++++++++++++++++++++++++++
 3 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/dlls/d3dcompiler_43/d3dcompiler_43_main.c b/dlls/d3dcompiler_43/d3dcompiler_43_main.c
index e4f8f99..365b631 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_43_main.c
+++ b/dlls/d3dcompiler_43/d3dcompiler_43_main.c
@@ -127,8 +127,15 @@ HRESULT WINAPI D3DStripShader(const void *data, SIZE_T data_size, UINT flags, ID
 HRESULT WINAPI D3DReflect(const void *data, SIZE_T data_size, REFIID riid, void **reflector)
 {
     struct d3dcompiler_shader_reflection *object;
+    HRESULT hr;
 
-    FIXME("data %p, data_size %lu, riid %s, blob %p stub!\n", data, data_size, debugstr_guid(riid), reflector);
+    TRACE("data %p, data_size %lu, riid %s, blob %p\n", data, data_size, debugstr_guid(riid), reflector);
+
+    if (!IsEqualGUID(riid, &IID_ID3D11ShaderReflection))
+    {
+        WARN("Wrong riid %s, accept only %s!\n", debugstr_guid(riid), debugstr_guid(&IID_ID3D11ShaderReflection));
+        return E_NOINTERFACE;
+    }
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
     if (!object)
@@ -137,10 +144,15 @@ HRESULT WINAPI D3DReflect(const void *data, SIZE_T data_size, REFIID riid, void
         return E_OUTOFMEMORY;
     }
 
-    object->vtbl = &d3dcompiler_shader_reflection_vtbl;
-    object->refcount = 1;
+    hr = d3dcompiler_shader_reflection_init(object, data, data_size);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize shader reflection\n");
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
 
-    *reflector = (ID3D11ShaderReflection *)object;
+    *reflector = object;
 
     TRACE("Created ID3D11ShaderReflection %p\n", object);
 
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 0b99629..c27e3d8 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -58,13 +58,15 @@ HRESULT d3dcompiler_get_blob_part(const void *data, SIZE_T data_size, D3D_BLOB_P
 HRESULT d3dcompiler_strip_shader(const void *data, SIZE_T data_size, UINT flags, ID3DBlob **blob) DECLSPEC_HIDDEN;
 
 /* ID3D11ShaderReflection */
-extern const struct ID3D11ShaderReflectionVtbl d3dcompiler_shader_reflection_vtbl DECLSPEC_HIDDEN;
 struct d3dcompiler_shader_reflection
 {
     const struct ID3D11ShaderReflectionVtbl *vtbl;
     LONG refcount;
 };
 
+/* reflection handling */
+HRESULT d3dcompiler_shader_reflection_init(struct d3dcompiler_shader_reflection *reflection, const void *data, SIZE_T data_size) DECLSPEC_HIDDEN;
+
 /* Shader assembler definitions */
 typedef enum _shader_type {
     ST_VERTEX,
diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index f92c986..e733a8f 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -241,3 +241,37 @@ const struct ID3D11ShaderReflectionVtbl d3dcompiler_shader_reflection_vtbl =
     d3dcompiler_shader_reflection_GetMinFeatureLevel,
     d3dcompiler_shader_reflection_GetThreadGroupSize,
 };
+
+HRESULT d3dcompiler_shader_reflection_init(struct d3dcompiler_shader_reflection *reflection,
+        const void *data, SIZE_T data_size)
+{
+    struct dxbc src_dxbc;
+    HRESULT hr;
+    unsigned int i;
+
+    reflection->vtbl = &d3dcompiler_shader_reflection_vtbl;
+    reflection->refcount = 1;
+
+    hr = dxbc_parse(data, data_size, &src_dxbc);
+    if (FAILED(hr))
+    {
+        WARN("Failed to parse reflection\n");
+        return hr;
+    }
+
+    for (i = 0; i < src_dxbc.count; ++i)
+    {
+        struct dxbc_section *section = &src_dxbc.sections[i];
+
+        switch (section->tag)
+        {
+            default:
+                FIXME("Unhandled section %s!\n", debugstr_an((const char *)&section->tag, 4));
+                break;
+        }
+    }
+
+    dxbc_destroy(&src_dxbc);
+
+    return hr;
+}




More information about the wine-cvs mailing list