wined3d: Pass an IWineD3DBaseShaderImpl pointer to shader_destroy().

This commit is contained in:
Henri Verbeet 2010-12-13 13:40:32 +01:00 committed by Alexandre Julliard
parent 97ca0e6863
commit fe2ffe1e6a
5 changed files with 39 additions and 33 deletions

View File

@ -4702,14 +4702,14 @@ static void shader_arb_deselect_depth_blt(void *shader_priv, const struct wined3
} }
} }
static void shader_arb_destroy(IWineD3DBaseShader *iface) { static void shader_arb_destroy(IWineD3DBaseShaderImpl *shader)
IWineD3DBaseShaderImpl *baseShader = (IWineD3DBaseShaderImpl *) iface; {
IWineD3DDeviceImpl *device = baseShader->baseShader.device; IWineD3DDeviceImpl *device = shader->baseShader.device;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; 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; UINT i;
if(!shader_data) return; /* This can happen if a shader was never compiled */ 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->gl_shaders);
HeapFree(GetProcessHeap(), 0, shader_data); HeapFree(GetProcessHeap(), 0, shader_data);
baseShader->baseShader.backend_data = NULL; shader->baseShader.backend_data = NULL;
} }
else else
{ {
struct arb_vshader_private *shader_data = baseShader->baseShader.backend_data; struct arb_vshader_private *shader_data = shader->baseShader.backend_data;
UINT i; UINT i;
if(!shader_data) return; /* This can happen if a shader was never compiled */ 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->gl_shaders);
HeapFree(GetProcessHeap(), 0, shader_data); HeapFree(GetProcessHeap(), 0, shader_data);
baseShader->baseShader.backend_data = NULL; shader->baseShader.backend_data = NULL;
} }
} }

View File

@ -6182,8 +6182,9 @@ static void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChainImpl
gl_info = context->gl_info; gl_info = context->gl_info;
IWineD3DDevice_EnumResources(iface, reset_unload_resources, NULL); IWineD3DDevice_EnumResources(iface, reset_unload_resources, NULL);
LIST_FOR_EACH_ENTRY(shader, &This->shaders, IWineD3DBaseShaderImpl, baseShader.shader_list_entry) { LIST_FOR_EACH_ENTRY(shader, &This->shaders, IWineD3DBaseShaderImpl, baseShader.shader_list_entry)
This->shader_backend->shader_destroy((IWineD3DBaseShader *) shader); {
This->shader_backend->shader_destroy(shader);
} }
ENTER_GL(); ENTER_GL();

View File

@ -4672,10 +4672,10 @@ static void shader_glsl_deselect_depth_blt(void *shader_priv, const struct wined
checkGLcall("glUseProgramObjectARB"); checkGLcall("glUseProgramObjectARB");
} }
static void shader_glsl_destroy(IWineD3DBaseShader *iface) { static void shader_glsl_destroy(IWineD3DBaseShaderImpl *shader)
{
const struct list *linked_programs; const struct list *linked_programs;
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) iface; IWineD3DDeviceImpl *device = shader->baseShader.device;
IWineD3DDeviceImpl *device = This->baseShader.device;
struct shader_glsl_priv *priv = device->shader_priv; struct shader_glsl_priv *priv = device->shader_priv;
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_context *context; 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 /* Note: Do not use QueryInterface here to find out which shader type this is because this code
* can be called from IWineD3DBaseShader::Release * 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) if (!shader_data || !shader_data->num_gl_shaders)
{ {
HeapFree(GetProcessHeap(), 0, shader_data); HeapFree(GetProcessHeap(), 0, shader_data);
This->baseShader.backend_data = NULL; shader->baseShader.backend_data = NULL;
return; return;
} }
context = context_acquire(device, NULL); context = context_acquire(device, NULL);
gl_info = context->gl_info; 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(); ENTER_GL();
shader_glsl_select(context, FALSE, FALSE); shader_glsl_select(context, FALSE, FALSE);
LEAVE_GL(); LEAVE_GL();
} }
} else { }
struct glsl_vshader_private *shader_data; else
shader_data = This->baseShader.backend_data; {
struct glsl_vshader_private *shader_data = shader->baseShader.backend_data;
if (!shader_data || !shader_data->num_gl_shaders) if (!shader_data || !shader_data->num_gl_shaders)
{ {
HeapFree(GetProcessHeap(), 0, shader_data); HeapFree(GetProcessHeap(), 0, shader_data);
This->baseShader.backend_data = NULL; shader->baseShader.backend_data = NULL;
return; return;
} }
context = context_acquire(device, NULL); context = context_acquire(device, NULL);
gl_info = context->gl_info; 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(); ENTER_GL();
shader_glsl_select(context, FALSE, FALSE); 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"); TRACE("Deleting linked programs\n");
if (linked_programs->next) { if (linked_programs->next) {
@ -4744,9 +4747,10 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
LEAVE_GL(); LEAVE_GL();
} }
if(pshader) { if (pshader)
{
struct glsl_pshader_private *shader_data = shader->baseShader.backend_data;
UINT i; UINT i;
struct glsl_pshader_private *shader_data = This->baseShader.backend_data;
ENTER_GL(); ENTER_GL();
for(i = 0; i < shader_data->num_gl_shaders; i++) { for(i = 0; i < shader_data->num_gl_shaders; i++) {
@ -4759,8 +4763,8 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
} }
else else
{ {
struct glsl_vshader_private *shader_data = shader->baseShader.backend_data;
UINT i; UINT i;
struct glsl_vshader_private *shader_data = This->baseShader.backend_data;
ENTER_GL(); ENTER_GL();
for(i = 0; i < shader_data->num_gl_shaders; i++) { 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, shader_data->gl_shaders);
} }
HeapFree(GetProcessHeap(), 0, This->baseShader.backend_data); HeapFree(GetProcessHeap(), 0, shader->baseShader.backend_data);
This->baseShader.backend_data = NULL; shader->baseShader.backend_data = NULL;
context_release(context); context_release(context);
} }

View File

@ -1479,7 +1479,7 @@ static void shader_cleanup(IWineD3DBaseShader *iface)
{ {
IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)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.reg_maps.constf);
HeapFree(GetProcessHeap(), 0, shader->baseShader.function); HeapFree(GetProcessHeap(), 0, shader->baseShader.function);
shader_delete_constant_list(&shader->baseShader.constantsF); 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_constants(const struct wined3d_context *context, char usePS, char useVS) {}
static void shader_none_load_np2fixup_constants(void *shader_priv, static void shader_none_load_np2fixup_constants(void *shader_priv,
const struct wined3d_gl_info *gl_info, const struct wined3d_state *state) {} 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 HRESULT shader_none_alloc(IWineD3DDeviceImpl *device) {return WINED3D_OK;}
static void shader_none_free(IWineD3DDeviceImpl *device) {} static void shader_none_free(IWineD3DDeviceImpl *device) {}
static BOOL shader_none_dirty_const(void) {return FALSE;} static BOOL shader_none_dirty_const(void) {return FALSE;}

View File

@ -57,6 +57,7 @@ typedef struct IWineD3DSurfaceImpl IWineD3DSurfaceImpl;
typedef struct IWineD3DPaletteImpl IWineD3DPaletteImpl; typedef struct IWineD3DPaletteImpl IWineD3DPaletteImpl;
typedef struct IWineD3DDeviceImpl IWineD3DDeviceImpl; typedef struct IWineD3DDeviceImpl IWineD3DDeviceImpl;
typedef struct IWineD3DSwapChainImpl IWineD3DSwapChainImpl; typedef struct IWineD3DSwapChainImpl IWineD3DSwapChainImpl;
struct IWineD3DBaseShaderImpl;
/* Texture format fixups */ /* 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_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, void (*shader_load_np2fixup_constants)(void *shader_priv, const struct wined3d_gl_info *gl_info,
const struct wined3d_state *state); const struct wined3d_state *state);
void (*shader_destroy)(IWineD3DBaseShader *iface); void (*shader_destroy)(struct IWineD3DBaseShaderImpl *shader);
HRESULT (*shader_alloc_private)(IWineD3DDeviceImpl *device); HRESULT (*shader_alloc_private)(IWineD3DDeviceImpl *device);
void (*shader_free_private)(IWineD3DDeviceImpl *device); void (*shader_free_private)(IWineD3DDeviceImpl *device);
BOOL (*shader_dirtifyable_constants)(void); BOOL (*shader_dirtifyable_constants)(void);