[4/16] WineD3D: Move clipping states to the state table
Stefan Dösinger
stefan at codeweavers.com
Fri Dec 8 11:01:23 CST 2006
-------------- next part --------------
From 21a9cfe2994dcf1deab4ad87fcf344b6409b9d46 Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Fri, 8 Dec 2006 17:56:19 +0100
Subject: [PATCH] WineD3D: Move clipping states to the state table
---
dlls/wined3d/device.c | 47 +----------------------------------------------
dlls/wined3d/state.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 46 insertions(+), 48 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 05ce062..0d1a552 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3418,7 +3418,6 @@ static void renderstate_stencil(IWineD3D
static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, WINED3DRENDERSTATETYPE State, DWORD Value) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- DWORD OldValue = This->stateBlock->renderState[State];
/* Simple way of referring to either a DWORD or a 4 byte float */
union {
@@ -3458,53 +3457,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl
case WINED3DRS_ALPHAFUNC :
case WINED3DRS_ALPHAREF :
case WINED3DRS_COLORKEYENABLE :
- StateTable[STATE_RENDER(State)].apply(STATE_RENDER(State), This->stateBlock);
- break;
-
case WINED3DRS_CLIPPLANEENABLE :
case WINED3DRS_CLIPPING :
- {
- /* Ensure we only do the changed clip planes */
- DWORD enable = 0xFFFFFFFF;
- DWORD disable = 0x00000000;
-
- /* If enabling / disabling all */
- if (State == WINED3DRS_CLIPPING) {
- if (Value) {
- enable = This->stateBlock->renderState[WINED3DRS_CLIPPLANEENABLE];
- disable = 0x00;
- } else {
- disable = This->stateBlock->renderState[WINED3DRS_CLIPPLANEENABLE];
- enable = 0x00;
- }
- } else {
- enable = Value & ~OldValue;
- disable = ~Value & OldValue;
- }
-
- if (enable & WINED3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); }
- if (enable & WINED3DCLIPPLANE1) { glEnable(GL_CLIP_PLANE1); checkGLcall("glEnable(clip plane 1)"); }
- if (enable & WINED3DCLIPPLANE2) { glEnable(GL_CLIP_PLANE2); checkGLcall("glEnable(clip plane 2)"); }
- if (enable & WINED3DCLIPPLANE3) { glEnable(GL_CLIP_PLANE3); checkGLcall("glEnable(clip plane 3)"); }
- if (enable & WINED3DCLIPPLANE4) { glEnable(GL_CLIP_PLANE4); checkGLcall("glEnable(clip plane 4)"); }
- if (enable & WINED3DCLIPPLANE5) { glEnable(GL_CLIP_PLANE5); checkGLcall("glEnable(clip plane 5)"); }
-
- if (disable & WINED3DCLIPPLANE0) { glDisable(GL_CLIP_PLANE0); checkGLcall("glDisable(clip plane 0)"); }
- if (disable & WINED3DCLIPPLANE1) { glDisable(GL_CLIP_PLANE1); checkGLcall("glDisable(clip plane 1)"); }
- if (disable & WINED3DCLIPPLANE2) { glDisable(GL_CLIP_PLANE2); checkGLcall("glDisable(clip plane 2)"); }
- if (disable & WINED3DCLIPPLANE3) { glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); }
- if (disable & WINED3DCLIPPLANE4) { glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); }
- if (disable & WINED3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); }
-
- /** update clipping status */
- if (enable) {
- This->stateBlock->clip_status.ClipUnion = 0;
- This->stateBlock->clip_status.ClipIntersection = 0xFFFFFFFF;
- } else {
- This->stateBlock->clip_status.ClipUnion = 0;
- This->stateBlock->clip_status.ClipIntersection = 0;
- }
- }
+ StateTable[STATE_RENDER(State)].apply(STATE_RENDER(State), This->stateBlock);
break;
case WINED3DRS_BLENDOP :
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 02c22b6..01c24ff 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -364,6 +364,49 @@ static void state_alpha(DWORD state, IWi
/* TODO: Some texture blending operations seem to affect the alpha test */
}
+static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock) {
+ DWORD enable = 0xFFFFFFFF;
+ DWORD disable = 0x00000000;
+
+ /* TODO: Keep track of previously enabled clipplanes to avoid unneccessary resetting
+ * of already set values
+ */
+
+ /* If enabling / disabling all
+ * TODO: Is this correct? Doesn't D3DRS_CLIPPING disable clipping on the viewport frustrum?
+ */
+ if (stateblock->renderState[WINED3DRS_CLIPPING]) {
+ enable = stateblock->renderState[WINED3DRS_CLIPPLANEENABLE];
+ disable = ~stateblock->renderState[WINED3DRS_CLIPPLANEENABLE];
+ } else {
+ disable = 0xffffffff;
+ enable = 0x00;
+ }
+
+ if (enable & WINED3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); }
+ if (enable & WINED3DCLIPPLANE1) { glEnable(GL_CLIP_PLANE1); checkGLcall("glEnable(clip plane 1)"); }
+ if (enable & WINED3DCLIPPLANE2) { glEnable(GL_CLIP_PLANE2); checkGLcall("glEnable(clip plane 2)"); }
+ if (enable & WINED3DCLIPPLANE3) { glEnable(GL_CLIP_PLANE3); checkGLcall("glEnable(clip plane 3)"); }
+ if (enable & WINED3DCLIPPLANE4) { glEnable(GL_CLIP_PLANE4); checkGLcall("glEnable(clip plane 4)"); }
+ if (enable & WINED3DCLIPPLANE5) { glEnable(GL_CLIP_PLANE5); checkGLcall("glEnable(clip plane 5)"); }
+
+ if (disable & WINED3DCLIPPLANE0) { glDisable(GL_CLIP_PLANE0); checkGLcall("glDisable(clip plane 0)"); }
+ if (disable & WINED3DCLIPPLANE1) { glDisable(GL_CLIP_PLANE1); checkGLcall("glDisable(clip plane 1)"); }
+ if (disable & WINED3DCLIPPLANE2) { glDisable(GL_CLIP_PLANE2); checkGLcall("glDisable(clip plane 2)"); }
+ if (disable & WINED3DCLIPPLANE3) { glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); }
+ if (disable & WINED3DCLIPPLANE4) { glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); }
+ if (disable & WINED3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); }
+
+ /** update clipping status */
+ if (enable) {
+ stateblock->clip_status.ClipUnion = 0;
+ stateblock->clip_status.ClipIntersection = 0xFFFFFFFF;
+ } else {
+ stateblock->clip_status.ClipUnion = 0;
+ stateblock->clip_status.ClipIntersection = 0;
+ }
+}
+
const struct StateEntry StateTable[] =
{
/* State name representative, apply function */
@@ -505,7 +548,7 @@ const struct StateEntry StateTable[] =
{ /*133, WINED3DRS_WRAP5 */ STATE_RENDER(WINED3DRS_WRAP0), state_unknown },
{ /*134, WINED3DRS_WRAP6 */ STATE_RENDER(WINED3DRS_WRAP0), state_unknown },
{ /*135, WINED3DRS_WRAP7 */ STATE_RENDER(WINED3DRS_WRAP0), state_unknown },
- { /*136, WINED3DRS_CLIPPING */ STATE_RENDER(WINED3DRS_CLIPPING), state_unknown },
+ { /*136, WINED3DRS_CLIPPING */ STATE_RENDER(WINED3DRS_CLIPPING), state_clipping },
{ /*137, WINED3DRS_LIGHTING */ STATE_RENDER(WINED3DRS_LIGHTING) /* Vertex decl! */,state_lighting },
{ /*138, WINED3DRS_EXTENTS */ STATE_RENDER(WINED3DRS_EXTENTS), state_unknown },
{ /*139, WINED3DRS_AMBIENT */ STATE_RENDER(WINED3DRS_AMBIENT), state_ambient },
@@ -521,7 +564,7 @@ const struct StateEntry StateTable[] =
{ /*149, Undefined */ 0, state_undefined },
{ /*150, Undefined */ 0, state_undefined },
{ /*151, WINED3DRS_VERTEXBLEND */ 0, state_nogl },
- { /*152, WINED3DRS_CLIPPLANEENABLE */ STATE_RENDER(WINED3DRS_CLIPPING), state_unknown },
+ { /*152, WINED3DRS_CLIPPLANEENABLE */ STATE_RENDER(WINED3DRS_CLIPPING), state_clipping },
{ /*153, WINED3DRS_SOFTWAREVERTEXPROCESSING */ 0, state_nogl },
{ /*154, WINED3DRS_POINTSIZE */ STATE_RENDER(WINED3DRS_POINTSIZE), state_unknown },
{ /*155, WINED3DRS_POINTSIZE_MIN */ STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_unknown },
--
1.4.2.4
More information about the wine-patches
mailing list