Paul Gofman : d3dcompiler: Support ID3D12ShaderReflection interface in D3DReflect().

Alexandre Julliard julliard at winehq.org
Wed Sep 9 15:42:27 CDT 2020


Module: wine
Branch: master
Commit: 602e0485275aee4574cb32c7bca15c753cfd304e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=602e0485275aee4574cb32c7bca15c753cfd304e

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Wed Sep  2 22:28:44 2020 +0300

d3dcompiler: Support ID3D12ShaderReflection interface in D3DReflect().

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3dcompiler_43/reflection.c | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index a081b20d68..3b45161510 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -93,6 +93,13 @@ struct d3dcompiler_shader_reflection_constant_buffer
     struct d3dcompiler_shader_reflection_variable *variables;
 };
 
+enum D3DCOMPILER_REFLECTION_VERSION
+{
+    D3DCOMPILER_REFLECTION_VERSION_D3D10,
+    D3DCOMPILER_REFLECTION_VERSION_D3D11,
+    D3DCOMPILER_REFLECTION_VERSION_D3D12,
+};
+
 /* ID3D11ShaderReflection */
 struct d3dcompiler_shader_reflection
 {
@@ -100,6 +107,8 @@ struct d3dcompiler_shader_reflection
     ID3D10ShaderReflection ID3D10ShaderReflection_iface;
     LONG refcount;
 
+    enum D3DCOMPILER_REFLECTION_VERSION interface_version;
+
     DWORD target;
     char *creator;
     UINT flags;
@@ -332,7 +341,8 @@ static HRESULT STDMETHODCALLTYPE d3dcompiler_shader_reflection_QueryInterface(ID
     TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
 
     if (IsEqualGUID(riid, &IID_ID3D11ShaderReflection)
-            || IsEqualGUID(riid, &IID_IUnknown))
+            || IsEqualGUID(riid, &IID_IUnknown)
+            || (D3D_COMPILER_VERSION >= 47 && IsEqualGUID(riid, &IID_ID3D12ShaderReflection)))
     {
         IUnknown_AddRef(iface);
         *object = iface;
@@ -486,7 +496,9 @@ static HRESULT STDMETHODCALLTYPE d3dcompiler_shader_reflection_GetResourceBindin
         return E_INVALIDARG;
     }
 
-    memcpy(desc, &reflection->bound_resources[index], sizeof(*desc));
+    memcpy(desc, &reflection->bound_resources[index],
+            reflection->interface_version == D3DCOMPILER_REFLECTION_VERSION_D3D12
+            ? sizeof(D3D12_SHADER_INPUT_BIND_DESC) : sizeof(D3D11_SHADER_INPUT_BIND_DESC));
 
     return S_OK;
 }
@@ -583,7 +595,7 @@ static struct ID3D11ShaderReflectionVariable * STDMETHODCALLTYPE d3dcompiler_sha
 static HRESULT STDMETHODCALLTYPE d3dcompiler_shader_reflection_GetResourceBindingDescByName(
         ID3D11ShaderReflection *iface, const char *name, D3D11_SHADER_INPUT_BIND_DESC *desc)
 {
-    struct d3dcompiler_shader_reflection *This = impl_from_ID3D11ShaderReflection(iface);
+    struct d3dcompiler_shader_reflection *reflection = impl_from_ID3D11ShaderReflection(iface);
     unsigned int i;
 
     TRACE("iface %p, name %s, desc %p\n", iface, debugstr_a(name), desc);
@@ -594,14 +606,15 @@ static HRESULT STDMETHODCALLTYPE d3dcompiler_shader_reflection_GetResourceBindin
         return E_INVALIDARG;
     }
 
-    for (i = 0; i < This->bound_resource_count; ++i)
+    for (i = 0; i < reflection->bound_resource_count; ++i)
     {
-        D3D12_SHADER_INPUT_BIND_DESC *d = &This->bound_resources[i];
+        D3D12_SHADER_INPUT_BIND_DESC *d = &reflection->bound_resources[i];
 
         if (!strcmp(d->Name, name))
         {
             TRACE("Returning D3D11_SHADER_INPUT_BIND_DESC %p.\n", d);
-            memcpy(desc, d, sizeof(*desc));
+            memcpy(desc, d, reflection->interface_version == D3DCOMPILER_REFLECTION_VERSION_D3D12
+                    ? sizeof(D3D12_SHADER_INPUT_BIND_DESC) : sizeof(D3D11_SHADER_INPUT_BIND_DESC));
             return S_OK;
         }
     }
@@ -2308,6 +2321,7 @@ HRESULT WINAPI D3D10ReflectShader(const void *data, SIZE_T data_size, ID3D10Shad
     }
 
     object->ID3D10ShaderReflection_iface.lpVtbl = &d3d10_shader_reflection_vtbl;
+    object->interface_version = D3DCOMPILER_REFLECTION_VERSION_D3D10;
     object->refcount = 1;
 
     hr = d3dcompiler_shader_reflection_init(object, data, data_size);
@@ -2350,7 +2364,8 @@ HRESULT WINAPI D3DReflect(const void *data, SIZE_T data_size, REFIID riid, void
 #endif
     }
 
-    if (!IsEqualGUID(riid, &IID_ID3D11ShaderReflection))
+    if (!IsEqualGUID(riid, &IID_ID3D11ShaderReflection)
+            && (D3D_COMPILER_VERSION < 47 || !IsEqualGUID(riid, &IID_ID3D12ShaderReflection)))
     {
         WARN("Wrong riid %s, accept only %s!\n", debugstr_guid(riid), debugstr_guid(&IID_ID3D11ShaderReflection));
 #if D3D_COMPILER_VERSION >= 46
@@ -2366,6 +2381,8 @@ HRESULT WINAPI D3DReflect(const void *data, SIZE_T data_size, REFIID riid, void
 
     object->ID3D11ShaderReflection_iface.lpVtbl = &d3dcompiler_shader_reflection_vtbl;
     object->refcount = 1;
+    object->interface_version = IsEqualGUID(riid, &IID_ID3D12ShaderReflection)
+            ? D3DCOMPILER_REFLECTION_VERSION_D3D12 : D3DCOMPILER_REFLECTION_VERSION_D3D11;
 
     hr = d3dcompiler_shader_reflection_init(object, data, data_size);
     if (FAILED(hr))




More information about the wine-cvs mailing list