Move state query validation out of Context.

Generate all GL errors in the validation helper functions, instead of
within the state manipulation logic and internals of Context.

BUG=angle:571

Change-Id: I7a3f540e2ae0f5f8c7126e2593717cc3200dd7e5
Reviewed-on: https://chromium-review.googlesource.com/200551
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index a7bac12..79b47c8 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -763,6 +763,11 @@
     return mState.samplers[textureUnit];
 }
 
+unsigned int Context::getActiveSampler() const
+{
+    return mState.activeSampler;
+}
+
 GLuint Context::getArrayBufferHandle() const
 {
     return mState.arrayBuffer.id();
@@ -961,7 +966,7 @@
     {
         detachBuffer(buffer);
     }
-    
+
     mResourceManager->deleteBuffer(buffer);
 }
 
@@ -991,7 +996,7 @@
     {
         detachRenderbuffer(renderbuffer);
     }
-    
+
     mResourceManager->deleteRenderbuffer(renderbuffer);
 }
 
@@ -1330,7 +1335,7 @@
             newProgram->addRef();
             mCurrentProgramBinary.set(newProgram->getProgramBinary());
         }
-        
+
         if (oldProgram)
         {
             oldProgram->release();
@@ -1626,7 +1631,7 @@
     return mState.samplerTexture[type][sampler].get();
 }
 
-bool Context::getBooleanv(GLenum pname, GLboolean *params)
+void Context::getBooleanv(GLenum pname, GLboolean *params)
 {
     switch (pname)
     {
@@ -1652,13 +1657,12 @@
       case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isStarted(); break;
       case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused();  break;
       default:
-        return false;
+        UNREACHABLE();
+        break;
     }
-
-    return true;
 }
 
-bool Context::getFloatv(GLenum pname, GLfloat *params)
+void Context::getFloatv(GLenum pname, GLfloat *params)
 {
     // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
     // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
@@ -1696,41 +1700,30 @@
         params[3] = mState.blendColor.alpha;
         break;
       case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
-        if (!supportsTextureFilterAnisotropy())
-        {
-            return false;
-        }
+        ASSERT(supportsTextureFilterAnisotropy());
         *params = mMaxTextureAnisotropy;
         break;
       default:
-        return false;
+        UNREACHABLE();
+        break;
     }
-
-    return true;
 }
 
-bool Context::getIntegerv(GLenum pname, GLint *params)
+void Context::getIntegerv(GLenum pname, GLint *params)
 {
     if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
     {
         unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
-
-        if (colorAttachment >= mRenderer->getMaxRenderTargets())
-        {
-            // return true to stop further operation in the parent call
-            return gl::error(GL_INVALID_OPERATION, true);
-        }
-
+        ASSERT(colorAttachment < mRenderer->getMaxRenderTargets());
         Framebuffer *framebuffer = getDrawFramebuffer();
-
         *params = framebuffer->getDrawBufferState(colorAttachment);
-        return true;
+        return;
     }
 
     // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
     // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
     // GetIntegerv as its native query function. As it would require conversion in any
-    // case, this should make no difference to the calling application. You may find it in 
+    // case, this should make no difference to the calling application. You may find it in
     // Context::getFloatv.
     switch (pname)
     {
@@ -1802,24 +1795,13 @@
       case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mRenderer->getMaxTransformFeedbackInterleavedComponents(); break;
       case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:       *params = mRenderer->getMaxTransformFeedbackBuffers();               break;
       case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:    *params = mRenderer->getMaxTransformFeedbackSeparateComponents();    break;
-      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:   
+      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
         params[0] = mNumCompressedTextureFormats;
         break;
       case GL_MAX_SAMPLES_ANGLE:
-        {
-            GLsizei maxSamples = getMaxSupportedSamples();
-            if (maxSamples != 0)
-            {
-                *params = maxSamples;
-            }
-            else
-            {
-                return false;
-            }
-
-            break;
-        }
-      case GL_SAMPLE_BUFFERS:                   
+        *params = static_cast<GLint>(getMaxSupportedSamples());
+        break;
+      case GL_SAMPLE_BUFFERS:
       case GL_SAMPLES:
         {
             gl::Framebuffer *framebuffer = getDrawFramebuffer();
@@ -1842,7 +1824,7 @@
                     break;
                 }
             }
-            else 
+            else
             {
                 *params = 0;
             }
@@ -1852,13 +1834,11 @@
       case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
         {
             GLenum internalFormat, format, type;
-            if (getCurrentReadFormatType(&internalFormat, &format, &type))
-            {
-                if (pname == GL_IMPLEMENTATION_COLOR_READ_FORMAT)
-                    *params = format;
-                else
-                    *params = type;
-            }
+            getCurrentReadFormatType(&internalFormat, &format, &type);
+            if (pname == GL_IMPLEMENTATION_COLOR_READ_FORMAT)
+                *params = format;
+            else
+                *params = type;
         }
         break;
       case GL_MAX_VIEWPORT_DIMS:
@@ -1953,48 +1933,20 @@
         }
         break;
       case GL_TEXTURE_BINDING_2D:
-        {
-            if (mState.activeSampler > mRenderer->getMaxCombinedTextureImageUnits() - 1)
-            {
-                gl::error(GL_INVALID_OPERATION);
-                return false;
-            }
-
-            *params = mState.samplerTexture[TEXTURE_2D][mState.activeSampler].id();
-        }
+        ASSERT(mState.activeSampler < mRenderer->getMaxCombinedTextureImageUnits());
+        *params = mState.samplerTexture[TEXTURE_2D][mState.activeSampler].id();
         break;
       case GL_TEXTURE_BINDING_CUBE_MAP:
-        {
-            if (mState.activeSampler > mRenderer->getMaxCombinedTextureImageUnits() - 1)
-            {
-                gl::error(GL_INVALID_OPERATION);
-                return false;
-            }
-
-            *params = mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].id();
-        }
+        ASSERT(mState.activeSampler < mRenderer->getMaxCombinedTextureImageUnits());
+        *params = mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].id();
         break;
       case GL_TEXTURE_BINDING_3D:
-        {
-            if (mState.activeSampler > mRenderer->getMaxCombinedTextureImageUnits() - 1)
-            {
-                gl::error(GL_INVALID_OPERATION);
-                return false;
-            }
-
-            *params = mState.samplerTexture[TEXTURE_3D][mState.activeSampler].id();
-        }
+        ASSERT(mState.activeSampler < mRenderer->getMaxCombinedTextureImageUnits());
+        *params = mState.samplerTexture[TEXTURE_3D][mState.activeSampler].id();
         break;
       case GL_TEXTURE_BINDING_2D_ARRAY:
-        {
-            if (mState.activeSampler > mRenderer->getMaxCombinedTextureImageUnits() - 1)
-            {
-                gl::error(GL_INVALID_OPERATION);
-                return false;
-            }
-
-            *params = mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler].id();
-        }
+        ASSERT(mState.activeSampler < mRenderer->getMaxCombinedTextureImageUnits());
+        *params = mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler].id();
         break;
       case GL_RESET_NOTIFICATION_STRATEGY_EXT:
         *params = mResetStrategy;
@@ -2027,13 +1979,12 @@
         *params = static_cast<GLint>(getNumExtensions());
         break;
       default:
-        return false;
+        UNREACHABLE();
+        break;
     }
-
-    return true;
 }
 
-bool Context::getInteger64v(GLenum pname, GLint64 *params)
+void Context::getInteger64v(GLenum pname, GLint64 *params)
 {
     switch (pname)
     {
@@ -2062,10 +2013,9 @@
         *params = 0;
         break;
       default:
-        return false;
+        UNREACHABLE();
+        break;
     }
-
-    return true;
 }
 
 bool Context::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
@@ -2138,7 +2088,7 @@
     // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
     // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
     // to the fact that it is stored internally as a float, and so would require conversion
-    // if returned from Context::getIntegerv. Since this conversion is already implemented 
+    // if returned from Context::getIntegerv. Since this conversion is already implemented
     // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
     // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
     // application.
@@ -2457,7 +2407,7 @@
     {
         if (mState.sampleCoverageValue != 0)
         {
-            
+
             float threshold = 0.5f;
 
             for (int i = 0; i < samples; ++i)
@@ -3167,7 +3117,7 @@
             mResetStatus = GL_NO_ERROR;
         }
     }
-    
+
     return status;
 }
 
@@ -3393,25 +3343,17 @@
     return mMaxTextureAnisotropy;
 }
 
-bool Context::getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type)
+void Context::getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type)
 {
     Framebuffer *framebuffer = getReadFramebuffer();
-    if (!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
-    {
-        return gl::error(GL_INVALID_OPERATION, false);
-    }
+    ASSERT(framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE);
 
     Renderbuffer *renderbuffer = framebuffer->getReadColorbuffer();
-    if (!renderbuffer)
-    {
-        return gl::error(GL_INVALID_OPERATION, false);
-    }
+    ASSERT(renderbuffer);
 
     *internalFormat = renderbuffer->getActualFormat();
     *format = gl::GetFormat(renderbuffer->getActualFormat(), mClientVersion);
     *type = gl::GetType(renderbuffer->getActualFormat(), mClientVersion);
-
-    return true;
 }
 
 void Context::detachBuffer(GLuint buffer)
@@ -3621,7 +3563,7 @@
         // undefined when not written, just skip drawing to avoid unexpected results.
         if (!getCurrentProgramBinary()->usesPointSize())
         {
-            // This is stictly speaking not an error, but developers should be 
+            // This is stictly speaking not an error, but developers should be
             // notified of risking undefined behavior.
             ERR("Point rendering without writing to gl_PointSize.");