From ad75dfe175dc7d2b04033c653b31e7ec2940477e Mon Sep 17 00:00:00 2001 From: Tobias Jakobi Date: Thu, 16 Apr 2009 22:05:39 +0200 Subject: [wined3d] add cur_np2fixup ptr to PixelShaderImpl The pointer is similar to the already existant cur_args one and stores a link to the fixup struct inside ps_compiled_shader. It will be used to implement efficient vec2 packing in the GLSL (and later ARB) NP2 texcoord fixup code. --- dlls/wined3d/glsl_shader.c | 6 ++++++ dlls/wined3d/pixelshader.c | 12 ++++++++---- dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 1e484c6..0e6c024 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -3855,6 +3855,12 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { TRACE("deleting pshader %u\n", ps->gl_shaders[i].prgId); GL_EXTCALL(glDeleteObjectARB(ps->gl_shaders[i].prgId)); checkGLcall("glDeleteObjectARB"); + + /* Release shader constant cache (for NP2 texcoord fixup) */ + if (ps->gl_shaders[i].np2fixup.const_cache) { + HeapFree(GetProcessHeap(), 0, ps->gl_shaders[i].np2fixup.const_cache); + ps->gl_shaders[i].np2fixup.const_cache = NULL; + } } LEAVE_GL(); HeapFree(GetProcessHeap(), 0, ps->gl_shaders); diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index d1701f5..9250a5c 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -416,7 +416,7 @@ static void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD } } -static GLuint pixelshader_compile(IWineD3DPixelShaderImpl *This, const struct ps_compile_args *args) +static GLuint pixelshader_compile(IWineD3DPixelShaderImpl *This, struct ps_compiled_shader *gl_shader) { CONST DWORD *function = This->baseShader.function; GLuint retval; @@ -430,10 +430,12 @@ static GLuint pixelshader_compile(IWineD3DPixelShaderImpl *This, const struct ps /* Generate the HW shader */ TRACE("(%p) : Generating hardware program\n", This); - This->cur_args = args; + This->cur_args = &gl_shader->args; + This->cur_np2fixup = &gl_shader->np2fixup; shader_buffer_init(&buffer); - retval = device->shader_backend->shader_generate_pshader((IWineD3DPixelShader *)This, &buffer, args); + retval = device->shader_backend->shader_generate_pshader((IWineD3DPixelShader *)This, &buffer, &gl_shader->args); shader_buffer_free(&buffer); + This->cur_np2fixup = NULL; This->cur_args = NULL; return retval; @@ -555,6 +557,8 @@ GLuint find_gl_pshader(IWineD3DPixelShaderImpl *shader, const struct ps_compile_ } shader->gl_shaders[shader->num_gl_shaders].args = *args; - shader->gl_shaders[shader->num_gl_shaders].prgId = pixelshader_compile(shader, args); + memset(&shader->gl_shaders[shader->num_gl_shaders].np2fixup, 0, sizeof(struct ps_np2fixup_t)); + shader->gl_shaders[shader->num_gl_shaders].prgId = + pixelshader_compile(shader, &shader->gl_shaders[shader->num_gl_shaders]); return shader->gl_shaders[shader->num_gl_shaders++].prgId; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 00c7082..a637016 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2514,6 +2514,7 @@ typedef struct IWineD3DPixelShaderImpl { char vpos_uniform; const struct ps_compile_args *cur_args; + struct ps_np2fixup_t *cur_np2fixup; } IWineD3DPixelShaderImpl; extern const SHADER_OPCODE IWineD3DPixelShaderImpl_shader_ins[]; -- 1.6.0.6