Fixed glGetIntegerv for OpenGL ES 2

Many new OpenGL ES 3 specific entries in Context::getIntegerv
were not hidden when an OpenGL ES 2 context is created. The
switch statement was separated in 2 statements in order to
fix this.

Change-Id: Ib218b72e854f5857958cfa14ecdfef5ae03ee92b
Reviewed-on: https://swiftshader-review.googlesource.com/8851
Tested-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 1239a70..27d608b 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1851,55 +1851,55 @@
 	// Context::getFloatv.
 	switch(pname)
 	{
-	case GL_MAX_VERTEX_ATTRIBS:               *params = MAX_VERTEX_ATTRIBS;               break;
-	case GL_MAX_VERTEX_UNIFORM_VECTORS:       *params = MAX_VERTEX_UNIFORM_VECTORS;       break;
-	case GL_MAX_VARYING_VECTORS:              *params = MAX_VARYING_VECTORS;              break;
-	case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = MAX_COMBINED_TEXTURE_IMAGE_UNITS; break;
-	case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:   *params = MAX_VERTEX_TEXTURE_IMAGE_UNITS;   break;
-	case GL_MAX_TEXTURE_IMAGE_UNITS:          *params = MAX_TEXTURE_IMAGE_UNITS;          break;
-	case GL_MAX_FRAGMENT_UNIFORM_VECTORS:     *params = MAX_FRAGMENT_UNIFORM_VECTORS;     break;
-	case GL_MAX_RENDERBUFFER_SIZE:            *params = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; break;
-	case GL_NUM_SHADER_BINARY_FORMATS:        *params = 0;                                    break;
-	case GL_SHADER_BINARY_FORMATS:      /* no shader binary formats are supported */          break;
-	case GL_ARRAY_BUFFER_BINDING:             *params = getArrayBufferName();                 break;
-	case GL_ELEMENT_ARRAY_BUFFER_BINDING:     *params = getElementArrayBufferName();          break;
+	case GL_MAX_VERTEX_ATTRIBS:               *params = MAX_VERTEX_ATTRIBS;               return true;
+	case GL_MAX_VERTEX_UNIFORM_VECTORS:       *params = MAX_VERTEX_UNIFORM_VECTORS;       return true;
+	case GL_MAX_VARYING_VECTORS:              *params = MAX_VARYING_VECTORS;              return true;
+	case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = MAX_COMBINED_TEXTURE_IMAGE_UNITS; return true;
+	case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:   *params = MAX_VERTEX_TEXTURE_IMAGE_UNITS;   return true;
+	case GL_MAX_TEXTURE_IMAGE_UNITS:          *params = MAX_TEXTURE_IMAGE_UNITS;          return true;
+	case GL_MAX_FRAGMENT_UNIFORM_VECTORS:     *params = MAX_FRAGMENT_UNIFORM_VECTORS;     return true;
+	case GL_MAX_RENDERBUFFER_SIZE:            *params = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; return true;
+	case GL_NUM_SHADER_BINARY_FORMATS:        *params = 0;                                    return true;
+	case GL_SHADER_BINARY_FORMATS:      /* no shader binary formats are supported */          return true;
+	case GL_ARRAY_BUFFER_BINDING:             *params = getArrayBufferName();                 return true;
+	case GL_ELEMENT_ARRAY_BUFFER_BINDING:     *params = getElementArrayBufferName();          return true;
 //	case GL_FRAMEBUFFER_BINDING:            // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
-	case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:   *params = mState.drawFramebuffer;               break;
-	case GL_READ_FRAMEBUFFER_BINDING_ANGLE:   *params = mState.readFramebuffer;               break;
-	case GL_RENDERBUFFER_BINDING:             *params = mState.renderbuffer.name();           break;
-	case GL_CURRENT_PROGRAM:                  *params = mState.currentProgram;                break;
-	case GL_PACK_ALIGNMENT:                   *params = mState.packAlignment;                 break;
-	case GL_UNPACK_ALIGNMENT:                 *params = mState.unpackInfo.alignment;          break;
-	case GL_GENERATE_MIPMAP_HINT:             *params = mState.generateMipmapHint;            break;
-	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.stencilFunc;                   break;
-	case GL_STENCIL_REF:                      *params = mState.stencilRef;                    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 = 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;
-	case GL_STENCIL_BACK_FAIL:                *params = mState.stencilBackFail;               break;
-	case GL_STENCIL_BACK_PASS_DEPTH_FAIL:     *params = mState.stencilBackPassDepthFail;      break;
-	case GL_STENCIL_BACK_PASS_DEPTH_PASS:     *params = mState.stencilBackPassDepthPass;      break;
-	case GL_DEPTH_FUNC:                       *params = mState.depthFunc;                     break;
-	case GL_BLEND_SRC_RGB:                    *params = mState.sourceBlendRGB;                break;
-	case GL_BLEND_SRC_ALPHA:                  *params = mState.sourceBlendAlpha;              break;
-	case GL_BLEND_DST_RGB:                    *params = mState.destBlendRGB;                  break;
-	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 = 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;
-	case GL_MAX_CUBE_MAP_TEXTURE_SIZE:        *params = IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE; break;
-	case GL_NUM_COMPRESSED_TEXTURE_FORMATS:   *params = NUM_COMPRESSED_TEXTURE_FORMATS;           break;
-	case GL_MAX_SAMPLES_ANGLE:                *params = IMPLEMENTATION_MAX_SAMPLES;               break;
+	case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:   *params = mState.drawFramebuffer;               return true;
+	case GL_READ_FRAMEBUFFER_BINDING_ANGLE:   *params = mState.readFramebuffer;               return true;
+	case GL_RENDERBUFFER_BINDING:             *params = mState.renderbuffer.name();           return true;
+	case GL_CURRENT_PROGRAM:                  *params = mState.currentProgram;                return true;
+	case GL_PACK_ALIGNMENT:                   *params = mState.packAlignment;                 return true;
+	case GL_UNPACK_ALIGNMENT:                 *params = mState.unpackInfo.alignment;          return true;
+	case GL_GENERATE_MIPMAP_HINT:             *params = mState.generateMipmapHint;            return true;
+	case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mState.fragmentShaderDerivativeHint; return true;
+	case GL_ACTIVE_TEXTURE:                   *params = (mState.activeSampler + GL_TEXTURE0); return true;
+	case GL_STENCIL_FUNC:                     *params = mState.stencilFunc;                   return true;
+	case GL_STENCIL_REF:                      *params = mState.stencilRef;                    return true;
+	case GL_STENCIL_VALUE_MASK:               *params = sw::clampToSignedInt(mState.stencilMask); return true;
+	case GL_STENCIL_BACK_FUNC:                *params = mState.stencilBackFunc;               return true;
+	case GL_STENCIL_BACK_REF:                 *params = mState.stencilBackRef;                return true;
+	case GL_STENCIL_BACK_VALUE_MASK:          *params = sw::clampToSignedInt(mState.stencilBackMask); return true;
+	case GL_STENCIL_FAIL:                     *params = mState.stencilFail;                   return true;
+	case GL_STENCIL_PASS_DEPTH_FAIL:          *params = mState.stencilPassDepthFail;          return true;
+	case GL_STENCIL_PASS_DEPTH_PASS:          *params = mState.stencilPassDepthPass;          return true;
+	case GL_STENCIL_BACK_FAIL:                *params = mState.stencilBackFail;               return true;
+	case GL_STENCIL_BACK_PASS_DEPTH_FAIL:     *params = mState.stencilBackPassDepthFail;      return true;
+	case GL_STENCIL_BACK_PASS_DEPTH_PASS:     *params = mState.stencilBackPassDepthPass;      return true;
+	case GL_DEPTH_FUNC:                       *params = mState.depthFunc;                     return true;
+	case GL_BLEND_SRC_RGB:                    *params = mState.sourceBlendRGB;                return true;
+	case GL_BLEND_SRC_ALPHA:                  *params = mState.sourceBlendAlpha;              return true;
+	case GL_BLEND_DST_RGB:                    *params = mState.destBlendRGB;                  return true;
+	case GL_BLEND_DST_ALPHA:                  *params = mState.destBlendAlpha;                return true;
+	case GL_BLEND_EQUATION_RGB:               *params = mState.blendEquationRGB;              return true;
+	case GL_BLEND_EQUATION_ALPHA:             *params = mState.blendEquationAlpha;            return true;
+	case GL_STENCIL_WRITEMASK:                *params = sw::clampToSignedInt(mState.stencilWritemask); return true;
+	case GL_STENCIL_BACK_WRITEMASK:           *params = sw::clampToSignedInt(mState.stencilBackWritemask); return true;
+	case GL_STENCIL_CLEAR_VALUE:              *params = mState.stencilClearValue;             return true;
+	case GL_SUBPIXEL_BITS:                    *params = 4;                                    return true;
+	case GL_MAX_TEXTURE_SIZE:                 *params = IMPLEMENTATION_MAX_TEXTURE_SIZE;          return true;
+	case GL_MAX_CUBE_MAP_TEXTURE_SIZE:        *params = IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE; return true;
+	case GL_NUM_COMPRESSED_TEXTURE_FORMATS:   *params = NUM_COMPRESSED_TEXTURE_FORMATS;           return true;
+	case GL_MAX_SAMPLES_ANGLE:                *params = IMPLEMENTATION_MAX_SAMPLES;               return true;
 	case GL_SAMPLE_BUFFERS:
 	case GL_SAMPLES:
 		{
@@ -1930,26 +1930,26 @@
 				*params = 0;
 			}
 		}
-		break;
+		return true;
 	case GL_IMPLEMENTATION_COLOR_READ_TYPE:
 		{
 			Framebuffer *framebuffer = getReadFramebuffer();
 			*params = framebuffer->getImplementationColorReadType();
 		}
-		break;
+		return true;
 	case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
 		{
 			Framebuffer *framebuffer = getReadFramebuffer();
 			*params = framebuffer->getImplementationColorReadFormat();
 		}
-		break;
+		return true;
 	case GL_MAX_VIEWPORT_DIMS:
 		{
 			int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE;
 			params[0] = maxDimension;
 			params[1] = maxDimension;
 		}
-		break;
+		return true;
 	case GL_COMPRESSED_TEXTURE_FORMATS:
 		{
 			for(int i = 0; i < NUM_COMPRESSED_TEXTURE_FORMATS; i++)
@@ -1957,21 +1957,21 @@
 				params[i] = compressedTextureFormats[i];
 			}
 		}
-		break;
+		return true;
 	case GL_VIEWPORT:
 		params[0] = mState.viewportX;
 		params[1] = mState.viewportY;
 		params[2] = mState.viewportWidth;
 		params[3] = mState.viewportHeight;
-		break;
+		return true;
 	case GL_SCISSOR_BOX:
 		params[0] = mState.scissorX;
 		params[1] = mState.scissorY;
 		params[2] = mState.scissorWidth;
 		params[3] = mState.scissorHeight;
-		break;
-	case GL_CULL_FACE_MODE:                   *params = mState.cullMode;                 break;
-	case GL_FRONT_FACE:                       *params = mState.frontFace;                break;
+		return true;
+	case GL_CULL_FACE_MODE:                   *params = mState.cullMode;                 return true;
+	case GL_FRONT_FACE:                       *params = mState.frontFace;                return true;
 	case GL_RED_BITS:
 	case GL_GREEN_BITS:
 	case GL_BLUE_BITS:
@@ -1984,10 +1984,10 @@
 			{
 				switch(pname)
 				{
-				case GL_RED_BITS:   *params = colorbuffer->getRedSize();   break;
-				case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
-				case GL_BLUE_BITS:  *params = colorbuffer->getBlueSize();  break;
-				case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
+				case GL_RED_BITS:   *params = colorbuffer->getRedSize();   return true;
+				case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); return true;
+				case GL_BLUE_BITS:  *params = colorbuffer->getBlueSize();  return true;
+				case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); return true;
 				}
 			}
 			else
@@ -1995,7 +1995,7 @@
 				*params = 0;
 			}
 		}
-		break;
+		return true;
 	case GL_DEPTH_BITS:
 		{
 			Framebuffer *framebuffer = getDrawFramebuffer();
@@ -2010,7 +2010,7 @@
 				*params = 0;
 			}
 		}
-		break;
+		return true;
 	case GL_STENCIL_BITS:
 		{
 			Framebuffer *framebuffer = getDrawFramebuffer();
@@ -2025,7 +2025,7 @@
 				*params = 0;
 			}
 		}
-		break;
+		return true;
 	case GL_TEXTURE_BINDING_2D:
 		if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
 		{
@@ -2034,7 +2034,7 @@
 		}
 
 		*params = mState.samplerTexture[TEXTURE_2D][mState.activeSampler].name();
-		break;
+		return true;
 	case GL_TEXTURE_BINDING_CUBE_MAP:
 		if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
 		{
@@ -2043,7 +2043,7 @@
 		}
 
 		*params = mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].name();
-		break;
+		return true;
 	case GL_TEXTURE_BINDING_EXTERNAL_OES:
 		if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
 		{
@@ -2052,7 +2052,7 @@
 		}
 
 		*params = mState.samplerTexture[TEXTURE_EXTERNAL][mState.activeSampler].name();
-		break;
+		return true;
 	case GL_TEXTURE_BINDING_3D_OES:
 		if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
 		{
@@ -2061,40 +2061,7 @@
 		}
 
 		*params = mState.samplerTexture[TEXTURE_3D][mState.activeSampler].name();
-		break;
-	case GL_TEXTURE_BINDING_2D_ARRAY:
-		if(clientVersion < 3)
-		{
-			return false;
-		}
-		else if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
-		{
-			error(GL_INVALID_OPERATION);
-			return false;
-		}
-
-		*params = mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler].name();
-		break;
-	case GL_COPY_READ_BUFFER_BINDING:
-		if(clientVersion >= 3)
-		{
-			*params = mState.copyReadBuffer.name();
-		}
-		else
-		{
-			return false;
-		}
-		break;
-	case GL_COPY_WRITE_BUFFER_BINDING:
-		if(clientVersion >= 3)
-		{
-			*params = mState.copyWriteBuffer.name();
-		}
-		else
-		{
-			return false;
-		}
-		break;
+		return true;
 	case GL_DRAW_BUFFER0:
 	case GL_DRAW_BUFFER1:
 	case GL_DRAW_BUFFER2:
@@ -2111,243 +2078,224 @@
 	case GL_DRAW_BUFFER13:
 	case GL_DRAW_BUFFER14:
 	case GL_DRAW_BUFFER15:
-		*params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0);
-		break;
-	case GL_MAJOR_VERSION:
-		if(clientVersion >= 3)
+		if((pname - GL_DRAW_BUFFER0) < MAX_DRAW_BUFFERS)
 		{
-			*params = clientVersion;
+			*params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0);
 		}
 		else
 		{
 			return false;
 		}
-		break;
-	case GL_MAX_3D_TEXTURE_SIZE:
-		*params = IMPLEMENTATION_MAX_TEXTURE_SIZE;
-		break;
-	case GL_MAX_ARRAY_TEXTURE_LAYERS:
-		*params = IMPLEMENTATION_MAX_TEXTURE_SIZE;
-		break;
-	case GL_MAX_COLOR_ATTACHMENTS:
-		*params = MAX_COLOR_ATTACHMENTS;
-		break;
-	case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
-		*params = MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;
-		break;
-	case GL_MAX_COMBINED_UNIFORM_BLOCKS:
-		*params = MAX_VERTEX_UNIFORM_BLOCKS + MAX_FRAGMENT_UNIFORM_BLOCKS;
-		break;
-	case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
-		*params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;
-		break;
+		return true;
 	case GL_MAX_DRAW_BUFFERS:
 		*params = MAX_DRAW_BUFFERS;
-		break;
-	case GL_MAX_ELEMENT_INDEX:
-		*params = MAX_ELEMENT_INDEX;
-		break;
-	case GL_MAX_ELEMENTS_INDICES:
-		*params = MAX_ELEMENTS_INDICES;
-		break;
-	case GL_MAX_ELEMENTS_VERTICES:
-		*params = MAX_ELEMENTS_VERTICES;
-		break;
-	case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
-		*params = MAX_FRAGMENT_INPUT_VECTORS * 4;
-		break;
-	case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
-		*params = MAX_FRAGMENT_UNIFORM_BLOCKS;
-		break;
-	case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
-		*params = MAX_FRAGMENT_UNIFORM_COMPONENTS;
-		break;
-	case GL_MAX_PROGRAM_TEXEL_OFFSET:
-		UNIMPLEMENTED();
-		*params = MAX_PROGRAM_TEXEL_OFFSET;
-		break;
-	case GL_MAX_SERVER_WAIT_TIMEOUT:
-		UNIMPLEMENTED();
-		*params = 0;
-		break;
-	case GL_MAX_TEXTURE_LOD_BIAS:
-		UNIMPLEMENTED();
-		*params = 2;
-		break;
-	case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
-		*params = sw::MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS;
-		break;
-	case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
-		*params = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;
-		break;
-	case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
-		*params = sw::MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;
-		break;
-	case GL_MAX_UNIFORM_BLOCK_SIZE:
-		*params = MAX_UNIFORM_BLOCK_SIZE;
-		break;
-	case GL_MAX_UNIFORM_BUFFER_BINDINGS:
-		*params = MAX_UNIFORM_BUFFER_BINDINGS;
-		break;
-	case GL_MAX_VARYING_COMPONENTS:
-		UNIMPLEMENTED();
-		// FIXME: should be MAX_VARYING_VECTORS * 4, but MAX_VARYING_VECTORS
-		// must be increased (see MAX_VERTEX_OUTPUTS and MAX_FRAGMENT_INPUTS)
-		*params = 60;
-		break;
-	case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
-		*params = MAX_VERTEX_OUTPUT_VECTORS * 4;
-		break;
-	case GL_MAX_VERTEX_UNIFORM_BLOCKS:
-		*params = MAX_VERTEX_UNIFORM_BLOCKS;
-		break;
-	case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
-		*params = MAX_VERTEX_UNIFORM_COMPONENTS;
-		break;
-	case GL_MIN_PROGRAM_TEXEL_OFFSET:
-		UNIMPLEMENTED();
-		*params = MIN_PROGRAM_TEXEL_OFFSET;
-		break;
-	case GL_MINOR_VERSION:
-		if (clientVersion >= 3)
-		{
-			*params = 0;
-		}
-		else
-		{
-			return false;
-		}
-		break;
-	case GL_NUM_EXTENSIONS:
-		GLuint numExtensions;
-		getExtensions(0, &numExtensions);
-		*params = numExtensions;
-		break;
-	case GL_NUM_PROGRAM_BINARY_FORMATS:
-		*params = NUM_PROGRAM_BINARY_FORMATS;
-		break;
-	case GL_PACK_ROW_LENGTH:
-		*params = mState.packRowLength;
-		break;
-	case GL_PACK_SKIP_PIXELS:
-		*params = mState.packSkipPixels;
-		break;
-	case GL_PACK_SKIP_ROWS:
-		*params = mState.packSkipRows;
-		break;
-	case GL_PIXEL_PACK_BUFFER_BINDING:
-		if(clientVersion >= 3)
-		{
-			*params = mState.pixelPackBuffer.name();
-		}
-		else
-		{
-			return false;
-		}
-		break;
-	case GL_PIXEL_UNPACK_BUFFER_BINDING:
-		if(clientVersion >= 3)
-		{
-			*params = mState.pixelUnpackBuffer.name();
-		}
-		else
-		{
-			return false;
-		}
-		break;
-	case GL_PROGRAM_BINARY_FORMATS:
-		// Since NUM_PROGRAM_BINARY_FORMATS is 0, the input
-		// should be a 0 sized array, so don't write to params
-		break;
-	case GL_READ_BUFFER:
-		*params = getReadFramebuffer()->getReadBuffer();
-		break;
-	case GL_SAMPLER_BINDING:
-		*params = mState.sampler[mState.activeSampler].name();
-		break;
-	case GL_UNIFORM_BUFFER_BINDING:
-		if(clientVersion >= 3)
-		{
-			*params = mState.genericUniformBuffer.name();
-		}
-		else
-		{
-			return false;
-		}
-		break;
-	case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
-		*params = UNIFORM_BUFFER_OFFSET_ALIGNMENT;
-		break;
-	case GL_UNIFORM_BUFFER_SIZE:
-		if(clientVersion >= 3)
-		{
-			*params = static_cast<T>(mState.genericUniformBuffer->size());
-		}
-		else
-		{
-			return false;
-		}
-		break;
-	case GL_UNIFORM_BUFFER_START:
-		if(clientVersion >= 3)
-		{
-			*params = static_cast<T>(mState.genericUniformBuffer->offset());
-		}
-		else
-		{
-			return false;
-		}
-		*params = 0;
-		break;
-	case GL_UNPACK_IMAGE_HEIGHT:
-		*params = mState.unpackInfo.imageHeight;
-		break;
-	case GL_UNPACK_ROW_LENGTH:
-		*params = mState.unpackInfo.rowLength;
-		break;
-	case GL_UNPACK_SKIP_IMAGES:
-		*params = mState.unpackInfo.skipImages;
-		break;
-	case GL_UNPACK_SKIP_PIXELS:
-		*params = mState.unpackInfo.skipPixels;
-		break;
-	case GL_UNPACK_SKIP_ROWS:
-		*params = mState.unpackInfo.skipRows;
-		break;
-	case GL_VERTEX_ARRAY_BINDING:
-		*params = getCurrentVertexArray()->name;
-		break;
-	case GL_TRANSFORM_FEEDBACK_BINDING:
-		{
-			TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
-			if(transformFeedback)
-			{
-				*params = transformFeedback->name;
-			}
-			else
-			{
-				return false;
-			}
-		}
-		break;
-	case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
-		{
-			TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
-			if(transformFeedback)
-			{
-				*params = transformFeedback->getGenericBufferName();
-			}
-			else
-			{
-				return false;
-			}
-		}
-		break;
+		return true;
 	default:
-		return false;
+		break;
 	}
 
-	return true;
+	if(clientVersion >= 3)
+	{
+		switch(pname)
+		{
+		case GL_TEXTURE_BINDING_2D_ARRAY:
+			if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
+			{
+				error(GL_INVALID_OPERATION);
+				return false;
+			}
+
+			*params = mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler].name();
+			return true;
+		case GL_COPY_READ_BUFFER_BINDING:
+			*params = mState.copyReadBuffer.name();
+			return true;
+		case GL_COPY_WRITE_BUFFER_BINDING:
+			*params = mState.copyWriteBuffer.name();
+			return true;
+		case GL_MAJOR_VERSION:
+			*params = clientVersion;
+			return true;
+		case GL_MAX_3D_TEXTURE_SIZE:
+			*params = IMPLEMENTATION_MAX_TEXTURE_SIZE;
+			return true;
+		case GL_MAX_ARRAY_TEXTURE_LAYERS:
+			*params = IMPLEMENTATION_MAX_TEXTURE_SIZE;
+			return true;
+		case GL_MAX_COLOR_ATTACHMENTS: // Note: not supported in OES_framebuffer_object
+			*params = MAX_COLOR_ATTACHMENTS;
+			return true;
+		case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
+			*params = MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;
+			return true;
+		case GL_MAX_COMBINED_UNIFORM_BLOCKS:
+			*params = MAX_VERTEX_UNIFORM_BLOCKS + MAX_FRAGMENT_UNIFORM_BLOCKS;
+			return true;
+		case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
+			*params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;
+			return true;
+		case GL_MAX_ELEMENT_INDEX:
+			*params = MAX_ELEMENT_INDEX;
+			return true;
+		case GL_MAX_ELEMENTS_INDICES:
+			*params = MAX_ELEMENTS_INDICES;
+			return true;
+		case GL_MAX_ELEMENTS_VERTICES:
+			*params = MAX_ELEMENTS_VERTICES;
+			return true;
+		case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
+			*params = MAX_FRAGMENT_INPUT_VECTORS * 4;
+			return true;
+		case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
+			*params = MAX_FRAGMENT_UNIFORM_BLOCKS;
+			return true;
+		case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
+			*params = MAX_FRAGMENT_UNIFORM_COMPONENTS;
+			return true;
+		case GL_MAX_PROGRAM_TEXEL_OFFSET:
+			UNIMPLEMENTED();
+			*params = MAX_PROGRAM_TEXEL_OFFSET;
+			return true;
+		case GL_MAX_SERVER_WAIT_TIMEOUT:
+			UNIMPLEMENTED();
+			*params = 0;
+			return true;
+		case GL_MAX_TEXTURE_LOD_BIAS:
+			UNIMPLEMENTED();
+			*params = 2;
+			return true;
+		case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
+			*params = sw::MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS;
+			return true;
+		case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
+			*params = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;
+			return true;
+		case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
+			*params = sw::MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;
+			return true;
+		case GL_MAX_UNIFORM_BLOCK_SIZE:
+			*params = MAX_UNIFORM_BLOCK_SIZE;
+			return true;
+		case GL_MAX_UNIFORM_BUFFER_BINDINGS:
+			*params = MAX_UNIFORM_BUFFER_BINDINGS;
+			return true;
+		case GL_MAX_VARYING_COMPONENTS:
+			UNIMPLEMENTED();
+			// FIXME: should be MAX_VARYING_VECTORS * 4, but MAX_VARYING_VECTORS
+			// must be increased (see MAX_VERTEX_OUTPUTS and MAX_FRAGMENT_INPUTS)
+			*params = 60;
+			return true;
+		case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
+			*params = MAX_VERTEX_OUTPUT_VECTORS * 4;
+			return true;
+		case GL_MAX_VERTEX_UNIFORM_BLOCKS:
+			*params = MAX_VERTEX_UNIFORM_BLOCKS;
+			return true;
+		case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
+			*params = MAX_VERTEX_UNIFORM_COMPONENTS;
+			return true;
+		case GL_MIN_PROGRAM_TEXEL_OFFSET:
+			UNIMPLEMENTED();
+			*params = MIN_PROGRAM_TEXEL_OFFSET;
+			return true;
+		case GL_MINOR_VERSION:
+			*params = 0;
+			return true;
+		case GL_NUM_EXTENSIONS:
+			GLuint numExtensions;
+			getExtensions(0, &numExtensions);
+			*params = numExtensions;
+			return true;
+		case GL_NUM_PROGRAM_BINARY_FORMATS:
+			*params = NUM_PROGRAM_BINARY_FORMATS;
+			return true;
+		case GL_PACK_ROW_LENGTH:
+			*params = mState.packRowLength;
+			return true;
+		case GL_PACK_SKIP_PIXELS:
+			*params = mState.packSkipPixels;
+			return true;
+		case GL_PACK_SKIP_ROWS:
+			*params = mState.packSkipRows;
+			return true;
+		case GL_PIXEL_PACK_BUFFER_BINDING:
+			*params = mState.pixelPackBuffer.name();
+			return true;
+		case GL_PIXEL_UNPACK_BUFFER_BINDING:
+			*params = mState.pixelUnpackBuffer.name();
+			return true;
+		case GL_PROGRAM_BINARY_FORMATS:
+			// Since NUM_PROGRAM_BINARY_FORMATS is 0, the input
+			// should be a 0 sized array, so don't write to params
+			return true;
+		case GL_READ_BUFFER:
+			*params = getReadFramebuffer()->getReadBuffer();
+			return true;
+		case GL_SAMPLER_BINDING:
+			*params = mState.sampler[mState.activeSampler].name();
+			return true;
+		case GL_UNIFORM_BUFFER_BINDING:
+			*params = mState.genericUniformBuffer.name();
+			return true;
+		case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
+			*params = UNIFORM_BUFFER_OFFSET_ALIGNMENT;
+			return true;
+		case GL_UNIFORM_BUFFER_SIZE:
+			*params = static_cast<T>(mState.genericUniformBuffer->size());
+			return true;
+		case GL_UNIFORM_BUFFER_START:
+			*params = static_cast<T>(mState.genericUniformBuffer->offset());
+			return true;
+		case GL_UNPACK_IMAGE_HEIGHT:
+			*params = mState.unpackInfo.imageHeight;
+			return true;
+		case GL_UNPACK_ROW_LENGTH:
+			*params = mState.unpackInfo.rowLength;
+			return true;
+		case GL_UNPACK_SKIP_IMAGES:
+			*params = mState.unpackInfo.skipImages;
+			return true;
+		case GL_UNPACK_SKIP_PIXELS:
+			*params = mState.unpackInfo.skipPixels;
+			return true;
+		case GL_UNPACK_SKIP_ROWS:
+			*params = mState.unpackInfo.skipRows;
+			return true;
+		case GL_VERTEX_ARRAY_BINDING:
+			*params = getCurrentVertexArray()->name;
+			return true;
+		case GL_TRANSFORM_FEEDBACK_BINDING:
+			{
+				TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
+				if(transformFeedback)
+				{
+					*params = transformFeedback->name;
+				}
+				else
+				{
+					return false;
+				}
+			}
+			return true;
+		case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
+			{
+				TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
+				if(transformFeedback)
+				{
+					*params = transformFeedback->getGenericBufferName();
+				}
+				else
+				{
+					return false;
+				}
+			}
+			return true;
+		default:
+			break;
+		}
+	}
+
+	return false;
 }
 
 template bool Context::getTransformFeedbackiv<GLint>(GLuint index, GLenum pname, GLint *param) const;