[6/8] WineD3D: Move clip planes to the state table
Stefan Dösinger
stefan at codeweavers.com
Wed Feb 28 10:19:51 CST 2007
-------------- next part --------------
From f42e2503b62d0c5f9f4c7982b5c2df6c91431a4b Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Wed, 28 Feb 2007 14:36:36 +0100
Subject: [PATCH] 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 b4377a0..06aa87e 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2494,6 +2494,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];
@@ -2505,25 +2514,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 9aac520..bd9b6c2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -449,7 +449,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
{
--
1.4.4.3
More information about the wine-patches
mailing list