[PATCH 5/5] wined3d: Merge the glsl_vshader_private and glsl_pshader_private structures.

Henri Verbeet hverbeet at codeweavers.com
Wed Sep 19 14:50:23 CDT 2012


---
 dlls/wined3d/glsl_shader.c |  155 ++++++++++++++++++++------------------------
 1 files changed, 70 insertions(+), 85 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index aece4d0..3759709 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -144,22 +144,20 @@ struct glsl_ps_compiled_shader
     GLhandleARB                     prgId;
 };
 
-struct glsl_pshader_private
-{
-    struct glsl_ps_compiled_shader  *gl_shaders;
-    UINT                            num_gl_shaders, shader_array_size;
-};
-
 struct glsl_vs_compiled_shader
 {
     struct vs_compile_args          args;
     GLhandleARB                     prgId;
 };
 
-struct glsl_vshader_private
+struct glsl_shader_private
 {
-    struct glsl_vs_compiled_shader  *gl_shaders;
-    UINT                            num_gl_shaders, shader_array_size;
+    union
+    {
+        struct glsl_vs_compiled_shader *vs;
+        struct glsl_ps_compiled_shader *ps;
+    } gl_shaders;
+    UINT num_gl_shaders, shader_array_size;
 };
 
 static const char *debug_gl_shader_type(GLenum type)
@@ -4192,11 +4190,11 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
         const struct ps_compile_args *args, const struct ps_np2fixup_info **np2fixup_info)
 {
     struct wined3d_state *state = &shader->device->stateBlock->state;
+    struct glsl_ps_compiled_shader *gl_shaders, *new_array;
+    struct glsl_shader_private *shader_data;
+    struct ps_np2fixup_info *np2fixup;
     UINT i;
     DWORD new_size;
-    struct glsl_ps_compiled_shader *new_array;
-    struct glsl_pshader_private    *shader_data;
-    struct ps_np2fixup_info        *np2fixup = NULL;
     GLhandleARB ret;
 
     if (!shader->backend_data)
@@ -4209,6 +4207,7 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
         }
     }
     shader_data = shader->backend_data;
+    gl_shaders = shader_data->gl_shaders.ps;
 
     /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
      * so a linear search is more performant than a hashmap or a binary search
@@ -4216,10 +4215,11 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
      */
     for (i = 0; i < shader_data->num_gl_shaders; ++i)
     {
-        if (!memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args)))
+        if (!memcmp(&gl_shaders[i].args, args, sizeof(*args)))
         {
-            if (args->np2_fixup) *np2fixup_info = &shader_data->gl_shaders[i].np2fixup;
-            return shader_data->gl_shaders[i].prgId;
+            if (args->np2_fixup)
+                *np2fixup_info = &gl_shaders[i].np2fixup;
+            return gl_shaders[i].prgId;
         }
     }
 
@@ -4228,10 +4228,12 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
         if (shader_data->num_gl_shaders)
         {
             new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2);
-            new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders,
-                                    new_size * sizeof(*shader_data->gl_shaders));
-        } else {
-            new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader_data->gl_shaders));
+            new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders.ps,
+                    new_size * sizeof(*gl_shaders));
+        }
+        else
+        {
+            new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*gl_shaders));
             new_size = 1;
         }
 
@@ -4239,21 +4241,22 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
             ERR("Out of memory\n");
             return 0;
         }
-        shader_data->gl_shaders = new_array;
+        shader_data->gl_shaders.ps = new_array;
         shader_data->shader_array_size = new_size;
+        gl_shaders = new_array;
     }
 
-    shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
+    gl_shaders[shader_data->num_gl_shaders].args = *args;
 
-    memset(&shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup, 0, sizeof(struct ps_np2fixup_info));
-    if (args->np2_fixup) np2fixup = &shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup;
+    np2fixup = &gl_shaders[shader_data->num_gl_shaders].np2fixup;
+    memset(np2fixup, 0, sizeof(*np2fixup));
+    *np2fixup_info = args->np2_fixup ? np2fixup : NULL;
 
     pixelshader_update_samplers(&shader->reg_maps, state->textures);
 
     shader_buffer_clear(buffer);
     ret = shader_glsl_generate_pshader(context, buffer, shader, args, np2fixup);
-    shader_data->gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
-    *np2fixup_info = np2fixup;
+    gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
 
     return ret;
 }
@@ -4271,9 +4274,9 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
 {
     UINT i;
     DWORD new_size;
-    struct glsl_vs_compiled_shader *new_array;
     DWORD use_map = shader->device->strided_streams.use_map;
-    struct glsl_vshader_private *shader_data;
+    struct glsl_vs_compiled_shader *gl_shaders, *new_array;
+    struct glsl_shader_private *shader_data;
     GLhandleARB ret;
 
     if (!shader->backend_data)
@@ -4286,15 +4289,16 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
         }
     }
     shader_data = shader->backend_data;
+    gl_shaders = shader_data->gl_shaders.vs;
 
     /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
      * so a linear search is more performant than a hashmap or a binary search
      * (cache coherency etc)
      */
-    for(i = 0; i < shader_data->num_gl_shaders; i++) {
-        if(vs_args_equal(&shader_data->gl_shaders[i].args, args, use_map)) {
-            return shader_data->gl_shaders[i].prgId;
-        }
+    for (i = 0; i < shader_data->num_gl_shaders; ++i)
+    {
+        if (vs_args_equal(&gl_shaders[i].args, args, use_map))
+            return gl_shaders[i].prgId;
     }
 
     TRACE("No matching GL shader found for shader %p, compiling a new shader.\n", shader);
@@ -4303,10 +4307,12 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
         if (shader_data->num_gl_shaders)
         {
             new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2);
-            new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders,
-                                    new_size * sizeof(*shader_data->gl_shaders));
-        } else {
-            new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader_data->gl_shaders));
+            new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders.vs,
+                    new_size * sizeof(*gl_shaders));
+        }
+        else
+        {
+            new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*gl_shaders));
             new_size = 1;
         }
 
@@ -4314,15 +4320,16 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
             ERR("Out of memory\n");
             return 0;
         }
-        shader_data->gl_shaders = new_array;
+        shader_data->gl_shaders.vs = new_array;
         shader_data->shader_array_size = new_size;
+        gl_shaders = new_array;
     }
 
-    shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
+    gl_shaders[shader_data->num_gl_shaders].args = *args;
 
     shader_buffer_clear(buffer);
     ret = shader_glsl_generate_vshader(context, buffer, shader, args);
-    shader_data->gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
+    gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
 
     return ret;
 }
@@ -4721,6 +4728,7 @@ static void shader_glsl_deselect_depth_blt(void *shader_priv, const struct wined
 
 static void shader_glsl_destroy(struct wined3d_shader *shader)
 {
+    struct glsl_shader_private *shader_data = shader->backend_data;
     struct wined3d_device *device = shader->device;
     struct shader_glsl_priv *priv = device->shader_priv;
     const struct wined3d_gl_info *gl_info;
@@ -4729,47 +4737,22 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
 
     char pshader = shader_is_pshader_version(shader->reg_maps.shader_version.type);
 
-    if (pshader)
+    if (!shader_data || !shader_data->num_gl_shaders)
     {
-        struct glsl_pshader_private *shader_data = shader->backend_data;
-
-        if (!shader_data || !shader_data->num_gl_shaders)
-        {
-            HeapFree(GetProcessHeap(), 0, shader_data);
-            shader->backend_data = NULL;
-            return;
-        }
-
-        context = context_acquire(device, NULL);
-        gl_info = context->gl_info;
-
-        if (priv->glsl_program && priv->glsl_program->pshader == shader)
-        {
-            ENTER_GL();
-            shader_glsl_select(context, FALSE, FALSE);
-            LEAVE_GL();
-        }
+        HeapFree(GetProcessHeap(), 0, shader_data);
+        shader->backend_data = NULL;
+        return;
     }
-    else
-    {
-        struct glsl_vshader_private *shader_data = shader->backend_data;
-
-        if (!shader_data || !shader_data->num_gl_shaders)
-        {
-            HeapFree(GetProcessHeap(), 0, shader_data);
-            shader->backend_data = NULL;
-            return;
-        }
 
-        context = context_acquire(device, NULL);
-        gl_info = context->gl_info;
+    context = context_acquire(device, NULL);
+    gl_info = context->gl_info;
 
-        if (priv->glsl_program && priv->glsl_program->vshader == shader)
-        {
-            ENTER_GL();
-            shader_glsl_select(context, FALSE, FALSE);
-            LEAVE_GL();
-        }
+    if (priv->glsl_program && (priv->glsl_program->vshader == shader
+            || priv->glsl_program->pshader == shader))
+    {
+        ENTER_GL();
+        shader_glsl_select(context, FALSE, FALSE);
+        LEAVE_GL();
     }
 
     linked_programs = &shader->linked_programs;
@@ -4793,31 +4776,33 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
 
     if (pshader)
     {
-        struct glsl_pshader_private *shader_data = shader->backend_data;
+        struct glsl_ps_compiled_shader *gl_shaders = shader_data->gl_shaders.ps;
         UINT i;
 
         ENTER_GL();
-        for(i = 0; i < shader_data->num_gl_shaders; i++) {
-            TRACE("deleting pshader %u\n", shader_data->gl_shaders[i].prgId);
-            GL_EXTCALL(glDeleteObjectARB(shader_data->gl_shaders[i].prgId));
+        for (i = 0; i < shader_data->num_gl_shaders; ++i)
+        {
+            TRACE("Deleting pixel shader %u.\n", gl_shaders[i].prgId);
+            GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId));
             checkGLcall("glDeleteObjectARB");
         }
         LEAVE_GL();
-        HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
+        HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders.ps);
     }
     else
     {
-        struct glsl_vshader_private *shader_data = shader->backend_data;
+        struct glsl_vs_compiled_shader *gl_shaders = shader_data->gl_shaders.vs;
         UINT i;
 
         ENTER_GL();
-        for(i = 0; i < shader_data->num_gl_shaders; i++) {
-            TRACE("deleting vshader %u\n", shader_data->gl_shaders[i].prgId);
-            GL_EXTCALL(glDeleteObjectARB(shader_data->gl_shaders[i].prgId));
+        for (i = 0; i < shader_data->num_gl_shaders; ++i)
+        {
+            TRACE("Deleting vertex shader %u.\n", gl_shaders[i].prgId);
+            GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId));
             checkGLcall("glDeleteObjectARB");
         }
         LEAVE_GL();
-        HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
+        HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders.vs);
     }
 
     HeapFree(GetProcessHeap(), 0, shader->backend_data);
-- 
1.7.8.6




More information about the wine-patches mailing list