Moved the stencilRef and stencilBackRef back to Context's state structure.

TRAC #22044

stencilRef and stencilBackRef are now set through the setDepthStencilState on
Renderer.

Signed-off-by: Nicolas Capens
Signed-off-by: Daniel Koch

Author:    Geoff Lang

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1438 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 7b61c08..84d6bc7 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -84,11 +84,9 @@
     mState.depthStencil.depthMask = true;
     mState.depthStencil.stencilTest = false;
     mState.depthStencil.stencilFunc = GL_ALWAYS;
-    mState.depthStencil.stencilRef = 0;
     mState.depthStencil.stencilMask = -1;
     mState.depthStencil.stencilWritemask = -1;
     mState.depthStencil.stencilBackFunc = GL_ALWAYS;
-    mState.depthStencil.stencilBackRef = 0;
     mState.depthStencil.stencilBackMask = - 1;
     mState.depthStencil.stencilBackWritemask = -1;
     mState.depthStencil.stencilFail = GL_KEEP;
@@ -98,6 +96,9 @@
     mState.depthStencil.stencilBackPassDepthFail = GL_KEEP;
     mState.depthStencil.stencilBackPassDepthPass = GL_KEEP;
 
+    mState.stencilRef = 0;
+    mState.stencilBackRef = 0;
+
     mState.sampleCoverage = false;
     mState.sampleCoverageValue = 1.0f;
     mState.sampleCoverageInvert = false;
@@ -482,14 +483,14 @@
 void Context::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
 {
     mState.depthStencil.stencilFunc = stencilFunc;
-    mState.depthStencil.stencilRef = (stencilRef > 0) ? stencilRef : 0;
+    mState.stencilRef = (stencilRef > 0) ? stencilRef : 0;
     mState.depthStencil.stencilMask = stencilMask;
 }
 
 void Context::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
 {
     mState.depthStencil.stencilBackFunc = stencilBackFunc;
-    mState.depthStencil.stencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
+    mState.stencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
     mState.depthStencil.stencilBackMask = stencilBackMask;
 }
 
@@ -1346,10 +1347,10 @@
       case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mState.fragmentShaderDerivativeHint; break;
       case GL_ACTIVE_TEXTURE:                   *params = (mState.activeSampler + GL_TEXTURE0); break;
       case GL_STENCIL_FUNC:                     *params = mState.depthStencil.stencilFunc;             break;
-      case GL_STENCIL_REF:                      *params = mState.depthStencil.stencilRef;              break;
+      case GL_STENCIL_REF:                      *params = mState.stencilRef;                           break;
       case GL_STENCIL_VALUE_MASK:               *params = mState.depthStencil.stencilMask;             break;
       case GL_STENCIL_BACK_FUNC:                *params = mState.depthStencil.stencilBackFunc;         break;
-      case GL_STENCIL_BACK_REF:                 *params = mState.depthStencil.stencilBackRef;          break;
+      case GL_STENCIL_BACK_REF:                 *params = mState.stencilBackRef;                       break;
       case GL_STENCIL_BACK_VALUE_MASK:          *params = mState.depthStencil.stencilBackMask;         break;
       case GL_STENCIL_FAIL:                     *params = mState.depthStencil.stencilFail;             break;
       case GL_STENCIL_PASS_DEPTH_FAIL:          *params = mState.depthStencil.stencilPassDepthFail;    break;
@@ -1960,9 +1961,8 @@
     mRenderer->setBlendState(mState.blend, mState.blendColor, mask);
 
     unsigned int stencilSize = framebufferObject->hasStencil() ? framebufferObject->getStencilbuffer()->getStencilSize() : 0;
-    mRenderer->setDepthStencilState(mState.depthStencil,
-                                    mState.rasterizer.frontFace == GL_CCW,
-                                    stencilSize);
+    mRenderer->setDepthStencilState(mState.depthStencil, mState.stencilRef, mState.stencilBackRef,
+                                    mState.rasterizer.frontFace == GL_CCW, stencilSize);
 }
 
 GLenum Context::applyVertexBuffer(GLint first, GLsizei count, GLsizei instances, GLsizei *repeatDraw)
diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h
index 99c1f13..d73730f 100644
--- a/src/libGLESv2/Context.h
+++ b/src/libGLESv2/Context.h
@@ -164,6 +164,8 @@
     bool sampleCoverageInvert;
 
     DepthStencilState depthStencil;
+    GLint stencilRef;
+    GLint stencilBackRef;
 
     GLfloat lineWidth;
 
diff --git a/src/libGLESv2/angletypes.h b/src/libGLESv2/angletypes.h
index 2521fb4..266c703 100644
--- a/src/libGLESv2/angletypes.h
+++ b/src/libGLESv2/angletypes.h
@@ -87,14 +87,12 @@
 
     bool stencilTest;
     GLenum stencilFunc;
-    GLint stencilRef;
     GLuint stencilMask;
     GLenum stencilFail;
     GLenum stencilPassDepthFail;
     GLenum stencilPassDepthPass;
     GLuint stencilWritemask;
     GLenum stencilBackFunc;
-    GLint stencilBackRef;
     GLuint stencilBackMask;
     GLenum stencilBackFail;
     GLenum stencilBackPassDepthFail;
diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h
index 99b2ae6..1dc50bd 100644
--- a/src/libGLESv2/renderer/Renderer.h
+++ b/src/libGLESv2/renderer/Renderer.h
@@ -76,8 +76,8 @@
     virtual void setRasterizerState(const gl::RasterizerState &rasterState, unsigned int depthSize) = 0;
     virtual void setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor,
                                unsigned int sampleMask) = 0;
-    virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, bool frontFaceCCW,
-                                      unsigned int stencilSize) = 0;
+    virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
+                                      int stencilBackRef, bool frontFaceCCW, unsigned int stencilSize) = 0;
 
     virtual void setScissorRectangle(const gl::Rectangle& scissor, unsigned int renderTargetWidth,
                                      unsigned int renderTargetHeight) = 0;
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 35ed122..bf7b0d1 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -311,8 +311,8 @@
     mForceSetBlendState = false;
 }
 
-void Renderer11::setDepthStencilState(const gl::DepthStencilState &depthStencilState, bool frontFaceCCW,
-                                      unsigned int stencilSize)
+void Renderer11::setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
+                                      int stencilBackRef, bool frontFaceCCW, unsigned int stencilSize)
 {
     // TODO
     UNIMPLEMENTED();
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index e89f97f..9216a1e 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -51,8 +51,8 @@
     virtual void setRasterizerState(const gl::RasterizerState &rasterState, unsigned int depthSize);
     virtual void setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor,
                                unsigned int sampleMask);
-    virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, bool frontFaceCCW,
-                                      unsigned int stencilSize);
+    virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
+                                      int stencilBackRef, bool frontFaceCCW, unsigned int stencilSize);
 
     virtual void setScissorRectangle(const gl::Rectangle& scissor, unsigned int renderTargetWidth,
                                      unsigned int renderTargetHeight);
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index fa4724d..2dd6116 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -745,11 +745,13 @@
     mForceSetBlendState = false;
 }
 
-void Renderer9::setDepthStencilState(const gl::DepthStencilState &depthStencilState, bool frontFaceCCW,
-                                     unsigned int stencilSize)
+void Renderer9::setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
+                                     int stencilBackRef, bool frontFaceCCW, unsigned int stencilSize)
 {
     bool depthStencilStateChanged = mForceSetDepthStencilState ||
                                     memcmp(&depthStencilState, &mCurDepthStencilState, sizeof(gl::DepthStencilState)) != 0;
+    bool stencilRefChanged = mForceSetDepthStencilState || stencilRef != mCurStencilRef ||
+                             stencilBackRef != mCurStencilBackRef;
     bool frontFaceCCWChanged = mForceSetDepthStencilState || frontFaceCCW != mCurFrontFaceCCW;
     bool stencilSizeChanged = mForceSetDepthStencilState || stencilSize != mCurStencilSize;
 
@@ -768,7 +770,7 @@
         mCurDepthStencilState = depthStencilState;
     }
 
-    if (depthStencilStateChanged || frontFaceCCWChanged || stencilSizeChanged)
+    if (depthStencilStateChanged || stencilRefChanged || frontFaceCCWChanged || stencilSizeChanged)
     {
         if (depthStencilState.stencilTest && stencilSize > 0)
         {
@@ -780,7 +782,7 @@
             const D3DRENDERSTATETYPE D3DRS_CCW_STENCILMASK = D3DRS_STENCILMASK;
             const D3DRENDERSTATETYPE D3DRS_CCW_STENCILWRITEMASK = D3DRS_STENCILWRITEMASK;
             if (depthStencilState.stencilWritemask != depthStencilState.stencilBackWritemask ||
-                depthStencilState.stencilRef != depthStencilState.stencilBackRef ||
+                stencilRef != stencilBackRef ||
                 depthStencilState.stencilMask != depthStencilState.stencilBackMask)
             {
                 ERR("Separate front/back stencil writemasks, reference values, or stencil mask values are invalid under WebGL.");
@@ -796,7 +798,7 @@
                                     gl_d3d9::ConvertComparison(depthStencilState.stencilFunc));
 
             mDevice->SetRenderState(frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF,
-                                    (depthStencilState.stencilRef < (GLint)maxStencil) ? depthStencilState.stencilRef : maxStencil);
+                                    (stencilRef < (int)maxStencil) ? stencilRef : maxStencil);
             mDevice->SetRenderState(frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK,
                                     depthStencilState.stencilMask);
 
@@ -813,7 +815,7 @@
                                     gl_d3d9::ConvertComparison(depthStencilState.stencilBackFunc));
 
             mDevice->SetRenderState(!frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF,
-                                    (depthStencilState.stencilBackRef < (GLint)maxStencil) ? depthStencilState.stencilBackRef : maxStencil);
+                                    (stencilBackRef < (int)maxStencil) ? stencilBackRef : maxStencil);
             mDevice->SetRenderState(!frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK,
                                     depthStencilState.stencilBackMask);
 
@@ -831,6 +833,8 @@
 
         mDevice->SetRenderState(D3DRS_ZWRITEENABLE, depthStencilState.depthMask ? TRUE : FALSE);
 
+        mCurStencilRef = stencilRef;
+        mCurStencilBackRef = stencilBackRef;
         mCurFrontFaceCCW = frontFaceCCW;
         mCurStencilSize = stencilSize;
     }
diff --git a/src/libGLESv2/renderer/Renderer9.h b/src/libGLESv2/renderer/Renderer9.h
index e5c60b8..d3ebfa3 100644
--- a/src/libGLESv2/renderer/Renderer9.h
+++ b/src/libGLESv2/renderer/Renderer9.h
@@ -74,8 +74,8 @@
     virtual void setRasterizerState(const gl::RasterizerState &rasterState, unsigned int depthSize);
     virtual void setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor,
                                unsigned int sampleMask);
-    virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, bool frontFaceCCW,
-                                      unsigned int stencilSize);
+    virtual void setDepthStencilState(const gl::DepthStencilState &depthStencilState, int stencilRef,
+                                      int stencilBackRef, bool frontFaceCCW, unsigned int stencilSize);
 
     virtual void setScissorRectangle(const gl::Rectangle& scissor, unsigned int renderTargetWidth,
                                      unsigned int renderTargetHeight);
@@ -183,6 +183,8 @@
     // previously set render states
     bool mForceSetDepthStencilState;
     gl::DepthStencilState mCurDepthStencilState;
+    int mCurStencilRef;
+    int mCurStencilBackRef;
     bool mCurFrontFaceCCW;
     unsigned int mCurStencilSize;