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;