wined3d: Free shader private data on reset.
authorStefan Dösinger <stefan@codeweavers.com>
Tue, 18 Mar 2008 18:31:24 +0000 (19:31 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 25 Mar 2008 18:48:14 +0000 (19:48 +0100)
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
dlls/wined3d/glsl_shader.c

index dea417c6f74351f972006e921dd46422199cff10..12f91afbe0de399d16a7ec77f6c2f4b3645278cf 100644 (file)
@@ -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;
 }
 
index 4f7b527f50421cd88243125332e0fa05e6ebf062..908f5bd11238cb0fbe8a14290fa9bbe5c3748442 100644 (file)
@@ -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) {