diff options
Diffstat (limited to 'gfx/angle/src/libANGLE/Uniform.cpp')
-rwxr-xr-x | gfx/angle/src/libANGLE/Uniform.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/Uniform.cpp b/gfx/angle/src/libANGLE/Uniform.cpp new file mode 100755 index 000000000..3caa3f5e2 --- /dev/null +++ b/gfx/angle/src/libANGLE/Uniform.cpp @@ -0,0 +1,160 @@ +// +// 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 <cstring> + +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<LinkedUniform *>(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); +} + +size_t LinkedUniform::getElementComponents() const +{ + return VariableComponentCount(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<LinkedUniform *>(this)->getDataPtrToElement(elementIndex); +} + +UniformBlock::UniformBlock() + : isArray(false), + arrayElement(0), + dataSize(0), + vertexStaticUse(false), + fragmentStaticUse(false), + computeStaticUse(false) +{ +} + +UniformBlock::UniformBlock(const std::string &nameIn, bool isArrayIn, unsigned int arrayElementIn) + : name(nameIn), + isArray(isArrayIn), + arrayElement(arrayElementIn), + dataSize(0), + vertexStaticUse(false), + fragmentStaticUse(false), + computeStaticUse(false) +{ +} + +std::string UniformBlock::nameWithArrayIndex() const +{ + std::stringstream fullNameStr; + fullNameStr << name; + if (isArray) + { + fullNameStr << "[" << arrayElement << "]"; + } + + return fullNameStr.str(); +} +} |