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) {
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;
}
}

View file

@ -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();

View file

@ -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);
}

View file

@ -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;}

View file

@ -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);