in gfx/angle/checkout/src/libANGLE/queryutils.cpp [3084:4014]
bool GetQueryParameterInfo(const State &glState,
GLenum pname,
GLenum *type,
unsigned int *numParams)
{
const Caps &caps = glState.getCaps();
const Extensions &extensions = glState.getExtensions();
GLint clientMajorVersion = glState.getClientMajorVersion();
EGLenum clientType = glState.getClientType();
// Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
// is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
// to the fact that it is stored internally as a float, and so would require conversion
// if returned from Context::getIntegerv. Since this conversion is already implemented
// in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
// place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
// application.
switch (pname)
{
case GL_COMPRESSED_TEXTURE_FORMATS:
{
*type = GL_INT;
*numParams = static_cast<unsigned int>(caps.compressedTextureFormats.size());
return true;
}
case GL_SHADER_BINARY_FORMATS:
{
*type = GL_INT;
*numParams = static_cast<unsigned int>(caps.shaderBinaryFormats.size());
return true;
}
case GL_MAX_VERTEX_ATTRIBS:
case GL_MAX_VERTEX_UNIFORM_VECTORS:
case GL_MAX_VARYING_VECTORS:
case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
case GL_MAX_TEXTURE_IMAGE_UNITS:
case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
case GL_MAX_RENDERBUFFER_SIZE:
case GL_NUM_SHADER_BINARY_FORMATS:
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
case GL_ARRAY_BUFFER_BINDING:
case GL_FRAMEBUFFER_BINDING: // GL_FRAMEBUFFER_BINDING now equivalent to
// GL_DRAW_FRAMEBUFFER_BINDING
case GL_RENDERBUFFER_BINDING:
case GL_CURRENT_PROGRAM:
case GL_PACK_ALIGNMENT:
case GL_UNPACK_ALIGNMENT:
case GL_GENERATE_MIPMAP_HINT:
case GL_TEXTURE_FILTERING_HINT_CHROMIUM:
case GL_RED_BITS:
case GL_GREEN_BITS:
case GL_BLUE_BITS:
case GL_ALPHA_BITS:
case GL_DEPTH_BITS:
case GL_STENCIL_BITS:
case GL_ELEMENT_ARRAY_BUFFER_BINDING:
case GL_CULL_FACE_MODE:
case GL_FRONT_FACE:
case GL_ACTIVE_TEXTURE:
case GL_STENCIL_FUNC:
case GL_STENCIL_VALUE_MASK:
case GL_STENCIL_REF:
case GL_STENCIL_FAIL:
case GL_STENCIL_PASS_DEPTH_FAIL:
case GL_STENCIL_PASS_DEPTH_PASS:
case GL_STENCIL_BACK_FUNC:
case GL_STENCIL_BACK_VALUE_MASK:
case GL_STENCIL_BACK_REF:
case GL_STENCIL_BACK_FAIL:
case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
case GL_STENCIL_BACK_PASS_DEPTH_PASS:
case GL_DEPTH_FUNC:
case GL_BLEND_SRC_RGB:
case GL_BLEND_SRC_ALPHA:
case GL_BLEND_DST_RGB:
case GL_BLEND_DST_ALPHA:
case GL_BLEND_EQUATION_RGB:
case GL_BLEND_EQUATION_ALPHA:
case GL_STENCIL_WRITEMASK:
case GL_STENCIL_BACK_WRITEMASK:
case GL_STENCIL_CLEAR_VALUE:
case GL_SUBPIXEL_BITS:
case GL_MAX_TEXTURE_SIZE:
case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
case GL_SAMPLE_BUFFERS:
case GL_SAMPLES:
case GL_IMPLEMENTATION_COLOR_READ_TYPE:
case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
case GL_TEXTURE_BINDING_2D:
case GL_TEXTURE_BINDING_CUBE_MAP:
case GL_RESET_NOTIFICATION_STRATEGY_EXT:
{
*type = GL_INT;
*numParams = 1;
return true;
}
case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
{
if (!extensions.packReverseRowOrderANGLE)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
}
case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
{
if (!extensions.textureRectangleANGLE)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
}
case GL_MAX_DRAW_BUFFERS_EXT:
case GL_MAX_COLOR_ATTACHMENTS_EXT:
{
if ((clientMajorVersion < 3) && !extensions.drawBuffersEXT)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
}
case GL_MAX_VIEWPORT_DIMS:
{
*type = GL_INT;
*numParams = 2;
return true;
}
case GL_VIEWPORT:
case GL_SCISSOR_BOX:
{
*type = GL_INT;
*numParams = 4;
return true;
}
case GL_SHADER_COMPILER:
case GL_SAMPLE_COVERAGE_INVERT:
case GL_DEPTH_WRITEMASK:
case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
// bool-natural
case GL_SAMPLE_COVERAGE:
case GL_SCISSOR_TEST:
case GL_STENCIL_TEST:
case GL_DEPTH_TEST:
case GL_BLEND:
case GL_DITHER:
case GL_CONTEXT_ROBUST_ACCESS_EXT:
{
*type = GL_BOOL;
*numParams = 1;
return true;
}
case GL_COLOR_LOGIC_OP:
{
if (!extensions.logicOpANGLE)
{
return false;
}
*type = GL_BOOL;
*numParams = 1;
return true;
}
case GL_COLOR_WRITEMASK:
{
*type = GL_BOOL;
*numParams = 4;
return true;
}
case GL_POLYGON_OFFSET_FACTOR:
case GL_POLYGON_OFFSET_UNITS:
case GL_SAMPLE_COVERAGE_VALUE:
case GL_DEPTH_CLEAR_VALUE:
case GL_LINE_WIDTH:
{
*type = GL_FLOAT;
*numParams = 1;
return true;
}
case GL_ALIASED_LINE_WIDTH_RANGE:
case GL_ALIASED_POINT_SIZE_RANGE:
case GL_DEPTH_RANGE:
{
*type = GL_FLOAT;
*numParams = 2;
return true;
}
case GL_COLOR_CLEAR_VALUE:
case GL_BLEND_COLOR:
{
*type = GL_FLOAT;
*numParams = 4;
return true;
}
case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
if (!extensions.textureFilterAnisotropicEXT)
{
return false;
}
*type = GL_FLOAT;
*numParams = 1;
return true;
case GL_TIMESTAMP_EXT:
if (!extensions.disjointTimerQueryEXT)
{
return false;
}
*type = GL_INT_64_ANGLEX;
*numParams = 1;
return true;
case GL_GPU_DISJOINT_EXT:
if (!extensions.disjointTimerQueryEXT)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_COVERAGE_MODULATION_CHROMIUM:
if (!extensions.framebufferMixedSamplesCHROMIUM)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_TEXTURE_BINDING_EXTERNAL_OES:
if (!extensions.EGLStreamConsumerExternalNV && !extensions.EGLImageExternalOES)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_MAX_CLIP_DISTANCES_EXT: // case GL_MAX_CLIP_PLANES
if (clientMajorVersion < 2)
{
break;
}
if (!extensions.clipDistanceAPPLE && !extensions.clipCullDistanceEXT)
{
// NOTE(hqle): if client version is 1. GL_MAX_CLIP_DISTANCES_EXT is equal
// to GL_MAX_CLIP_PLANES which is a valid enum.
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_MAX_CULL_DISTANCES_EXT:
case GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT:
if (!extensions.clipCullDistanceEXT)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_CLIP_ORIGIN_EXT:
case GL_CLIP_DEPTH_MODE_EXT:
if (!extensions.clipControlEXT)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_PRIMITIVE_BOUNDING_BOX:
if (!extensions.primitiveBoundingBoxAny())
{
return false;
}
*type = GL_FLOAT;
*numParams = 8;
return true;
case GL_SHADING_RATE_QCOM:
if (!extensions.shadingRateQCOM)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
}
if (clientType == EGL_OPENGL_API ||
(clientType == EGL_OPENGL_ES_API && glState.getClientVersion() >= Version(3, 2)))
{
switch (pname)
{
case GL_CONTEXT_FLAGS:
{
*type = GL_INT;
*numParams = 1;
return true;
}
}
}
if (clientType == EGL_OPENGL_API)
{
switch (pname)
{
case GL_CONTEXT_PROFILE_MASK:
{
*type = GL_INT;
*numParams = 1;
return true;
}
}
}
if (extensions.debugKHR)
{
switch (pname)
{
case GL_DEBUG_LOGGED_MESSAGES:
case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
case GL_DEBUG_GROUP_STACK_DEPTH:
case GL_MAX_DEBUG_MESSAGE_LENGTH:
case GL_MAX_DEBUG_LOGGED_MESSAGES:
case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
case GL_MAX_LABEL_LENGTH:
*type = GL_INT;
*numParams = 1;
return true;
case GL_DEBUG_OUTPUT_SYNCHRONOUS:
case GL_DEBUG_OUTPUT:
*type = GL_BOOL;
*numParams = 1;
return true;
}
}
if (extensions.multisampleCompatibilityEXT)
{
switch (pname)
{
case GL_MULTISAMPLE_EXT:
case GL_SAMPLE_ALPHA_TO_ONE_EXT:
*type = GL_BOOL;
*numParams = 1;
return true;
}
}
if (extensions.bindGeneratesResourceCHROMIUM)
{
switch (pname)
{
case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
*type = GL_BOOL;
*numParams = 1;
return true;
}
}
if (extensions.clientArraysANGLE)
{
switch (pname)
{
case GL_CLIENT_ARRAYS_ANGLE:
*type = GL_BOOL;
*numParams = 1;
return true;
}
}
if (extensions.sRGBWriteControlEXT)
{
switch (pname)
{
case GL_FRAMEBUFFER_SRGB_EXT:
*type = GL_BOOL;
*numParams = 1;
return true;
}
}
if (extensions.robustResourceInitializationANGLE &&
pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
{
*type = GL_BOOL;
*numParams = 1;
return true;
}
if (extensions.programCacheControlANGLE && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
{
*type = GL_BOOL;
*numParams = 1;
return true;
}
if (extensions.parallelShaderCompileKHR && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
{
*type = GL_INT;
*numParams = 1;
return true;
}
if (extensions.blendFuncExtendedEXT && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
{
*type = GL_INT;
*numParams = 1;
return true;
}
if (extensions.robustFragmentShaderOutputANGLE &&
pname == GL_ROBUST_FRAGMENT_SHADER_OUTPUT_ANGLE)
{
*type = GL_BOOL;
*numParams = 1;
return true;
}
// Check for ES3.0+ parameter names which are also exposed as ES2 extensions
switch (pname)
{
// GL_DRAW_FRAMEBUFFER_BINDING equivalent to GL_FRAMEBUFFER_BINDING
case GL_READ_FRAMEBUFFER_BINDING:
if ((clientMajorVersion < 3) && !extensions.framebufferBlitAny())
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
if ((clientMajorVersion < 3) && !extensions.getProgramBinaryOES)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_PROGRAM_BINARY_FORMATS_OES:
if ((clientMajorVersion < 3) && !extensions.getProgramBinaryOES)
{
return false;
}
*type = GL_INT;
*numParams = static_cast<unsigned int>(caps.programBinaryFormats.size());
return true;
case GL_PACK_ROW_LENGTH:
case GL_PACK_SKIP_ROWS:
case GL_PACK_SKIP_PIXELS:
if ((clientMajorVersion < 3) && !extensions.packSubimageNV)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_UNPACK_ROW_LENGTH:
case GL_UNPACK_SKIP_ROWS:
case GL_UNPACK_SKIP_PIXELS:
if ((clientMajorVersion < 3) && !extensions.unpackSubimageEXT)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_VERTEX_ARRAY_BINDING:
if ((clientMajorVersion < 3) && !extensions.vertexArrayObjectOES)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_PIXEL_PACK_BUFFER_BINDING:
case GL_PIXEL_UNPACK_BUFFER_BINDING:
if ((clientMajorVersion < 3) && !extensions.pixelBufferObjectNV)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_MAX_SAMPLES:
{
static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
"GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
if ((clientMajorVersion < 3) && !(extensions.framebufferMultisampleANGLE ||
extensions.multisampledRenderToTextureEXT))
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
if ((clientMajorVersion < 3) && !extensions.standardDerivativesOES)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
}
case GL_TEXTURE_BINDING_3D:
if ((clientMajorVersion < 3) && !extensions.texture3DOES)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_MAX_3D_TEXTURE_SIZE:
if ((clientMajorVersion < 3) && !extensions.texture3DOES)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
}
if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
{
if ((glState.getClientVersion() < Version(3, 0)) && !extensions.drawBuffersEXT)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
}
if ((extensions.multiview2OVR || extensions.multiviewOVR) && pname == GL_MAX_VIEWS_OVR)
{
*type = GL_INT;
*numParams = 1;
return true;
}
if (extensions.provokingVertexANGLE && pname == GL_PROVOKING_VERTEX)
{
*type = GL_INT;
*numParams = 1;
return true;
}
if (glState.getClientVersion() < Version(2, 0))
{
switch (pname)
{
case GL_ALPHA_TEST_FUNC:
case GL_CLIENT_ACTIVE_TEXTURE:
case GL_MATRIX_MODE:
case GL_MAX_TEXTURE_UNITS:
case GL_MAX_MODELVIEW_STACK_DEPTH:
case GL_MAX_PROJECTION_STACK_DEPTH:
case GL_MAX_TEXTURE_STACK_DEPTH:
case GL_MAX_LIGHTS:
case GL_MAX_CLIP_PLANES:
case GL_VERTEX_ARRAY_STRIDE:
case GL_NORMAL_ARRAY_STRIDE:
case GL_COLOR_ARRAY_STRIDE:
case GL_TEXTURE_COORD_ARRAY_STRIDE:
case GL_VERTEX_ARRAY_SIZE:
case GL_COLOR_ARRAY_SIZE:
case GL_TEXTURE_COORD_ARRAY_SIZE:
case GL_VERTEX_ARRAY_TYPE:
case GL_NORMAL_ARRAY_TYPE:
case GL_COLOR_ARRAY_TYPE:
case GL_TEXTURE_COORD_ARRAY_TYPE:
case GL_VERTEX_ARRAY_BUFFER_BINDING:
case GL_NORMAL_ARRAY_BUFFER_BINDING:
case GL_COLOR_ARRAY_BUFFER_BINDING:
case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
case GL_POINT_SIZE_ARRAY_STRIDE_OES:
case GL_POINT_SIZE_ARRAY_TYPE_OES:
case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
case GL_SHADE_MODEL:
case GL_MODELVIEW_STACK_DEPTH:
case GL_PROJECTION_STACK_DEPTH:
case GL_TEXTURE_STACK_DEPTH:
case GL_LOGIC_OP_MODE:
case GL_BLEND_SRC:
case GL_BLEND_DST:
case GL_PERSPECTIVE_CORRECTION_HINT:
case GL_POINT_SMOOTH_HINT:
case GL_LINE_SMOOTH_HINT:
case GL_FOG_HINT:
*type = GL_INT;
*numParams = 1;
return true;
case GL_ALPHA_TEST_REF:
case GL_FOG_DENSITY:
case GL_FOG_START:
case GL_FOG_END:
case GL_FOG_MODE:
case GL_POINT_SIZE:
case GL_POINT_SIZE_MIN:
case GL_POINT_SIZE_MAX:
case GL_POINT_FADE_THRESHOLD_SIZE:
*type = GL_FLOAT;
*numParams = 1;
return true;
case GL_SMOOTH_POINT_SIZE_RANGE:
case GL_SMOOTH_LINE_WIDTH_RANGE:
*type = GL_FLOAT;
*numParams = 2;
return true;
case GL_CURRENT_COLOR:
case GL_CURRENT_TEXTURE_COORDS:
case GL_LIGHT_MODEL_AMBIENT:
case GL_FOG_COLOR:
*type = GL_FLOAT;
*numParams = 4;
return true;
case GL_CURRENT_NORMAL:
case GL_POINT_DISTANCE_ATTENUATION:
*type = GL_FLOAT;
*numParams = 3;
return true;
case GL_MODELVIEW_MATRIX:
case GL_PROJECTION_MATRIX:
case GL_TEXTURE_MATRIX:
*type = GL_FLOAT;
*numParams = 16;
return true;
case GL_LIGHT_MODEL_TWO_SIDE:
*type = GL_BOOL;
*numParams = 1;
return true;
}
}
if (glState.getClientVersion() < Version(3, 0))
{
return false;
}
// Check for ES3.0+ parameter names
switch (pname)
{
case GL_MAX_UNIFORM_BUFFER_BINDINGS:
case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
case GL_UNIFORM_BUFFER_BINDING:
case GL_TRANSFORM_FEEDBACK_BINDING:
case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
case GL_COPY_READ_BUFFER_BINDING:
case GL_COPY_WRITE_BUFFER_BINDING:
case GL_SAMPLER_BINDING:
case GL_READ_BUFFER:
case GL_TEXTURE_BINDING_3D:
case GL_TEXTURE_BINDING_2D_ARRAY:
case GL_MAX_ARRAY_TEXTURE_LAYERS:
case GL_MAX_VERTEX_UNIFORM_BLOCKS:
case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
case GL_MAX_COMBINED_UNIFORM_BLOCKS:
case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
case GL_MAX_VARYING_COMPONENTS:
case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
case GL_MIN_PROGRAM_TEXEL_OFFSET:
case GL_MAX_PROGRAM_TEXEL_OFFSET:
case GL_NUM_EXTENSIONS:
case GL_MAJOR_VERSION:
case GL_MINOR_VERSION:
case GL_MAX_ELEMENTS_INDICES:
case GL_MAX_ELEMENTS_VERTICES:
case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
case GL_UNPACK_IMAGE_HEIGHT:
case GL_UNPACK_SKIP_IMAGES:
case GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES:
{
*type = GL_INT;
*numParams = 1;
return true;
}
case GL_MAX_ELEMENT_INDEX:
case GL_MAX_UNIFORM_BLOCK_SIZE:
case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
case GL_MAX_SERVER_WAIT_TIMEOUT:
{
*type = GL_INT_64_ANGLEX;
*numParams = 1;
return true;
}
case GL_TRANSFORM_FEEDBACK_ACTIVE:
case GL_TRANSFORM_FEEDBACK_PAUSED:
case GL_PRIMITIVE_RESTART_FIXED_INDEX:
case GL_RASTERIZER_DISCARD:
{
*type = GL_BOOL;
*numParams = 1;
return true;
}
case GL_MAX_TEXTURE_LOD_BIAS:
case GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES:
case GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES:
{
*type = GL_FLOAT;
*numParams = 1;
return true;
}
}
if (extensions.requestExtensionANGLE)
{
switch (pname)
{
case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
*type = GL_INT;
*numParams = 1;
return true;
}
}
if (extensions.textureMultisampleANGLE)
{
switch (pname)
{
case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
case GL_MAX_INTEGER_SAMPLES_ANGLE:
case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
case GL_MAX_SAMPLE_MASK_WORDS:
*type = GL_INT;
*numParams = 1;
return true;
}
}
if (extensions.textureCubeMapArrayAny())
{
switch (pname)
{
case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
*type = GL_INT;
*numParams = 1;
return true;
}
}
if (extensions.textureBufferAny())
{
switch (pname)
{
case GL_TEXTURE_BUFFER_BINDING:
case GL_TEXTURE_BINDING_BUFFER:
case GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
case GL_MAX_TEXTURE_BUFFER_SIZE:
*type = GL_INT;
*numParams = 1;
return true;
}
}
if (extensions.shaderPixelLocalStorageANGLE)
{
switch (pname)
{
case GL_MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE:
case GL_MAX_COLOR_ATTACHMENTS_WITH_ACTIVE_PIXEL_LOCAL_STORAGE_ANGLE:
case GL_MAX_COMBINED_DRAW_BUFFERS_AND_PIXEL_LOCAL_STORAGE_PLANES_ANGLE:
*type = GL_INT;
*numParams = 1;
return true;
case GL_PIXEL_LOCAL_STORAGE_ACTIVE_ANGLE:
*type = GL_BOOL;
*numParams = 1;
return true;
}
}
if (glState.getClientVersion() < Version(3, 1))
{
return false;
}
// Check for ES3.1+ parameter names
switch (pname)
{
case GL_ATOMIC_COUNTER_BUFFER_BINDING:
case GL_DRAW_INDIRECT_BUFFER_BINDING:
case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
case GL_MAX_FRAMEBUFFER_WIDTH:
case GL_MAX_FRAMEBUFFER_HEIGHT:
case GL_MAX_FRAMEBUFFER_SAMPLES:
case GL_MAX_SAMPLE_MASK_WORDS:
case GL_MAX_COLOR_TEXTURE_SAMPLES:
case GL_MAX_DEPTH_TEXTURE_SAMPLES:
case GL_MAX_INTEGER_SAMPLES:
case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
case GL_MAX_VERTEX_ATTRIB_BINDINGS:
case GL_MAX_VERTEX_ATTRIB_STRIDE:
case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
case GL_MAX_VERTEX_ATOMIC_COUNTERS:
case GL_MAX_VERTEX_IMAGE_UNIFORMS:
case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
case GL_MAX_UNIFORM_LOCATIONS:
case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
case GL_MAX_COMBINED_ATOMIC_COUNTERS:
case GL_MAX_IMAGE_UNITS:
case GL_MAX_COMBINED_IMAGE_UNIFORMS:
case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
case GL_SHADER_STORAGE_BUFFER_BINDING:
case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
case GL_PROGRAM_PIPELINE_BINDING:
*type = GL_INT;
*numParams = 1;
return true;
case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
*type = GL_INT_64_ANGLEX;
*numParams = 1;
return true;
case GL_SAMPLE_MASK:
case GL_SAMPLE_SHADING:
*type = GL_BOOL;
*numParams = 1;
return true;
case GL_MIN_SAMPLE_SHADING_VALUE:
*type = GL_FLOAT;
*numParams = 1;
return true;
}
if (extensions.geometryShaderAny())
{
switch (pname)
{
case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
case GL_LAYER_PROVOKING_VERTEX_EXT:
case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
*type = GL_INT;
*numParams = 1;
return true;
}
}
if (extensions.tessellationShaderEXT)
{
switch (pname)
{
case GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED:
*type = GL_BOOL;
*numParams = 1;
return true;
case GL_PATCH_VERTICES:
case GL_MAX_PATCH_VERTICES_EXT:
case GL_MAX_TESS_GEN_LEVEL_EXT:
case GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT:
case GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT:
case GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT:
case GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT:
case GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT:
case GL_MAX_TESS_PATCH_COMPONENTS_EXT:
case GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT:
case GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT:
case GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT:
case GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT:
case GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT:
case GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT:
case GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT:
case GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT:
case GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT:
case GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT:
case GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT:
case GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT:
case GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT:
case GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT:
case GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT:
case GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT:
*type = GL_INT;
*numParams = 1;
return true;
}
}
return false;
}