Rico Schüller : d3dcompiler: Add initial reflection parsing.
Alexandre Julliard
julliard at winehq.org
Fri Dec 10 11:56:57 CST 2010
Module: wine
Branch: master
Commit: 5b2286a5bde2ae3e62354afc22055db818c40086
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b2286a5bde2ae3e62354afc22055db818c40086
Author: Rico Schüller <kgbricola at web.de>
Date: Fri Nov 26 12:43:51 2010 +0100
d3dcompiler: Add initial reflection parsing.
---
dlls/d3dcompiler_43/d3dcompiler_43_main.c | 20 +++++++++++++---
dlls/d3dcompiler_43/d3dcompiler_private.h | 4 ++-
dlls/d3dcompiler_43/reflection.c | 34 +++++++++++++++++++++++++++++
3 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_43_main.c b/dlls/d3dcompiler_43/d3dcompiler_43_main.c
index e4f8f99..365b631 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_43_main.c
+++ b/dlls/d3dcompiler_43/d3dcompiler_43_main.c
@@ -127,8 +127,15 @@ HRESULT WINAPI D3DStripShader(const void *data, SIZE_T data_size, UINT flags, ID
HRESULT WINAPI D3DReflect(const void *data, SIZE_T data_size, REFIID riid, void **reflector)
{
struct d3dcompiler_shader_reflection *object;
+ HRESULT hr;
- FIXME("data %p, data_size %lu, riid %s, blob %p stub!\n", data, data_size, debugstr_guid(riid), reflector);
+ TRACE("data %p, data_size %lu, riid %s, blob %p\n", data, data_size, debugstr_guid(riid), reflector);
+
+ if (!IsEqualGUID(riid, &IID_ID3D11ShaderReflection))
+ {
+ WARN("Wrong riid %s, accept only %s!\n", debugstr_guid(riid), debugstr_guid(&IID_ID3D11ShaderReflection));
+ return E_NOINTERFACE;
+ }
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
@@ -137,10 +144,15 @@ HRESULT WINAPI D3DReflect(const void *data, SIZE_T data_size, REFIID riid, void
return E_OUTOFMEMORY;
}
- object->vtbl = &d3dcompiler_shader_reflection_vtbl;
- object->refcount = 1;
+ hr = d3dcompiler_shader_reflection_init(object, data, data_size);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize shader reflection\n");
+ HeapFree(GetProcessHeap(), 0, object);
+ return hr;
+ }
- *reflector = (ID3D11ShaderReflection *)object;
+ *reflector = object;
TRACE("Created ID3D11ShaderReflection %p\n", object);
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 0b99629..c27e3d8 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -58,13 +58,15 @@ HRESULT d3dcompiler_get_blob_part(const void *data, SIZE_T data_size, D3D_BLOB_P
HRESULT d3dcompiler_strip_shader(const void *data, SIZE_T data_size, UINT flags, ID3DBlob **blob) DECLSPEC_HIDDEN;
/* ID3D11ShaderReflection */
-extern const struct ID3D11ShaderReflectionVtbl d3dcompiler_shader_reflection_vtbl DECLSPEC_HIDDEN;
struct d3dcompiler_shader_reflection
{
const struct ID3D11ShaderReflectionVtbl *vtbl;
LONG refcount;
};
+/* reflection handling */
+HRESULT d3dcompiler_shader_reflection_init(struct d3dcompiler_shader_reflection *reflection, const void *data, SIZE_T data_size) DECLSPEC_HIDDEN;
+
/* Shader assembler definitions */
typedef enum _shader_type {
ST_VERTEX,
diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index f92c986..e733a8f 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -241,3 +241,37 @@ const struct ID3D11ShaderReflectionVtbl d3dcompiler_shader_reflection_vtbl =
d3dcompiler_shader_reflection_GetMinFeatureLevel,
d3dcompiler_shader_reflection_GetThreadGroupSize,
};
+
+HRESULT d3dcompiler_shader_reflection_init(struct d3dcompiler_shader_reflection *reflection,
+ const void *data, SIZE_T data_size)
+{
+ struct dxbc src_dxbc;
+ HRESULT hr;
+ unsigned int i;
+
+ reflection->vtbl = &d3dcompiler_shader_reflection_vtbl;
+ reflection->refcount = 1;
+
+ hr = dxbc_parse(data, data_size, &src_dxbc);
+ if (FAILED(hr))
+ {
+ WARN("Failed to parse reflection\n");
+ return hr;
+ }
+
+ for (i = 0; i < src_dxbc.count; ++i)
+ {
+ struct dxbc_section *section = &src_dxbc.sections[i];
+
+ switch (section->tag)
+ {
+ default:
+ FIXME("Unhandled section %s!\n", debugstr_an((const char *)§ion->tag, 4));
+ break;
+ }
+ }
+
+ dxbc_destroy(&src_dxbc);
+
+ return hr;
+}
More information about the wine-cvs
mailing list