Module: wine Branch: master Commit: 28fdebe404ddcd9a5c325d48ea859d6346c4edb8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=28fdebe404ddcd9a5c325d48ea...
Author: Stefan Dösinger stefan@codeweavers.com Date: Tue Mar 18 19:49:05 2008 +0100
wined3d: Alloc / free shader private data and blt stuff in Init3D/Uninit3D.
---
dlls/wined3d/device.c | 15 +++++++++++++-- dlls/wined3d/directx.c | 7 +------ 2 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 12f91af..cfef9ac 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -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) diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 93f3838..7b6ddf2 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -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