Commit c36a2589 authored by Matteo Bruni's avatar Matteo Bruni Committed by Alexandre Julliard

d3d10: Do not accept any compute shader in D3D10ReflectShader().

parent af454773
......@@ -52,6 +52,8 @@ enum D3DCOMPILER_SIGNATURE_ELEMENT_SIZE
#define D3DCOMPILER_SHADER_TARGET_SHADERTYPE_MASK 0xffff0000
#define D3DCOMPILER_SHADER_TARGET_SHADERTYPE_SHIFT 16
#define D3DCOMPILER_SHDR_SHADER_TYPE_CS 0x4353
enum d3dcompiler_shader_type
{
D3DCOMPILER_SHADER_TYPE_CS = 5,
......@@ -1487,6 +1489,9 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
size_t size = data_size >> 2;
uint32_t target_version;
const char *ptr = data;
#if D3D_COMPILER_VERSION < 47
uint32_t shader_type;
#endif
HRESULT hr;
TRACE("Size %Iu.\n", size);
......@@ -1508,8 +1513,10 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
target_version = r->target & D3DCOMPILER_SHADER_TARGET_VERSION_MASK;
#if D3D_COMPILER_VERSION < 47
if (target_version >= 0x501 && (!D3D_COMPILER_VERSION || ((r->target & D3DCOMPILER_SHADER_TARGET_SHADERTYPE_MASK)
>> D3DCOMPILER_SHADER_TARGET_SHADERTYPE_SHIFT) != 0x4353 /* CS */))
shader_type = (r->target & D3DCOMPILER_SHADER_TARGET_SHADERTYPE_MASK)
>> D3DCOMPILER_SHADER_TARGET_SHADERTYPE_SHIFT;
if ((target_version >= 0x501 && shader_type != D3DCOMPILER_SHDR_SHADER_TYPE_CS)
|| (!D3D_COMPILER_VERSION && shader_type == D3DCOMPILER_SHDR_SHADER_TYPE_CS))
{
WARN("Target version %#x is not supported in d3dcompiler %u.\n", target_version, D3D_COMPILER_VERSION);
return E_INVALIDARG;
......
......@@ -1198,10 +1198,33 @@ static const D3D12_SHADER_INPUT_BIND_DESC test_reflection_bound_resources_result
{"c2", D3D_SIT_CBUFFER, 1, 1, 0, 0, D3D_SRV_DIMENSION_UNKNOWN, 0, 0, 1},
};
#if D3D_COMPILER_VERSION
static void test_reflection_cs(void)
{
/*
* fxc.exe /T cs_4_0 /Fo
*/
#if 0
[numthreads(16, 8, 4)]
void main( uint3 DTid : SV_DispatchThreadID )
{
}
#endif
static const DWORD test_blob_cs_4_0[] =
{
0x43425844, 0x698a31ca, 0x8c6eee35, 0x2377107a, 0xe1e69066, 0x00000001, 0x00000150, 0x00000005,
0x00000034, 0x0000008c, 0x0000009c, 0x000000ac, 0x000000d4, 0x46454452, 0x00000050, 0x00000000,
0x00000000, 0x00000000, 0x0000001c, 0x43530400, 0x00000100, 0x0000001c, 0x7263694d, 0x666f736f,
0x52282074, 0x4c482029, 0x53204c53, 0x65646168, 0x6f432072, 0x6c69706d, 0x39207265, 0x2e39322e,
0x2e323539, 0x31313133, 0xababab00, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, 0x4e47534f,
0x00000008, 0x00000000, 0x00000008, 0x58454853, 0x00000020, 0x00050040, 0x00000008, 0x0100086a,
0x0400009b, 0x00000010, 0x00000008, 0x00000004, 0x0100003e, 0x54415453, 0x00000074, 0x00000001,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
/*
* fxc.exe /T cs_5_1 /Fo
*/
#if 0
......@@ -1228,10 +1251,17 @@ static void test_reflection_cs(void)
};
UINT size_x, size_y, size_z, size_total;
ID3D11ShaderReflection *ref11;
HRESULT hr;
HRESULT hr, expected;
expected = D3D_COMPILER_VERSION ? S_OK : E_INVALIDARG;
hr = call_reflect(test_blob_cs_4_0, test_blob_cs_4_0[6], &IID_ID3D11ShaderReflection, (void **)&ref11);
ok(hr == expected, "Unexpected hr %#lx.\n", hr);
if (SUCCEEDED(hr))
ref11->lpVtbl->Release(ref11);
hr = call_reflect(test_blob, test_blob[6], &IID_ID3D11ShaderReflection, (void **)&ref11);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
ok(hr == expected, "Unexpected hr %#lx.\n", hr);
if (FAILED(hr))
return;
size_total = ref11->lpVtbl->GetThreadGroupSize(ref11, &size_x, &size_y, &size_z);
......@@ -1242,7 +1272,6 @@ static void test_reflection_cs(void)
ref11->lpVtbl->Release(ref11);
}
#endif
static void test_reflection_bound_resources(const DWORD *blob, const D3D12_SHADER_INPUT_BIND_DESC *result,
unsigned int result_count, unsigned int target_version)
......@@ -2208,10 +2237,10 @@ START_TEST(reflection)
#if D3D_COMPILER_VERSION
test_reflection_references();
test_reflection_interfaces();
test_reflection_cs();
#else
test_d3d10_interfaces();
#endif
test_reflection_cs();
test_reflection_desc_vs();
test_reflection_desc_ps();
test_reflection_desc_ps_output();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment