Henri Verbeet : wined3d: Pass an IWineD3DBaseShaderImpl pointer to shader_destroy().

Alexandre Julliard julliard at winehq.org
Mon Dec 13 10:43:21 CST 2010


Module: wine
Branch: master
Commit: fe2ffe1e6a47f190c3e3b508267bf1bbd96da4fb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fe2ffe1e6a47f190c3e3b508267bf1bbd96da4fb

Author: Henri Verbeet <hverbeet at 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);




More information about the wine-cvs mailing list