wined3d: Alloc / free shader private data and blt stuff in Init3D/Uninit3D.
authorStefan Dösinger <stefan@codeweavers.com>
Tue, 18 Mar 2008 18:49:05 +0000 (19:49 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 25 Mar 2008 18:48:24 +0000 (19:48 +0100)
dlls/wined3d/device.c
dlls/wined3d/directx.c

index 12f91afbe0de399d16a7ec77f6c2f4b3645278cf..cfef9ac74e04d36d71a1e2ec325fd326c7310ad3 100644 (file)
@@ -173,8 +173,6 @@ static ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) {
             GL_EXTCALL(glDeleteFramebuffersEXT(1, &This->dst_fbo));
         }
 
-        This->shader_backend->shader_free_private(iface);
-
         if (This->glsl_program_lookup) hash_table_destroy(This->glsl_program_lookup);
 
         /* TODO: Clean up all the surfaces and textures! */
@@ -2084,6 +2082,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR
         IWineD3DSurface_AddRef(This->stencilBufferTarget);
     }
 
+    hr = This->shader_backend->shader_alloc_private(iface);
+    if(FAILED(hr)) {
+        TRACE("Shader private data couldn't be allocated\n");
+        goto err_out;
+    }
+
     /* Set up some starting GL setup */
     ENTER_GL();
 
@@ -2147,6 +2151,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR
     return WINED3D_OK;
 
 err_out:
+    This->shader_backend->shader_free_private(iface);
     HeapFree(GetProcessHeap(), 0, This->render_targets);
     HeapFree(GetProcessHeap(), 0, This->fbo_color_attachments);
     HeapFree(GetProcessHeap(), 0, This->draw_buffers);
@@ -2212,6 +2217,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D
         IWineD3DDevice_SetTexture(iface, WINED3DVERTEXTEXTURESAMPLER0 + sampler, NULL);
     }
 
+    /* Destroy the depth blt resources, they will be invalid after the reset. Also free shader
+     * private data, it might contain opengl pointers
+     */
+    This->shader_backend->shader_destroy_depth_blt(iface);
+    This->shader_backend->shader_free_private(iface);
+
     /* Release the update stateblock */
     if(IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock) > 0){
         if(This->updateStateBlock != This->stateBlock)
index 93f383829a012166723cbbbca8a8cefd8c3083ba..7b6ddf2ac353b2c950a664e09b98ded6df9b341a 100644 (file)
@@ -3213,12 +3213,7 @@ static HRESULT  WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
     object->devType                      = DeviceType;
 
     select_shader_mode(&GLINFO_LOCATION, DeviceType, &object->ps_selected_mode, &object->vs_selected_mode);
-    object->shader_backend = select_shader_backend(Adapter, DeviceType);    if(FAILED(object->shader_backend->shader_alloc_private((IWineD3DDevice *) object))) {
-        IWineD3D_Release(object->wineD3D);
-        HeapFree(GetProcessHeap(), 0, object);
-        *ppReturnedDeviceInterface = NULL;
-        return E_OUTOFMEMORY;
-    }
+    object->shader_backend = select_shader_backend(Adapter, DeviceType);
 
     /* Prefer the vtable with functions optimized for single dirtifyable objects if the shader
      * model can deal with that. It is essentially the same, just with adjusted