| // | |
| // 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 "libGLESv2/Uniform.h" | |
| #include "common/utilities.h" | |
| 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 IsSampler(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; | |
| } | |
| } |