Module: vkd3d Branch: master Commit: 694d39ffe655e1507f1b7a42a388b9d180806c1c URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/694d39ffe655e1507f1b7a42a388b9...
Author: Zebediah Figura zfigura@codeweavers.com Date: Thu May 2 22:13:51 2024 -0500
tests: Test bounds checking in ID3D12ShaderReflection.
---
tests/hlsl_d3d12.c | 62 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 17 deletions(-)
diff --git a/tests/hlsl_d3d12.c b/tests/hlsl_d3d12.c index 4ab08816..ffab9fdd 100644 --- a/tests/hlsl_d3d12.c +++ b/tests/hlsl_d3d12.c @@ -1555,7 +1555,14 @@ static void test_reflection(void) for (unsigned int t = 0; t < ARRAY_SIZE(tests); ++t) { ID3D10Blob *code = compile_shader_flags(tests[t].source, - tests[t].profile, D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY); + tests[t].profile, strstr(tests[t].profile, "5_1") ? 0 : D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY); + ID3D12ShaderReflectionConstantBuffer *cbuffer; + D3D12_SHADER_TYPE_DESC type_desc, field_desc; + D3D12_SHADER_INPUT_BIND_DESC binding_desc; + ID3D12ShaderReflectionType *type, *field; + D3D12_SHADER_BUFFER_DESC buffer_desc; + ID3D12ShaderReflectionVariable *var; + D3D12_SHADER_VARIABLE_DESC var_desc; ID3D12ShaderReflection *reflection; D3D12_SHADER_DESC shader_desc;
@@ -1571,8 +1578,6 @@ static void test_reflection(void) for (unsigned int i = 0; i < shader_desc.ConstantBuffers; ++i) { const struct shader_buffer *expect_buffer = &tests[t].buffers[i]; - ID3D12ShaderReflectionConstantBuffer *cbuffer; - D3D12_SHADER_BUFFER_DESC buffer_desc;
vkd3d_test_push_context("Buffer %u", i);
@@ -1588,10 +1593,6 @@ static void test_reflection(void) for (unsigned int j = 0; j < buffer_desc.Variables; ++j) { const struct shader_variable *expect = &expect_buffer->vars[j]; - D3D12_SHADER_TYPE_DESC type_desc, field_desc; - ID3D12ShaderReflectionType *type, *field; - ID3D12ShaderReflectionVariable *var; - D3D12_SHADER_VARIABLE_DESC var_desc;
vkd3d_test_push_context("Variable %u", j);
@@ -1630,35 +1631,56 @@ static void test_reflection(void) vkd3d_test_pop_context(); }
+ field = ID3D12ShaderReflectionType_GetMemberTypeByIndex(type, type_desc.Members); + hr = ID3D12ShaderReflectionType_GetDesc(field, &field_desc); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + vkd3d_test_pop_context(); }
+ var = ID3D12ShaderReflectionConstantBuffer_GetVariableByIndex(cbuffer, buffer_desc.Variables); + hr = ID3D12ShaderReflectionVariable_GetDesc(var, &var_desc); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + + type = ID3D12ShaderReflectionVariable_GetType(var); + hr = ID3D12ShaderReflectionType_GetDesc(type, &type_desc); + ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr); + field = ID3D12ShaderReflectionType_GetMemberTypeByIndex(type, 0); + hr = ID3D12ShaderReflectionType_GetDesc(field, &type_desc); + ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr); + vkd3d_test_pop_context(); }
+ cbuffer = ID3D12ShaderReflection_GetConstantBufferByIndex(reflection, shader_desc.ConstantBuffers); + hr = ID3D12ShaderReflectionConstantBuffer_GetDesc(cbuffer, &buffer_desc); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + for (unsigned int i = 0; i < shader_desc.BoundResources; ++i) { const D3D12_SHADER_INPUT_BIND_DESC *expect = &tests[t].bindings[i]; - D3D12_SHADER_INPUT_BIND_DESC desc;
vkd3d_test_push_context("Binding %u", i);
- hr = ID3D12ShaderReflection_GetResourceBindingDesc(reflection, i, &desc); + hr = ID3D12ShaderReflection_GetResourceBindingDesc(reflection, i, &binding_desc); ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
- ok(!strcmp(desc.Name, expect->Name), "Got name "%s".\n", desc.Name); - ok(desc.Type == expect->Type, "Got type %#x.\n", desc.Type); - ok(desc.BindPoint == expect->BindPoint, "Got bind point %u.\n", desc.BindPoint); - ok(desc.BindCount == expect->BindCount, "Got bind count %u.\n", desc.BindCount); + ok(!strcmp(binding_desc.Name, expect->Name), "Got name "%s".\n", binding_desc.Name); + ok(binding_desc.Type == expect->Type, "Got type %#x.\n", binding_desc.Type); + ok(binding_desc.BindPoint == expect->BindPoint, "Got bind point %u.\n", binding_desc.BindPoint); + ok(binding_desc.BindCount == expect->BindCount, "Got bind count %u.\n", binding_desc.BindCount); todo_if ((expect->uFlags & D3D_SIF_USERPACKED) && expect->Type != D3D_SIT_CBUFFER) - ok(desc.uFlags == expect->uFlags, "Got flags %#x.\n", desc.uFlags); - ok(desc.ReturnType == expect->ReturnType, "Got return type %#x.\n", desc.ReturnType); - ok(desc.Dimension == expect->Dimension, "Got dimension %#x.\n", desc.Dimension); - ok(desc.NumSamples == expect->NumSamples, "Got multisample count %u.\n", desc.NumSamples); + ok(binding_desc.uFlags == expect->uFlags, "Got flags %#x.\n", binding_desc.uFlags); + ok(binding_desc.ReturnType == expect->ReturnType, "Got return type %#x.\n", binding_desc.ReturnType); + ok(binding_desc.Dimension == expect->Dimension, "Got dimension %#x.\n", binding_desc.Dimension); + ok(binding_desc.NumSamples == expect->NumSamples, "Got multisample count %u.\n", binding_desc.NumSamples);
vkd3d_test_pop_context(); }
+ hr = ID3D12ShaderReflection_GetResourceBindingDesc(reflection, shader_desc.BoundResources, &binding_desc); + todo ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + ID3D10Blob_Release(code); refcount = ID3D12ShaderReflection_Release(reflection); ok(!refcount, "Got unexpected refcount %u.\n", refcount); @@ -1845,6 +1867,9 @@ static void test_signature_reflection(void) vkd3d_test_pop_context(); }
+ hr = reflection->lpVtbl->GetInputParameterDesc(reflection, shader_desc.InputParameters, &desc); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + for (unsigned int j = 0; j < shader_desc.OutputParameters; ++j) { vkd3d_test_push_context("Output %u", j); @@ -1854,6 +1879,9 @@ static void test_signature_reflection(void) vkd3d_test_pop_context(); }
+ hr = reflection->lpVtbl->GetOutputParameterDesc(reflection, shader_desc.OutputParameters, &desc); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + ID3D10Blob_Release(code); refcount = reflection->lpVtbl->Release(reflection); ok(!refcount, "Got unexpected refcount %u.\n", refcount);