[PATCH 4/5] wined3d: Store shader signatures directly in struct wined3d_shader_desc.

Henri Verbeet hverbeet at codeweavers.com
Mon May 23 11:06:29 CDT 2016


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d3d11/shader.c    | 60 +++++++++++++++++---------------------------------
 dlls/d3d8/shader.c     |  8 +++----
 dlls/d3d9/shader.c     |  8 +++----
 dlls/wined3d/shader.c  | 41 +++++++++++++++-------------------
 include/wine/wined3d.h |  4 ++--
 5 files changed, 48 insertions(+), 73 deletions(-)

diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c
index 0b6b29e..bab3b63 100644
--- a/dlls/d3d11/shader.c
+++ b/dlls/d3d11/shader.c
@@ -385,8 +385,6 @@ static unsigned int d3d_sm_from_feature_level(D3D_FEATURE_LEVEL feature_level)
 static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_device *device,
         const void *byte_code, SIZE_T byte_code_length)
 {
-    struct wined3d_shader_signature output_signature;
-    struct wined3d_shader_signature input_signature;
     struct d3d_shader_info shader_info;
     struct wined3d_shader_desc desc;
     HRESULT hr;
@@ -397,8 +395,8 @@ static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d
     wined3d_mutex_lock();
     wined3d_private_store_init(&shader->private_store);
 
-    shader_info.input_signature = &input_signature;
-    shader_info.output_signature = &output_signature;
+    shader_info.input_signature = &desc.input_signature;
+    shader_info.output_signature = &desc.output_signature;
     if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info)))
     {
         WARN("Failed to extract shader, hr %#x.\n", hr);
@@ -408,14 +406,12 @@ static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d
     }
 
     desc.byte_code = shader_info.shader_code;
-    desc.input_signature = &input_signature;
-    desc.output_signature = &output_signature;
     desc.max_version = d3d_sm_from_feature_level(device->feature_level);
 
     hr = wined3d_shader_create_vs(device->wined3d_device, &desc, shader,
             &d3d_vertex_shader_wined3d_parent_ops, &shader->wined3d_shader);
-    shader_free_signature(&input_signature);
-    shader_free_signature(&output_signature);
+    shader_free_signature(&desc.input_signature);
+    shader_free_signature(&desc.output_signature);
     if (FAILED(hr))
     {
         WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr);
@@ -601,8 +597,6 @@ static const struct wined3d_parent_ops d3d11_hull_shader_wined3d_parent_ops =
 static HRESULT d3d11_hull_shader_init(struct d3d11_hull_shader *shader, struct d3d_device *device,
         const void *byte_code, SIZE_T byte_code_length)
 {
-    struct wined3d_shader_signature output_signature;
-    struct wined3d_shader_signature input_signature;
     struct d3d_shader_info shader_info;
     struct wined3d_shader_desc desc;
     HRESULT hr;
@@ -612,8 +606,8 @@ static HRESULT d3d11_hull_shader_init(struct d3d11_hull_shader *shader, struct d
     wined3d_mutex_lock();
     wined3d_private_store_init(&shader->private_store);
 
-    shader_info.input_signature = &input_signature;
-    shader_info.output_signature = &output_signature;
+    shader_info.input_signature = &desc.input_signature;
+    shader_info.output_signature = &desc.output_signature;
     if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info)))
     {
         WARN("Failed to extract shader, hr %#x.\n", hr);
@@ -623,14 +617,12 @@ static HRESULT d3d11_hull_shader_init(struct d3d11_hull_shader *shader, struct d
     }
 
     desc.byte_code = shader_info.shader_code;
-    desc.input_signature = &input_signature;
-    desc.output_signature = &output_signature;
     desc.max_version = d3d_sm_from_feature_level(device->feature_level);
 
     hr = wined3d_shader_create_hs(device->wined3d_device, &desc, shader,
             &d3d11_hull_shader_wined3d_parent_ops, &shader->wined3d_shader);
-    shader_free_signature(&input_signature);
-    shader_free_signature(&output_signature);
+    shader_free_signature(&desc.input_signature);
+    shader_free_signature(&desc.output_signature);
     if (FAILED(hr))
     {
         WARN("Failed to create wined3d hull shader, hr %#x.\n", hr);
@@ -797,8 +789,6 @@ static const struct wined3d_parent_ops d3d11_domain_shader_wined3d_parent_ops =
 static HRESULT d3d11_domain_shader_init(struct d3d11_domain_shader *shader, struct d3d_device *device,
         const void *byte_code, SIZE_T byte_code_length)
 {
-    struct wined3d_shader_signature output_signature;
-    struct wined3d_shader_signature input_signature;
     struct d3d_shader_info shader_info;
     struct wined3d_shader_desc desc;
     HRESULT hr;
@@ -808,8 +798,8 @@ static HRESULT d3d11_domain_shader_init(struct d3d11_domain_shader *shader, stru
     wined3d_mutex_lock();
     wined3d_private_store_init(&shader->private_store);
 
-    shader_info.input_signature = &input_signature;
-    shader_info.output_signature = &output_signature;
+    shader_info.input_signature = &desc.input_signature;
+    shader_info.output_signature = &desc.output_signature;
     if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info)))
     {
         WARN("Failed to extract shader, hr %#x.\n", hr);
@@ -819,14 +809,12 @@ static HRESULT d3d11_domain_shader_init(struct d3d11_domain_shader *shader, stru
     }
 
     desc.byte_code = shader_info.shader_code;
-    desc.input_signature = &input_signature;
-    desc.output_signature = &output_signature;
     desc.max_version = d3d_sm_from_feature_level(device->feature_level);
 
     hr = wined3d_shader_create_ds(device->wined3d_device, &desc, shader,
             &d3d11_domain_shader_wined3d_parent_ops, &shader->wined3d_shader);
-    shader_free_signature(&input_signature);
-    shader_free_signature(&output_signature);
+    shader_free_signature(&desc.input_signature);
+    shader_free_signature(&desc.output_signature);
     if (FAILED(hr))
     {
         WARN("Failed to create wined3d domain shader, hr %#x.\n", hr);
@@ -1096,8 +1084,6 @@ static const struct wined3d_parent_ops d3d_geometry_shader_wined3d_parent_ops =
 static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader, struct d3d_device *device,
         const void *byte_code, SIZE_T byte_code_length)
 {
-    struct wined3d_shader_signature output_signature;
-    struct wined3d_shader_signature input_signature;
     struct d3d_shader_info shader_info;
     struct wined3d_shader_desc desc;
     HRESULT hr;
@@ -1108,8 +1094,8 @@ static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader, stru
     wined3d_mutex_lock();
     wined3d_private_store_init(&shader->private_store);
 
-    shader_info.input_signature = &input_signature;
-    shader_info.output_signature = &output_signature;
+    shader_info.input_signature = &desc.input_signature;
+    shader_info.output_signature = &desc.output_signature;
     if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info)))
     {
         WARN("Failed to extract shader, hr %#x.\n", hr);
@@ -1119,14 +1105,12 @@ static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader, stru
     }
 
     desc.byte_code = shader_info.shader_code;
-    desc.input_signature = &input_signature;
-    desc.output_signature = &output_signature;
     desc.max_version = d3d_sm_from_feature_level(device->feature_level);
 
     hr = wined3d_shader_create_gs(device->wined3d_device, &desc, shader,
             &d3d_geometry_shader_wined3d_parent_ops, &shader->wined3d_shader);
-    shader_free_signature(&input_signature);
-    shader_free_signature(&output_signature);
+    shader_free_signature(&desc.input_signature);
+    shader_free_signature(&desc.output_signature);
     if (FAILED(hr))
     {
         WARN("Failed to create wined3d geometry shader, hr %#x.\n", hr);
@@ -1422,8 +1406,6 @@ static const struct wined3d_parent_ops d3d_pixel_shader_wined3d_parent_ops =
 static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device *device,
         const void *byte_code, SIZE_T byte_code_length)
 {
-    struct wined3d_shader_signature output_signature;
-    struct wined3d_shader_signature input_signature;
     struct d3d_shader_info shader_info;
     struct wined3d_shader_desc desc;
     HRESULT hr;
@@ -1434,8 +1416,8 @@ static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d
     wined3d_mutex_lock();
     wined3d_private_store_init(&shader->private_store);
 
-    shader_info.input_signature = &input_signature;
-    shader_info.output_signature = &output_signature;
+    shader_info.input_signature = &desc.input_signature;
+    shader_info.output_signature = &desc.output_signature;
     if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info)))
     {
         WARN("Failed to extract shader, hr %#x.\n", hr);
@@ -1445,14 +1427,12 @@ static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d
     }
 
     desc.byte_code = shader_info.shader_code;
-    desc.input_signature = &input_signature;
-    desc.output_signature = &output_signature;
     desc.max_version = d3d_sm_from_feature_level(device->feature_level);
 
     hr = wined3d_shader_create_ps(device->wined3d_device, &desc, shader,
             &d3d_pixel_shader_wined3d_parent_ops, &shader->wined3d_shader);
-    shader_free_signature(&input_signature);
-    shader_free_signature(&output_signature);
+    shader_free_signature(&desc.input_signature);
+    shader_free_signature(&desc.output_signature);
     if (FAILED(hr))
     {
         WARN("Failed to create wined3d pixel shader, hr %#x.\n", hr);
diff --git a/dlls/d3d8/shader.c b/dlls/d3d8/shader.c
index a0bb317..f920fed 100644
--- a/dlls/d3d8/shader.c
+++ b/dlls/d3d8/shader.c
@@ -117,8 +117,8 @@ HRESULT d3d8_vertex_shader_init(struct d3d8_vertex_shader *shader, struct d3d8_d
             FIXME("Usage %#x not implemented.\n", usage);
 
         desc.byte_code = byte_code;
-        desc.input_signature = NULL;
-        desc.output_signature = NULL;
+        desc.input_signature.element_count = 0;
+        desc.output_signature.element_count = 0;
         desc.max_version = 1;
 
         wined3d_mutex_lock();
@@ -166,8 +166,8 @@ HRESULT d3d8_pixel_shader_init(struct d3d8_pixel_shader *shader, struct d3d8_dev
     shader->handle = shader_handle;
 
     desc.byte_code = byte_code;
-    desc.input_signature = NULL;
-    desc.output_signature = NULL;
+    desc.input_signature.element_count = 0;
+    desc.output_signature.element_count = 0;
     desc.max_version = 1;
 
     wined3d_mutex_lock();
diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c
index 9430afd..b66762d 100644
--- a/dlls/d3d9/shader.c
+++ b/dlls/d3d9/shader.c
@@ -143,8 +143,8 @@ HRESULT vertexshader_init(struct d3d9_vertexshader *shader, struct d3d9_device *
     shader->IDirect3DVertexShader9_iface.lpVtbl = &d3d9_vertexshader_vtbl;
 
     desc.byte_code = byte_code;
-    desc.input_signature = NULL;
-    desc.output_signature = NULL;
+    desc.input_signature.element_count = 0;
+    desc.output_signature.element_count = 0;
     desc.max_version = 3;
 
     wined3d_mutex_lock();
@@ -294,8 +294,8 @@ HRESULT pixelshader_init(struct d3d9_pixelshader *shader, struct d3d9_device *de
     shader->IDirect3DPixelShader9_iface.lpVtbl = &d3d9_pixelshader_vtbl;
 
     desc.byte_code = byte_code;
-    desc.input_signature = NULL;
-    desc.output_signature = NULL;
+    desc.input_signature.element_count = 0;
+    desc.output_signature.element_count = 0;
     desc.max_version = 3;
 
     wined3d_mutex_lock();
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 953efb5..c843bc1 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -2737,6 +2737,9 @@ static HRESULT shader_signature_copy(struct wined3d_shader_signature *dst,
     SIZE_T len;
     char *ptr;
 
+    if (!src->element_count)
+        return WINED3D_OK;
+
     ptr = *signature_strings;
 
     dst->element_count = src->element_count;
@@ -2778,42 +2781,34 @@ static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device
     shader->parent_ops = parent_ops;
 
     total = 0;
-    if (desc->input_signature)
+    for (i = 0; i < desc->input_signature.element_count; ++i)
     {
-        for (i = 0; i < desc->input_signature->element_count; ++i)
-        {
-            e = &desc->input_signature->elements[i];
-            len = strlen(e->semantic_name);
-            if (len >= ~(SIZE_T)0 - total)
-                return E_OUTOFMEMORY;
+        e = &desc->input_signature.elements[i];
+        len = strlen(e->semantic_name);
+        if (len >= ~(SIZE_T)0 - total)
+            return E_OUTOFMEMORY;
 
-            total += len + 1;
-        }
+        total += len + 1;
     }
-    if (desc->output_signature)
+    for (i = 0; i < desc->output_signature.element_count; ++i)
     {
-        for (i = 0; i < desc->output_signature->element_count; ++i)
-        {
-            e = &desc->output_signature->elements[i];
-            len = strlen(e->semantic_name);
-            if (len >= ~(SIZE_T)0 - total)
-                return E_OUTOFMEMORY;
+        e = &desc->output_signature.elements[i];
+        len = strlen(e->semantic_name);
+        if (len >= ~(SIZE_T)0 - total)
+            return E_OUTOFMEMORY;
 
-            total += len + 1;
-        }
+        total += len + 1;
     }
-    if (!(shader->signature_strings = HeapAlloc(GetProcessHeap(), 0, total)))
+    if (total && !(shader->signature_strings = HeapAlloc(GetProcessHeap(), 0, total)))
         return E_OUTOFMEMORY;
     ptr = shader->signature_strings;
 
-    if (desc->input_signature && FAILED(hr = shader_signature_copy(&shader->input_signature,
-            desc->input_signature, &ptr)))
+    if (FAILED(hr = shader_signature_copy(&shader->input_signature, &desc->input_signature, &ptr)))
     {
         HeapFree(GetProcessHeap(), 0, shader->signature_strings);
         return hr;
     }
-    if (desc->output_signature && FAILED(hr = shader_signature_copy(&shader->output_signature,
-            desc->output_signature, &ptr)))
+    if (FAILED(hr = shader_signature_copy(&shader->output_signature, &desc->output_signature, &ptr)))
     {
         HeapFree(GetProcessHeap(), 0, shader->input_signature.elements);
         HeapFree(GetProcessHeap(), 0, shader->signature_strings);
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index e31f9ca..d5415e0 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1929,8 +1929,8 @@ struct wined3d_shader_signature
 struct wined3d_shader_desc
 {
     const DWORD *byte_code;
-    const struct wined3d_shader_signature *input_signature;
-    const struct wined3d_shader_signature *output_signature;
+    struct wined3d_shader_signature input_signature;
+    struct wined3d_shader_signature output_signature;
     unsigned int max_version;
 };
 
-- 
2.1.4




More information about the wine-patches mailing list