wined3d: Use the context manager to prepare for drawing.
This commit is contained in:
parent
380930dc54
commit
c1623d4e7b
|
@ -12,6 +12,7 @@ C_SRCS = \
|
||||||
arb_program_shader.c \
|
arb_program_shader.c \
|
||||||
baseshader.c \
|
baseshader.c \
|
||||||
basetexture.c \
|
basetexture.c \
|
||||||
|
context.c \
|
||||||
cubetexture.c \
|
cubetexture.c \
|
||||||
device.c \
|
device.c \
|
||||||
directx.c \
|
directx.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 <stdio.h>
|
||||||
|
#ifdef HAVE_FLOAT_H
|
||||||
|
# include <float.h>
|
||||||
|
#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");
|
||||||
|
}
|
||||||
|
}
|
|
@ -1178,10 +1178,7 @@ void drawPrimitive(IWineD3DDevice *iface,
|
||||||
|
|
||||||
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
|
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
|
||||||
IWineD3DSwapChainImpl *swapchain;
|
IWineD3DSwapChainImpl *swapchain;
|
||||||
int i;
|
int i;
|
||||||
DWORD dirtyState, idx;
|
|
||||||
BYTE shift;
|
|
||||||
WineD3DContext *context;
|
|
||||||
|
|
||||||
/* Signals other modules that a drawing is in progress and the stateblock finalized */
|
/* Signals other modules that a drawing is in progress and the stateblock finalized */
|
||||||
This->isInDraw = TRUE;
|
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 */
|
/* Ok, we will be updating the screen from here onwards so grab the lock */
|
||||||
ENTER_GL();
|
ENTER_GL();
|
||||||
|
|
||||||
/* TODO: Find the correct context for the render target / thread */
|
ActivateContext(This, This->render_targets[0], CTXUSAGE_DRAWPRIM);
|
||||||
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 */
|
|
||||||
|
|
||||||
if (TRACE_ON(d3d_draw) && wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
|
if (TRACE_ON(d3d_draw) && wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
|
||||||
check_fbo_status(iface);
|
check_fbo_status(iface);
|
||||||
|
|
|
@ -290,6 +290,7 @@ do {
|
||||||
typedef struct IWineD3DStateBlockImpl IWineD3DStateBlockImpl;
|
typedef struct IWineD3DStateBlockImpl IWineD3DStateBlockImpl;
|
||||||
typedef struct IWineD3DSurfaceImpl IWineD3DSurfaceImpl;
|
typedef struct IWineD3DSurfaceImpl IWineD3DSurfaceImpl;
|
||||||
typedef struct IWineD3DPaletteImpl IWineD3DPaletteImpl;
|
typedef struct IWineD3DPaletteImpl IWineD3DPaletteImpl;
|
||||||
|
typedef struct IWineD3DDeviceImpl IWineD3DDeviceImpl;
|
||||||
|
|
||||||
/* Tracking */
|
/* Tracking */
|
||||||
|
|
||||||
|
@ -478,6 +479,14 @@ struct WineD3DContext {
|
||||||
GLenum tracking_parm; /* Which source is tracking current colour */
|
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 */
|
/* Routine to fill gl caps for swapchains and IWineD3D */
|
||||||
BOOL IWineD3DImpl_FillGLCaps(IWineD3D *iface, Display* display);
|
BOOL IWineD3DImpl_FillGLCaps(IWineD3D *iface, Display* display);
|
||||||
|
|
||||||
|
@ -575,7 +584,7 @@ void dumpResources(ResourceList *resources);
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* IWineD3DDevice implementation structure
|
* IWineD3DDevice implementation structure
|
||||||
*/
|
*/
|
||||||
typedef struct IWineD3DDeviceImpl
|
struct IWineD3DDeviceImpl
|
||||||
{
|
{
|
||||||
/* IUnknown fields */
|
/* IUnknown fields */
|
||||||
const IWineD3DDeviceVtbl *lpVtbl;
|
const IWineD3DDeviceVtbl *lpVtbl;
|
||||||
|
@ -688,7 +697,7 @@ typedef struct IWineD3DDeviceImpl
|
||||||
WineD3DContext contexts[1]; /* Dynamic array later */
|
WineD3DContext contexts[1]; /* Dynamic array later */
|
||||||
UINT activeContext; /* Only 0 for now */
|
UINT activeContext; /* Only 0 for now */
|
||||||
UINT numContexts; /* Always 1 for now */
|
UINT numContexts; /* Always 1 for now */
|
||||||
} IWineD3DDeviceImpl;
|
};
|
||||||
|
|
||||||
extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl;
|
extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue