Module: wine Branch: master Commit: 409aa731323638d886a6744f49cb2d6958e256d6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=409aa731323638d886a6744f49...
Author: Stefan Dösinger stefan@codeweavers.com Date: Wed Feb 28 14:36:36 2007 +0100
wined3d: Move clip planes to the state table.
---
dlls/wined3d/device.c | 29 ++++++----------- dlls/wined3d/state.c | 65 +++++++++++++++++++++++++++++++++++++-- dlls/wined3d/wined3d_private.h | 5 ++- 3 files changed, 75 insertions(+), 24 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 49dcc93..bd37c51 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2418,6 +2418,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetClipPlane(IWineD3DDevice *iface, DWO
This->updateStateBlock->changed.clipplane[Index] = TRUE; This->updateStateBlock->set.clipplane[Index] = TRUE; + + if(This->updateStateBlock->clipplane[Index][0] == pPlane[0] && + This->updateStateBlock->clipplane[Index][1] == pPlane[1] && + This->updateStateBlock->clipplane[Index][2] == pPlane[2] && + This->updateStateBlock->clipplane[Index][3] == pPlane[3]) { + TRACE("Application is setting old values over, nothing to do\n"); + return WINED3D_OK; + } + This->updateStateBlock->clipplane[Index][0] = pPlane[0]; This->updateStateBlock->clipplane[Index][1] = pPlane[1]; This->updateStateBlock->clipplane[Index][2] = pPlane[2]; @@ -2429,25 +2438,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetClipPlane(IWineD3DDevice *iface, DWO return WINED3D_OK; }
- /* Apply it */ - - ENTER_GL(); - - /* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */ - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadMatrixf((float *) &This->stateBlock->transforms[WINED3DTS_VIEW].u.m[0][0]); - - TRACE("Clipplane [%f,%f,%f,%f]\n", - This->updateStateBlock->clipplane[Index][0], - This->updateStateBlock->clipplane[Index][1], - This->updateStateBlock->clipplane[Index][2], - This->updateStateBlock->clipplane[Index][3]); - glClipPlane(GL_CLIP_PLANE0 + Index, This->updateStateBlock->clipplane[Index]); - checkGLcall("glClipPlane"); - - glPopMatrix(); - LEAVE_GL(); + IWineD3DDeviceImpl_MarkStateDirty(This, STATE_CLIPPLANE(Index));
return WINED3D_OK; } diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index efdd05d..2fd2804 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -2034,6 +2034,29 @@ static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, Win } }
+static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { + UINT index = state - STATE_CLIPPLANE(0); + + if(isStateDirty(context, STATE_TRANSFORM(WINED3DTS_VIEW)) || index > GL_LIMITS(clipplanes)) { + return; + } + + /* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */ + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadMatrixf((float *) &stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]); + + TRACE("Clipplane [%f,%f,%f,%f]\n", + stateblock->clipplane[index][0], + stateblock->clipplane[index][1], + stateblock->clipplane[index][2], + stateblock->clipplane[index][3]); + glClipPlane(GL_CLIP_PLANE0 + index, stateblock->clipplane[index]); + checkGLcall("glClipPlane"); + + glPopMatrix(); +} + static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { unsigned int k;
@@ -2060,10 +2083,11 @@ static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine checkGLcall("glLightfv dirn"); }
- /* Reset Clipping Planes if clipping is enabled. TODO: Call clipplane apply func */ + /* Reset Clipping Planes */ for (k = 0; k < GL_LIMITS(clipplanes); k++) { - glClipPlane(GL_CLIP_PLANE0 + k, stateblock->clipplane[k]); - checkGLcall("glClipPlane"); + if(!isStateDirty(context, STATE_CLIPPLANE(k))) { + clipplane(STATE_CLIPPLANE(k), stateblock, context); + } }
if(context->last_was_rhw) { @@ -4118,5 +4142,38 @@ const struct StateEntry StateTable[] = { /* , STATE_ACTIVELIGHT(6) */ STATE_ACTIVELIGHT(6), light }, { /* , STATE_ACTIVELIGHT(7) */ STATE_ACTIVELIGHT(7), light },
- { /* Scissor rect */ STATE_SCISSORRECT, scissorrect } + { /* Scissor rect */ STATE_SCISSORRECT, scissorrect }, + /* Clip planes */ + { /* STATE_CLIPPLANE(0) */ STATE_CLIPPLANE(0), clipplane }, + { /* STATE_CLIPPLANE(1) */ STATE_CLIPPLANE(1), clipplane }, + { /* STATE_CLIPPLANE(2) */ STATE_CLIPPLANE(2), clipplane }, + { /* STATE_CLIPPLANE(3) */ STATE_CLIPPLANE(3), clipplane }, + { /* STATE_CLIPPLANE(4) */ STATE_CLIPPLANE(4), clipplane }, + { /* STATE_CLIPPLANE(5) */ STATE_CLIPPLANE(5), clipplane }, + { /* STATE_CLIPPLANE(6) */ STATE_CLIPPLANE(6), clipplane }, + { /* STATE_CLIPPLANE(7) */ STATE_CLIPPLANE(7), clipplane }, + { /* STATE_CLIPPLANE(8) */ STATE_CLIPPLANE(8), clipplane }, + { /* STATE_CLIPPLANE(9) */ STATE_CLIPPLANE(9), clipplane }, + { /* STATE_CLIPPLANE(10) */ STATE_CLIPPLANE(10), clipplane }, + { /* STATE_CLIPPLANE(11) */ STATE_CLIPPLANE(11), clipplane }, + { /* STATE_CLIPPLANE(12) */ STATE_CLIPPLANE(12), clipplane }, + { /* STATE_CLIPPLANE(13) */ STATE_CLIPPLANE(13), clipplane }, + { /* STATE_CLIPPLANE(14) */ STATE_CLIPPLANE(14), clipplane }, + { /* STATE_CLIPPLANE(15) */ STATE_CLIPPLANE(15), clipplane }, + { /* STATE_CLIPPLANE(16) */ STATE_CLIPPLANE(16), clipplane }, + { /* STATE_CLIPPLANE(17) */ STATE_CLIPPLANE(17), clipplane }, + { /* STATE_CLIPPLANE(18) */ STATE_CLIPPLANE(18), clipplane }, + { /* STATE_CLIPPLANE(19) */ STATE_CLIPPLANE(19), clipplane }, + { /* STATE_CLIPPLANE(20) */ STATE_CLIPPLANE(20), clipplane }, + { /* STATE_CLIPPLANE(21) */ STATE_CLIPPLANE(21), clipplane }, + { /* STATE_CLIPPLANE(22) */ STATE_CLIPPLANE(22), clipplane }, + { /* STATE_CLIPPLANE(23) */ STATE_CLIPPLANE(23), clipplane }, + { /* STATE_CLIPPLANE(24) */ STATE_CLIPPLANE(24), clipplane }, + { /* STATE_CLIPPLANE(25) */ STATE_CLIPPLANE(25), clipplane }, + { /* STATE_CLIPPLANE(26) */ STATE_CLIPPLANE(26), clipplane }, + { /* STATE_CLIPPLANE(27) */ STATE_CLIPPLANE(27), clipplane }, + { /* STATE_CLIPPLANE(28) */ STATE_CLIPPLANE(28), clipplane }, + { /* STATE_CLIPPLANE(29) */ STATE_CLIPPLANE(29), clipplane }, + { /* STATE_CLIPPLANE(30) */ STATE_CLIPPLANE(30), clipplane }, + { /* STATE_CLIPPLANE(31) */ STATE_CLIPPLANE(31), clipplane }, }; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 8bcffa3..1a5d3eb 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -479,7 +479,10 @@ typedef void (*APPLYSTATEFUNC)(DWORD state, IWineD3DStateBlockImpl *stateblock, #define STATE_SCISSORRECT (STATE_ACTIVELIGHT(MAX_ACTIVE_LIGHTS - 1) + 1) #define STATE_IS_SCISSORRECT(a) ((a) == STATE_SCISSORRECT)
-#define STATE_HIGHEST (STATE_SCISSORRECT) +#define STATE_CLIPPLANE(a) (STATE_SCISSORRECT + 1 + (a)) +#define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(MAX_CLIPPLANES - 1)) + +#define STATE_HIGHEST (STATE_CLIPPLANE(MAX_CLIPPLANES - 1))
struct StateEntry {