[PATCH 4/8] wined3d: Call shader_set_function() separately from shader_init().

Józef Kucia jkucia at codeweavers.com
Wed Oct 3 05:32:18 CDT 2018


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/shader.c | 96 ++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 65 insertions(+), 31 deletions(-)

diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 38377c0b9857..edaa35ea65cb 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3700,8 +3700,7 @@ static HRESULT shader_copy_signatures_from_shader_desc(struct wined3d_shader *sh
 }
 
 static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device *device,
-        const struct wined3d_shader_desc *desc, DWORD float_const_count, enum wined3d_shader_type type,
-        void *parent, const struct wined3d_parent_ops *parent_ops)
+        const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
 {
     size_t byte_code_size;
     HRESULT hr;
@@ -3765,26 +3764,6 @@ static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device
         }
         memcpy(shader->function, desc->byte_code, byte_code_size);
         shader->functionLength = byte_code_size;
-
-        if (FAILED(hr = shader_set_function(shader, device, type, float_const_count)))
-        {
-            WARN("Failed to set function, hr %#x.\n", hr);
-            shader_cleanup(shader);
-            return hr;
-        }
-    }
-    else
-    {
-        shader->reg_maps.shader_version.type = type;
-        shader->reg_maps.shader_version.major = 4;
-        shader->reg_maps.shader_version.minor = 0;
-        shader_set_limits(shader);
-
-        if (FAILED(hr = shader_scan_output_signature(shader)))
-        {
-            shader_cleanup(shader);
-            return hr;
-        }
     }
 
     return hr;
@@ -3797,10 +3776,16 @@ static HRESULT vertex_shader_init(struct wined3d_shader *shader, struct wined3d_
     unsigned int i;
     HRESULT hr;
 
-    if (FAILED(hr = shader_init(shader, device, desc, device->adapter->d3d_info.limits.vs_uniform_count,
-            WINED3D_SHADER_TYPE_VERTEX, parent, parent_ops)))
+    if (FAILED(hr = shader_init(shader, device, desc, parent, parent_ops)))
         return hr;
 
+    if (FAILED(hr = shader_set_function(shader, device,
+            WINED3D_SHADER_TYPE_VERTEX, device->adapter->d3d_info.limits.vs_uniform_count)))
+    {
+        shader_cleanup(shader);
+        return hr;
+    }
+
     for (i = 0; i < shader->input_signature.element_count; ++i)
     {
         const struct wined3d_shader_signature_element *input = &shader->input_signature.elements[i];
@@ -3845,10 +3830,32 @@ static HRESULT geometry_shader_init(struct wined3d_shader *shader, struct wined3
         }
     }
 
-    if (FAILED(hr = shader_init(shader, device, &shader_desc, 0,
-            WINED3D_SHADER_TYPE_GEOMETRY, parent, parent_ops)))
+    if (FAILED(hr = shader_init(shader, device, &shader_desc, parent, parent_ops)))
         return hr;
 
+    if (shader_desc.byte_code)
+    {
+        if (FAILED(hr = shader_set_function(shader, device, WINED3D_SHADER_TYPE_GEOMETRY, 0)))
+        {
+            WARN("Failed to set function, hr %#x.\n", hr);
+            shader_cleanup(shader);
+            return hr;
+        }
+    }
+    else
+    {
+        shader->reg_maps.shader_version.type = WINED3D_SHADER_TYPE_GEOMETRY;
+        shader->reg_maps.shader_version.major = 4;
+        shader->reg_maps.shader_version.minor = 0;
+        shader_set_limits(shader);
+
+        if (FAILED(hr = shader_scan_output_signature(shader)))
+        {
+            shader_cleanup(shader);
+            return hr;
+        }
+    }
+
     if (so_desc)
     {
         if (!(elements = heap_calloc(so_desc->element_count, sizeof(*elements))))
@@ -4152,10 +4159,16 @@ static HRESULT pixel_shader_init(struct wined3d_shader *shader, struct wined3d_d
     unsigned int i, highest_reg_used = 0, num_regs_used = 0;
     HRESULT hr;
 
-    if (FAILED(hr = shader_init(shader, device, desc, device->adapter->d3d_info.limits.ps_uniform_count,
-            WINED3D_SHADER_TYPE_PIXEL, parent, parent_ops)))
+    if (FAILED(hr = shader_init(shader, device, desc, parent, parent_ops)))
         return hr;
 
+    if (FAILED(hr = shader_set_function(shader, device,
+            WINED3D_SHADER_TYPE_PIXEL, device->adapter->d3d_info.limits.ps_uniform_count)))
+    {
+        shader_cleanup(shader);
+        return hr;
+    }
+
     for (i = 0; i < MAX_REG_INPUT; ++i)
     {
         if (shader->u.ps.input_reg_used & (1u << i))
@@ -4246,13 +4259,20 @@ HRESULT CDECL wined3d_shader_create_cs(struct wined3d_device *device, const stru
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    if (FAILED(hr = shader_init(object, device, desc, 0, WINED3D_SHADER_TYPE_COMPUTE, parent, parent_ops)))
+    if (FAILED(hr = shader_init(object, device, desc, parent, parent_ops)))
     {
         WARN("Failed to initialize compute shader, hr %#x.\n", hr);
         heap_free(object);
         return hr;
     }
 
+    if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_COMPUTE, 0)))
+    {
+        shader_cleanup(object);
+        heap_free(object);
+        return hr;
+    }
+
     wined3d_cs_init_object(device->cs, wined3d_shader_init_object, object);
 
     TRACE("Created compute shader %p.\n", object);
@@ -4276,13 +4296,20 @@ HRESULT CDECL wined3d_shader_create_ds(struct wined3d_device *device, const stru
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    if (FAILED(hr = shader_init(object, device, desc, 0, WINED3D_SHADER_TYPE_DOMAIN, parent, parent_ops)))
+    if (FAILED(hr = shader_init(object, device, desc, parent, parent_ops)))
     {
         WARN("Failed to initialize domain shader, hr %#x.\n", hr);
         heap_free(object);
         return hr;
     }
 
+    if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_DOMAIN, 0)))
+    {
+        shader_cleanup(object);
+        heap_free(object);
+        return hr;
+    }
+
     wined3d_cs_init_object(device->cs, wined3d_shader_init_object, object);
 
     TRACE("Created domain shader %p.\n", object);
@@ -4337,13 +4364,20 @@ HRESULT CDECL wined3d_shader_create_hs(struct wined3d_device *device, const stru
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    if (FAILED(hr = shader_init(object, device, desc, 0, WINED3D_SHADER_TYPE_HULL, parent, parent_ops)))
+    if (FAILED(hr = shader_init(object, device, desc, parent, parent_ops)))
     {
         WARN("Failed to initialize hull shader, hr %#x.\n", hr);
         heap_free(object);
         return hr;
     }
 
+    if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_HULL, 0)))
+    {
+        shader_cleanup(object);
+        heap_free(object);
+        return hr;
+    }
+
     wined3d_cs_init_object(device->cs, wined3d_shader_init_object, object);
 
     TRACE("Created hull shader %p.\n", object);
-- 
2.16.4




More information about the wine-devel mailing list