// // 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 { LinkedUniform::LinkedUniform() : blockIndex(-1), blockInfo(sh::BlockMemberInfo::getDefaultBlockInfo()) { } LinkedUniform::LinkedUniform(GLenum typeIn, GLenum precisionIn, const std::string &nameIn, unsigned int arraySizeIn, const int blockIndexIn, const sh::BlockMemberInfo &blockInfoIn) : blockIndex(blockIndexIn), blockInfo(blockInfoIn) { type = typeIn; precision = precisionIn; name = nameIn; arraySize = arraySizeIn; } LinkedUniform::LinkedUniform(const sh::Uniform &uniform) : sh::Uniform(uniform), blockIndex(-1), blockInfo(sh::BlockMemberInfo::getDefaultBlockInfo()) { } LinkedUniform::LinkedUniform(const LinkedUniform &uniform) : sh::Uniform(uniform), blockIndex(uniform.blockIndex), blockInfo(uniform.blockInfo) { // This function is not intended to be called during runtime. ASSERT(uniform.mLazyData.empty()); } LinkedUniform &LinkedUniform::operator=(const LinkedUniform &uniform) { // This function is not intended to be called during runtime. ASSERT(uniform.mLazyData.empty()); sh::Uniform::operator=(uniform); blockIndex = uniform.blockIndex; blockInfo = uniform.blockInfo; return *this; } LinkedUniform::~LinkedUniform() { } bool LinkedUniform::isInDefaultBlock() const { return blockIndex == -1; } size_t LinkedUniform::dataSize() const { ASSERT(type != GL_STRUCT_ANGLEX); if (mLazyData.empty()) { mLazyData.resize(VariableExternalSize(type) * elementCount()); ASSERT(!mLazyData.empty()); } return mLazyData.size(); } uint8_t *LinkedUniform::data() { if (mLazyData.empty()) { // dataSize() will init the data store. size_t size = dataSize(); memset(mLazyData.data(), 0, size); } return mLazyData.data(); } const uint8_t *LinkedUniform::data() const { return const_cast(this)->data(); } bool LinkedUniform::isSampler() const { return IsSamplerType(type); } bool LinkedUniform::isField() const { return name.find('.') != std::string::npos; } size_t LinkedUniform::getElementSize() const { return VariableExternalSize(type); } uint8_t *LinkedUniform::getDataPtrToElement(size_t elementIndex) { ASSERT((!isArray() && elementIndex == 0) || (isArray() && elementIndex < arraySize)); return data() + getElementSize() * elementIndex; } const uint8_t *LinkedUniform::getDataPtrToElement(size_t elementIndex) const { return const_cast(this)->getDataPtrToElement(elementIndex); } UniformBlock::UniformBlock() : isArray(false), arrayElement(0), dataSize(0), vertexStaticUse(false), fragmentStaticUse(false) { } UniformBlock::UniformBlock(const std::string &nameIn, bool isArrayIn, unsigned int arrayElementIn) : name(nameIn), isArray(isArrayIn), arrayElement(arrayElementIn), dataSize(0), vertexStaticUse(false), fragmentStaticUse(false) { } std::string UniformBlock::nameWithArrayIndex() const { std::stringstream fullNameStr; fullNameStr << name; if (isArray) { fullNameStr << "[" << arrayElement << "]"; } return fullNameStr.str(); } }