From c1623d4e7b95ef5c0a668a4a70e1b31908df182a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Mon, 12 Feb 2007 19:18:36 +0100 Subject: [PATCH] wined3d: Use the context manager to prepare for drawing. --- dlls/wined3d/Makefile.in | 1 + dlls/wined3d/context.c | 82 ++++++++++++++++++++++++++++++++++ dlls/wined3d/drawprim.c | 18 +------- dlls/wined3d/wined3d_private.h | 13 +++++- 4 files changed, 96 insertions(+), 18 deletions(-) create mode 100644 dlls/wined3d/context.c diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in index 0cdd967863a..4700483d245 100644 --- a/dlls/wined3d/Makefile.in +++ b/dlls/wined3d/Makefile.in @@ -12,6 +12,7 @@ C_SRCS = \ arb_program_shader.c \ baseshader.c \ basetexture.c \ + context.c \ cubetexture.c \ device.c \ directx.c \ diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c new file mode 100644 index 00000000000..3090538b0e9 --- /dev/null +++ b/dlls/wined3d/context.c @@ -0,0 +1,82 @@ +/* + * Context and render target management in wined3d + * + * Copyright 2007 Stefan Dösinger for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include +#ifdef HAVE_FLOAT_H +# include +#endif +#include "wined3d_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); + +/***************************************************************************** + * ActivateContext + * + * Finds a rendering context and drawable matching the device and render + * target for the current thread, activates them and puts them into the + * requested state. + * + * Params: + * This: Device to activate the context for + * target: Requested render target + * usage: Prepares the context for blitting, drawing or other actions + * + *****************************************************************************/ +void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextUsage usage) { + DWORD tid = This->createParms.BehaviorFlags & D3DCREATE_MULTITHREADED ? GetCurrentThreadId() : 0; + int i; + DWORD dirtyState, idx; + BYTE shift; + WineD3DContext *context; + + TRACE("(%p): Selecting context for render target %p, thread %d\n", This, target, tid); + /* TODO: Render target selection */ + + /* TODO: Thread selection */ + + /* TODO: Activate the opengl context */ + context = &This->contexts[This->activeContext]; + + switch(usage) { + case CTXUSAGE_RESOURCELOAD: + /* This does not require any special states to be set up */ + break; + + case CTXUSAGE_DRAWPRIM: + /* This needs all dirty states applied */ + for(i=0; i < context->numDirtyEntries; i++) { + dirtyState = context->dirtyArray[i]; + idx = dirtyState >> 5; + shift = dirtyState & 0x1f; + context->isStateDirty[idx] &= ~(1 << shift); + StateTable[dirtyState].apply(dirtyState, This->stateBlock, context); + } + context->numDirtyEntries = 0; /* This makes the whole list clean */ + break; + + case CTXUSAGE_BLIT: + FIXME("Setting up for blitting not supported yet\n"); + break; + + default: + FIXME("Unexpected context usage requested\n"); + } +} diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 0d6adf00340..dcf6d26f6b7 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -1178,10 +1178,7 @@ void drawPrimitive(IWineD3DDevice *iface, IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DSwapChainImpl *swapchain; - int i; - DWORD dirtyState, idx; - BYTE shift; - WineD3DContext *context; + int i; /* Signals other modules that a drawing is in progress and the stateblock finalized */ This->isInDraw = TRUE; @@ -1198,18 +1195,7 @@ void drawPrimitive(IWineD3DDevice *iface, /* Ok, we will be updating the screen from here onwards so grab the lock */ ENTER_GL(); - /* TODO: Find the correct context for the render target / thread */ - context = &This->contexts[This->activeContext]; - - /* Apply dirty states */ - for(i=0; i < context->numDirtyEntries; i++) { - dirtyState = context->dirtyArray[i]; - idx = dirtyState >> 5; - shift = dirtyState & 0x1f; - context->isStateDirty[idx] &= ~(1 << shift); - StateTable[dirtyState].apply(dirtyState, This->stateBlock, context); - } - context->numDirtyEntries = 0; /* This makes the whole list clean */ + ActivateContext(This, This->render_targets[0], CTXUSAGE_DRAWPRIM); if (TRACE_ON(d3d_draw) && wined3d_settings.offscreen_rendering_mode == ORM_FBO) { check_fbo_status(iface); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 76bf29c26c2..ab3e94793c9 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -290,6 +290,7 @@ do { typedef struct IWineD3DStateBlockImpl IWineD3DStateBlockImpl; typedef struct IWineD3DSurfaceImpl IWineD3DSurfaceImpl; typedef struct IWineD3DPaletteImpl IWineD3DPaletteImpl; +typedef struct IWineD3DDeviceImpl IWineD3DDeviceImpl; /* Tracking */ @@ -478,6 +479,14 @@ struct WineD3DContext { GLenum tracking_parm; /* Which source is tracking current colour */ }; +typedef enum ContextUsage { + CTXUSAGE_RESOURCELOAD = 1, /* Only loads textures: No State is applied */ + CTXUSAGE_DRAWPRIM = 2, /* OpenGL states are set up for blitting DirectDraw surfacs */ + CTXUSAGE_BLIT = 3, /* OpenGL states are set up 3D drawing */ +} ContextUsage; + +void ActivateContext(IWineD3DDeviceImpl *device, IWineD3DSurface *target, ContextUsage usage); + /* Routine to fill gl caps for swapchains and IWineD3D */ BOOL IWineD3DImpl_FillGLCaps(IWineD3D *iface, Display* display); @@ -575,7 +584,7 @@ void dumpResources(ResourceList *resources); /***************************************************************************** * IWineD3DDevice implementation structure */ -typedef struct IWineD3DDeviceImpl +struct IWineD3DDeviceImpl { /* IUnknown fields */ const IWineD3DDeviceVtbl *lpVtbl; @@ -688,7 +697,7 @@ typedef struct IWineD3DDeviceImpl WineD3DContext contexts[1]; /* Dynamic array later */ UINT activeContext; /* Only 0 for now */ UINT numContexts; /* Always 1 for now */ -} IWineD3DDeviceImpl; +}; extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl;