Vitaly Budovski : wined3d: Implemented WINED3DRS_CCW_STENCIL* render states .

Alexandre Julliard julliard at wine.codeweavers.com
Tue Feb 28 06:08:25 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 63585380a9a8caf4379d70b4759c7054200c983c
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=63585380a9a8caf4379d70b4759c7054200c983c

Author: Vitaly Budovski <vbudovsk at cs.rmit.edu.au>
Date:   Sun Feb 26 01:53:48 2006 +1100

wined3d: Implemented WINED3DRS_CCW_STENCIL* render states.

---

 dlls/wined3d/device.c |   70 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 7130c55..dd72818 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3729,11 +3729,81 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRen
     case WINED3DRS_ADAPTIVETESS_Z :
     case WINED3DRS_ADAPTIVETESS_W :
     case WINED3DRS_ENABLEADAPTIVETESSELLATION :
+    {
+        FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value);
+        break;
+    }
     case WINED3DRS_TWOSIDEDSTENCILMODE :
+    {
+        if(Value) {
+            TRACE("Two-sided stencil mode enabled\n");
+        } else {
+            TRACE("Two-sided stencil mode disabled\n");
+        }
+        break;
+    }
     case WINED3DRS_CCW_STENCILFAIL :
     case WINED3DRS_CCW_STENCILZFAIL :
     case WINED3DRS_CCW_STENCILPASS :
+    {
+        GLint stencilFail;
+        GLint depthFail;
+        GLint stencilPass;
+
+        GLint action = StencilOp(Value);
+
+        glGetIntegerv(GL_STENCIL_FAIL, &stencilFail);
+        glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &depthFail);
+        glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &stencilPass);
+
+        if(WINED3DRS_CCW_STENCILFAIL == State) {
+            stencilFail = action;
+        }
+        else if(WINED3DRS_CCW_STENCILZFAIL == State) {
+            depthFail = action;
+        }
+        else if(WINED3DRS_CCW_STENCILPASS == State) {
+            stencilPass = action;
+        }
+
+        if(!This->stateBlock->renderState[WINED3DRS_TWOSIDEDSTENCILMODE]) {
+            glStencilOpSeparate(GL_BACK, stencilFail, depthFail, stencilPass);
+            checkGLcall("glStencilOpSeparate(GL_BACK,...)");
+        } else {
+            glStencilOp(stencilFail, depthFail, stencilPass);
+            checkGLcall("glStencilOp(...)");
+        }
+        break;
+    }
     case WINED3DRS_CCW_STENCILFUNC :
+    {
+        GLint func;
+        GLint ref = This->stateBlock->renderState[WINED3DRS_STENCILREF];
+        GLuint mask = This->stateBlock->renderState[WINED3DRS_STENCILMASK];
+
+        func = GL_ALWAYS;
+        switch ((D3DCMPFUNC)Value) {
+            case D3DCMP_NEVER: func = GL_NEVER; break;
+            case D3DCMP_LESS: func = GL_LESS; break;
+            case D3DCMP_EQUAL: func = GL_EQUAL; break;
+            case D3DCMP_LESSEQUAL: func = GL_LEQUAL; break;
+            case D3DCMP_GREATER: func = GL_GREATER; break;
+            case D3DCMP_NOTEQUAL: func = GL_NOTEQUAL; break;
+            case D3DCMP_GREATEREQUAL: func = GL_GEQUAL; break;
+            case D3DCMP_ALWAYS: func = GL_ALWAYS; break;
+            default:
+                FIXME("Unrecognized/Unhandled D3DCMPFUNC value %ld\n", Value);
+        }
+        This->stencilfunc = func;
+        if(!This->stateBlock->renderState[WINED3DRS_TWOSIDEDSTENCILMODE]) {
+            glStencilFuncSeparate(GL_BACK, func, ref, mask);
+            checkGLcall("glStencilFuncSeparate(GL_BACK,...)");
+        } else {
+            glStencilFunc(func, ref, mask);
+            checkGLcall("glStencilFunc(...)");
+        }
+        break;
+    }
     case WINED3DRS_COLORWRITEENABLE1 :
     case WINED3DRS_COLORWRITEENABLE2 :
     case WINED3DRS_COLORWRITEENABLE3 :




More information about the wine-cvs mailing list