[PATCH] WineD3D: Don't single-allocate new gl shaders=0A=

Stefan Doesinger stefan at codeweavers.com
Mon Jan 19 18:39:36 CST 2009


=0A=
---=0A=
 dlls/wined3d/arb_program_shader.c |    1 +=0A=
 dlls/wined3d/glsl_shader.c        |    1 +=0A=
 dlls/wined3d/pixelshader.c        |   31 +++++++++++++++++++------------=0A=
 dlls/wined3d/wined3d_private.h    |    2 +-=0A=
 4 files changed, 22 insertions(+), 13 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index 7ff3cd4..c5f7718 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -1857,6 +1857,7 @@ static void shader_arb_destroy(IWineD3DBaseShader =
*iface) {=0A=
         HeapFree(GetProcessHeap(), 0, This->gl_shaders);=0A=
         This->gl_shaders =3D NULL;=0A=
         This->num_gl_shaders =3D 0;=0A=
+        This->shader_array_size =3D 0;=0A=
     } else {=0A=
         IWineD3DVertexShaderImpl *This =3D (IWineD3DVertexShaderImpl *) =
iface;=0A=
 =0A=
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c=0A=
index 8dfb416..601d6f6 100644=0A=
--- a/dlls/wined3d/glsl_shader.c=0A=
+++ b/dlls/wined3d/glsl_shader.c=0A=
@@ -3652,6 +3652,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader =
*iface) {=0A=
         HeapFree(GetProcessHeap(), 0, ps->gl_shaders);=0A=
         ps->gl_shaders =3D NULL;=0A=
         ps->num_gl_shaders =3D 0;=0A=
+        ps->shader_array_size =3D 0;=0A=
     } else {=0A=
         TRACE("Deleting shader object %u\n", vs->prgId);=0A=
         ENTER_GL();=0A=
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c=0A=
index 9f96c59..9dcf37f 100644=0A=
--- a/dlls/wined3d/pixelshader.c=0A=
+++ b/dlls/wined3d/pixelshader.c=0A=
@@ -520,10 +520,12 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl =
*shader, IWineD3DStateBlockImp=0A=
 GLuint find_gl_pshader(IWineD3DPixelShaderImpl *shader, const struct =
ps_compile_args *args)=0A=
 {=0A=
     UINT i;=0A=
-    struct ps_compiled_shader *old_array;=0A=
+    DWORD new_size;=0A=
+    struct ps_compiled_shader *new_array;=0A=
 =0A=
     /* Usually we have very few GL shaders for each d3d shader(just 1 =
or maybe 2),=0A=
-     * so a linear search is more performant than a hashmap=0A=
+     * so a linear search is more performant than a hashmap or a binary =
search=0A=
+     * (cache coherency etc)=0A=
      */=0A=
     for(i =3D 0; i < shader->num_gl_shaders; i++) {=0A=
         if(memcmp(&shader->gl_shaders[i].args, args, sizeof(*args)) =
=3D=3D 0) {=0A=
@@ -532,17 +534,22 @@ GLuint find_gl_pshader(IWineD3DPixelShaderImpl =
*shader, const struct ps_compile_=0A=
     }=0A=
 =0A=
     TRACE("No matching GL shader found, compiling a new shader\n");=0A=
-    old_array =3D shader->gl_shaders;=0A=
-    if(old_array) {=0A=
-        shader->gl_shaders =3D HeapReAlloc(GetProcessHeap(), 0, =
old_array,=0A=
-                                         (shader->num_gl_shaders + 1) * =
sizeof(*shader->gl_shaders));=0A=
-    } else {=0A=
-        shader->gl_shaders =3D HeapAlloc(GetProcessHeap(), 0, =
sizeof(*shader->gl_shaders));=0A=
-    }=0A=
+    if(shader->shader_array_size =3D=3D shader->num_gl_shaders) {=0A=
+        if(shader->gl_shaders) {=0A=
+            new_size =3D shader->shader_array_size + max(1, =
shader->shader_array_size / 2);=0A=
+            new_array =3D HeapReAlloc(GetProcessHeap(), 0, =
shader->gl_shaders,=0A=
+                                    new_size * =
sizeof(*shader->gl_shaders));=0A=
+        } else {=0A=
+            new_array =3D HeapAlloc(GetProcessHeap(), 0, =
sizeof(*shader->gl_shaders));=0A=
+            new_size =3D 1;=0A=
+        }=0A=
 =0A=
-    if(!shader->gl_shaders) {=0A=
-        ERR("Out of memory\n");=0A=
-        return 0;=0A=
+        if(!new_array) {=0A=
+            ERR("Out of memory\n");=0A=
+            return 0;=0A=
+        }=0A=
+        shader->gl_shaders =3D new_array;=0A=
+        shader->shader_array_size =3D new_size;=0A=
     }=0A=
 =0A=
     shader->gl_shaders[shader->num_gl_shaders].args =3D *args;=0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index 80f6c72..f7f724b 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -2382,7 +2382,7 @@ typedef struct IWineD3DPixelShaderImpl {=0A=
 =0A=
     /* The GL shader */=0A=
     struct ps_compiled_shader   *gl_shaders;=0A=
-    UINT                        num_gl_shaders;=0A=
+    UINT                        num_gl_shaders, shader_array_size;=0A=
 =0A=
     /* Some information about the shader behavior */=0A=
     struct stb_const_desc       bumpenvmatconst[MAX_TEXTURES];=0A=
-- =0A=
1.6.0.6=0A=
=0A=

------=_NextPart_000_0021_01C97A6D.8B1E1C00--




More information about the wine-patches mailing list