wined3d: Create multiple contexts for onscreen render targets.
authorStefan Dösinger <stefan@codeweavers.com>
Sat, 2 Jun 2007 20:21:57 +0000 (20:21 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 3 Jul 2007 10:32:33 +0000 (12:32 +0200)
dlls/wined3d/context.c
dlls/wined3d/swapchain.c
dlls/wined3d/wined3d_private.h

index 0f2529a..f51cc1d 100644 (file)
@@ -668,8 +668,8 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
             }
 
             if(!context) {
-                /* TODO: Create a new context for the thread */
-                FIXME("Context creation for a new thread not implemented yet\n");
+                /* Create a new context for the thread */
+                context = IWineD3DSwapChainImpl_CreateContextForThread(swapchain);
             }
             This->render_offscreen = FALSE;
             /* The context != This->activeContext will catch a NOP context change. This can occur
index b449856..d776b4e 100644 (file)
@@ -555,3 +555,33 @@ const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl =
     IWineD3DSwapChainImpl_SetGammaRamp,
     IWineD3DSwapChainImpl_GetGammaRamp
 };
+
+WineD3DContext *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface) {
+    WineD3DContext *ctx;
+    IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface;
+    WineD3DContext **newArray;
+
+    TRACE("Creating a new context for swapchain %p, thread %d\n", This, GetCurrentThreadId());
+
+    ctx = CreateContext(This->wineD3DDevice, (IWineD3DSurfaceImpl *) This->frontBuffer,
+                        This->context[0]->display, This->win);
+    if(!ctx) {
+        ERR("Failed to create a new context for the swapchain\n");
+        return NULL;
+    }
+
+    newArray = HeapAlloc(GetProcessHeap(), 0, sizeof(*newArray) * This->num_contexts + 1);
+    if(!newArray) {
+        ERR("Out of memory when trying to allocate a new context array\n");
+        DestroyContext(This->wineD3DDevice, ctx);
+        return NULL;
+    }
+    memcpy(newArray, This->context, sizeof(*newArray) * This->num_contexts);
+    HeapFree(GetProcessHeap(), 0, This->context);
+    newArray[This->num_contexts] = ctx;
+    This->context = newArray;
+    This->num_contexts++;
+
+    TRACE("Returning context %p\n", ctx);
+    return ctx;
+}
index 89f207e..558773c 100644 (file)
@@ -1412,6 +1412,8 @@ typedef struct IWineD3DSwapChainImpl
 
 extern const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl;
 
+WineD3DContext *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface);
+
 /*****************************************************************************
  * Utility function prototypes 
  */