| // |
| // 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. |
| // |
| |
| #ifndef LIBANGLE_UNIFORM_H_ |
| #define LIBANGLE_UNIFORM_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "angle_gl.h" |
| #include "common/debug.h" |
| #include "common/MemoryBuffer.h" |
| #include "compiler/translator/blocklayout.h" |
| #include "libANGLE/angletypes.h" |
| |
| namespace gl |
| { |
| |
| // Helper struct representing a single shader uniform |
| struct LinkedUniform : public sh::Uniform |
| { |
| LinkedUniform(); |
| LinkedUniform(GLenum type, |
| GLenum precision, |
| const std::string &name, |
| unsigned int arraySize, |
| const int binding, |
| const int offset, |
| const int location, |
| const int bufferIndex, |
| const sh::BlockMemberInfo &blockInfo); |
| LinkedUniform(const sh::Uniform &uniform); |
| LinkedUniform(const LinkedUniform &uniform); |
| LinkedUniform &operator=(const LinkedUniform &uniform); |
| ~LinkedUniform(); |
| |
| size_t dataSize() const; |
| uint8_t *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 *data() const; |
| bool isSampler() const; |
| bool isImage() const; |
| bool isAtomicCounter() const; |
| bool isInDefaultBlock() const; |
| bool isField() const; |
| size_t getElementSize() const; |
| size_t getElementComponents() const; |
| uint8_t *getDataPtrToElement(size_t elementIndex); |
| const uint8_t *getDataPtrToElement(size_t elementIndex) const; |
| |
| // Identifies the containing buffer backed resource -- interface block or atomic counter buffer. |
| int bufferIndex; |
| sh::BlockMemberInfo blockInfo; |
| |
| private: |
| mutable angle::MemoryBuffer mLazyData; |
| }; |
| |
| // Parent struct for atomic counter, uniform block, and shader storage block buffer, which all |
| // contain a group of shader variables, and have a GL buffer backed. |
| struct ShaderVariableBuffer |
| { |
| ShaderVariableBuffer(); |
| virtual ~ShaderVariableBuffer(); |
| ShaderVariableBuffer(const ShaderVariableBuffer &other) = default; |
| ShaderVariableBuffer &operator=(const ShaderVariableBuffer &other) = default; |
| int numActiveVariables() const { return static_cast<int>(memberIndexes.size()); } |
| |
| int binding; |
| unsigned int dataSize; |
| std::vector<unsigned int> memberIndexes; |
| |
| bool vertexStaticUse; |
| bool fragmentStaticUse; |
| bool computeStaticUse; |
| }; |
| |
| using AtomicCounterBuffer = ShaderVariableBuffer; |
| |
| // Helper struct representing a single shader uniform block |
| struct UniformBlock : public ShaderVariableBuffer |
| { |
| UniformBlock(); |
| UniformBlock(const std::string &nameIn, |
| const std::string &mappedNameIn, |
| bool isArrayIn, |
| unsigned int arrayElementIn, |
| int bindingIn); |
| UniformBlock(const UniformBlock &other) = default; |
| UniformBlock &operator=(const UniformBlock &other) = default; |
| |
| std::string nameWithArrayIndex() const; |
| std::string mappedNameWithArrayIndex() const; |
| |
| std::string name; |
| std::string mappedName; |
| bool isArray; |
| unsigned int arrayElement; |
| }; |
| |
| } |
| |
| #endif // LIBANGLE_UNIFORM_H_ |