Support matrix stack overflow/underflow errors.

Change-Id: Ie3caee1128c8227397a74378fcefdf9e128fc6bf
Reviewed-on: https://swiftshader-review.googlesource.com/3761
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index b8ce8d6..2027f41 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -162,6 +162,8 @@
     mInvalidOperation = false;

     mOutOfMemory = false;

     mInvalidFramebufferOperation = false;

+	mMatrixStackOverflow = false;

+	mMatrixStackUnderflow = false;

 

 	lighting = false;

 

@@ -2649,6 +2651,16 @@
     mInvalidFramebufferOperation = true;

 }

 

+void Context::recordMatrixStackOverflow()

+{

+    mMatrixStackOverflow = true;

+}

+

+void Context::recordMatrixStackUnderflow()

+{

+    mMatrixStackUnderflow = true;

+}

+

 // Get one of the recorded errors and clear its flag, if any.

 // [OpenGL ES 2.0.24] section 2.5 page 13.

 GLenum Context::getError()

@@ -2688,6 +2700,20 @@
         return GL_INVALID_FRAMEBUFFER_OPERATION_OES;

     }

 

+	if(mMatrixStackOverflow)

+    {

+        mMatrixStackOverflow = false;

+

+        return GL_INVALID_FRAMEBUFFER_OPERATION_OES;

+    }

+

+	if(mMatrixStackUnderflow)

+    {

+        mMatrixStackUnderflow = false;

+

+        return GL_INVALID_FRAMEBUFFER_OPERATION_OES;

+    }

+

     return GL_NO_ERROR;

 }

 

diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index b16a9c5..8ade0c9 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -461,6 +461,8 @@
     void recordInvalidOperation();

     void recordOutOfMemory();

     void recordInvalidFramebufferOperation();

+	void recordMatrixStackOverflow();

+	void recordMatrixStackUnderflow();

 

     GLenum getError();

 

@@ -533,6 +535,8 @@
     bool mInvalidOperation;

     bool mOutOfMemory;

     bool mInvalidFramebufferOperation;

+	bool mMatrixStackOverflow;

+	bool mMatrixStackUnderflow;

 

     bool mHasBeenCurrent;

 

diff --git a/src/OpenGL/libGLES_CM/main.cpp b/src/OpenGL/libGLES_CM/main.cpp
index 381cee1..9ec5656 100644
--- a/src/OpenGL/libGLES_CM/main.cpp
+++ b/src/OpenGL/libGLES_CM/main.cpp
@@ -135,6 +135,14 @@
             context->recordInvalidFramebufferOperation();

             TRACE("\t! Error generated: invalid framebuffer operation\n");

             break;

+		case GL_STACK_OVERFLOW:

+			context->recordMatrixStackOverflow();

+            TRACE("\t! Error generated: matrix stack overflow\n");

+            break;

+		case GL_STACK_UNDERFLOW:

+			context->recordMatrixStackUnderflow();

+            TRACE("\t! Error generated: matrix stack underflow\n");

+            break;

         default: UNREACHABLE(errorCode);

         }

     }