From 98027cb535a09749aeb27352d5220cf2152528c8 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 28 Oct 2009 11:00:12 +0100 Subject: [PATCH] wined3d: Call context_release() for wined3d contexts made current by context_create(). --- dlls/wined3d/context.c | 15 +++++++++------ dlls/wined3d/device.c | 22 ++++++++++++++++++---- dlls/wined3d/swapchain.c | 14 +++++++++----- dlls/wined3d/wined3d_private.h | 6 +++--- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 9865f9f2261..1362352e151 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -876,7 +876,7 @@ static void Context_MarkStateDirty(struct wined3d_context *context, DWORD state, /***************************************************************************** * AddContextToArray * - * Adds a context to the context array. Helper function for CreateContext + * Adds a context to the context array. Helper function for context_create(). * * This method is not called in performance-critical code paths, only when a * new render target or swapchain is created. Thus performance is not an issue @@ -1110,7 +1110,7 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc, } /***************************************************************************** - * CreateContext + * context_create * * Creates a new context for a window, or a pbuffer context. * @@ -1122,7 +1122,7 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc, * pPresentParameters: contains the pixelformats to use for onscreen rendering * *****************************************************************************/ -struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, +struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win_handle, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms) { const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; @@ -1447,6 +1447,8 @@ struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceI This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE); + ++ret->level; + return ret; out: @@ -1793,7 +1795,7 @@ static struct wined3d_context *findThreadContextForSwapChain(IWineD3DSwapChain * } /* Create a new context for the thread */ - return IWineD3DSwapChainImpl_CreateContextForThread(swapchain); + return swapchain_create_context_for_thread(swapchain); } /***************************************************************************** @@ -1874,14 +1876,15 @@ retry: if (This->pbufferContext) DestroyContext(This, This->pbufferContext); /* The display is irrelevant here, the window is 0. But - * CreateContext needs a valid X connection. Create the context + * context_create() needs a valid X connection. Create the context * on the same server as the primary swapchain. The primary * swapchain is exists at this point. */ - This->pbufferContext = CreateContext(This, targetimpl, + This->pbufferContext = context_create(This, targetimpl, ((IWineD3DSwapChainImpl *)This->swapchains[0])->context[0]->win_handle, TRUE /* pbuffer */, &((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms); This->pbufferWidth = targetimpl->currentDesc.Width; This->pbufferHeight = targetimpl->currentDesc.Height; + if (This->pbufferContext) context_release(This->pbufferContext); } if (This->pbufferContext) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 185d6cb4610..7f03adb82fa 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1193,8 +1193,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSwapChain(IWineD3DDevice *iface, } object->num_contexts = 1; - if(surface_type == SURFACE_OPENGL) { - object->context[0] = CreateContext(This, (IWineD3DSurfaceImpl *) object->frontBuffer, object->win_handle, FALSE /* pbuffer */, pPresentationParameters); + if (surface_type == SURFACE_OPENGL) + { + object->context[0] = context_create(This, (IWineD3DSurfaceImpl *)object->frontBuffer, + object->win_handle, FALSE /* pbuffer */, pPresentationParameters); if (!object->context[0]) { ERR("Failed to create a new context\n"); hr = WINED3DERR_NOTAVAILABLE; @@ -1250,6 +1252,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSwapChain(IWineD3DDevice *iface, } } + if (object->context[0]) context_release(object->context[0]); + /* Under directX swapchains share the depth stencil, so only create one depth-stencil */ if (pPresentationParameters->EnableAutoDepthStencil && surface_type == SURFACE_OPENGL) { TRACE("Creating depth stencil buffer\n"); @@ -1301,7 +1305,10 @@ error: object->backBuffer = NULL; } if(object->context && object->context[0]) + { + context_release(object->context[0]); DestroyContext(This, object->context[0]); + } if (object->frontBuffer) IWineD3DSurface_Release(object->frontBuffer); HeapFree(GetProcessHeap(), 0, object); return hr; @@ -1727,6 +1734,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; IWineD3DSwapChainImpl *swapchain = NULL; + struct wined3d_context *context; HRESULT hr; DWORD state; unsigned int i; @@ -1843,6 +1851,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, /* Setup all the devices defaults */ IWineD3DStateBlock_InitStartupStateBlock((IWineD3DStateBlock *)This->stateBlock); + + context = context_acquire(This, swapchain->frontBuffer, CTXUSAGE_RESOURCELOAD); + create_dummy_textures(This); ENTER_GL(); @@ -1875,6 +1886,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, TRACE("(%p) All defaults now set up, leaving Init3D with %p\n", This, This); LEAVE_GL(); + context_release(context); + /* Clear the screen */ IWineD3DDevice_Clear((IWineD3DDevice *) This, 0, NULL, WINED3DCLEAR_TARGET | pPresentationParameters->EnableAutoDepthStencil ? WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL : 0, @@ -6666,12 +6679,13 @@ HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain * } else { target = (IWineD3DSurfaceImpl *) swapchain->frontBuffer; } - swapchain->context[0] = CreateContext(This, target, swapchain->win_handle, FALSE, - &swapchain->presentParms); + swapchain->context[0] = context_create(This, target, swapchain->win_handle, FALSE, &swapchain->presentParms); swapchain->num_contexts = 1; create_dummy_textures(This); + context_release(swapchain->context[0]); + hr = This->shader_backend->shader_alloc_private(iface); if(FAILED(hr)) { ERR("Failed to recreate shader private data\n"); diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index b89d61f6f44..456440bd9f0 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -355,7 +355,9 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapCh IWineD3DSurface_UnlockRect(This->backBuffer[0]); DestroyContext(This->wineD3DDevice, This->context[0]); - This->context[0] = CreateContext(This->wineD3DDevice, (IWineD3DSurfaceImpl *) This->frontBuffer, This->win_handle, FALSE /* pbuffer */, &This->presentParms); + This->context[0] = context_create(This->wineD3DDevice, (IWineD3DSurfaceImpl *)This->frontBuffer, + This->win_handle, FALSE /* pbuffer */, &This->presentParms); + context_release(This->context[0]); IWineD3DSurface_LockRect(This->backBuffer[0], &r, NULL, WINED3DLOCK_DISCARD); memcpy(r.pBits, mem, r.Pitch * ((IWineD3DSurfaceImpl *) This->backBuffer[0])->currentDesc.Height); @@ -386,7 +388,7 @@ const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl = IWineD3DBaseSwapChainImpl_GetGammaRamp }; -struct wined3d_context *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface) +struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *iface) { IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface; struct wined3d_context **newArray; @@ -394,12 +396,14 @@ struct wined3d_context *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwa TRACE("Creating a new context for swapchain %p, thread %d\n", This, GetCurrentThreadId()); - ctx = CreateContext(This->wineD3DDevice, (IWineD3DSurfaceImpl *) This->frontBuffer, - This->context[0]->win_handle, FALSE /* pbuffer */, &This->presentParms); - if(!ctx) { + ctx = context_create(This->wineD3DDevice, (IWineD3DSurfaceImpl *) This->frontBuffer, + This->context[0]->win_handle, FALSE /* pbuffer */, &This->presentParms); + if (!ctx) + { ERR("Failed to create a new context for the swapchain\n"); return NULL; } + context_release(ctx); newArray = HeapAlloc(GetProcessHeap(), 0, sizeof(*newArray) * This->num_contexts + 1); if(!newArray) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 207088ac426..0617bbcf4de 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1162,8 +1162,6 @@ typedef enum ContextUsage { CTXUSAGE_CLEAR = 4, /* Drawable and states are set up for clearing */ } ContextUsage; -struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win, - BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms) DECLSPEC_HIDDEN; void DestroyContext(IWineD3DDeviceImpl *This, struct wined3d_context *context) DECLSPEC_HIDDEN; struct wined3d_context *context_acquire(IWineD3DDeviceImpl *This, IWineD3DSurface *target, enum ContextUsage usage) DECLSPEC_HIDDEN; @@ -1178,6 +1176,8 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context, GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer) DECLSPEC_HIDDEN; void context_attach_surface_fbo(const struct wined3d_context *context, GLenum fbo_target, DWORD idx, IWineD3DSurface *surface) DECLSPEC_HIDDEN; +struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win, + BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *present_parameters) DECLSPEC_HIDDEN; void context_free_event_query(struct wined3d_event_query *query) DECLSPEC_HIDDEN; void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN; struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN; @@ -2447,7 +2447,7 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface, HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *iface, WINED3DGAMMARAMP *pRamp) DECLSPEC_HIDDEN; -struct wined3d_context *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; +struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; #define DEFAULT_REFRESH_RATE 0