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 dea417c6f7..12f91afbe0 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 4f7b527f50..908f5bd112 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) {