summaryrefslogtreecommitdiffstats
path: root/gfx/angle/checkout/src/libANGLE/Uniform.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/Uniform.h')
-rw-r--r--gfx/angle/checkout/src/libANGLE/Uniform.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/Uniform.h b/gfx/angle/checkout/src/libANGLE/Uniform.h
new file mode 100644
index 0000000000..5c15906779
--- /dev/null
+++ b/gfx/angle/checkout/src/libANGLE/Uniform.h
@@ -0,0 +1,138 @@
+//
+// Copyright 2010 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/MemoryBuffer.h"
+#include "common/debug.h"
+#include "common/utilities.h"
+#include "compiler/translator/blocklayout.h"
+#include "libANGLE/angletypes.h"
+
+namespace gl
+{
+struct UniformTypeInfo;
+
+struct ActiveVariable
+{
+ ActiveVariable();
+ ActiveVariable(const ActiveVariable &rhs);
+ virtual ~ActiveVariable();
+
+ ActiveVariable &operator=(const ActiveVariable &rhs);
+
+ ShaderType getFirstShaderTypeWhereActive() const;
+ void setActive(ShaderType shaderType, bool used);
+ void unionReferencesWith(const ActiveVariable &other);
+ bool isActive(ShaderType shaderType) const
+ {
+ ASSERT(shaderType != ShaderType::InvalidEnum);
+ return mActiveUseBits[shaderType];
+ }
+ ShaderBitSet activeShaders() const { return mActiveUseBits; }
+ GLuint activeShaderCount() const;
+
+ private:
+ ShaderBitSet mActiveUseBits;
+};
+
+// Helper struct representing a single shader uniform
+struct LinkedUniform : public sh::ShaderVariable, public ActiveVariable
+{
+ LinkedUniform();
+ LinkedUniform(GLenum type,
+ GLenum precision,
+ const std::string &name,
+ const std::vector<unsigned int> &arraySizes,
+ const int binding,
+ const int offset,
+ const int location,
+ const int bufferIndex,
+ const sh::BlockMemberInfo &blockInfo);
+ LinkedUniform(const sh::ShaderVariable &uniform);
+ LinkedUniform(const LinkedUniform &uniform);
+ LinkedUniform &operator=(const LinkedUniform &uniform);
+ ~LinkedUniform() override;
+
+ bool isSampler() const { return typeInfo->isSampler; }
+ bool isImage() const { return typeInfo->isImageType; }
+ bool isAtomicCounter() const { return IsAtomicCounterType(type); }
+ bool isInDefaultBlock() const { return bufferIndex == -1; }
+ bool isField() const { return name.find('.') != std::string::npos; }
+ size_t getElementSize() const { return typeInfo->externalSize; }
+ size_t getElementComponents() const { return typeInfo->componentCount; }
+
+ const UniformTypeInfo *typeInfo;
+
+ // Identifies the containing buffer backed resource -- interface block or atomic counter buffer.
+ int bufferIndex;
+ sh::BlockMemberInfo blockInfo;
+ std::vector<unsigned int> outerArraySizes;
+ unsigned int outerArrayOffset;
+};
+
+struct BufferVariable : public sh::ShaderVariable, public ActiveVariable
+{
+ BufferVariable();
+ BufferVariable(GLenum type,
+ GLenum precision,
+ const std::string &name,
+ const std::vector<unsigned int> &arraySizes,
+ const int bufferIndex,
+ const sh::BlockMemberInfo &blockInfo);
+ ~BufferVariable() override;
+
+ int bufferIndex;
+ sh::BlockMemberInfo blockInfo;
+
+ int topLevelArraySize;
+};
+
+// 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 : public ActiveVariable
+{
+ ShaderVariableBuffer();
+ ShaderVariableBuffer(const ShaderVariableBuffer &other);
+ ~ShaderVariableBuffer() override;
+ int numActiveVariables() const;
+
+ int binding;
+ unsigned int dataSize;
+ std::vector<unsigned int> memberIndexes;
+};
+
+using AtomicCounterBuffer = ShaderVariableBuffer;
+
+// Helper struct representing a single shader interface block
+struct InterfaceBlock : public ShaderVariableBuffer
+{
+ InterfaceBlock();
+ InterfaceBlock(const std::string &nameIn,
+ const std::string &mappedNameIn,
+ bool isArrayIn,
+ unsigned int arrayElementIn,
+ unsigned int firstFieldArraySizeIn,
+ int bindingIn);
+
+ std::string nameWithArrayIndex() const;
+ std::string mappedNameWithArrayIndex() const;
+
+ std::string name;
+ std::string mappedName;
+ bool isArray;
+ unsigned int arrayElement;
+ unsigned int firstFieldArraySize;
+};
+
+} // namespace gl
+
+#endif // LIBANGLE_UNIFORM_H_