[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