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