Vitaly Budovski : wined3d: Added two sided stencil support to WINED3DRS_STENCILFAIL,

Alexandre Julliard julliard at wine.codeweavers.com
Sat Mar 4 11:10:09 CST 2006


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

Author: Vitaly Budovski <vbudovsk at cs.rmit.edu.au>
Date:   Sat Mar  4 17:52:24 2006 +1100

wined3d: Added two sided stencil support to WINED3DRS_STENCILFAIL,
WINED3DRS_STENCILZFAIL and WINED3DRS_STENCILPASS.

---

 dlls/wined3d/device.c |   93 ++++++++++++++++++++++++-------------------------
 1 files changed, 46 insertions(+), 47 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 894a70a..047b2b9 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3195,57 +3195,56 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRen
         break;
 
     case WINED3DRS_STENCILFAIL               :
-        {
-            GLenum fail  ;
-            GLint  zpass ;
-            GLint  zfail ;
-
-            fail = StencilOp(Value);
-            glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass);
-            checkGLcall("glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass);");
-            glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &zfail);
-            checkGLcall("glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &zfail);");
-
-            TRACE("StencilOp fail=%x, zfail=%x, zpass=%x\n", fail, zfail, zpass);
-            glStencilOp(fail, zfail, zpass);
-            checkGLcall("glStencilOp(fail, zfail, zpass);");
-        }
-        break;
     case WINED3DRS_STENCILZFAIL              :
-        {
-            GLint  fail  ;
-            GLint  zpass ;
-            GLenum zfail ;
-
-            glGetIntegerv(GL_STENCIL_FAIL, &fail);
-            checkGLcall("glGetIntegerv(GL_STENCIL_FAIL, &fail);");
-            glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass);
-            checkGLcall("glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass);");
-            zfail = StencilOp(Value);
-
-            TRACE("StencilOp fail=%x, zfail=%x, zpass=%x\n", fail, zfail, zpass);
-            glStencilOp(fail, zfail, zpass);
-            checkGLcall("glStencilOp(fail, zfail, zpass);");
-        }
-        break;
     case WINED3DRS_STENCILPASS               :
-        {
-            GLint  fail  ;
-            GLenum zpass ;
-            GLint  zfail ;
-
-            glGetIntegerv(GL_STENCIL_FAIL, &fail);
-            checkGLcall("glGetIntegerv(GL_STENCIL_FAIL, &fail);");
-            zpass = StencilOp(Value);
-            glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &zfail);
-            checkGLcall("glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &zfail);");
-
-            TRACE("StencilOp fail=%x, zfail=%x, zpass=%x\n", fail, zfail, zpass);
-            glStencilOp(fail, zfail, zpass);
-            checkGLcall("glStencilOp(fail, zfail, zpass);");
+    {
+        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_STENCILFAIL == State) {
+            stencilFail = action;
+        }
+        else if(WINED3DRS_STENCILZFAIL == State) {
+            depthFail = action;
+        }
+        else if(WINED3DRS_STENCILPASS == State) {
+            stencilPass = action;
         }
-        break;
 
+        if(!This->stateBlock->renderState[WINED3DRS_TWOSIDEDSTENCILMODE]) {
+            if(GL_EXTCALL(glStencilOpSeparate)) {
+                GL_EXTCALL(glStencilOpSeparate(GL_FRONT, stencilFail, depthFail, stencilPass));
+                checkGLcall("glStencilOpSeparate(GL_FRONT,...)");
+            }
+            else if(GL_EXTCALL(glActiveStencilFaceEXT)) {
+                glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);
+                checkGLcall("glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT)");
+                GL_EXTCALL(glActiveStencilFaceEXT(GL_FRONT));
+                checkGLcall("glActiveStencilFaceEXT(GL_FRONT)");
+                glStencilOp(stencilFail, depthFail, stencilPass);
+                checkGLcall("glStencilOp(...)");
+            }
+            else if(GL_EXTCALL(glStencilOpSeparateATI)) {
+                GL_EXTCALL(glStencilOpSeparateATI(GL_FRONT, stencilFail, depthFail, stencilPass));
+                checkGLcall("glStencilOpSeparateATI(GL_FRONT,...)");
+            } else {
+                TRACE("Separate stencil operation not supported on this version of opengl");
+                glStencilOp(stencilFail, depthFail, stencilPass);
+                checkGLcall("glStencilOp(...)");
+            }
+        } else {
+            glStencilOp(stencilFail, depthFail, stencilPass);
+            checkGLcall("glStencilOp(...)");
+        }
+        break;
+    }
     case WINED3DRS_STENCILWRITEMASK          :
         {
             glStencilMask(Value);




More information about the wine-cvs mailing list