[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