Rico Schüller : d3dcompiler: Parse bound resources.
Alexandre Julliard
julliard at winehq.org
Mon Feb 14 10:02:04 CST 2011
Module: wine
Branch: master
Commit: 5ad824a1780a0d746250e21209dad6ac8268d3f0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5ad824a1780a0d746250e21209dad6ac8268d3f0
Author: Rico Schüller <kgbricola at web.de>
Date: Thu Feb 10 20:05:59 2011 +0100
d3dcompiler: Parse bound resources.
---
dlls/d3dcompiler_43/d3dcompiler_private.h | 3 +
dlls/d3dcompiler_43/reflection.c | 101 +++++++++++++++++++++++++---
2 files changed, 93 insertions(+), 11 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index d69b88c..bc99322 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -70,6 +70,7 @@ struct d3dcompiler_shader_reflection
ID3D11ShaderReflection ID3D11ShaderReflection_iface;
LONG refcount;
+ DWORD target;
char *creator;
UINT flags;
UINT version;
@@ -106,6 +107,8 @@ struct d3dcompiler_shader_reflection
struct d3dcompiler_shader_signature *isgn;
struct d3dcompiler_shader_signature *osgn;
struct d3dcompiler_shader_signature *pcsg;
+ char *resource_string;
+ D3D11_SHADER_INPUT_BIND_DESC *bound_resources;
};
/* reflection handling */
diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index 96adb04..9677075 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -85,6 +85,8 @@ static void reflection_cleanup(struct d3dcompiler_shader_reflection *ref)
HeapFree(GetProcessHeap(), 0, ref->pcsg);
}
+ HeapFree(GetProcessHeap(), 0, ref->bound_resources);
+ HeapFree(GetProcessHeap(), 0, ref->resource_string);
HeapFree(GetProcessHeap(), 0, ref->creator);
}
@@ -506,42 +508,119 @@ static HRESULT d3dcompiler_parse_rdef(struct d3dcompiler_shader_reflection *r, c
{
const char *ptr = data;
DWORD size = data_size >> 2;
- DWORD offset;
+ DWORD offset, cbuffer_offset, resource_offset, creator_offset;
+ unsigned int i;
+ unsigned int string_data_offset;
+ unsigned int string_data_size;
+ char *string_data = NULL, *creator = NULL;
+ D3D11_SHADER_INPUT_BIND_DESC *bound_resources = NULL;
+ HRESULT hr;
TRACE("Size %u\n", size);
read_dword(&ptr, &r->constant_buffer_count);
TRACE("Constant buffer count: %u\n", r->constant_buffer_count);
- read_dword(&ptr, &offset);
- TRACE("Constant buffer offset: %x\n", offset);
+ read_dword(&ptr, &cbuffer_offset);
+ TRACE("Constant buffer offset: %#x\n", cbuffer_offset);
read_dword(&ptr, &r->bound_resource_count);
TRACE("Bound resource count: %u\n", r->bound_resource_count);
- read_dword(&ptr, &offset);
- TRACE("Bound resource offset: %x\n", offset);
+ read_dword(&ptr, &resource_offset);
+ TRACE("Bound resource offset: %#x\n", resource_offset);
- skip_dword_unknown(&ptr, 1);
+ read_dword(&ptr, &r->target);
+ TRACE("Target: %#x\n", r->target);
read_dword(&ptr, &r->flags);
TRACE("Flags: %u\n", r->flags);
- read_dword(&ptr, &offset);
- TRACE("Creator at offset %#x.\n", offset);
+ read_dword(&ptr, &creator_offset);
+ TRACE("Creator at offset %#x.\n", creator_offset);
- if (!copy_name(data + offset, &r->creator))
+ if (!copy_name(data + creator_offset, &creator))
{
ERR("Failed to copy name.\n");
return E_OUTOFMEMORY;
}
- TRACE("Creator: %s.\n", debugstr_a(r->creator));
+ TRACE("Creator: %s.\n", debugstr_a(creator));
+
+ /* todo: Parse RD11 */
+ if ((r->target & 0x0000ffff) >= 0x500)
+ {
+ skip_dword_unknown(&ptr, 8);
+ }
+
+ if (r->bound_resource_count)
+ {
+ /* 8 for each bind desc */
+ string_data_offset = resource_offset + r->bound_resource_count * 8 * sizeof(DWORD);
+ string_data_size = (cbuffer_offset ? cbuffer_offset : creator_offset) - string_data_offset;
+
+ string_data = HeapAlloc(GetProcessHeap(), 0, string_data_size);
+ if (!string_data)
+ {
+ ERR("Failed to allocate string data memory.\n");
+ hr = E_OUTOFMEMORY;
+ goto err_out;
+ }
+ memcpy(string_data, data + string_data_offset, string_data_size);
+
+ bound_resources = HeapAlloc(GetProcessHeap(), 0, r->bound_resource_count * sizeof(*bound_resources));
+ if (!bound_resources)
+ {
+ ERR("Failed to allocate resources memory.\n");
+ hr = E_OUTOFMEMORY;
+ goto err_out;
+ }
- /* todo: Parse D3D11_SHADER_INPUT_BIND_DESC Structure */
+ ptr = data + resource_offset;
+ for (i = 0; i < r->bound_resource_count; i++)
+ {
+ D3D11_SHADER_INPUT_BIND_DESC *desc = &bound_resources[i];
+
+ read_dword(&ptr, &offset);
+ desc->Name = string_data + (offset - string_data_offset);
+ TRACE("Input bind Name: %s\n", debugstr_a(desc->Name));
+
+ read_dword(&ptr, &desc->Type);
+ TRACE("Input bind Type: %#x\n", desc->Type);
+
+ read_dword(&ptr, &desc->ReturnType);
+ TRACE("Input bind ReturnType: %#x\n", desc->ReturnType);
+
+ read_dword(&ptr, &desc->Dimension);
+ TRACE("Input bind Dimension: %#x\n", desc->Dimension);
+
+ read_dword(&ptr, &desc->NumSamples);
+ TRACE("Input bind NumSamples: %u\n", desc->NumSamples);
+
+ read_dword(&ptr, &desc->BindPoint);
+ TRACE("Input bind BindPoint: %u\n", desc->BindPoint);
+
+ read_dword(&ptr, &desc->BindCount);
+ TRACE("Input bind BindCount: %u\n", desc->BindCount);
+
+ read_dword(&ptr, &desc->uFlags);
+ TRACE("Input bind uFlags: %u\n", desc->uFlags);
+ }
+ }
/* todo: Parse Constant buffers */
+ r->creator = creator;
+ r->resource_string = string_data;
+ r->bound_resources = bound_resources;
+
return S_OK;
+
+err_out:
+ HeapFree(GetProcessHeap(), 0, bound_resources);
+ HeapFree(GetProcessHeap(), 0, string_data);
+ HeapFree(GetProcessHeap(), 0, creator);
+
+ return hr;
}
HRESULT d3dcompiler_parse_signature(struct d3dcompiler_shader_signature *s, struct dxbc_section *section)
More information about the wine-cvs
mailing list