wined3d: Create multiple contexts for onscreen render targets.

This commit is contained in:
Stefan Dösinger 2007-06-02 20:21:57 +00:00 committed by Alexandre Julliard
parent 13f24c3808
commit b462ff0876
3 changed files with 34 additions and 2 deletions

View 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

View 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;
}

View File

@ -1412,6 +1412,8 @@ typedef struct IWineD3DSwapChainImpl
extern const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl;
WineD3DContext *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface);
/*****************************************************************************
* Utility function prototypes
*/