[PATCH v3 5/5] d3dcompiler: Implement d3d12_shader_reflection_Get{Input|Output|PatchConstant}ParameterDesc().

Paul Gofman pgofman at codeweavers.com
Tue Aug 11 07:30:26 CDT 2020


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
v2, v3:
    - no changes.

 dlls/d3dcompiler_43/reflection.c       |  52 ++++++++---
 dlls/d3dcompiler_43/tests/reflection.c | 123 ++++++++++++++++---------
 2 files changed, 118 insertions(+), 57 deletions(-)

diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index d88d6216dd8..9610fd140b9 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -35,7 +35,7 @@ enum D3DCOMPILER_SIGNATURE_ELEMENT_SIZE
 
 struct d3dcompiler_shader_signature
 {
-    D3D11_SIGNATURE_PARAMETER_DESC *elements;
+    D3D12_SIGNATURE_PARAMETER_DESC *elements;
     UINT element_count;
     char *string_data;
 };
@@ -572,7 +572,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_shader_reflection_GetInputParameterDesc(I
         return E_INVALIDARG;
     }
 
-    *desc = reflection->isgn->elements[index];
+    memcpy(desc, &reflection->isgn->elements[index], sizeof(*desc));
 
     return S_OK;
 }
@@ -590,7 +590,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_shader_reflection_GetOutputParameterDesc(
         return E_INVALIDARG;
     }
 
-    *desc = reflection->osgn->elements[index];
+    memcpy(desc, &reflection->osgn->elements[index], sizeof(*desc));
 
     return S_OK;
 }
@@ -608,7 +608,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_shader_reflection_GetPatchConstantParamet
         return E_INVALIDARG;
     }
 
-    *desc = reflection->pcsg->elements[index];
+    memcpy(desc, &reflection->pcsg->elements[index], sizeof(*desc));
 
     return S_OK;
 }
@@ -1652,7 +1652,7 @@ err_out:
 
 static HRESULT d3dcompiler_parse_signature(struct d3dcompiler_shader_signature *s, struct dxbc_section *section, DWORD target)
 {
-    D3D11_SIGNATURE_PARAMETER_DESC *d;
+    D3D12_SIGNATURE_PARAMETER_DESC *d;
     unsigned int string_data_offset;
     unsigned int string_data_size;
     const char *ptr = section->data;
@@ -2442,25 +2442,55 @@ static HRESULT STDMETHODCALLTYPE d3d12_shader_reflection_GetResourceBindingDesc(
 static HRESULT STDMETHODCALLTYPE d3d12_shader_reflection_GetInputParameterDesc(ID3D12ShaderReflection *iface,
         UINT index, D3D12_SIGNATURE_PARAMETER_DESC *desc)
 {
-    FIXME("iface %p, index %u, desc %p stub.\n", iface, index, desc);
+    struct d3dcompiler_shader_reflection *reflection = impl_from_ID3D12ShaderReflection(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, index %u, desc %p\n", iface, index, desc);
+
+    if (!desc || !reflection->isgn || index >= reflection->isgn->element_count)
+    {
+        WARN("Invalid argument specified\n");
+        return E_INVALIDARG;
+    }
+
+    memcpy(desc, &reflection->isgn->elements[index], sizeof(*desc));
+
+    return S_OK;
 }
 
 static HRESULT STDMETHODCALLTYPE d3d12_shader_reflection_GetOutputParameterDesc(ID3D12ShaderReflection *iface,
         UINT index, D3D12_SIGNATURE_PARAMETER_DESC *desc)
 {
-    FIXME("iface %p, index %u, desc %p stub.\n", iface, index, desc);
+    struct d3dcompiler_shader_reflection *reflection = impl_from_ID3D12ShaderReflection(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, index %u, desc %p\n", iface, index, desc);
+
+    if (!desc || !reflection->osgn || index >= reflection->osgn->element_count)
+    {
+        WARN("Invalid argument specified\n");
+        return E_INVALIDARG;
+    }
+
+    memcpy(desc, &reflection->osgn->elements[index], sizeof(*desc));
+
+    return S_OK;
 }
 
 static HRESULT STDMETHODCALLTYPE d3d12_shader_reflection_GetPatchConstantParameterDesc(ID3D12ShaderReflection *iface,
         UINT index, D3D12_SIGNATURE_PARAMETER_DESC *desc)
 {
-    FIXME("iface %p, index %u, desc %p stub.\n", iface, index, desc);
+    struct d3dcompiler_shader_reflection *reflection = impl_from_ID3D12ShaderReflection(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
+
+    if (!desc || !reflection->pcsg || index >= reflection->pcsg->element_count)
+    {
+        WARN("Invalid argument specified.\n");
+        return E_INVALIDARG;
+    }
+
+    memcpy(desc, &reflection->pcsg->elements[index], sizeof(*desc));
+
+    return S_OK;
 }
 
 static struct ID3D12ShaderReflectionVariable * STDMETHODCALLTYPE d3d12_shader_reflection_GetVariableByName
diff --git a/dlls/d3dcompiler_43/tests/reflection.c b/dlls/d3dcompiler_43/tests/reflection.c
index fba93897927..822e53a8964 100644
--- a/dlls/d3dcompiler_43/tests/reflection.c
+++ b/dlls/d3dcompiler_43/tests/reflection.c
@@ -388,7 +388,8 @@ static void test_reflection_desc_vs(void)
 {
     struct D3D11_SIGNATURE_PARAMETER_DESC_46 desc_46 = {0};
     const D3D11_SIGNATURE_PARAMETER_DESC *pdesc;
-    D3D11_SIGNATURE_PARAMETER_DESC desc = {0};
+    D3D11_SIGNATURE_PARAMETER_DESC desc11 = {0};
+    D3D12_SIGNATURE_PARAMETER_DESC desc12 = {0};
     D3D_MIN_PRECISION expected_min_prec;
     D3D11_SHADER_DESC sdesc11 = {0};
     D3D12_SHADER_DESC sdesc12 = {0};
@@ -460,16 +461,31 @@ static void test_reflection_desc_vs(void)
 
 #if D3D_COMPILER_VERSION
     ret = ref11->lpVtbl->GetBitwiseInstructionCount(ref11);
-    ok(ret == 0, "GetBitwiseInstructionCount failed, got %u, expected %u\n", ret, 0);
+    ok(ret == 0, "Got unexpected ret %u.\n", ret);
 
     ret = ref11->lpVtbl->GetConversionInstructionCount(ref11);
-    ok(ret == 2, "GetConversionInstructionCount failed, got %u, expected %u\n", ret, 2);
+    ok(ret == 2, "Got unexpected ret %u.\n", ret);
 
     ret = ref11->lpVtbl->GetMovInstructionCount(ref11);
-    ok(ret == 10, "GetMovInstructionCount failed, got %u, expected %u\n", ret, 10);
+    ok(ret == 10, "Got unexpected ret %u.\n", ret);
 
     ret = ref11->lpVtbl->GetMovcInstructionCount(ref11);
-    ok(ret == 0, "GetMovcInstructionCount failed, got %u, expected %u\n", ret, 0);
+    ok(ret == 0, "Got unexpected ret %u.\n", ret);
+
+    if (ref12)
+    {
+        ret = ref12->lpVtbl->GetBitwiseInstructionCount(ref12);
+        ok(ret == 0, "Got unexpected ret %u.\n", ret);
+
+        ret = ref12->lpVtbl->GetConversionInstructionCount(ref12);
+        ok(ret == 2, "Got unexpected ret %u.\n", ret);
+
+        ret = ref12->lpVtbl->GetMovInstructionCount(ref12);
+        ok(ret == 10, "Got unexpected ret %u.\n", ret);
+
+        ret = ref12->lpVtbl->GetMovcInstructionCount(ref12);
+        ok(ret == 0, "Got unexpected ret %u.\n", ret);
+    }
 #endif
 
     /* GetIn/OutputParameterDesc */
@@ -487,59 +503,74 @@ static void test_reflection_desc_vs(void)
     {
         pdesc = &test_reflection_desc_vs_resultin[i];
 
-        hr = ref11->lpVtbl->GetInputParameterDesc(ref11, i, &desc);
-        ok(hr == S_OK, "GetInputParameterDesc(%u) failed, got %x, expected %x\n", i, hr, S_OK);
-
-        ok(!strcmp(desc.SemanticName, pdesc->SemanticName), "GetInputParameterDesc(%u) SemanticName failed, got \"%s\", expected \"%s\"\n",
-                i, desc.SemanticName, pdesc->SemanticName);
-        ok(desc.SemanticIndex == pdesc->SemanticIndex, "GetInputParameterDesc(%u) SemanticIndex failed, got %u, expected %u\n",
-                i, desc.SemanticIndex, pdesc->SemanticIndex);
-        ok(desc.Register == pdesc->Register, "GetInputParameterDesc(%u) Register failed, got %u, expected %u\n",
-                i, desc.Register, pdesc->Register);
-        ok(desc.SystemValueType == pdesc->SystemValueType, "GetInputParameterDesc(%u) SystemValueType failed, got %x, expected %x\n",
-                i, desc.SystemValueType, pdesc->SystemValueType);
-        ok(desc.ComponentType == pdesc->ComponentType, "GetInputParameterDesc(%u) ComponentType failed, got %x, expected %x\n",
-                i, desc.ComponentType, pdesc->ComponentType);
-        ok(desc.Mask == pdesc->Mask, "GetInputParameterDesc(%u) Mask failed, got %x, expected %x\n",
-                i, desc.Mask, pdesc->Mask);
-        ok(desc.ReadWriteMask == pdesc->ReadWriteMask, "GetInputParameterDesc(%u) ReadWriteMask failed, got %x, expected %x\n",
-                i, desc.ReadWriteMask, pdesc->ReadWriteMask);
+        hr = ref11->lpVtbl->GetInputParameterDesc(ref11, i, &desc11);
+        ok(hr == S_OK, "Got unexpected hr %#x, i %u.\n", hr, i);
+
+        ok(!strcmp(desc11.SemanticName, pdesc->SemanticName), "Got unexpected SemanticName \"%s\", i %u.\n",
+                desc11.SemanticName, i);
+        ok(desc11.SemanticIndex == pdesc->SemanticIndex, "Got unexpected SemanticIndex %u, i %u.\n",
+                desc11.SemanticIndex, i);
+        ok(desc11.Register == pdesc->Register, "Got unexpected Register %u, i %u.\n", desc11.Register, i);
+        ok(desc11.SystemValueType == pdesc->SystemValueType, "Got unexpected SystemValueType %u, i %u.\n",
+                desc11.SystemValueType, i);
+        ok(desc11.ComponentType == pdesc->ComponentType, "Got unexpected ComponentType %u, i %u.\n",
+                desc11.ComponentType, i);
+        ok(desc11.Mask == pdesc->Mask, "Got unexpected SystemValueType %#x, i %u.\n", desc11.Mask, i);
+        ok(desc11.ReadWriteMask == pdesc->ReadWriteMask, "Got unexpected ReadWriteMask %#x, i %u.\n",
+                desc11.ReadWriteMask, i);
         /* The Stream field of D3D11_SIGNATURE_PARAMETER_DESC is in the
          * trailing padding of the D3D10_SIGNATURE_PARAMETER_DESC struct on
          * 64-bits and thus undefined. Don't test it. */
         if (D3D_COMPILER_VERSION)
-            ok(desc.Stream == pdesc->Stream, "(%u): got unexpected Stream %u, expected %u.\n",
-                    i, desc.Stream, pdesc->Stream);
+            ok(desc11.Stream == pdesc->Stream, "Got unexpected Stream %u, i %u.\n",
+                    desc11.Stream, i);
         else if (sizeof(void *) == 4)
-            ok(!desc.Stream, "(%u): got unexpected Stream %u.\n", i, desc.Stream);
+            ok(!desc11.Stream, "Got unexpected Stream %u, i %u.\n", desc11.Stream, i);
+
+        if (ref12)
+        {
+            hr = ref12->lpVtbl->GetInputParameterDesc(ref12, i, &desc12);
+            ok(hr == S_OK, "Got unexpected hr %#x, i %u.\n", hr, i);
+
+            ok(!memcmp(&desc12, &desc11, sizeof(desc11)), "D3D11 and D3D12 descs do not match.\n");
+        }
     }
 
     for (i = 0; i < ARRAY_SIZE(test_reflection_desc_vs_resultout); ++i)
     {
         pdesc = &test_reflection_desc_vs_resultout[i];
 
-        hr = ref11->lpVtbl->GetOutputParameterDesc(ref11, i, &desc);
-        ok(hr == S_OK, "GetOutputParameterDesc(%u) failed, got %x, expected %x\n", i, hr, S_OK);
-
-        ok(!strcmp(desc.SemanticName, pdesc->SemanticName), "GetOutputParameterDesc(%u) SemanticName failed, got \"%s\", expected \"%s\"\n",
-                i, desc.SemanticName, pdesc->SemanticName);
-        ok(desc.SemanticIndex == pdesc->SemanticIndex, "GetOutputParameterDesc(%u) SemanticIndex failed, got %u, expected %u\n",
-                i, desc.SemanticIndex, pdesc->SemanticIndex);
-        ok(desc.Register == pdesc->Register, "GetOutputParameterDesc(%u) Register failed, got %u, expected %u\n",
-                i, desc.Register, pdesc->Register);
-        ok(desc.SystemValueType == pdesc->SystemValueType, "GetOutputParameterDesc(%u) SystemValueType failed, got %x, expected %x\n",
-                i, desc.SystemValueType, pdesc->SystemValueType);
-        ok(desc.ComponentType == pdesc->ComponentType, "GetOutputParameterDesc(%u) ComponentType failed, got %x, expected %x\n",
-                i, desc.ComponentType, pdesc->ComponentType);
-        ok(desc.Mask == pdesc->Mask, "GetOutputParameterDesc(%u) Mask failed, got %x, expected %x\n",
-                i, desc.Mask, pdesc->Mask);
-        ok(desc.ReadWriteMask == pdesc->ReadWriteMask, "GetOutputParameterDesc(%u) ReadWriteMask failed, got %x, expected %x\n",
-                i, desc.ReadWriteMask, pdesc->ReadWriteMask);
+        hr = ref11->lpVtbl->GetOutputParameterDesc(ref11, i, &desc11);
+        ok(hr == S_OK, "Got unexpected hr %#x, i %u.\n", hr, i);
+
+        ok(!strcmp(desc11.SemanticName, pdesc->SemanticName), "Got unexpected SemanticName \"%s\", i %u.\n",
+                desc11.SemanticName, i);
+        ok(desc11.SemanticIndex == pdesc->SemanticIndex, "Got unexpected SemanticIndex %u, i %u.\n",
+                desc11.SemanticIndex, i);
+        ok(desc11.Register == pdesc->Register, "Got unexpected Register %u, i %u.\n", desc11.Register, i);
+        ok(desc11.SystemValueType == pdesc->SystemValueType, "Got unexpected SystemValueType %u, i %u.\n",
+                desc11.SystemValueType, i);
+        ok(desc11.ComponentType == pdesc->ComponentType, "Got unexpected ComponentType %u, i %u.\n",
+                desc11.ComponentType, i);
+        ok(desc11.Mask == pdesc->Mask, "Got unexpected SystemValueType %#x, i %u.\n", desc11.Mask, i);
+        ok(desc11.ReadWriteMask == pdesc->ReadWriteMask, "Got unexpected ReadWriteMask %#x, i %u.\n",
+                desc11.ReadWriteMask, i);
+        /* The Stream field of D3D11_SIGNATURE_PARAMETER_DESC is in the
+         * trailing padding of the D3D10_SIGNATURE_PARAMETER_DESC struct on
+         * 64-bits and thus undefined. Don't test it. */
         if (D3D_COMPILER_VERSION)
-            ok(desc.Stream == pdesc->Stream, "(%u): got unexpected Stream %u, expected %u.\n",
-                    i, desc.Stream, pdesc->Stream);
+            ok(desc11.Stream == pdesc->Stream, "Got unexpected Stream %u, i %u.\n",
+                    desc11.Stream, i);
         else if (sizeof(void *) == 4)
-            ok(!desc.Stream, "(%u): got unexpected Stream %u.\n", i, desc.Stream);
+            ok(!desc11.Stream, "Got unexpected Stream %u, i %u.\n", desc11.Stream, i);
+
+        if (ref12)
+        {
+            hr = ref12->lpVtbl->GetOutputParameterDesc(ref12, i, &desc12);
+            ok(hr == S_OK, "Got unexpected hr %#x, i %u.\n", hr, i);
+
+            ok(!memcmp(&desc12, &desc11, sizeof(desc11)), "D3D11 and D3D12 descs do not match.\n");
+        }
     }
 
     if (ref12)
@@ -549,7 +580,7 @@ static void test_reflection_desc_vs(void)
     }
 
     count = ref11->lpVtbl->Release(ref11);
-    ok(count == 0, "Release failed %u\n", count);
+    ok(count == 0, "Got unexpected ref count %u.\n", count);
 }
 
 /*
-- 
2.26.2




More information about the wine-devel mailing list