[PATCH 3/5] wined3d: Call context_release() for wined3d contexts made current by context_create().
Henri Verbeet
hverbeet at codeweavers.com
Wed Oct 28 05:00:12 CDT 2009
---
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 9865f9f..1362352 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 185d6cb..7f03adb 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 b89d61f..456440b 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 207088a..0617bbc 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
--
1.6.4.4
More information about the wine-patches
mailing list