OSDN Git Service

Fixed glGetIntegerv for OpenGL ES 2
authorAlexis Hetu <sugoi@google.com>
Fri, 17 Feb 2017 19:40:50 +0000 (14:40 -0500)
committerAlexis Hétu <sugoi@google.com>
Fri, 17 Feb 2017 20:24:39 +0000 (20:24 +0000)
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>
src/OpenGL/libGLESv2/Context.cpp

index 1239a70..27d608b 100644 (file)
@@ -1851,55 +1851,55 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        // 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 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                                *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 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                                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 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                        {
                                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 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                                *params = 0;
                        }
                }
-               break;
+               return true;
        case GL_DEPTH_BITS:
                {
                        Framebuffer *framebuffer = getDrawFramebuffer();
@@ -2010,7 +2010,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                                *params = 0;
                        }
                }
-               break;
+               return true;
        case GL_STENCIL_BITS:
                {
                        Framebuffer *framebuffer = getDrawFramebuffer();
@@ -2025,7 +2025,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                                *params = 0;
                        }
                }
-               break;
+               return true;
        case GL_TEXTURE_BINDING_2D:
                if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
                {
@@ -2034,7 +2034,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                }
 
                *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 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                }
 
                *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 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                }
 
                *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 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
                }
 
                *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 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
        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;
+               return true;
+       default:
                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)
+       }
+
+       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;
-               }
-               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)
-               {
+                       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();
-               }
-               else
-               {
-                       return false;
-               }
-               break;
-       case GL_PIXEL_UNPACK_BUFFER_BINDING:
-               if(clientVersion >= 3)
-               {
+                       return true;
+               case GL_PIXEL_UNPACK_BUFFER_BINDING:
                        *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)
-               {
+                       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();
-               }
-               else
-               {
-                       return false;
-               }
-               break;
-       case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
-               *params = UNIFORM_BUFFER_OFFSET_ALIGNMENT;
-               break;
-       case GL_UNIFORM_BUFFER_SIZE:
-               if(clientVersion >= 3)
-               {
+                       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());
-               }
-               else
-               {
-                       return false;
-               }
-               break;
-       case GL_UNIFORM_BUFFER_START:
-               if(clientVersion >= 3)
-               {
+                       return true;
+               case GL_UNIFORM_BUFFER_START:
                        *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)
+                       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:
                        {
-                               *params = transformFeedback->getGenericBufferName();
+                               TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
+                               if(transformFeedback)
+                               {
+                                       *params = transformFeedback->name;
+                               }
+                               else
+                               {
+                                       return false;
+                               }
                        }
-                       else
+                       return true;
+               case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
                        {
-                               return false;
+                               TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
+                               if(transformFeedback)
+                               {
+                                       *params = transformFeedback->getGenericBufferName();
+                               }
+                               else
+                               {
+                                       return false;
+                               }
                        }
+                       return true;
+               default:
+                       break;
                }
-               break;
-       default:
-               return false;
        }
 
-       return true;
+       return false;
 }
 
 template bool Context::getTransformFeedbackiv<GLint>(GLuint index, GLenum pname, GLint *param) const;