Add ES3.1 API constants

The newly added capability constants are handled in the corresponding
glGet functions. Also, getBooleani_v has been added.

BUG=angleproject:1442

TEST=angle_deqp_gtest_gles31_tests
--gtest_filter=*functional_state_query_integer_max_*
TEST=angle_deqp_gtest_gles31_tests
--gtest_filter=*state_query_indexed_max_compute_work_group_size*
TEST=angle_unittests
TEST=angle_end2end_tests

Change-Id: I846e006307563ae81d8b6c62cf261417e15186c7
Reviewed-on: https://chromium-review.googlesource.com/362270
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index e0c45b5..4a6b4e3 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -37,6 +37,7 @@
 #include "libANGLE/validationES.h"
 #include "libANGLE/renderer/ContextImpl.h"
 #include "libANGLE/renderer/EGLImplFactory.h"
+#include "libANGLE/queryconversions.h"
 
 namespace
 {
@@ -1366,7 +1367,129 @@
       case GL_GPU_DISJOINT_EXT:
           *params = mImplementation->getGPUDisjoint();
           break;
-
+      case GL_MAX_FRAMEBUFFER_WIDTH:
+          *params = mCaps.maxFramebufferWidth;
+          break;
+      case GL_MAX_FRAMEBUFFER_HEIGHT:
+          *params = mCaps.maxFramebufferHeight;
+          break;
+      case GL_MAX_FRAMEBUFFER_SAMPLES:
+          *params = mCaps.maxFramebufferSamples;
+          break;
+      case GL_MAX_SAMPLE_MASK_WORDS:
+          *params = mCaps.maxSampleMaskWords;
+          break;
+      case GL_MAX_COLOR_TEXTURE_SAMPLES:
+          *params = mCaps.maxColorTextureSamples;
+          break;
+      case GL_MAX_DEPTH_TEXTURE_SAMPLES:
+          *params = mCaps.maxDepthTextureSamples;
+          break;
+      case GL_MAX_INTEGER_SAMPLES:
+          *params = mCaps.maxIntegerSamples;
+          break;
+      case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
+          *params = mCaps.maxVertexAttribRelativeOffset;
+          break;
+      case GL_MAX_VERTEX_ATTRIB_BINDINGS:
+          *params = mCaps.maxVertexAttribBindings;
+          break;
+      case GL_MAX_VERTEX_ATTRIB_STRIDE:
+          *params = mCaps.maxVertexAttribStride;
+          break;
+      case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
+          *params = mCaps.maxVertexAtomicCounterBuffers;
+          break;
+      case GL_MAX_VERTEX_ATOMIC_COUNTERS:
+          *params = mCaps.maxVertexAtomicCounters;
+          break;
+      case GL_MAX_VERTEX_IMAGE_UNIFORMS:
+          *params = mCaps.maxVertexImageUniforms;
+          break;
+      case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
+          *params = mCaps.maxVertexShaderStorageBlocks;
+          break;
+      case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
+          *params = mCaps.maxFragmentAtomicCounterBuffers;
+          break;
+      case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
+          *params = mCaps.maxFragmentAtomicCounters;
+          break;
+      case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
+          *params = mCaps.maxFragmentImageUniforms;
+          break;
+      case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
+          *params = mCaps.maxFragmentShaderStorageBlocks;
+          break;
+      case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
+          *params = mCaps.minProgramTextureGatherOffset;
+          break;
+      case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
+          *params = mCaps.maxProgramTextureGatherOffset;
+          break;
+      case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
+          *params = mCaps.maxComputeWorkGroupInvocations;
+          break;
+      case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
+          *params = mCaps.maxComputeUniformBlocks;
+          break;
+      case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
+          *params = mCaps.maxComputeTextureImageUnits;
+          break;
+      case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
+          *params = mCaps.maxComputeSharedMemorySize;
+          break;
+      case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
+          *params = mCaps.maxComputeUniformComponents;
+          break;
+      case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
+          *params = mCaps.maxComputeAtomicCounterBuffers;
+          break;
+      case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
+          *params = mCaps.maxComputeAtomicCounters;
+          break;
+      case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
+          *params = mCaps.maxComputeImageUniforms;
+          break;
+      case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
+          *params = mCaps.maxCombinedComputeUniformComponents;
+          break;
+      case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
+          *params = mCaps.maxComputeShaderStorageBlocks;
+          break;
+      case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
+          *params = mCaps.maxCombinedShaderOutputResources;
+          break;
+      case GL_MAX_UNIFORM_LOCATIONS:
+          *params = mCaps.maxUniformLocations;
+          break;
+      case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
+          *params = mCaps.maxAtomicCounterBufferBindings;
+          break;
+      case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
+          *params = mCaps.maxAtomicCounterBufferSize;
+          break;
+      case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
+          *params = mCaps.maxCombinedAtomicCounterBuffers;
+          break;
+      case GL_MAX_COMBINED_ATOMIC_COUNTERS:
+          *params = mCaps.maxCombinedAtomicCounters;
+          break;
+      case GL_MAX_IMAGE_UNITS:
+          *params = mCaps.maxImageUnits;
+          break;
+      case GL_MAX_COMBINED_IMAGE_UNIFORMS:
+          *params = mCaps.maxCombinedImageUniforms;
+          break;
+      case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
+          *params = mCaps.maxShaderStorageBufferBindings;
+          break;
+      case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
+          *params = mCaps.maxCombinedShaderStorageBlocks;
+          break;
+      case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
+          *params = mCaps.shaderStorageBufferOffsetAlignment;
+          break;
       default:
           mGLState.getIntegerv(mState, pname, params);
           break;
@@ -1399,6 +1522,10 @@
       case GL_TIMESTAMP_EXT:
           *params = mImplementation->getTimestamp();
           break;
+
+      case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
+          *params = mCaps.maxShaderStorageBlockSize;
+          break;
       default:
         UNREACHABLE();
         break;
@@ -1410,22 +1537,76 @@
     mGLState.getPointerv(pname, params);
 }
 
-bool Context::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
+void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
 {
     // Queries about context capabilities and maximums are answered by Context.
     // Queries about current GL state values are answered by State.
-    // Indexed integer queries all refer to current state, so this function is a
-    // mere passthrough.
-    return mGLState.getIndexedIntegerv(target, index, data);
+
+    GLenum nativeType;
+    unsigned int numParams;
+    bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
+    ASSERT(queryStatus);
+
+    if (nativeType == GL_INT)
+    {
+        switch (target)
+        {
+            case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
+                ASSERT(index < 3u);
+                *data = mCaps.maxComputeWorkGroupCount[index];
+                break;
+            case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
+                ASSERT(index < 3u);
+                *data = mCaps.maxComputeWorkGroupSize[index];
+                break;
+            default:
+                mGLState.getIntegeri_v(target, index, data);
+        }
+    }
+    else
+    {
+        CastIndexedStateValues(this, nativeType, target, index, numParams, data);
+    }
 }
 
-bool Context::getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data)
+void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
 {
     // Queries about context capabilities and maximums are answered by Context.
     // Queries about current GL state values are answered by State.
-    // Indexed integer queries all refer to current state, so this function is a
-    // mere passthrough.
-    return mGLState.getIndexedInteger64v(target, index, data);
+
+    GLenum nativeType;
+    unsigned int numParams;
+    bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
+    ASSERT(queryStatus);
+
+    if (nativeType == GL_INT_64_ANGLEX)
+    {
+        mGLState.getInteger64i_v(target, index, data);
+    }
+    else
+    {
+        CastIndexedStateValues(this, nativeType, target, index, numParams, data);
+    }
+}
+
+void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
+{
+    // Queries about context capabilities and maximums are answered by Context.
+    // Queries about current GL state values are answered by State.
+
+    GLenum nativeType;
+    unsigned int numParams;
+    bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
+    ASSERT(queryStatus);
+
+    if (nativeType == GL_BOOL)
+    {
+        mGLState.getBooleani_v(target, index, data);
+    }
+    else
+    {
+        CastIndexedStateValues(this, nativeType, target, index, numParams, data);
+    }
 }
 
 Error Context::drawArrays(GLenum mode, GLint first, GLsizei count)