// // Copyright 2016 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. //
// queryutils.cpp: Utilities for querying values from GL objects
switch (pname)
{ case GL_TEXTURE_RED_TYPE:
*params = CastFromGLintStateValue<ParamType>(
pname, info->redBits ? info->componentType : GL_NONE); break; case GL_TEXTURE_GREEN_TYPE:
*params = CastFromGLintStateValue<ParamType>(
pname, info->greenBits ? info->componentType : GL_NONE); break; case GL_TEXTURE_BLUE_TYPE:
*params = CastFromGLintStateValue<ParamType>(
pname, info->blueBits ? info->componentType : GL_NONE); break; case GL_TEXTURE_ALPHA_TYPE:
*params = CastFromGLintStateValue<ParamType>(
pname, info->alphaBits ? info->componentType : GL_NONE); break; case GL_TEXTURE_DEPTH_TYPE:
*params = CastFromGLintStateValue<ParamType>(
pname, info->depthBits ? info->componentType : GL_NONE); break; case GL_TEXTURE_RED_SIZE:
*params = CastFromGLintStateValue<ParamType>(pname, info->redBits); break; case GL_TEXTURE_GREEN_SIZE:
*params = CastFromGLintStateValue<ParamType>(pname, info->greenBits); break; case GL_TEXTURE_BLUE_SIZE:
*params = CastFromGLintStateValue<ParamType>(pname, info->blueBits); break; case GL_TEXTURE_ALPHA_SIZE:
*params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits); break; case GL_TEXTURE_DEPTH_SIZE:
*params = CastFromGLintStateValue<ParamType>(pname, info->depthBits); break; case GL_TEXTURE_STENCIL_SIZE:
*params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits); break; case GL_TEXTURE_SHARED_SIZE:
*params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits); break; case GL_TEXTURE_INTERNAL_FORMAT:
*params = CastFromGLintStateValue<ParamType>(
pname, info->internalFormat ? info->internalFormat : GL_RGBA); break; case GL_TEXTURE_WIDTH:
*params = CastFromGLintStateValue<ParamType>(
pname, static_cast<uint32_t>(texture->getWidth(target, level))); break; case GL_TEXTURE_HEIGHT:
*params = CastFromGLintStateValue<ParamType>(
pname, static_cast<uint32_t>(texture->getHeight(target, level))); break; case GL_TEXTURE_DEPTH:
*params = CastFromGLintStateValue<ParamType>(
pname, static_cast<uint32_t>(texture->getDepth(target, level))); break; case GL_TEXTURE_SAMPLES:
*params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level)); break; case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
*params = CastFromStateValue<ParamType>(
pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level))); break; case GL_TEXTURE_COMPRESSED:
*params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed)); break; case GL_MEMORY_SIZE_ANGLE:
*params =
CastFromStateValue<ParamType>(pname, texture->getLevelMemorySize(target, level)); break; case GL_RESOURCE_INITIALIZED_ANGLE:
*params = CastFromGLintStateValue<ParamType>(
pname, texture->initState(GL_NONE, ImageIndex::MakeFromTarget(target, level)) ==
InitState::Initialized); break; case GL_TEXTURE_BUFFER_DATA_STORE_BINDING:
*params = CastFromStateValue<ParamType>(
pname, static_cast<GLint>(texture->getBuffer().id().value)); break; case GL_TEXTURE_BUFFER_OFFSET:
*params = CastFromStateValue<ParamType>(
pname, static_cast<GLint>(texture->getBuffer().getOffset())); break; case GL_TEXTURE_BUFFER_SIZE:
*params = CastFromStateValue<ParamType>(
pname, static_cast<GLint>(GetBoundBufferAvailableSize(texture->getBuffer()))); break; default:
UNREACHABLE(); break;
}
}
// This function is needed to handle fixed_point data. // It can be used when some pname need special conversion from int/float/bool to fixed_point. template <bool isGLfixed, typename QueryT, typename ParamType>
QueryT CastFromSpecialValue(GLenum pname, const ParamType param)
{ if (isGLfixed)
{ returnstatic_cast<QueryT>(ConvertFloatToFixed(CastFromStateValue<GLfloat>(pname, param)));
} else
{ return CastFromStateValue<QueryT>(pname, param);
}
}
switch (pname)
{ case GL_TEXTURE_MAG_FILTER:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter()); break; case GL_TEXTURE_MIN_FILTER:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter()); break; case GL_TEXTURE_WRAP_S:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS()); break; case GL_TEXTURE_WRAP_T:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT()); break; case GL_TEXTURE_WRAP_R:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR()); break; case GL_TEXTURE_IMMUTABLE_FORMAT:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat()); break; case GL_TEXTURE_IMMUTABLE_LEVELS:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels()); break; case GL_TEXTURE_USAGE_ANGLE:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage()); break; case GL_TEXTURE_MAX_ANISOTROPY_EXT:
*params =
CastFromSpecialValue<isGLfixed, ParamType>(pname, texture->getMaxAnisotropy()); break; case GL_TEXTURE_SWIZZLE_R:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed()); break; case GL_TEXTURE_SWIZZLE_G:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen()); break; case GL_TEXTURE_SWIZZLE_B:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue()); break; case GL_TEXTURE_SWIZZLE_A:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha()); break; case GL_TEXTURE_BASE_LEVEL:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel()); break; case GL_TEXTURE_MAX_LEVEL:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel()); break; case GL_TEXTURE_MIN_LOD:
*params = CastFromSpecialValue<isGLfixed, ParamType>(pname, texture->getMinLod()); break; case GL_TEXTURE_MAX_LOD:
*params = CastFromSpecialValue<isGLfixed, ParamType>(pname, texture->getMaxLod()); break; case GL_TEXTURE_COMPARE_MODE:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode()); break; case GL_TEXTURE_COMPARE_FUNC:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc()); break; case GL_TEXTURE_SRGB_DECODE_EXT:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode()); break; case GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBOverride()); break; case GL_DEPTH_STENCIL_TEXTURE_MODE:
*params =
CastFromGLintStateValue<ParamType>(pname, texture->getDepthStencilTextureMode()); break; case GL_TEXTURE_CROP_RECT_OES:
{ const gl::Rectangle &crop = texture->getCrop();
params[0] = CastFromSpecialValue<isGLfixed, ParamType>(pname, crop.x);
params[1] = CastFromSpecialValue<isGLfixed, ParamType>(pname, crop.y);
params[2] = CastFromSpecialValue<isGLfixed, ParamType>(pname, crop.width);
params[3] = CastFromSpecialValue<isGLfixed, ParamType>(pname, crop.height); break;
} case GL_GENERATE_MIPMAP:
*params = CastFromGLintStateValue<ParamType>(pname, texture->getGenerateMipmapHint()); break; case GL_MEMORY_SIZE_ANGLE:
*params = CastFromSpecialValue<isGLfixed, ParamType>(pname, texture->getMemorySize()); break; case GL_TEXTURE_BORDER_COLOR:
ConvertFromColor<isPureInteger>(texture->getBorderColor(), params); break; case GL_TEXTURE_NATIVE_ID_ANGLE:
*params = CastFromSpecialValue<isGLfixed, ParamType>(pname, texture->getNativeID()); break; case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
*params = CastFromGLintStateValue<ParamType>(
pname, texture->getImplementationColorReadFormat(context)); break; case GL_IMPLEMENTATION_COLOR_READ_TYPE:
*params = CastFromGLintStateValue<ParamType>(
pname, texture->getImplementationColorReadType(context)); break; case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
*params =
CastFromGLintStateValue<ParamType>(pname, GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE); break; case GL_RESOURCE_INITIALIZED_ANGLE:
*params = CastFromGLintStateValue<ParamType>(
pname, texture->initState() == InitState::Initialized); break; case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
*params = CastFromGLintStateValue<ParamType>(
pname, texture->getRequiredTextureImageUnits(context)); break; case GL_TEXTURE_PROTECTED_EXT:
*params = CastFromGLintStateValue<ParamType>(pname, texture->hasProtectedContent()); break; default:
UNREACHABLE(); break;
}
}
// this function is needed to handle OES_FIXED_POINT. // Some pname values can take in GLfixed values and may need to be converted template <bool isGLfixed, typename ReturnType, typename ParamType>
ReturnType ConvertTexParam(GLenum pname, const ParamType param)
{ if (isGLfixed)
{ return CastQueryValueTo<ReturnType>(pname,
ConvertFixedToFloat(static_cast<GLfixed>(param)));
} else
{ return CastQueryValueTo<ReturnType>(pname, param);
}
}
case GL_ARRAY_SIZE: // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs, // see GLES 3.1 spec section 7.3.1.1 page 77. return clampCast<GLint>(var.getBasicTypeElementCount());
case GL_NAME_LENGTH: // ES31 spec p84: This counts the terminating null char. return clampCast<GLint>(var.name.size() + 1u);
switch (prop)
{ case GL_TYPE: case GL_ARRAY_SIZE: return GetCommonVariableProperty(variable, prop);
case GL_NAME_LENGTH: return clampCast<GLint>(program->getInputResourceName(index).size() + 1u);
case GL_LOCATION: return variable.isBuiltIn() ? GL_INVALID_INDEX : variable.location;
// The query is targeted at the set of active input variables used by the first shader stage // of program. If program contains multiple shader stages then input variables from any // stage other than the first will not be enumerated. Since we found the variable to get // this far, we know it exists in the first attached shader stage. case GL_REFERENCED_BY_VERTEX_SHADER: return program->getState().getFirstAttachedShaderStageType() == ShaderType::Vertex; case GL_REFERENCED_BY_FRAGMENT_SHADER: return program->getState().getFirstAttachedShaderStageType() == ShaderType::Fragment; case GL_REFERENCED_BY_COMPUTE_SHADER: return program->getState().getFirstAttachedShaderStageType() == ShaderType::Compute; case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT: return program->getState().getFirstAttachedShaderStageType() == ShaderType::Geometry; case GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT: return program->getState().getFirstAttachedShaderStageType() == ShaderType::TessControl; case GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT: return program->getState().getFirstAttachedShaderStageType() ==
ShaderType::TessEvaluation; case GL_IS_PER_PATCH_EXT: return variable.isPatch;
switch (prop)
{ case GL_TYPE: case GL_ARRAY_SIZE: return GetCommonVariableProperty(outputVariable, prop);
case GL_NAME_LENGTH: return clampCast<GLint>(program->getOutputResourceName(index).size() + 1u);
case GL_LOCATION: return outputVariable.location;
case GL_LOCATION_INDEX_EXT: // EXT_blend_func_extended if (program->getState().getLastAttachedShaderStageType() == gl::ShaderType::Fragment)
{ return program->getFragDataIndex(outputVariable.name);
} return GL_INVALID_INDEX;
// The set of active user-defined outputs from the final shader stage in this program. If // the final stage is a Fragment Shader, then this represents the fragment outputs that get // written to individual color buffers. If the program only contains a Compute Shader, then // there are no user-defined outputs. case GL_REFERENCED_BY_VERTEX_SHADER: return program->getState().getLastAttachedShaderStageType() == ShaderType::Vertex; case GL_REFERENCED_BY_FRAGMENT_SHADER: return program->getState().getLastAttachedShaderStageType() == ShaderType::Fragment; case GL_REFERENCED_BY_COMPUTE_SHADER: return program->getState().getLastAttachedShaderStageType() == ShaderType::Compute; case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT: return program->getState().getLastAttachedShaderStageType() == ShaderType::Geometry; case GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT: return program->getState().getLastAttachedShaderStageType() == ShaderType::TessControl; case GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT: return program->getState().getLastAttachedShaderStageType() ==
ShaderType::TessEvaluation; case GL_IS_PER_PATCH_EXT: return outputVariable.isPatch;
GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
{ switch (programInterface)
{ case GL_PROGRAM_INPUT: return clampCast<GLint>(program->getState().getProgramInputs().size());
case GL_PROGRAM_OUTPUT: return clampCast<GLint>(program->getState().getOutputVariables().size());
case GL_UNIFORM: return clampCast<GLint>(program->getState().getUniforms().size());
case GL_UNIFORM_BLOCK: return clampCast<GLint>(program->getState().getUniformBlocks().size());
case GL_ATOMIC_COUNTER_BUFFER: return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
case GL_BUFFER_VARIABLE: return clampCast<GLint>(program->getState().getBufferVariables().size());
case GL_SHADER_STORAGE_BLOCK: return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
case GL_TRANSFORM_FEEDBACK_VARYING: return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
default:
UNREACHABLE(); return 0;
}
}
template <typename T, typename M>
GLint FindMaxSize(const std::vector<T> &resources, M member)
{
GLint max = 0; for (const T &resource : resources)
{
max = std::max(max, clampCast<GLint>((resource.*member).size()));
} return max;
}
GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
{
GLint maxNameLength = 0; switch (programInterface)
{ case GL_PROGRAM_INPUT:
maxNameLength = program->getInputResourceMaxNameSize(); break;
case GL_PROGRAM_OUTPUT:
maxNameLength = program->getOutputResourceMaxNameSize(); break;
case GL_UNIFORM:
maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name); break;
case GL_UNIFORM_BLOCK: return program->getActiveUniformBlockMaxNameLength();
case GL_BUFFER_VARIABLE:
maxNameLength =
FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name); break;
case GL_SHADER_STORAGE_BLOCK: return program->getActiveShaderStorageBlockMaxNameLength();
case GL_TRANSFORM_FEEDBACK_VARYING: return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
default:
UNREACHABLE(); return 0;
} // This length includes an extra character for the null terminator. return (maxNameLength == 0 ? 0 : maxNameLength + 1);
}
GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
{ switch (programInterface)
{ case GL_UNIFORM_BLOCK: return FindMaxSize(program->getState().getUniformBlocks(),
&InterfaceBlock::memberIndexes); case GL_ATOMIC_COUNTER_BUFFER: return FindMaxSize(program->getState().getAtomicCounterBuffers(),
&AtomicCounterBuffer::memberIndexes);
case GL_SHADER_STORAGE_BLOCK: return FindMaxSize(program->getState().getShaderStorageBlocks(),
&InterfaceBlock::memberIndexes);
default:
UNREACHABLE(); return 0;
}
}
GLenum GetUniformPropertyEnum(GLenum prop)
{ switch (prop)
{ case GL_UNIFORM_TYPE: return GL_TYPE; case GL_UNIFORM_SIZE: return GL_ARRAY_SIZE; case GL_UNIFORM_NAME_LENGTH: return GL_NAME_LENGTH; case GL_UNIFORM_BLOCK_INDEX: return GL_BLOCK_INDEX; case GL_UNIFORM_OFFSET: return GL_OFFSET; case GL_UNIFORM_ARRAY_STRIDE: return GL_ARRAY_STRIDE; case GL_UNIFORM_MATRIX_STRIDE: return GL_MATRIX_STRIDE; case GL_UNIFORM_IS_ROW_MAJOR: return GL_IS_ROW_MAJOR;
bool IsTextureEnvEnumParameter(TextureEnvParameter pname)
{ switch (pname)
{ case TextureEnvParameter::Mode: case TextureEnvParameter::CombineRgb: case TextureEnvParameter::CombineAlpha: case TextureEnvParameter::Src0Rgb: case TextureEnvParameter::Src1Rgb: case TextureEnvParameter::Src2Rgb: case TextureEnvParameter::Src0Alpha: case TextureEnvParameter::Src1Alpha: case TextureEnvParameter::Src2Alpha: case TextureEnvParameter::Op0Rgb: case TextureEnvParameter::Op1Rgb: case TextureEnvParameter::Op2Rgb: case TextureEnvParameter::Op0Alpha: case TextureEnvParameter::Op1Alpha: case TextureEnvParameter::Op2Alpha: case TextureEnvParameter::PointCoordReplace: returntrue; default: returnfalse;
}
}
if (attachmentObject == nullptr)
{ // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE // is NONE, then querying any other pname will generate INVALID_ENUM.
// ES 3.0.2 spec pg 235 states that if the attachment type is none, // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an // INVALID_OPERATION for all other pnames
switch (pname)
{ case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
*params = GL_NONE; break;
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
*params = 0; break;
default:
UNREACHABLE(); break;
}
return;
}
switch (pname)
{ case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
*params = attachmentObject->type(); break;
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
*params = attachmentObject->id(); break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
*params = attachmentObject->mipLevel(); break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
{
TextureTarget face = attachmentObject->cubeMapFace(); if (face != TextureTarget::InvalidEnum)
{
*params = ToGLenum(attachmentObject->cubeMapFace());
} else
{ // This happens when the attachment isn't a texture cube map face
*params = GL_NONE;
}
} break;
case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
*params = attachmentObject->getRedSize(); break;
case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
*params = attachmentObject->getGreenSize(); break;
case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
*params = attachmentObject->getBlueSize(); break;
case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
*params = attachmentObject->getAlphaSize(); break;
case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
*params = attachmentObject->getDepthSize(); break;
case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
*params = attachmentObject->getStencilSize(); break;
case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
*params = attachmentObject->getComponentType(); break;
case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
*params = attachmentObject->getColorEncoding(); break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
*params = attachmentObject->layer(); break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR:
*params = attachmentObject->getNumViews(); break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR:
*params = attachmentObject->getBaseViewIndex(); break;
case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
*params = attachmentObject->isLayered(); break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT: if (attachmentObject->type() == GL_TEXTURE)
{
*params = attachmentObject->getSamples();
} else
{
*params = 0;
} break;
// All queries return one value, exit early if the buffer can't fit anything. if (bufSize < 1)
{ if (length != nullptr)
{
*length = 0;
} return angle::Result::Continue;
}
switch (pname)
{ case GL_OBJECT_TYPE:
*values = clampCast<GLint>(GL_SYNC_FENCE); break; case GL_SYNC_CONDITION:
*values = clampCast<GLint>(sync->getCondition()); break; case GL_SYNC_FLAGS:
*values = clampCast<GLint>(sync->getFlags()); break; case GL_SYNC_STATUS: if (context->isContextLost())
{
*values = GL_SIGNALED;
} else
{
ANGLE_TRY(sync->getStatus(context, values));
} break;
if (bufSize == 0)
{ // No room to write the results return;
}
GLsizei pos = 0; for (GLsizei i = 0; i < propCount; i++)
{ switch (programInterface)
{ case GL_PROGRAM_INPUT:
params[i] = GetInputResourceProperty(program, index.value, props[i]);
++pos; break;
case GL_PROGRAM_OUTPUT:
params[i] = GetOutputResourceProperty(program, index.value, props[i]);
++pos; break;
case GL_UNIFORM:
params[i] = GetUniformResourceProperty(program, index.value, props[i]);
++pos; break;
case GL_BUFFER_VARIABLE:
params[i] = GetBufferVariableResourceProperty(program, index.value, props[i]);
++pos; break;
case GL_UNIFORM_BLOCK:
GetUniformBlockResourceProperty(program, index.value, props[i], params, bufSize,
&pos); break;
case GL_SHADER_STORAGE_BLOCK:
GetShaderStorageBlockResourceProperty(program, index.value, props[i], params,
bufSize, &pos); break;
case GL_ATOMIC_COUNTER_BUFFER:
GetAtomicCounterBufferResourceProperty(program, index.value, props[i], params,
bufSize, &pos); break;
case GL_TRANSFORM_FEEDBACK_VARYING:
params[i] =
GetTransformFeedbackVaryingResourceProperty(program, index.value, props[i]);
++pos; break;
default:
UNREACHABLE();
params[i] = GL_INVALID_VALUE;
} if (pos == bufSize)
{ // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values. // This checks not to break buffer bounds for such case. break;
}
}
case GL_PROTECTED_MEMORY_OBJECT_EXT:
*params = memoryObject->isProtectedMemory(); break;
default:
UNREACHABLE();
}
}
ClientVertexArrayType ParamToVertexArrayType(GLenum param)
{ switch (param)
{ case GL_VERTEX_ARRAY: case GL_VERTEX_ARRAY_BUFFER_BINDING: case GL_VERTEX_ARRAY_STRIDE: case GL_VERTEX_ARRAY_SIZE: case GL_VERTEX_ARRAY_TYPE: case GL_VERTEX_ARRAY_POINTER: return ClientVertexArrayType::Vertex; case GL_NORMAL_ARRAY: case GL_NORMAL_ARRAY_BUFFER_BINDING: case GL_NORMAL_ARRAY_STRIDE: case GL_NORMAL_ARRAY_TYPE: case GL_NORMAL_ARRAY_POINTER: return ClientVertexArrayType::Normal; case GL_COLOR_ARRAY: case GL_COLOR_ARRAY_BUFFER_BINDING: case GL_COLOR_ARRAY_STRIDE: case GL_COLOR_ARRAY_SIZE: case GL_COLOR_ARRAY_TYPE: case GL_COLOR_ARRAY_POINTER: return ClientVertexArrayType::Color; case GL_POINT_SIZE_ARRAY_OES: case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES: case GL_POINT_SIZE_ARRAY_STRIDE_OES: case GL_POINT_SIZE_ARRAY_TYPE_OES: case GL_POINT_SIZE_ARRAY_POINTER_OES: return ClientVertexArrayType::PointSize; case GL_TEXTURE_COORD_ARRAY: case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING: case GL_TEXTURE_COORD_ARRAY_STRIDE: case GL_TEXTURE_COORD_ARRAY_SIZE: case GL_TEXTURE_COORD_ARRAY_TYPE: case GL_TEXTURE_COORD_ARRAY_POINTER: return ClientVertexArrayType::TextureCoord; default:
UNREACHABLE(); return ClientVertexArrayType::InvalidEnum;
}
}
switch (pname)
{ case LightParameter::Ambient:
lightParams.ambient.writeData(params); break; case LightParameter::Diffuse:
lightParams.diffuse.writeData(params); break; case LightParameter::Specular:
lightParams.specular.writeData(params); break; case LightParameter::Position:
memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat)); break; case LightParameter::SpotDirection:
memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat)); break; case LightParameter::SpotExponent:
*params = lightParams.spotlightExponent; break; case LightParameter::SpotCutoff:
*params = lightParams.spotlightCutoffAngle; break; case LightParameter::ConstantAttenuation:
*params = lightParams.attenuationConst; break; case LightParameter::LinearAttenuation:
*params = lightParams.attenuationLinear; break; case LightParameter::QuadraticAttenuation:
*params = lightParams.attenuationQuadratic; break; default: break;
}
}
void SetMaterialParameters(GLES1State *state,
GLenum face,
MaterialParameter pname, const GLfloat *params)
{ // Note: Ambient and diffuse colors are inherited from glColor when COLOR_MATERIAL is enabled, // and can only be modified by this function if that is disabled: // // > the replaced values remain until changed by either sending a new color or by setting a // > new material value when COLOR_MATERIAL is not currently enabled, to override that // particular value.
MaterialParameters &material = state->materialParameters(); switch (pname)
{ case MaterialParameter::Ambient: if (!state->isColorMaterialEnabled())
{
material.ambient = ColorF::fromData(params);
} break; case MaterialParameter::Diffuse: if (!state->isColorMaterialEnabled())
{
material.diffuse = ColorF::fromData(params);
} break; case MaterialParameter::AmbientAndDiffuse: if (!state->isColorMaterialEnabled())
{
material.ambient = ColorF::fromData(params);
material.diffuse = ColorF::fromData(params);
} break; case MaterialParameter::Specular:
material.specular = ColorF::fromData(params); break; case MaterialParameter::Emission:
material.emissive = ColorF::fromData(params); break; case MaterialParameter::Shininess:
material.specularExponent = *params; break; default: return;
}
}
unsignedint GetLightParameterCount(LightParameter pname)
{ switch (pname)
{ case LightParameter::Ambient: case LightParameter::Diffuse: case LightParameter::AmbientAndDiffuse: case LightParameter::Specular: case LightParameter::Position: return 4; case LightParameter::SpotDirection: return 3; case LightParameter::SpotExponent: case LightParameter::SpotCutoff: case LightParameter::ConstantAttenuation: case LightParameter::LinearAttenuation: case LightParameter::QuadraticAttenuation: return 1; default:
UNREACHABLE(); return 0;
}
}
unsignedint GetMaterialParameterCount(MaterialParameter pname)
{ switch (pname)
{ case MaterialParameter::Ambient: case MaterialParameter::Diffuse: case MaterialParameter::AmbientAndDiffuse: case MaterialParameter::Specular: case MaterialParameter::Emission: return 4; case MaterialParameter::Shininess: return 1; default:
UNREACHABLE(); return 0;
}
}
void SetFogParameters(GLES1State *state, GLenum pname, const GLfloat *params)
{
FogParameters &fog = state->fogParameters(); switch (pname)
{ case GL_FOG_MODE:
fog.mode = FromGLenum<FogMode>(static_cast<GLenum>(params[0])); break; case GL_FOG_DENSITY:
fog.density = params[0]; break; case GL_FOG_START:
fog.start = params[0]; break; case GL_FOG_END:
fog.end = params[0]; break; case GL_FOG_COLOR:
fog.color = ColorF::fromData(params); break; default: return;
}
}
void GetFogParameters(const GLES1State *state, GLenum pname, GLfloat *params)
{ const FogParameters &fog = state->fogParameters(); switch (pname)
{ case GL_FOG_MODE:
params[0] = static_cast<GLfloat>(ToGLenum(fog.mode)); break; case GL_FOG_DENSITY:
params[0] = fog.density; break; case GL_FOG_START:
params[0] = fog.start; break; case GL_FOG_END:
params[0] = fog.end; break; case GL_FOG_COLOR:
fog.color.writeData(params); break; default: return;
}
}
unsignedint GetFogParameterCount(GLenum pname)
{ switch (pname)
{ case GL_FOG_MODE: case GL_FOG_DENSITY: case GL_FOG_START: case GL_FOG_END: return 1; case GL_FOG_COLOR: return 4; default: return 0;
}
}
unsignedint GetTextureEnvParameterCount(TextureEnvParameter pname)
{ switch (pname)
{ case TextureEnvParameter::Mode: case TextureEnvParameter::CombineRgb: case TextureEnvParameter::CombineAlpha: case TextureEnvParameter::Src0Rgb: case TextureEnvParameter::Src1Rgb: case TextureEnvParameter::Src2Rgb: case TextureEnvParameter::Src0Alpha: case TextureEnvParameter::Src1Alpha: case TextureEnvParameter::Src2Alpha: case TextureEnvParameter::Op0Rgb: case TextureEnvParameter::Op1Rgb: case TextureEnvParameter::Op2Rgb: case TextureEnvParameter::Op0Alpha: case TextureEnvParameter::Op1Alpha: case TextureEnvParameter::Op2Alpha: case TextureEnvParameter::RgbScale: case TextureEnvParameter::AlphaScale: case TextureEnvParameter::PointCoordReplace: return 1; case TextureEnvParameter::Color: return 4; default: return 0;
}
}
unsignedint GetTexParameterCount(GLenum pname)
{ switch (pname)
{ case GL_TEXTURE_CROP_RECT_OES: case GL_TEXTURE_BORDER_COLOR: return 4; case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_USAGE_ANGLE: case GL_TEXTURE_MAX_ANISOTROPY_EXT: case GL_TEXTURE_IMMUTABLE_FORMAT: case GL_TEXTURE_WRAP_R: case GL_TEXTURE_IMMUTABLE_LEVELS: case GL_TEXTURE_SWIZZLE_R: case GL_TEXTURE_SWIZZLE_G: case GL_TEXTURE_SWIZZLE_B: case GL_TEXTURE_SWIZZLE_A: case GL_TEXTURE_BASE_LEVEL: case GL_TEXTURE_MAX_LEVEL: case GL_TEXTURE_MIN_LOD: case GL_TEXTURE_MAX_LOD: case GL_TEXTURE_COMPARE_MODE: case GL_TEXTURE_COMPARE_FUNC: case GL_TEXTURE_SRGB_DECODE_EXT: case GL_DEPTH_STENCIL_TEXTURE_MODE: case GL_TEXTURE_NATIVE_ID_ANGLE: case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES: return 1; default: return 0;
}
}
// 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<unsignedint>(caps.compressedTextureFormats.size()); returntrue;
} case GL_SHADER_BINARY_FORMATS:
{
*type = GL_INT;
*numParams = static_cast<unsignedint>(caps.shaderBinaryFormats.size()); returntrue;
}
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; returntrue;
} case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
{ if (!extensions.packReverseRowOrderANGLE)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
} case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE: case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
{ if (!extensions.textureRectangleANGLE)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
} case GL_MAX_DRAW_BUFFERS_EXT: case GL_MAX_COLOR_ATTACHMENTS_EXT:
{ if ((clientMajorVersion < 3) && !extensions.drawBuffersEXT)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
} case GL_MAX_VIEWPORT_DIMS:
{
*type = GL_INT;
*numParams = 2; returntrue;
} case GL_VIEWPORT: case GL_SCISSOR_BOX:
{
*type = GL_INT;
*numParams = 4; returntrue;
} 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; returntrue;
} case GL_COLOR_LOGIC_OP:
{ if (!extensions.logicOpANGLE)
{ returnfalse;
}
*type = GL_BOOL;
*numParams = 1; returntrue;
} case GL_COLOR_WRITEMASK:
{
*type = GL_BOOL;
*numParams = 4; returntrue;
} 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; returntrue;
} case GL_ALIASED_LINE_WIDTH_RANGE: case GL_ALIASED_POINT_SIZE_RANGE: case GL_DEPTH_RANGE:
{
*type = GL_FLOAT;
*numParams = 2; returntrue;
} case GL_COLOR_CLEAR_VALUE: case GL_BLEND_COLOR:
{
*type = GL_FLOAT;
*numParams = 4; returntrue;
} case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: if (!extensions.textureFilterAnisotropicEXT)
{ returnfalse;
}
*type = GL_FLOAT;
*numParams = 1; returntrue; case GL_TIMESTAMP_EXT: if (!extensions.disjointTimerQueryEXT)
{ returnfalse;
}
*type = GL_INT_64_ANGLEX;
*numParams = 1; returntrue; case GL_GPU_DISJOINT_EXT: if (!extensions.disjointTimerQueryEXT)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_COVERAGE_MODULATION_CHROMIUM: if (!extensions.framebufferMixedSamplesCHROMIUM)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_TEXTURE_BINDING_EXTERNAL_OES: if (!extensions.EGLStreamConsumerExternalNV && !extensions.EGLImageExternalOES)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; 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. returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_MAX_CULL_DISTANCES_EXT: case GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT: if (!extensions.clipCullDistanceEXT)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_CLIP_ORIGIN_EXT: case GL_CLIP_DEPTH_MODE_EXT: if (!extensions.clipControlEXT)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_PRIMITIVE_BOUNDING_BOX: if (!extensions.primitiveBoundingBoxAny())
{ returnfalse;
}
*type = GL_FLOAT;
*numParams = 8; returntrue; case GL_SHADING_RATE_QCOM: if (!extensions.shadingRateQCOM)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
}
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; returntrue;
case GL_DEBUG_OUTPUT_SYNCHRONOUS: case GL_DEBUG_OUTPUT:
*type = GL_BOOL;
*numParams = 1; returntrue;
}
}
if (extensions.multisampleCompatibilityEXT)
{ switch (pname)
{ case GL_MULTISAMPLE_EXT: case GL_SAMPLE_ALPHA_TO_ONE_EXT:
*type = GL_BOOL;
*numParams = 1; returntrue;
}
}
if (extensions.bindGeneratesResourceCHROMIUM)
{ switch (pname)
{ case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
*type = GL_BOOL;
*numParams = 1; returntrue;
}
}
if (extensions.clientArraysANGLE)
{ switch (pname)
{ case GL_CLIENT_ARRAYS_ANGLE:
*type = GL_BOOL;
*numParams = 1; returntrue;
}
}
if (extensions.sRGBWriteControlEXT)
{ switch (pname)
{ case GL_FRAMEBUFFER_SRGB_EXT:
*type = GL_BOOL;
*numParams = 1; returntrue;
}
}
// 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())
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
case GL_NUM_PROGRAM_BINARY_FORMATS_OES: if ((clientMajorVersion < 3) && !extensions.getProgramBinaryOES)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
case GL_PROGRAM_BINARY_FORMATS_OES: if ((clientMajorVersion < 3) && !extensions.getProgramBinaryOES)
{ returnfalse;
}
*type = GL_INT;
*numParams = static_cast<unsignedint>(caps.programBinaryFormats.size()); returntrue;
case GL_PACK_ROW_LENGTH: case GL_PACK_SKIP_ROWS: case GL_PACK_SKIP_PIXELS: if ((clientMajorVersion < 3) && !extensions.packSubimageNV)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_UNPACK_ROW_LENGTH: case GL_UNPACK_SKIP_ROWS: case GL_UNPACK_SKIP_PIXELS: if ((clientMajorVersion < 3) && !extensions.unpackSubimageEXT)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_VERTEX_ARRAY_BINDING: if ((clientMajorVersion < 3) && !extensions.vertexArrayObjectOES)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_PIXEL_PACK_BUFFER_BINDING: case GL_PIXEL_UNPACK_BUFFER_BINDING: if ((clientMajorVersion < 3) && !extensions.pixelBufferObjectNV)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; 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))
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT: if ((clientMajorVersion < 3) && !extensions.standardDerivativesOES)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
} case GL_TEXTURE_BINDING_3D: if ((clientMajorVersion < 3) && !extensions.texture3DOES)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue; case GL_MAX_3D_TEXTURE_SIZE: if ((clientMajorVersion < 3) && !extensions.texture3DOES)
{ returnfalse;
}
*type = GL_INT;
*numParams = 1; returntrue;
}
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; returntrue; 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; returntrue; case GL_SMOOTH_POINT_SIZE_RANGE: case GL_SMOOTH_LINE_WIDTH_RANGE:
*type = GL_FLOAT;
*numParams = 2; returntrue; case GL_CURRENT_COLOR: case GL_CURRENT_TEXTURE_COORDS: case GL_LIGHT_MODEL_AMBIENT: case GL_FOG_COLOR:
*type = GL_FLOAT;
*numParams = 4; returntrue; case GL_CURRENT_NORMAL: case GL_POINT_DISTANCE_ATTENUATION:
*type = GL_FLOAT;
*numParams = 3; returntrue; case GL_MODELVIEW_MATRIX: case GL_PROJECTION_MATRIX: case GL_TEXTURE_MATRIX:
*type = GL_FLOAT;
*numParams = 16; returntrue; case GL_LIGHT_MODEL_TWO_SIDE:
*type = GL_BOOL;
*numParams = 1; returntrue;
}
}
if (glState.getClientVersion() < Version(3, 0))
{ returnfalse;
}
// 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; returntrue;
}
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; returntrue;
}
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; returntrue;
}
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; returntrue;
}
}
if (extensions.requestExtensionANGLE)
{ switch (pname)
{ case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
*type = GL_INT;
*numParams = 1; returntrue;
}
}
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; returntrue;
}
}
if (extensions.textureCubeMapArrayAny())
{ switch (pname)
{ case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
*type = GL_INT;
*numParams = 1; returntrue;
}
}
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; returntrue;
}
}
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; returntrue; case GL_PIXEL_LOCAL_STORAGE_ACTIVE_ANGLE:
*type = GL_BOOL;
*numParams = 1; returntrue;
}
}
if (glState.getClientVersion() < Version(3, 1))
{ returnfalse;
}
// 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; returntrue; case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
*type = GL_INT_64_ANGLEX;
*numParams = 1; returntrue; case GL_SAMPLE_MASK: case GL_SAMPLE_SHADING:
*type = GL_BOOL;
*numParams = 1; returntrue; case GL_MIN_SAMPLE_SHADING_VALUE:
*type = GL_FLOAT;
*numParams = 1; returntrue;
}
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; returntrue;
}
}
if (extensions.tessellationShaderEXT)
{ switch (pname)
{ case GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED:
*type = GL_BOOL;
*numParams = 1; returntrue; 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; returntrue;
}
}
returnfalse;
}
void QueryProgramPipelineiv(const Context *context,
ProgramPipeline *programPipeline,
GLenum pname,
GLint *params)
{ if (!params)
{ // Can't write the result anywhere, so just return immediately. return;
}
switch (pname)
{ case GL_ACTIVE_PROGRAM:
{ // the name of the active program object of the program pipeline object is returned in // params
*params = 0; if (programPipeline)
{ const Program *program = programPipeline->getActiveShaderProgram(); if (program)
{
*params = program->id().value;
}
} break;
}
case GL_VERTEX_SHADER:
{ // the name of the current program object for the vertex shader type of the program // pipeline object is returned in params
GetShaderProgramId(programPipeline, ShaderType::Vertex, params); break;
}
case GL_FRAGMENT_SHADER:
{ // the name of the current program object for the fragment shader type of the program // pipeline object is returned in params
GetShaderProgramId(programPipeline, ShaderType::Fragment, params); break;
}
case GL_TESS_CONTROL_SHADER:
{ // the name of the current program object for the tessellation control shader type of // the program pipeline object is returned in params
GetShaderProgramId(programPipeline, ShaderType::TessControl, params); break;
}
case GL_TESS_EVALUATION_SHADER:
{ // the name of the current program object for the tessellation evaluation shader type of // the program pipeline object is returned in params
GetShaderProgramId(programPipeline, ShaderType::TessEvaluation, params); break;
}
case GL_COMPUTE_SHADER:
{ // the name of the current program object for the compute shader type of the program // pipeline object is returned in params
GetShaderProgramId(programPipeline, ShaderType::Compute, params); break;
}
case GL_GEOMETRY_SHADER:
{ // the name of the current program object for the geometry shader type of the program // pipeline object is returned in params
GetShaderProgramId(programPipeline, ShaderType::Geometry, params); break;
}
case GL_INFO_LOG_LENGTH:
{ // the length of the info log, including the null terminator, is returned in params. If // there is no info log, zero is returned.
*params = 0; if (programPipeline)
{
*params = programPipeline->getExecutable().getInfoLogLength();
} break;
}
case GL_VALIDATE_STATUS:
{ // the validation status of pipeline, as determined by glValidateProgramPipeline, is // returned in params
*params = 0; if (programPipeline)
{
*params = programPipeline->isValid();
} break;
}
default: break;
}
}
} // namespace gl
namespace egl
{
void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
{
ASSERT(config != nullptr); switch (attribute)
{ case EGL_BUFFER_SIZE:
*value = config->bufferSize; break; case EGL_ALPHA_SIZE:
*value = config->alphaSize; break; case EGL_BLUE_SIZE:
*value = config->blueSize; break; case EGL_GREEN_SIZE:
*value = config->greenSize; break; case EGL_RED_SIZE:
*value = config->redSize; break; case EGL_DEPTH_SIZE:
*value = config->depthSize; break; case EGL_STENCIL_SIZE:
*value = config->stencilSize; break; case EGL_CONFIG_CAVEAT:
*value = config->configCaveat; break; case EGL_CONFIG_ID:
*value = config->configID; break; case EGL_LEVEL:
*value = config->level; break; case EGL_NATIVE_RENDERABLE:
*value = config->nativeRenderable; break; case EGL_NATIVE_VISUAL_ID:
*value = config->nativeVisualID; break; case EGL_NATIVE_VISUAL_TYPE:
*value = config->nativeVisualType; break; case EGL_SAMPLES:
*value = config->samples; break; case EGL_SAMPLE_BUFFERS:
*value = config->sampleBuffers; break; case EGL_SURFACE_TYPE:
*value = config->surfaceType; break; case EGL_BIND_TO_TEXTURE_TARGET_ANGLE:
*value = config->bindToTextureTarget; break; case EGL_TRANSPARENT_TYPE:
*value = config->transparentType; break; case EGL_TRANSPARENT_BLUE_VALUE:
*value = config->transparentBlueValue; break; case EGL_TRANSPARENT_GREEN_VALUE:
*value = config->transparentGreenValue; break; case EGL_TRANSPARENT_RED_VALUE:
*value = config->transparentRedValue; break; case EGL_BIND_TO_TEXTURE_RGB:
*value = config->bindToTextureRGB; break; case EGL_BIND_TO_TEXTURE_RGBA:
*value = config->bindToTextureRGBA; break; case EGL_MIN_SWAP_INTERVAL:
*value = config->minSwapInterval; break; case EGL_MAX_SWAP_INTERVAL:
*value = config->maxSwapInterval; break; case EGL_LUMINANCE_SIZE:
*value = config->luminanceSize; break; case EGL_ALPHA_MASK_SIZE:
*value = config->alphaMaskSize; break; case EGL_COLOR_BUFFER_TYPE:
*value = config->colorBufferType; break; case EGL_RENDERABLE_TYPE:
*value = config->renderableType; break; case EGL_MATCH_NATIVE_PIXMAP:
*value = false;
UNIMPLEMENTED(); break; case EGL_CONFORMANT:
*value = config->conformant; break; case EGL_MAX_PBUFFER_WIDTH:
*value = config->maxPBufferWidth; break; case EGL_MAX_PBUFFER_HEIGHT:
*value = config->maxPBufferHeight; break; case EGL_MAX_PBUFFER_PIXELS:
*value = config->maxPBufferPixels; break; case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
*value = config->optimalOrientation; break; case EGL_COLOR_COMPONENT_TYPE_EXT:
*value = config->colorComponentType; break; case EGL_RECORDABLE_ANDROID:
*value = config->recordable; break; case EGL_FRAMEBUFFER_TARGET_ANDROID:
*value = config->framebufferTarget; break; case EGL_MATCH_FORMAT_KHR:
*value = config->matchFormat; break; default:
UNREACHABLE(); break;
}
}
void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
{ switch (attribute)
{ case EGL_CONFIG_ID: if (context->getConfig() != EGL_NO_CONFIG_KHR)
{
*value = context->getConfig()->configID;
} else
{
*value = 0;
} break; case EGL_CONTEXT_CLIENT_TYPE:
*value = context->getClientType(); break; case EGL_CONTEXT_CLIENT_VERSION:
*value = context->getClientMajorVersion(); break; case EGL_RENDER_BUFFER:
*value = context->getRenderBuffer(); break; case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
*value = context->isRobustResourceInitEnabled(); break; case EGL_CONTEXT_PRIORITY_LEVEL_IMG:
*value = static_cast<EGLint>(context->getContextPriority()); break; case EGL_PROTECTED_CONTENT_EXT:
*value = context->getState().hasProtectedContent(); break; default:
UNREACHABLE(); break;
}
}
egl::Error QuerySurfaceAttrib(const Display *display, const gl::Context *context,
Surface *surface,
EGLint attribute,
EGLint *value)
{ switch (attribute)
{ case EGL_GL_COLORSPACE:
*value = surface->getGLColorspace(); break; case EGL_VG_ALPHA_FORMAT:
*value = surface->getVGAlphaFormat(); break; case EGL_VG_COLORSPACE:
*value = surface->getVGColorspace(); break; case EGL_CONFIG_ID:
*value = surface->getConfig()->configID; break; case EGL_HEIGHT:
ANGLE_TRY(surface->getUserHeight(display, value)); break; case EGL_HORIZONTAL_RESOLUTION:
*value = surface->getHorizontalResolution(); break; case EGL_LARGEST_PBUFFER: // The EGL spec states that value is not written if the surface is not a pbuffer if (surface->getType() == EGL_PBUFFER_BIT)
{
*value = surface->getLargestPbuffer();
} break; case EGL_MIPMAP_TEXTURE: // The EGL spec states that value is not written if the surface is not a pbuffer if (surface->getType() == EGL_PBUFFER_BIT)
{
*value = surface->getMipmapTexture();
} break; case EGL_MIPMAP_LEVEL: // The EGL spec states that value is not written if the surface is not a pbuffer if (surface->getType() == EGL_PBUFFER_BIT)
{
*value = surface->getMipmapLevel();
} break; case EGL_MULTISAMPLE_RESOLVE:
*value = surface->getMultisampleResolve(); break; case EGL_PIXEL_ASPECT_RATIO:
*value = surface->getPixelAspectRatio(); break; case EGL_RENDER_BUFFER:
*value = surface->getRenderBuffer(); break; case EGL_SWAP_BEHAVIOR:
*value = surface->getSwapBehavior(); break; case EGL_TEXTURE_FORMAT: // The EGL spec states that value is not written if the surface is not a pbuffer if (surface->getType() == EGL_PBUFFER_BIT)
{
*value = ToEGLenum(surface->getTextureFormat());
} break; case EGL_TEXTURE_TARGET: // The EGL spec states that value is not written if the surface is not a pbuffer if (surface->getType() == EGL_PBUFFER_BIT)
{
*value = surface->getTextureTarget();
} break; case EGL_VERTICAL_RESOLUTION:
*value = surface->getVerticalResolution(); break; case EGL_WIDTH:
ANGLE_TRY(surface->getUserWidth(display, value)); break; case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
*value = surface->isPostSubBufferSupported(); break; case EGL_FIXED_SIZE_ANGLE:
*value = surface->isFixedSize(); break; case EGL_SURFACE_ORIENTATION_ANGLE:
*value = surface->getOrientation(); break; case EGL_DIRECT_COMPOSITION_ANGLE:
*value = surface->directComposition(); break; case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
*value = surface->isRobustResourceInitEnabled(); break; case EGL_TIMESTAMPS_ANDROID:
*value = surface->isTimestampsEnabled(); break; case EGL_BUFFER_AGE_EXT:
ANGLE_TRY(surface->getBufferAge(context, value)); break; case EGL_BITMAP_PITCH_KHR:
*value = surface->getBitmapPitch(); break; case EGL_BITMAP_ORIGIN_KHR:
*value = surface->getBitmapOrigin(); break; case EGL_BITMAP_PIXEL_RED_OFFSET_KHR:
*value = surface->getRedOffset(); break; case EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR:
*value = surface->getGreenOffset(); break; case EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR:
*value = surface->getBlueOffset(); break; case EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR:
*value = surface->getAlphaOffset(); break; case EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR:
*value = surface->getLuminanceOffset(); break; case EGL_BITMAP_PIXEL_SIZE_KHR:
*value = surface->getBitmapPixelSize(); break; case EGL_PROTECTED_CONTENT_EXT:
*value = surface->hasProtectedContent(); break; default:
UNREACHABLE(); break;
} return NoError();
}
egl::Error QuerySurfaceAttrib64KHR(const Display *display, const gl::Context *context, const Surface *surface,
EGLint attribute,
EGLAttribKHR *value)
{ switch (attribute)
{ case EGL_BITMAP_PITCH_KHR:
*value = static_cast<EGLAttribKHR>(surface->getBitmapPitch()); break; case EGL_BITMAP_ORIGIN_KHR:
*value = static_cast<EGLAttribKHR>(surface->getBitmapOrigin()); break; case EGL_BITMAP_PIXEL_RED_OFFSET_KHR:
*value = static_cast<EGLAttribKHR>(surface->getRedOffset()); break; case EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR:
*value = static_cast<EGLAttribKHR>(surface->getGreenOffset()); break; case EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR:
*value = static_cast<EGLAttribKHR>(surface->getBlueOffset()); break; case EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR:
*value = static_cast<EGLAttribKHR>(surface->getAlphaOffset()); break; case EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR:
*value = static_cast<EGLAttribKHR>(surface->getLuminanceOffset()); break; case EGL_BITMAP_PIXEL_SIZE_KHR:
*value = static_cast<EGLAttribKHR>(surface->getBitmapPixelSize()); break; case EGL_BITMAP_POINTER_KHR:
*value = surface->getBitmapPointer(); break; default:
UNREACHABLE(); break;
} return NoError();
}
egl::Error SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
{ switch (attribute)
{ case EGL_MIPMAP_LEVEL:
surface->setMipmapLevel(value); break; case EGL_MULTISAMPLE_RESOLVE:
surface->setMultisampleResolve(value); break; case EGL_SWAP_BEHAVIOR:
surface->setSwapBehavior(value); break; case EGL_WIDTH:
surface->setFixedWidth(value); break; case EGL_HEIGHT:
surface->setFixedHeight(value); break; case EGL_TIMESTAMPS_ANDROID:
surface->setTimestampsEnabled(value != EGL_FALSE); break; case EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID: return surface->setAutoRefreshEnabled(value == EGL_TRUE); case EGL_RENDER_BUFFER: return surface->setRenderBuffer(value); default:
UNREACHABLE(); break;
} return NoError();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.