wined3d: Pass an IWineD3DBaseShaderImpl pointer to shader_destroy().
This commit is contained in:
parent
97ca0e6863
commit
fe2ffe1e6a
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user