From: Zebediah Figura zfigura@codeweavers.com
--- libs/vkd3d-utils/reflection.c | 41 +++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 7 deletions(-)
diff --git a/libs/vkd3d-utils/reflection.c b/libs/vkd3d-utils/reflection.c index f6e545c56..7adbc9cfa 100644 --- a/libs/vkd3d-utils/reflection.c +++ b/libs/vkd3d-utils/reflection.c @@ -26,6 +26,9 @@ struct d3d12_type { ID3D12ShaderReflectionType ID3D12ShaderReflectionType_iface; const struct vkd3d_shader_d3d_type *type; + uint32_t field_offset; + + struct d3d12_type *fields; };
struct d3d12_variable @@ -90,7 +93,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_type_GetDesc( desc->Columns = type->type->column_count; desc->Elements = type->type->element_count; desc->Members = type->type->field_count; - desc->Offset = 0; + desc->Offset = type->field_offset; desc->Name = type->type->name;
return S_OK; @@ -99,9 +102,17 @@ static HRESULT STDMETHODCALLTYPE d3d12_type_GetDesc( static ID3D12ShaderReflectionType * STDMETHODCALLTYPE d3d12_type_GetMemberTypeByIndex( ID3D12ShaderReflectionType *iface, UINT index) { - FIXME("iface %p, index %u, stub!\n", iface, index); + struct d3d12_type *type = impl_from_ID3D12ShaderReflectionType(iface);
- return NULL; + TRACE("iface %p, index %u.\n", iface, index); + + if (index > type->type->field_count) + { + WARN("Invalid index %u.\n", index); + return &null_type.ID3D12ShaderReflectionType_iface; + } + + return &type->fields[index].ID3D12ShaderReflectionType_iface; }
static ID3D12ShaderReflectionType * STDMETHODCALLTYPE d3d12_type_GetMemberTypeByName( @@ -602,19 +613,32 @@ static const struct ID3D12ShaderReflectionVtbl d3d12_reflection_vtbl = d3d12_reflection_GetRequiresFlags, };
-static void d3d12_type_init(struct d3d12_type *type, const struct vkd3d_shader_d3d_type *vkd3d_type) +static bool d3d12_type_init(struct d3d12_type *type, + const struct vkd3d_shader_d3d_type *vkd3d_type, uint32_t field_offset) { type->ID3D12ShaderReflectionType_iface.lpVtbl = &d3d12_type_vtbl; type->type = vkd3d_type; + type->field_offset = field_offset; + + if (!(type->fields = vkd3d_calloc(vkd3d_type->field_count, sizeof(*type->fields)))) + return false; + + for (uint32_t i = 0; i < vkd3d_type->field_count; ++i) + { + if (!d3d12_type_init(&type->fields[i], &vkd3d_type->fields[i].type, vkd3d_type->fields[i].offset)) + return false; + } + + return true; }
-static void d3d12_variable_init(struct d3d12_variable *variable, +static bool d3d12_variable_init(struct d3d12_variable *variable, struct d3d12_buffer *buffer, const struct vkd3d_shader_d3d_variable *vkd3d_variable) { variable->ID3D12ShaderReflectionVariable_iface.lpVtbl = &d3d12_variable_vtbl; variable->buffer = buffer; variable->variable = vkd3d_variable; - d3d12_type_init(&variable->type, &vkd3d_variable->type); + return d3d12_type_init(&variable->type, &vkd3d_variable->type, 0); }
static bool d3d12_buffer_init(struct d3d12_buffer *buffer, const struct vkd3d_shader_d3d_buffer *vkd3d_buffer) @@ -626,7 +650,10 @@ static bool d3d12_buffer_init(struct d3d12_buffer *buffer, const struct vkd3d_sh return false;
for (uint32_t i = 0; i < vkd3d_buffer->variable_count; ++i) - d3d12_variable_init(&buffer->variables[i], buffer, &vkd3d_buffer->variables[i]); + { + if (!d3d12_variable_init(&buffer->variables[i], buffer, &vkd3d_buffer->variables[i])) + return false; + }
return true; }