[PATCH 3/4] wined3d: Move swapchain context retrieval to swapchain.c.
Henri Verbeet
hverbeet at codeweavers.com
Wed Jan 19 12:20:11 CST 2011
---
dlls/wined3d/context.c | 39 ++++-----------------------------------
dlls/wined3d/swapchain.c | 17 ++++++++++++++++-
dlls/wined3d/wined3d_private.h | 2 +-
3 files changed, 21 insertions(+), 37 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 2265188..a438a88 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1859,32 +1859,10 @@ static void SetupForBlit(IWineD3DDeviceImpl *This, struct wined3d_context *conte
This->frag_pipe->enable_extension(FALSE);
}
-/*****************************************************************************
- * findThreadContextForSwapChain
- *
- * Searches a swapchain for all contexts and picks one for the thread tid.
- * If none can be found the swapchain is requested to create a new context
- *
- *****************************************************************************/
-static struct wined3d_context *findThreadContextForSwapChain(struct IWineD3DSwapChainImpl *swapchain, DWORD tid)
-{
- unsigned int i;
-
- for (i = 0; i < swapchain->num_contexts; ++i)
- {
- if (swapchain->context[i]->tid == tid)
- return swapchain->context[i];
- }
-
- /* Create a new context for the thread */
- return swapchain_create_context_for_thread(swapchain);
-}
-
/* Do not call while under the GL lock. */
static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target)
{
struct wined3d_context *current_context = context_get_current();
- DWORD tid = GetCurrentThreadId();
struct wined3d_context *context;
if (current_context && current_context->destroyed) current_context = NULL;
@@ -1915,27 +1893,18 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur
{
TRACE("Rendering onscreen\n");
- context = findThreadContextForSwapChain(target->container.u.swapchain, tid);
+ context = swapchain_get_context(target->container.u.swapchain);
}
else
{
TRACE("Rendering offscreen\n");
- /* Stay with the currently active context. */
+ /* Stay with the current context if possible. Otherwise use the
+ * context for the primary swapchain. */
if (current_context && current_context->swapchain->device == This)
- {
context = current_context;
- }
else
- {
- /* This may happen if the app jumps straight into offscreen rendering
- * Start using the context of the primary swapchain. tid == 0 is no problem
- * for findThreadContextForSwapChain.
- *
- * Can also happen on thread switches - in that case findThreadContextForSwapChain
- * is perfect to call. */
- context = findThreadContextForSwapChain((IWineD3DSwapChainImpl *)This->swapchains[0], tid);
- }
+ context = swapchain_get_context((IWineD3DSwapChainImpl *)This->swapchains[0]);
}
context_validate(context);
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 430c751..f613dfe 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -783,7 +783,7 @@ err:
}
/* Do not call while under the GL lock. */
-struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChainImpl *swapchain)
+static struct wined3d_context *swapchain_create_context(struct IWineD3DSwapChainImpl *swapchain)
{
struct wined3d_context **newArray;
struct wined3d_context *ctx;
@@ -813,6 +813,21 @@ struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChainImp
return ctx;
}
+struct wined3d_context *swapchain_get_context(struct IWineD3DSwapChainImpl *swapchain)
+{
+ DWORD tid = GetCurrentThreadId();
+ unsigned int i;
+
+ for (i = 0; i < swapchain->num_contexts; ++i)
+ {
+ if (swapchain->context[i]->tid == tid)
+ return swapchain->context[i];
+ }
+
+ /* Create a new context for the thread */
+ return swapchain_create_context(swapchain);
+}
+
void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height)
{
/* The drawable size of an onscreen drawable is the surface size.
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 7ea5067..819a6ab 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2634,7 +2634,7 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface,
HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *iface,
WINED3DGAMMARAMP *pRamp) DECLSPEC_HIDDEN;
-struct wined3d_context *swapchain_create_context_for_thread(struct IWineD3DSwapChainImpl *swapchain) DECLSPEC_HIDDEN;
+struct wined3d_context *swapchain_get_context(struct IWineD3DSwapChainImpl *swapchain) DECLSPEC_HIDDEN;
HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface_type,
IWineD3DDeviceImpl *device, WINED3DPRESENT_PARAMETERS *present_parameters, void *parent) DECLSPEC_HIDDEN;
--
1.7.3.4
More information about the wine-patches
mailing list