Henri Verbeet : d3d10core: Improve the shader input/ output signature parsing code.
Alexandre Julliard
julliard at winehq.org
Mon May 11 09:10:45 CDT 2009
Module: wine
Branch: master
Commit: d6fa27f5a1acf2dab87f8a58086439ed5eb5b987
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d6fa27f5a1acf2dab87f8a58086439ed5eb5b987
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Fri May 8 17:44:25 2009 +0200
d3d10core: Improve the shader input/output signature parsing code.
Make a copy of the string data, and move the function to shader.c.
---
dlls/d3d10core/d3d10core_private.h | 2 +
dlls/d3d10core/inputlayout.c | 67 ++---------------------------------
dlls/d3d10core/shader.c | 65 ++++++++++++++++++++++++++++++++++
3 files changed, 71 insertions(+), 63 deletions(-)
diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h
index 3f782ba..fade879 100644
--- a/dlls/d3d10core/d3d10core_private.h
+++ b/dlls/d3d10core/d3d10core_private.h
@@ -155,6 +155,8 @@ struct d3d10_pixel_shader
};
HRESULT shader_extract_from_dxbc(const void *dxbc, SIZE_T dxbc_length, const DWORD **shader_code);
+HRESULT shader_parse_signature(const char *data, DWORD data_size, struct wined3d_shader_signature *s);
+void shader_free_signature(struct wined3d_shader_signature *s);
/* Layered device */
enum dxgi_device_layer_id
diff --git a/dlls/d3d10core/inputlayout.c b/dlls/d3d10core/inputlayout.c
index d78ecad..f6f50bc 100644
--- a/dlls/d3d10core/inputlayout.c
+++ b/dlls/d3d10core/inputlayout.c
@@ -24,74 +24,15 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d10core);
-struct input_signature_element
-{
- const char *semantic_name;
- UINT semantic_idx;
- DWORD unknown; /* system value semantic? */
- DWORD component_type;
- UINT register_idx;
- DWORD mask;
-};
-
-struct input_signature
-{
- struct input_signature_element *elements;
- UINT element_count;
-};
-
-static HRESULT parse_isgn(const char *data, struct input_signature *is)
-{
- struct input_signature_element *e;
- const char *ptr = data;
- unsigned int i;
- DWORD count;
-
- read_dword(&ptr, &count);
- TRACE("%u elements\n", count);
-
- skip_dword_unknown(&ptr, 1);
-
- e = HeapAlloc(GetProcessHeap(), 0, count * sizeof(*e));
- if (!e)
- {
- ERR("Failed to allocate input signature memory.\n");
- return E_OUTOFMEMORY;
- }
-
- for (i = 0; i < count; ++i)
- {
- UINT name_offset;
-
- read_dword(&ptr, &name_offset);
- e[i].semantic_name = data + name_offset;
- read_dword(&ptr, &e[i].semantic_idx);
- read_dword(&ptr, &e[i].unknown);
- read_dword(&ptr, &e[i].component_type);
- read_dword(&ptr, &e[i].register_idx);
- read_dword(&ptr, &e[i].mask);
-
- TRACE("semantic: %s, semantic idx: %u, unknown %#x, type %u, register idx: %u, use_mask %#x, input_mask %#x\n",
- e[i].semantic_name, e[i].semantic_idx, e[i].unknown, e[i].component_type,
- e[i].register_idx, (e[i].mask >> 8) & 0xff, e[i].mask & 0xff);
- }
-
- is->elements = e;
- is->element_count = count;
-
- return S_OK;
-}
-
static HRESULT isgn_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
{
- struct input_signature *is = ctx;
- const char *ptr = data;
+ struct wined3d_shader_signature *is = ctx;
char tag_str[5];
switch(tag)
{
case TAG_ISGN:
- return parse_isgn(ptr, is);
+ return shader_parse_signature(data, data_size, is);
default:
memcpy(tag_str, &tag, 4);
@@ -105,7 +46,7 @@ HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEMENT_DESC
UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length,
WINED3DVERTEXELEMENT **wined3d_elements, UINT *wined3d_element_count)
{
- struct input_signature is;
+ struct wined3d_shader_signature is;
HRESULT hr;
UINT i;
@@ -157,7 +98,7 @@ HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEMENT_DESC
}
}
- HeapFree(GetProcessHeap(), 0, is.elements);
+ shader_free_signature(&is);
return S_OK;
}
diff --git a/dlls/d3d10core/shader.c b/dlls/d3d10core/shader.c
index 8b3d01e..42af6d0 100644
--- a/dlls/d3d10core/shader.c
+++ b/dlls/d3d10core/shader.c
@@ -55,6 +55,71 @@ HRESULT shader_extract_from_dxbc(const void *dxbc, SIZE_T dxbc_length, const DWO
return hr;
}
+HRESULT shader_parse_signature(const char *data, DWORD data_size, struct wined3d_shader_signature *s)
+{
+ struct wined3d_shader_signature_element *e;
+ unsigned int string_data_offset;
+ unsigned int string_data_size;
+ const char *ptr = data;
+ char *string_data;
+ unsigned int i;
+ DWORD count;
+
+ read_dword(&ptr, &count);
+ TRACE("%u elements\n", count);
+
+ skip_dword_unknown(&ptr, 1);
+
+ e = HeapAlloc(GetProcessHeap(), 0, count * sizeof(*e));
+ if (!e)
+ {
+ ERR("Failed to allocate input signature memory.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ /* 2 DWORDs for the header, 6 for each element. */
+ string_data_offset = 2 * sizeof(DWORD) + count * 6 * sizeof(DWORD);
+ string_data_size = data_size - string_data_offset;
+ string_data = HeapAlloc(GetProcessHeap(), 0, string_data_size);
+ if (!string_data)
+ {
+ ERR("Failed to allocate string data memory.\n");
+ HeapFree(GetProcessHeap(), 0, e);
+ return E_OUTOFMEMORY;
+ }
+ memcpy(string_data, data + string_data_offset, string_data_size);
+
+ for (i = 0; i < count; ++i)
+ {
+ UINT name_offset;
+
+ read_dword(&ptr, &name_offset);
+ e[i].semantic_name = string_data + (name_offset - string_data_offset);
+ read_dword(&ptr, &e[i].semantic_idx);
+ read_dword(&ptr, &e[i].sysval_semantic);
+ read_dword(&ptr, &e[i].component_type);
+ read_dword(&ptr, &e[i].register_idx);
+ read_dword(&ptr, &e[i].mask);
+
+ TRACE("semantic: %s, semantic idx: %u, sysval_semantic %#x, "
+ "type %u, register idx: %u, use_mask %#x, input_mask %#x\n",
+ e[i].semantic_name, e[i].semantic_idx, e[i].sysval_semantic, e[i].component_type,
+ e[i].register_idx, (e[i].mask >> 8) & 0xff, e[i].mask & 0xff);
+ }
+
+ s->elements = e;
+ s->element_count = count;
+ s->string_data = string_data;
+
+ return S_OK;
+}
+
+void shader_free_signature(struct wined3d_shader_signature *s)
+{
+ HeapFree(GetProcessHeap(), 0, s->string_data);
+ HeapFree(GetProcessHeap(), 0, s->elements);
+}
+
/* IUnknown methods */
static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_QueryInterface(ID3D10VertexShader *iface,
More information about the wine-cvs
mailing list