156 lines
3.6 KiB
C++
156 lines
3.6 KiB
C++
//
|
|
// 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);
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|