// // 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(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize, const int blockIndex, const sh::BlockMemberInfo &blockInfo) : type(type), precision(precision), name(name), arraySize(arraySize), blockIndex(blockIndex), blockInfo(blockInfo), data(NULL), dirty(true), psRegisterIndex(GL_INVALID_INDEX), vsRegisterIndex(GL_INVALID_INDEX), registerCount(0), registerElement(0) { // We use data storage for default block uniforms to cache values that are sent to D3D during rendering // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only) if (isInDefaultBlock()) { size_t bytes = dataSize(); data = new unsigned char[bytes]; memset(data, 0, bytes); registerCount = VariableRowCount(type) * elementCount(); } } LinkedUniform::~LinkedUniform() { delete[] data; } bool LinkedUniform::isArray() const { return arraySize > 0; } unsigned int LinkedUniform::elementCount() const { return arraySize > 0 ? arraySize : 1; } bool LinkedUniform::isReferencedByVertexShader() const { return vsRegisterIndex != GL_INVALID_INDEX; } bool LinkedUniform::isReferencedByFragmentShader() const { return psRegisterIndex != GL_INVALID_INDEX; } bool LinkedUniform::isInDefaultBlock() const { return blockIndex == -1; } size_t LinkedUniform::dataSize() const { ASSERT(type != GL_STRUCT_ANGLEX); return VariableInternalSize(type) * elementCount(); } bool LinkedUniform::isSampler() const { return IsSamplerType(type); } UniformBlock::UniformBlock(const std::string &name, unsigned int elementIndex, unsigned int dataSize) : name(name), elementIndex(elementIndex), dataSize(dataSize), psRegisterIndex(GL_INVALID_INDEX), vsRegisterIndex(GL_INVALID_INDEX) { } bool UniformBlock::isArrayElement() const { return elementIndex != GL_INVALID_INDEX; } bool UniformBlock::isReferencedByVertexShader() const { return vsRegisterIndex != GL_INVALID_INDEX; } bool UniformBlock::isReferencedByFragmentShader() const { return psRegisterIndex != GL_INVALID_INDEX; } }