Module: wine Branch: master Commit: fe2ffe1e6a47f190c3e3b508267bf1bbd96da4fb URL: http://source.winehq.org/git/wine.git/?a=commit;h=fe2ffe1e6a47f190c3e3b50826...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Mon Dec 13 13:40:32 2010 +0100
wined3d: Pass an IWineD3DBaseShaderImpl pointer to shader_destroy().
---
dlls/wined3d/arb_program_shader.c | 16 ++++++------ dlls/wined3d/device.c | 5 ++- dlls/wined3d/glsl_shader.c | 44 ++++++++++++++++++++---------------- dlls/wined3d/shader.c | 4 +- dlls/wined3d/wined3d_private.h | 3 +- 5 files changed, 39 insertions(+), 33 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index bd5b197..1526e70 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -4702,14 +4702,14 @@ static void shader_arb_deselect_depth_blt(void *shader_priv, const struct wined3 } }
-static void shader_arb_destroy(IWineD3DBaseShader *iface) { - IWineD3DBaseShaderImpl *baseShader = (IWineD3DBaseShaderImpl *) iface; - IWineD3DDeviceImpl *device = baseShader->baseShader.device; +static void shader_arb_destroy(IWineD3DBaseShaderImpl *shader) +{ + IWineD3DDeviceImpl *device = shader->baseShader.device; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- if (shader_is_pshader_version(baseShader->baseShader.reg_maps.shader_version.type)) + if (shader_is_pshader_version(shader->baseShader.reg_maps.shader_version.type)) { - struct arb_pshader_private *shader_data = baseShader->baseShader.backend_data; + struct arb_pshader_private *shader_data = shader->baseShader.backend_data; UINT i;
if(!shader_data) return; /* This can happen if a shader was never compiled */ @@ -4731,11 +4731,11 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); HeapFree(GetProcessHeap(), 0, shader_data); - baseShader->baseShader.backend_data = NULL; + shader->baseShader.backend_data = NULL; } else { - struct arb_vshader_private *shader_data = baseShader->baseShader.backend_data; + struct arb_vshader_private *shader_data = shader->baseShader.backend_data; UINT i;
if(!shader_data) return; /* This can happen if a shader was never compiled */ @@ -4757,7 +4757,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); HeapFree(GetProcessHeap(), 0, shader_data); - baseShader->baseShader.backend_data = NULL; + shader->baseShader.backend_data = NULL; } }
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 15b9020..0789ed9 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -6182,8 +6182,9 @@ static void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChainImpl gl_info = context->gl_info;
IWineD3DDevice_EnumResources(iface, reset_unload_resources, NULL); - LIST_FOR_EACH_ENTRY(shader, &This->shaders, IWineD3DBaseShaderImpl, baseShader.shader_list_entry) { - This->shader_backend->shader_destroy((IWineD3DBaseShader *) shader); + LIST_FOR_EACH_ENTRY(shader, &This->shaders, IWineD3DBaseShaderImpl, baseShader.shader_list_entry) + { + This->shader_backend->shader_destroy(shader); }
ENTER_GL(); diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index a28e9ce..a2fb79a 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4672,10 +4672,10 @@ static void shader_glsl_deselect_depth_blt(void *shader_priv, const struct wined checkGLcall("glUseProgramObjectARB"); }
-static void shader_glsl_destroy(IWineD3DBaseShader *iface) { +static void shader_glsl_destroy(IWineD3DBaseShaderImpl *shader) +{ const struct list *linked_programs; - IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) iface; - IWineD3DDeviceImpl *device = This->baseShader.device; + IWineD3DDeviceImpl *device = shader->baseShader.device; struct shader_glsl_priv *priv = device->shader_priv; const struct wined3d_gl_info *gl_info; struct wined3d_context *context; @@ -4683,41 +4683,44 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { /* Note: Do not use QueryInterface here to find out which shader type this is because this code * can be called from IWineD3DBaseShader::Release */ - char pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type); + char pshader = shader_is_pshader_version(shader->baseShader.reg_maps.shader_version.type); + + if (pshader) + { + struct glsl_pshader_private *shader_data = shader->baseShader.backend_data;
- if(pshader) { - struct glsl_pshader_private *shader_data; - shader_data = This->baseShader.backend_data; if (!shader_data || !shader_data->num_gl_shaders) { HeapFree(GetProcessHeap(), 0, shader_data); - This->baseShader.backend_data = NULL; + shader->baseShader.backend_data = NULL; return; }
context = context_acquire(device, NULL); gl_info = context->gl_info;
- if (priv->glsl_program && (IWineD3DBaseShader *)priv->glsl_program->pshader == iface) + if (priv->glsl_program && (IWineD3DBaseShaderImpl *)priv->glsl_program->pshader == shader) { ENTER_GL(); shader_glsl_select(context, FALSE, FALSE); LEAVE_GL(); } - } else { - struct glsl_vshader_private *shader_data; - shader_data = This->baseShader.backend_data; + } + else + { + struct glsl_vshader_private *shader_data = shader->baseShader.backend_data; + if (!shader_data || !shader_data->num_gl_shaders) { HeapFree(GetProcessHeap(), 0, shader_data); - This->baseShader.backend_data = NULL; + shader->baseShader.backend_data = NULL; return; }
context = context_acquire(device, NULL); gl_info = context->gl_info;
- if (priv->glsl_program && (IWineD3DBaseShader *)priv->glsl_program->vshader == iface) + if (priv->glsl_program && (IWineD3DBaseShaderImpl *)priv->glsl_program->vshader == shader) { ENTER_GL(); shader_glsl_select(context, FALSE, FALSE); @@ -4725,7 +4728,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { } }
- linked_programs = &This->baseShader.linked_programs; + linked_programs = &shader->baseShader.linked_programs;
TRACE("Deleting linked programs\n"); if (linked_programs->next) { @@ -4744,9 +4747,10 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { LEAVE_GL(); }
- if(pshader) { + if (pshader) + { + struct glsl_pshader_private *shader_data = shader->baseShader.backend_data; UINT i; - struct glsl_pshader_private *shader_data = This->baseShader.backend_data;
ENTER_GL(); for(i = 0; i < shader_data->num_gl_shaders; i++) { @@ -4759,8 +4763,8 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { } else { + struct glsl_vshader_private *shader_data = shader->baseShader.backend_data; UINT i; - struct glsl_vshader_private *shader_data = This->baseShader.backend_data;
ENTER_GL(); for(i = 0; i < shader_data->num_gl_shaders; i++) { @@ -4772,8 +4776,8 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); }
- HeapFree(GetProcessHeap(), 0, This->baseShader.backend_data); - This->baseShader.backend_data = NULL; + HeapFree(GetProcessHeap(), 0, shader->baseShader.backend_data); + shader->baseShader.backend_data = NULL;
context_release(context); } diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 4a72e88..1220e21 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -1479,7 +1479,7 @@ static void shader_cleanup(IWineD3DBaseShader *iface) { IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
- shader->baseShader.device->shader_backend->shader_destroy(iface); + shader->baseShader.device->shader_backend->shader_destroy(shader); HeapFree(GetProcessHeap(), 0, shader->baseShader.reg_maps.constf); HeapFree(GetProcessHeap(), 0, shader->baseShader.function); shader_delete_constant_list(&shader->baseShader.constantsF); @@ -1503,7 +1503,7 @@ static void shader_none_update_float_pixel_constants(IWineD3DDeviceImpl *device, static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {} static void shader_none_load_np2fixup_constants(void *shader_priv, const struct wined3d_gl_info *gl_info, const struct wined3d_state *state) {} -static void shader_none_destroy(IWineD3DBaseShader *iface) {} +static void shader_none_destroy(IWineD3DBaseShaderImpl *shader) {} static HRESULT shader_none_alloc(IWineD3DDeviceImpl *device) {return WINED3D_OK;} static void shader_none_free(IWineD3DDeviceImpl *device) {} static BOOL shader_none_dirty_const(void) {return FALSE;} diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index d7612eb..6769956 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -57,6 +57,7 @@ typedef struct IWineD3DSurfaceImpl IWineD3DSurfaceImpl; typedef struct IWineD3DPaletteImpl IWineD3DPaletteImpl; typedef struct IWineD3DDeviceImpl IWineD3DDeviceImpl; typedef struct IWineD3DSwapChainImpl IWineD3DSwapChainImpl; +struct IWineD3DBaseShaderImpl;
/* Texture format fixups */
@@ -758,7 +759,7 @@ typedef struct { void (*shader_load_constants)(const struct wined3d_context *context, char usePS, char useVS); void (*shader_load_np2fixup_constants)(void *shader_priv, const struct wined3d_gl_info *gl_info, const struct wined3d_state *state); - void (*shader_destroy)(IWineD3DBaseShader *iface); + void (*shader_destroy)(struct IWineD3DBaseShaderImpl *shader); HRESULT (*shader_alloc_private)(IWineD3DDeviceImpl *device); void (*shader_free_private)(IWineD3DDeviceImpl *device); BOOL (*shader_dirtifyable_constants)(void);