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

Stefan Doesinger stefan at codeweavers.com
Fri Jan 16 15:07:12 CST 2009


=0A=
---=0A=
 dlls/wined3d/pixelshader.c     |   19 +++++++++++++------=0A=
 dlls/wined3d/wined3d_private.h |    2 +-=0A=
 2 files changed, 14 insertions(+), 7 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c=0A=
index 9f96c59..feb7f41 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=
+    DWORD old_size =3D shader->shader_array_size;=0A=
     struct ps_compiled_shader *old_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=
@@ -533,15 +535,20 @@ GLuint find_gl_pshader(IWineD3DPixelShaderImpl =
*shader, const struct ps_compile_=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=
+    if(old_size <=3D shader->num_gl_shaders) {=0A=
+        if(old_array) {=0A=
+            shader->shader_array_size +=3D max(1, old_size * 0.5);=0A=
+            shader->gl_shaders =3D HeapReAlloc(GetProcessHeap(), 0, =
old_array,=0A=
+                                             (shader->shader_array_size =
+ 1) * sizeof(*shader->gl_shaders));=0A=
+        } else {=0A=
+            shader->gl_shaders =3D HeapAlloc(GetProcessHeap(), 0, =
sizeof(*shader->gl_shaders));=0A=
+            shader->shader_array_size =3D 1;=0A=
+        }=0A=
     }=0A=
 =0A=
     if(!shader->gl_shaders) {=0A=
         ERR("Out of memory\n");=0A=
+        shader->shader_array_size =3D old_size;=0A=
         return 0;=0A=
     }=0A=
 =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_0112_01C97A2B.F12A3F70--




More information about the wine-patches mailing list