[PATCH 1/3] d3dcompiler: Parse register space and range id for sm51 in d3dcompiler_parse_rdef().

Paul Gofman pgofman at codeweavers.com
Fri Aug 7 18:19:48 CDT 2020


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/d3dcompiler_43/reflection.c | 40 ++++++++++++++++++++++----------
 1 file changed, 28 insertions(+), 12 deletions(-)

diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index 7a8af39b07d..4d3d988b2ad 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -138,7 +138,7 @@ struct d3dcompiler_shader_reflection
     struct d3dcompiler_shader_signature *osgn;
     struct d3dcompiler_shader_signature *pcsg;
     char *resource_string;
-    D3D11_SHADER_INPUT_BIND_DESC *bound_resources;
+    D3D12_SHADER_INPUT_BIND_DESC *bound_resources;
     struct d3dcompiler_shader_reflection_constant_buffer *constant_buffers;
     struct wine_rb_tree types;
 };
@@ -476,17 +476,17 @@ static struct ID3D11ShaderReflectionConstantBuffer * STDMETHODCALLTYPE d3dcompil
 static HRESULT STDMETHODCALLTYPE d3dcompiler_shader_reflection_GetResourceBindingDesc(
         ID3D11ShaderReflection *iface, UINT index, D3D11_SHADER_INPUT_BIND_DESC *desc)
 {
-    struct d3dcompiler_shader_reflection *This = impl_from_ID3D11ShaderReflection(iface);
+    struct d3dcompiler_shader_reflection *reflection = impl_from_ID3D11ShaderReflection(iface);
 
     TRACE("iface %p, index %u, desc %p\n", iface, index, desc);
 
-    if (!desc || index >= This->bound_resource_count)
+    if (!desc || index >= reflection->bound_resource_count)
     {
         WARN("Invalid argument specified\n");
         return E_INVALIDARG;
     }
 
-    *desc = This->bound_resources[index];
+    memcpy(desc, &reflection->bound_resources[index], sizeof(*desc));
 
     return S_OK;
 }
@@ -596,12 +596,12 @@ static HRESULT STDMETHODCALLTYPE d3dcompiler_shader_reflection_GetResourceBindin
 
     for (i = 0; i < This->bound_resource_count; ++i)
     {
-        D3D11_SHADER_INPUT_BIND_DESC *d = &This->bound_resources[i];
+        D3D12_SHADER_INPUT_BIND_DESC *d = &This->bound_resources[i];
 
         if (!strcmp(d->Name, name))
         {
             TRACE("Returning D3D11_SHADER_INPUT_BIND_DESC %p.\n", d);
-            *desc = *d;
+            memcpy(desc, d, sizeof(*desc));
             return S_OK;
         }
     }
@@ -1412,13 +1412,14 @@ err_out:
 
 static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, const char *data, DWORD data_size)
 {
-    const char *ptr = data;
-    DWORD size = data_size >> 2;
+    struct d3dcompiler_shader_reflection_constant_buffer *constant_buffers = NULL;
     DWORD offset, cbuffer_offset, resource_offset, creator_offset;
     unsigned int i, string_data_offset, string_data_size;
+    D3D12_SHADER_INPUT_BIND_DESC *bound_resources = NULL;
     char *string_data = NULL, *creator = NULL;
-    D3D11_SHADER_INPUT_BIND_DESC *bound_resources = NULL;
-    struct d3dcompiler_shader_reflection_constant_buffer *constant_buffers = NULL;
+    DWORD size = data_size >> 2;
+    const char *ptr = data;
+    DWORD target_version;
     HRESULT hr;
 
     TRACE("Size %u\n", size);
@@ -1438,6 +1439,8 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
     read_dword(&ptr, &r->target);
     TRACE("Target: %#x\n", r->target);
 
+    target_version = r->target & D3DCOMPILER_SHADER_TARGET_VERSION_MASK;
+
     read_dword(&ptr, &r->flags);
     TRACE("Flags: %u\n", r->flags);
 
@@ -1452,7 +1455,7 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
     TRACE("Creator: %s.\n", debugstr_a(creator));
 
     /* todo: Parse RD11 */
-    if ((r->target & D3DCOMPILER_SHADER_TARGET_VERSION_MASK) >= 0x500)
+    if (target_version >= 0x500)
     {
         skip_dword_unknown(&ptr, 8);
     }
@@ -1483,7 +1486,7 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
         ptr = data + resource_offset;
         for (i = 0; i < r->bound_resource_count; i++)
         {
-            D3D11_SHADER_INPUT_BIND_DESC *desc = &bound_resources[i];
+            D3D12_SHADER_INPUT_BIND_DESC *desc = &bound_resources[i];
 
             read_dword(&ptr, &offset);
             desc->Name = string_data + (offset - string_data_offset);
@@ -1509,6 +1512,19 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
 
             read_dword(&ptr, &desc->uFlags);
             TRACE("Input bind uFlags: %u\n", desc->uFlags);
+
+            if (target_version >= 0x501)
+            {
+                read_dword(&ptr, &desc->Space);
+                TRACE("Input bind Space %u.\n", desc->Space);
+                read_dword(&ptr, &desc->uID);
+                TRACE("Input bind uID %u.\n", desc->uID);
+            }
+            else
+            {
+                desc->Space = 0;
+                desc->uID = 0;
+            }
         }
     }
 
-- 
2.26.2




More information about the wine-devel mailing list