| // |
| // Copyright (c) 2013-2014 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. |
| // |
| // shadervars.h: |
| // Types to represent GL variables (varyings, uniforms, etc) |
| // |
| |
| #ifndef COMMON_SHADERVARIABLE_H_ |
| #define COMMON_SHADERVARIABLE_H_ |
| |
| #include <string> |
| #include <vector> |
| #include <algorithm> |
| |
| #include <GLES3/gl3.h> |
| #include <GLES2/gl2.h> |
| |
| namespace gl |
| { |
| |
| // Varying interpolation qualifier, see section 4.3.9 of the ESSL 3.00.4 spec |
| enum InterpolationType |
| { |
| INTERPOLATION_SMOOTH, |
| INTERPOLATION_CENTROID, |
| INTERPOLATION_FLAT |
| }; |
| |
| // Uniform block layout qualifier, see section 4.3.8.3 of the ESSL 3.00.4 spec |
| enum BlockLayoutType |
| { |
| BLOCKLAYOUT_STANDARD, |
| BLOCKLAYOUT_PACKED, |
| BLOCKLAYOUT_SHARED |
| }; |
| |
| // Base class for all variables defined in shaders, including Varyings, Uniforms, etc |
| struct ShaderVariable |
| { |
| GLenum type; |
| GLenum precision; |
| std::string name; |
| unsigned int arraySize; |
| |
| ShaderVariable(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn) |
| : type(typeIn), |
| precision(precisionIn), |
| name(nameIn), |
| arraySize(arraySizeIn) |
| {} |
| |
| bool isArray() const { return arraySize > 0; } |
| unsigned int elementCount() const { return std::max(1u, arraySize); } |
| }; |
| |
| // Uniform registers (and element indices) are assigned when outputting shader code |
| struct Uniform : public ShaderVariable |
| { |
| unsigned int registerIndex; |
| unsigned int elementIndex; // Offset within a register, for struct members |
| std::vector<Uniform> fields; |
| |
| Uniform(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn, |
| unsigned int registerIndexIn, unsigned int elementIndexIn) |
| : ShaderVariable(typeIn, precisionIn, nameIn, arraySizeIn), |
| registerIndex(registerIndexIn), |
| elementIndex(elementIndexIn) |
| {} |
| |
| bool isStruct() const { return !fields.empty(); } |
| }; |
| |
| struct Attribute : public ShaderVariable |
| { |
| int location; |
| |
| Attribute() |
| : ShaderVariable(GL_NONE, GL_NONE, "", 0), |
| location(-1) |
| {} |
| |
| Attribute(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn, int locationIn) |
| : ShaderVariable(typeIn, precisionIn, nameIn, arraySizeIn), |
| location(locationIn) |
| {} |
| }; |
| |
| struct InterfaceBlockField : public ShaderVariable |
| { |
| bool isRowMajorMatrix; |
| std::vector<InterfaceBlockField> fields; |
| |
| InterfaceBlockField(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn, bool isRowMajorMatrix) |
| : ShaderVariable(typeIn, precisionIn, nameIn, arraySizeIn), |
| isRowMajorMatrix(isRowMajorMatrix) |
| {} |
| |
| bool isStruct() const { return !fields.empty(); } |
| }; |
| |
| struct Varying : public ShaderVariable |
| { |
| InterpolationType interpolation; |
| std::vector<Varying> fields; |
| std::string structName; |
| |
| Varying(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn, InterpolationType interpolationIn) |
| : ShaderVariable(typeIn, precisionIn, nameIn, arraySizeIn), |
| interpolation(interpolationIn) |
| {} |
| |
| bool isStruct() const { return !fields.empty(); } |
| }; |
| |
| struct BlockMemberInfo |
| { |
| int offset; |
| int arrayStride; |
| int matrixStride; |
| bool isRowMajorMatrix; |
| |
| static BlockMemberInfo getDefaultBlockInfo() |
| { |
| return BlockMemberInfo(-1, -1, -1, false); |
| } |
| |
| BlockMemberInfo(int offset, int arrayStride, int matrixStride, bool isRowMajorMatrix) |
| : offset(offset), |
| arrayStride(arrayStride), |
| matrixStride(matrixStride), |
| isRowMajorMatrix(isRowMajorMatrix) |
| {} |
| }; |
| |
| typedef std::vector<BlockMemberInfo> BlockMemberInfoArray; |
| |
| struct InterfaceBlock |
| { |
| std::string name; |
| unsigned int arraySize; |
| size_t dataSize; |
| BlockLayoutType layout; |
| bool isRowMajorLayout; |
| std::vector<InterfaceBlockField> fields; |
| std::vector<BlockMemberInfo> blockInfo; |
| |
| unsigned int registerIndex; |
| |
| InterfaceBlock(const char *name, unsigned int arraySize, unsigned int registerIndex) |
| : name(name), |
| arraySize(arraySize), |
| layout(BLOCKLAYOUT_SHARED), |
| registerIndex(registerIndex), |
| isRowMajorLayout(false) |
| {} |
| }; |
| |
| } |
| |
| #endif // COMMON_SHADERVARIABLE_H_ |