// // Copyright (c) 2010-2013 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. // #include "libANGLE/Uniform.h" #include "common/utilities.h" #include namespace gl { ActiveVariable::ActiveVariable() {} ActiveVariable::~ActiveVariable() {} ActiveVariable::ActiveVariable(const ActiveVariable &rhs) = default; ActiveVariable &ActiveVariable::operator=(const ActiveVariable &rhs) = default; void ActiveVariable::setActive(ShaderType shaderType, bool used) { ASSERT(shaderType != ShaderType::InvalidEnum); mActiveUseBits.set(shaderType, used); } void ActiveVariable::unionReferencesWith(const ActiveVariable &other) { mActiveUseBits |= other.mActiveUseBits; } ShaderType ActiveVariable::getFirstShaderTypeWhereActive() const { return static_cast(ScanForward(mActiveUseBits.bits())); } GLuint ActiveVariable::activeShaderCount() const { return static_cast(mActiveUseBits.count()); } LinkedUniform::LinkedUniform() : typeInfo(nullptr), bufferIndex(-1), blockInfo(sh::kDefaultBlockMemberInfo) {} LinkedUniform::LinkedUniform(GLenum typeIn, GLenum precisionIn, const std::string &nameIn, const std::vector &arraySizesIn, const int bindingIn, const int offsetIn, const int locationIn, const int bufferIndexIn, const sh::BlockMemberInfo &blockInfoIn) : typeInfo(&GetUniformTypeInfo(typeIn)), bufferIndex(bufferIndexIn), blockInfo(blockInfoIn) { type = typeIn; precision = precisionIn; name = nameIn; arraySizes = arraySizesIn; binding = bindingIn; offset = offsetIn; location = locationIn; ASSERT(!isArrayOfArrays()); ASSERT(!isArray() || !isStruct()); } LinkedUniform::LinkedUniform(const sh::Uniform &uniform) : sh::Uniform(uniform), typeInfo(&GetUniformTypeInfo(type)), bufferIndex(-1), blockInfo(sh::kDefaultBlockMemberInfo) { ASSERT(!isArrayOfArrays()); ASSERT(!isArray() || !isStruct()); } LinkedUniform::LinkedUniform(const LinkedUniform &uniform) : sh::Uniform(uniform), ActiveVariable(uniform), typeInfo(uniform.typeInfo), bufferIndex(uniform.bufferIndex), blockInfo(uniform.blockInfo) {} LinkedUniform &LinkedUniform::operator=(const LinkedUniform &uniform) { sh::Uniform::operator =(uniform); ActiveVariable::operator=(uniform); typeInfo = uniform.typeInfo; bufferIndex = uniform.bufferIndex; blockInfo = uniform.blockInfo; return *this; } LinkedUniform::~LinkedUniform() {} bool LinkedUniform::isInDefaultBlock() const { return bufferIndex == -1; } bool LinkedUniform::isSampler() const { return typeInfo->isSampler; } bool LinkedUniform::isImage() const { return typeInfo->isImageType; } bool LinkedUniform::isAtomicCounter() const { return IsAtomicCounterType(type); } bool LinkedUniform::isField() const { return name.find('.') != std::string::npos; } size_t LinkedUniform::getElementSize() const { return typeInfo->externalSize; } size_t LinkedUniform::getElementComponents() const { return typeInfo->componentCount; } BufferVariable::BufferVariable() : bufferIndex(-1), blockInfo(sh::kDefaultBlockMemberInfo), topLevelArraySize(-1) {} BufferVariable::BufferVariable(GLenum typeIn, GLenum precisionIn, const std::string &nameIn, const std::vector &arraySizesIn, const int bufferIndexIn, const sh::BlockMemberInfo &blockInfoIn) : bufferIndex(bufferIndexIn), blockInfo(blockInfoIn), topLevelArraySize(-1) { type = typeIn; precision = precisionIn; name = nameIn; arraySizes = arraySizesIn; } BufferVariable::~BufferVariable() {} ShaderVariableBuffer::ShaderVariableBuffer() : binding(0), dataSize(0) {} ShaderVariableBuffer::ShaderVariableBuffer(const ShaderVariableBuffer &other) = default; ShaderVariableBuffer::~ShaderVariableBuffer() {} int ShaderVariableBuffer::numActiveVariables() const { return static_cast(memberIndexes.size()); } InterfaceBlock::InterfaceBlock() : isArray(false), arrayElement(0) {} InterfaceBlock::InterfaceBlock(const std::string &nameIn, const std::string &mappedNameIn, bool isArrayIn, unsigned int arrayElementIn, int bindingIn) : name(nameIn), mappedName(mappedNameIn), isArray(isArrayIn), arrayElement(arrayElementIn) { binding = bindingIn; } std::string InterfaceBlock::nameWithArrayIndex() const { std::stringstream fullNameStr; fullNameStr << name; if (isArray) { fullNameStr << "[" << arrayElement << "]"; } return fullNameStr.str(); } std::string InterfaceBlock::mappedNameWithArrayIndex() const { std::stringstream fullNameStr; fullNameStr << mappedName; if (isArray) { fullNameStr << "[" << arrayElement << "]"; } return fullNameStr.str(); } } // namespace gl