// // 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;
¤ 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.0.12Bemerkung:
(vorverarbeitet)
¤
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.