Fixed mask related state queries

Mask queries could return negative values when only positive
values are accepted, so a clamp was added to prevent returning
negative values.

Change-Id: Ib151573fff54604567b83736163b8fe748c749f8
Reviewed-on: https://swiftshader-review.googlesource.com/4743
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/Math.hpp b/src/Common/Math.hpp
index ef307c9..4735a29 100644
--- a/src/Common/Math.hpp
+++ b/src/Common/Math.hpp
@@ -346,6 +346,11 @@
 		return ((value + alignment - 1) / alignment) * alignment;

 	}

 

+	inline int clampToSignedInt(unsigned int x)

+	{

+		return static_cast<int>(min(x, 0x7FFFFFFFu));

+	}

+

 	class RGB9E5Data

 	{

 		unsigned int R : 9;

diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 016b40f..b325f06 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1951,10 +1951,10 @@
     case GL_ACTIVE_TEXTURE:                   *params = (mState.activeSampler + GL_TEXTURE0); break;

     case GL_STENCIL_FUNC:                     *params = mState.stencilFunc;                   break;

     case GL_STENCIL_REF:                      *params = mState.stencilRef;                    break;

-    case GL_STENCIL_VALUE_MASK:               *params = mState.stencilMask;                   break;

+	case GL_STENCIL_VALUE_MASK:               *params = sw::clampToSignedInt(mState.stencilMask); break;

     case GL_STENCIL_BACK_FUNC:                *params = mState.stencilBackFunc;               break;

     case GL_STENCIL_BACK_REF:                 *params = mState.stencilBackRef;                break;

-    case GL_STENCIL_BACK_VALUE_MASK:          *params = mState.stencilBackMask;               break;

+	case GL_STENCIL_BACK_VALUE_MASK:          *params = sw::clampToSignedInt(mState.stencilBackMask); break;

     case GL_STENCIL_FAIL:                     *params = mState.stencilFail;                   break;

     case GL_STENCIL_PASS_DEPTH_FAIL:          *params = mState.stencilPassDepthFail;          break;

     case GL_STENCIL_PASS_DEPTH_PASS:          *params = mState.stencilPassDepthPass;          break;

@@ -1968,8 +1968,8 @@
     case GL_BLEND_DST_ALPHA:                  *params = mState.destBlendAlpha;                break;

     case GL_BLEND_EQUATION_RGB:               *params = mState.blendEquationRGB;              break;

     case GL_BLEND_EQUATION_ALPHA:             *params = mState.blendEquationAlpha;            break;

-    case GL_STENCIL_WRITEMASK:                *params = mState.stencilWritemask;              break;

-    case GL_STENCIL_BACK_WRITEMASK:           *params = mState.stencilBackWritemask;          break;

+	case GL_STENCIL_WRITEMASK:                *params = sw::clampToSignedInt(mState.stencilWritemask); break;

+	case GL_STENCIL_BACK_WRITEMASK:           *params = sw::clampToSignedInt(mState.stencilBackWritemask); break;

     case GL_STENCIL_CLEAR_VALUE:              *params = mState.stencilClearValue;             break;

     case GL_SUBPIXEL_BITS:                    *params = 4;                                    break;

 	case GL_MAX_TEXTURE_SIZE:                 *params = IMPLEMENTATION_MAX_TEXTURE_SIZE;          break;