// // Copyright 2010 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 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), outerArrayOffset(0) {} 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), outerArrayOffset(0) { type = typeIn; precision = precisionIn; name = nameIn; arraySizes = arraySizesIn; binding = bindingIn; offset = offsetIn; location = locationIn; ASSERT(!isArrayOfArrays()); ASSERT(!isArray() || !isStruct()); } LinkedUniform::LinkedUniform(const sh::ShaderVariable &uniform) : sh::ShaderVariable(uniform), typeInfo(&GetUniformTypeInfo(type)), bufferIndex(-1), blockInfo(sh::kDefaultBlockMemberInfo) { ASSERT(!isArrayOfArrays()); ASSERT(!isArray() || !isStruct()); } LinkedUniform::LinkedUniform(const LinkedUniform &uniform) : sh::ShaderVariable(uniform), ActiveVariable(uniform), typeInfo(uniform.typeInfo), bufferIndex(uniform.bufferIndex), blockInfo(uniform.blockInfo), outerArraySizes(uniform.outerArraySizes), outerArrayOffset(uniform.outerArrayOffset) {} LinkedUniform &LinkedUniform::operator=(const LinkedUniform &uniform) { sh::ShaderVariable::operator=(uniform); ActiveVariable::operator =(uniform); typeInfo = uniform.typeInfo; bufferIndex = uniform.bufferIndex; blockInfo = uniform.blockInfo; outerArraySizes = uniform.outerArraySizes; outerArrayOffset = uniform.outerArrayOffset; return *this; } LinkedUniform::~LinkedUniform() {} 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, unsigned int firstFieldArraySizeIn, int bindingIn) : name(nameIn), mappedName(mappedNameIn), isArray(isArrayIn), arrayElement(arrayElementIn), firstFieldArraySize(firstFieldArraySizeIn) { 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