From ac57b4e2f57b4130702de0264508551e2b1f528e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Tue, 18 Mar 2008 19:31:24 +0100 Subject: [PATCH] wined3d: Free shader private data on reset. Since the shader backend implementations might track opengl resources in their private data inform them about reset calls. For example, the atifs backend keeps track of the replacement shaders, which are lost during an opengl context recreation. --- dlls/wined3d/device.c | 11 +++++++++-- dlls/wined3d/glsl_shader.c | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index dea417c6f74..12f91afbe0d 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -7029,6 +7029,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE This->depth_blt_texture = 0; } This->shader_backend->shader_destroy_depth_blt(iface); + This->shader_backend->shader_free_private(iface); for (i = 0; i < GL_LIMITS(textures); i++) { /* Textures are recreated below */ @@ -7123,6 +7124,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE &swapchain->presentParms); swapchain->num_contexts = 1; This->activeContext = swapchain->context[0]; + IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); hr = IWineD3DStateBlock_InitStartupStateBlock((IWineD3DStateBlock *) This->stateBlock); if(FAILED(hr)) { @@ -7130,11 +7132,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE } create_dummy_textures(This); + + hr = This->shader_backend->shader_alloc_private(iface); + if(FAILED(hr)) { + ERR("Failed to recreate shader private data\n"); + return hr; + } + /* All done. There is no need to reload resources or shaders, this will happen automatically on the * first use */ - - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); return WINED3D_OK; } diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 4f7b527f504..908f5bd1123 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -3378,6 +3378,7 @@ static HRESULT shader_glsl_alloc(IWineD3DDevice *iface) { static void shader_glsl_free(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; HeapFree(GetProcessHeap(), 0, This->shader_priv); + This->shader_priv = NULL; } static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) {