1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2010 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_UNIFORM_H_ 8*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_UNIFORM_H_ 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include <string> 11*8975f5c5SAndroid Build Coastguard Worker #include <vector> 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "common/MemoryBuffer.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "common/uniform_type_info_autogen.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/blocklayout.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker namespace gl 22*8975f5c5SAndroid Build Coastguard Worker { 23*8975f5c5SAndroid Build Coastguard Worker class BinaryInputStream; 24*8975f5c5SAndroid Build Coastguard Worker class BinaryOutputStream; 25*8975f5c5SAndroid Build Coastguard Worker struct UniformTypeInfo; 26*8975f5c5SAndroid Build Coastguard Worker struct UsedUniform; 27*8975f5c5SAndroid Build Coastguard Worker struct LinkedUniform; 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker #define ACTIVE_VARIABLE_COMMON_INTERFACES \ 30*8975f5c5SAndroid Build Coastguard Worker void setActive(ShaderType shaderType, bool used, uint32_t id) \ 31*8975f5c5SAndroid Build Coastguard Worker { \ 32*8975f5c5SAndroid Build Coastguard Worker ASSERT(shaderType != ShaderType::InvalidEnum); \ 33*8975f5c5SAndroid Build Coastguard Worker pod.activeUseBits.set(shaderType, used); \ 34*8975f5c5SAndroid Build Coastguard Worker pod.ids[shaderType] = id; \ 35*8975f5c5SAndroid Build Coastguard Worker } \ 36*8975f5c5SAndroid Build Coastguard Worker ShaderType getFirstActiveShaderType() const \ 37*8975f5c5SAndroid Build Coastguard Worker { \ 38*8975f5c5SAndroid Build Coastguard Worker return pod.activeUseBits.first(); \ 39*8975f5c5SAndroid Build Coastguard Worker } \ 40*8975f5c5SAndroid Build Coastguard Worker bool isActive(ShaderType shaderType) const \ 41*8975f5c5SAndroid Build Coastguard Worker { \ 42*8975f5c5SAndroid Build Coastguard Worker return pod.activeUseBits[shaderType]; \ 43*8975f5c5SAndroid Build Coastguard Worker } \ 44*8975f5c5SAndroid Build Coastguard Worker const ShaderMap<uint32_t> &getIds() const \ 45*8975f5c5SAndroid Build Coastguard Worker { \ 46*8975f5c5SAndroid Build Coastguard Worker return pod.ids; \ 47*8975f5c5SAndroid Build Coastguard Worker } \ 48*8975f5c5SAndroid Build Coastguard Worker uint32_t getId(ShaderType shaderType) const \ 49*8975f5c5SAndroid Build Coastguard Worker { \ 50*8975f5c5SAndroid Build Coastguard Worker return pod.ids[shaderType]; \ 51*8975f5c5SAndroid Build Coastguard Worker } \ 52*8975f5c5SAndroid Build Coastguard Worker ShaderBitSet activeShaders() const \ 53*8975f5c5SAndroid Build Coastguard Worker { \ 54*8975f5c5SAndroid Build Coastguard Worker return pod.activeUseBits; \ 55*8975f5c5SAndroid Build Coastguard Worker } \ 56*8975f5c5SAndroid Build Coastguard Worker uint32_t activeShaderCount() const \ 57*8975f5c5SAndroid Build Coastguard Worker { \ 58*8975f5c5SAndroid Build Coastguard Worker return static_cast<uint32_t>(pod.activeUseBits.count()); \ 59*8975f5c5SAndroid Build Coastguard Worker } 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker struct ActiveVariable 62*8975f5c5SAndroid Build Coastguard Worker { ActiveVariableActiveVariable63*8975f5c5SAndroid Build Coastguard Worker ActiveVariable() { memset(&pod, 0, sizeof(pod)); } 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Worker ACTIVE_VARIABLE_COMMON_INTERFACES 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker struct PODStruct 68*8975f5c5SAndroid Build Coastguard Worker { 69*8975f5c5SAndroid Build Coastguard Worker ShaderBitSet activeUseBits; 70*8975f5c5SAndroid Build Coastguard Worker // The id of a linked variable in each shader stage. This id originates from 71*8975f5c5SAndroid Build Coastguard Worker // sh::ShaderVariable::id or sh::InterfaceBlock::id 72*8975f5c5SAndroid Build Coastguard Worker ShaderMap<uint32_t> ids; 73*8975f5c5SAndroid Build Coastguard Worker } pod; 74*8975f5c5SAndroid Build Coastguard Worker }; 75*8975f5c5SAndroid Build Coastguard Worker 76*8975f5c5SAndroid Build Coastguard Worker // Important: This struct must have basic data types only, so that we can initialize with memcpy. Do 77*8975f5c5SAndroid Build Coastguard Worker // not put any std::vector or objects with virtual functions in it. 78*8975f5c5SAndroid Build Coastguard Worker // Helper struct representing a single shader uniform. Most of this structure's data member and 79*8975f5c5SAndroid Build Coastguard Worker // access functions mirrors ShaderVariable; See ShaderVars.h for more info. 80*8975f5c5SAndroid Build Coastguard Worker ANGLE_ENABLE_STRUCT_PADDING_WARNINGS 81*8975f5c5SAndroid Build Coastguard Worker struct LinkedUniform 82*8975f5c5SAndroid Build Coastguard Worker { 83*8975f5c5SAndroid Build Coastguard Worker LinkedUniform() = default; 84*8975f5c5SAndroid Build Coastguard Worker LinkedUniform(GLenum typeIn, 85*8975f5c5SAndroid Build Coastguard Worker GLenum precisionIn, 86*8975f5c5SAndroid Build Coastguard Worker const std::vector<unsigned int> &arraySizesIn, 87*8975f5c5SAndroid Build Coastguard Worker const int bindingIn, 88*8975f5c5SAndroid Build Coastguard Worker const int offsetIn, 89*8975f5c5SAndroid Build Coastguard Worker const int locationIn, 90*8975f5c5SAndroid Build Coastguard Worker const int bufferIndexIn, 91*8975f5c5SAndroid Build Coastguard Worker const sh::BlockMemberInfo &blockInfoIn); 92*8975f5c5SAndroid Build Coastguard Worker LinkedUniform(const UsedUniform &usedUniform); 93*8975f5c5SAndroid Build Coastguard Worker getUniformTypeInfoLinkedUniform94*8975f5c5SAndroid Build Coastguard Worker const UniformTypeInfo &getUniformTypeInfo() const 95*8975f5c5SAndroid Build Coastguard Worker { 96*8975f5c5SAndroid Build Coastguard Worker return GetUniformTypeInfoFromIndex(pod.typeIndex); 97*8975f5c5SAndroid Build Coastguard Worker } 98*8975f5c5SAndroid Build Coastguard Worker isSamplerLinkedUniform99*8975f5c5SAndroid Build Coastguard Worker bool isSampler() const { return getUniformTypeInfo().isSampler; } isImageLinkedUniform100*8975f5c5SAndroid Build Coastguard Worker bool isImage() const { return getUniformTypeInfo().isImageType; } isAtomicCounterLinkedUniform101*8975f5c5SAndroid Build Coastguard Worker bool isAtomicCounter() const { return IsAtomicCounterType(getType()); } isInDefaultBlockLinkedUniform102*8975f5c5SAndroid Build Coastguard Worker bool isInDefaultBlock() const { return pod.bufferIndex == -1; } getElementSizeLinkedUniform103*8975f5c5SAndroid Build Coastguard Worker size_t getElementSize() const { return getUniformTypeInfo().externalSize; } getElementComponentsLinkedUniform104*8975f5c5SAndroid Build Coastguard Worker GLint getElementComponents() const { return GetUniformElementComponents(pod.typeIndex); } 105*8975f5c5SAndroid Build Coastguard Worker isTexelFetchStaticUseLinkedUniform106*8975f5c5SAndroid Build Coastguard Worker bool isTexelFetchStaticUse() const { return pod.flagBits.texelFetchStaticUse; } isFragmentInOutLinkedUniform107*8975f5c5SAndroid Build Coastguard Worker bool isFragmentInOut() const { return pod.flagBits.isFragmentInOut; } 108*8975f5c5SAndroid Build Coastguard Worker isArrayLinkedUniform109*8975f5c5SAndroid Build Coastguard Worker bool isArray() const { return pod.flagBits.isArray; } getBasicTypeElementCountLinkedUniform110*8975f5c5SAndroid Build Coastguard Worker uint16_t getBasicTypeElementCount() const 111*8975f5c5SAndroid Build Coastguard Worker { 112*8975f5c5SAndroid Build Coastguard Worker ASSERT(pod.flagBits.isArray || pod.arraySize == 1u); 113*8975f5c5SAndroid Build Coastguard Worker return pod.arraySize; 114*8975f5c5SAndroid Build Coastguard Worker } 115*8975f5c5SAndroid Build Coastguard Worker getTypeLinkedUniform116*8975f5c5SAndroid Build Coastguard Worker GLenum getType() const { return getUniformTypeInfo().type; } getOuterArrayOffsetLinkedUniform117*8975f5c5SAndroid Build Coastguard Worker uint16_t getOuterArrayOffset() const { return pod.outerArrayOffset; } getOuterArraySizeProductLinkedUniform118*8975f5c5SAndroid Build Coastguard Worker uint16_t getOuterArraySizeProduct() const { return pod.outerArraySizeProduct; } getBindingLinkedUniform119*8975f5c5SAndroid Build Coastguard Worker int16_t getBinding() const { return pod.binding; } getOffsetLinkedUniform120*8975f5c5SAndroid Build Coastguard Worker int16_t getOffset() const { return pod.offset; } getBufferIndexLinkedUniform121*8975f5c5SAndroid Build Coastguard Worker int getBufferIndex() const { return pod.bufferIndex; } getLocationLinkedUniform122*8975f5c5SAndroid Build Coastguard Worker int getLocation() const { return pod.location; } getImageUnitFormatLinkedUniform123*8975f5c5SAndroid Build Coastguard Worker GLenum getImageUnitFormat() const { return pod.imageUnitFormat; } 124*8975f5c5SAndroid Build Coastguard Worker 125*8975f5c5SAndroid Build Coastguard Worker ACTIVE_VARIABLE_COMMON_INTERFACES 126*8975f5c5SAndroid Build Coastguard Worker 127*8975f5c5SAndroid Build Coastguard Worker struct PODStruct 128*8975f5c5SAndroid Build Coastguard Worker { 129*8975f5c5SAndroid Build Coastguard Worker UniformTypeIndex typeIndex; 130*8975f5c5SAndroid Build Coastguard Worker uint16_t precision; 131*8975f5c5SAndroid Build Coastguard Worker 132*8975f5c5SAndroid Build Coastguard Worker int32_t location; 133*8975f5c5SAndroid Build Coastguard Worker 134*8975f5c5SAndroid Build Coastguard Worker // These are from sh::struct BlockMemberInfo struct. See locklayout.h for detail. 135*8975f5c5SAndroid Build Coastguard Worker uint16_t blockOffset; 136*8975f5c5SAndroid Build Coastguard Worker uint16_t blockArrayStride; 137*8975f5c5SAndroid Build Coastguard Worker 138*8975f5c5SAndroid Build Coastguard Worker uint16_t blockMatrixStride; 139*8975f5c5SAndroid Build Coastguard Worker uint16_t imageUnitFormat; 140*8975f5c5SAndroid Build Coastguard Worker 141*8975f5c5SAndroid Build Coastguard Worker // maxUniformVectorsCount is 4K due to we clamp maxUniformBlockSize to 64KB. All of these 142*8975f5c5SAndroid Build Coastguard Worker // variable should be enough to pack into 16 bits to reduce the size of mUniforms. 143*8975f5c5SAndroid Build Coastguard Worker int16_t binding; 144*8975f5c5SAndroid Build Coastguard Worker int16_t bufferIndex; 145*8975f5c5SAndroid Build Coastguard Worker 146*8975f5c5SAndroid Build Coastguard Worker int16_t offset; 147*8975f5c5SAndroid Build Coastguard Worker uint16_t arraySize; 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker uint16_t outerArraySizeProduct; 150*8975f5c5SAndroid Build Coastguard Worker uint16_t outerArrayOffset; 151*8975f5c5SAndroid Build Coastguard Worker 152*8975f5c5SAndroid Build Coastguard Worker uint16_t parentArrayIndex; 153*8975f5c5SAndroid Build Coastguard Worker union 154*8975f5c5SAndroid Build Coastguard Worker { 155*8975f5c5SAndroid Build Coastguard Worker struct 156*8975f5c5SAndroid Build Coastguard Worker { 157*8975f5c5SAndroid Build Coastguard Worker uint8_t isFragmentInOut : 1; 158*8975f5c5SAndroid Build Coastguard Worker uint8_t texelFetchStaticUse : 1; 159*8975f5c5SAndroid Build Coastguard Worker uint8_t isArray : 1; 160*8975f5c5SAndroid Build Coastguard Worker uint8_t blockIsRowMajorMatrix : 1; 161*8975f5c5SAndroid Build Coastguard Worker uint8_t isBlock : 1; 162*8975f5c5SAndroid Build Coastguard Worker uint8_t padding : 3; 163*8975f5c5SAndroid Build Coastguard Worker } flagBits; 164*8975f5c5SAndroid Build Coastguard Worker uint8_t flagBitsAsUByte; 165*8975f5c5SAndroid Build Coastguard Worker }; 166*8975f5c5SAndroid Build Coastguard Worker ShaderBitSet activeUseBits; 167*8975f5c5SAndroid Build Coastguard Worker 168*8975f5c5SAndroid Build Coastguard Worker uint32_t id; 169*8975f5c5SAndroid Build Coastguard Worker // The id of a linked variable in each shader stage. This id originates from 170*8975f5c5SAndroid Build Coastguard Worker // sh::ShaderVariable::id or sh::InterfaceBlock::id 171*8975f5c5SAndroid Build Coastguard Worker ShaderMap<uint32_t> ids; 172*8975f5c5SAndroid Build Coastguard Worker } pod; 173*8975f5c5SAndroid Build Coastguard Worker }; 174*8975f5c5SAndroid Build Coastguard Worker ANGLE_DISABLE_STRUCT_PADDING_WARNINGS 175*8975f5c5SAndroid Build Coastguard Worker 176*8975f5c5SAndroid Build Coastguard Worker struct BufferVariable 177*8975f5c5SAndroid Build Coastguard Worker { 178*8975f5c5SAndroid Build Coastguard Worker BufferVariable(); 179*8975f5c5SAndroid Build Coastguard Worker BufferVariable(GLenum type, 180*8975f5c5SAndroid Build Coastguard Worker GLenum precision, 181*8975f5c5SAndroid Build Coastguard Worker const std::string &name, 182*8975f5c5SAndroid Build Coastguard Worker const std::vector<unsigned int> &arraySizes, 183*8975f5c5SAndroid Build Coastguard Worker const int bufferIndex, 184*8975f5c5SAndroid Build Coastguard Worker int topLevelArraySize, 185*8975f5c5SAndroid Build Coastguard Worker const sh::BlockMemberInfo &blockInfo); ~BufferVariableBufferVariable186*8975f5c5SAndroid Build Coastguard Worker ~BufferVariable() {} 187*8975f5c5SAndroid Build Coastguard Worker isArrayBufferVariable188*8975f5c5SAndroid Build Coastguard Worker bool isArray() const { return pod.isArray; } getBasicTypeElementCountBufferVariable189*8975f5c5SAndroid Build Coastguard Worker uint32_t getBasicTypeElementCount() const { return pod.basicTypeElementCount; } 190*8975f5c5SAndroid Build Coastguard Worker 191*8975f5c5SAndroid Build Coastguard Worker ACTIVE_VARIABLE_COMMON_INTERFACES 192*8975f5c5SAndroid Build Coastguard Worker 193*8975f5c5SAndroid Build Coastguard Worker std::string name; 194*8975f5c5SAndroid Build Coastguard Worker std::string mappedName; 195*8975f5c5SAndroid Build Coastguard Worker 196*8975f5c5SAndroid Build Coastguard Worker ANGLE_ENABLE_STRUCT_PADDING_WARNINGS 197*8975f5c5SAndroid Build Coastguard Worker struct PODStruct 198*8975f5c5SAndroid Build Coastguard Worker { 199*8975f5c5SAndroid Build Coastguard Worker uint16_t type; 200*8975f5c5SAndroid Build Coastguard Worker uint16_t precision; 201*8975f5c5SAndroid Build Coastguard Worker 202*8975f5c5SAndroid Build Coastguard Worker // 1 byte each 203*8975f5c5SAndroid Build Coastguard Worker ShaderBitSet activeUseBits; 204*8975f5c5SAndroid Build Coastguard Worker bool isArray; 205*8975f5c5SAndroid Build Coastguard Worker 206*8975f5c5SAndroid Build Coastguard Worker int16_t bufferIndex; 207*8975f5c5SAndroid Build Coastguard Worker 208*8975f5c5SAndroid Build Coastguard Worker // The id of a linked variable in each shader stage. This id originates from 209*8975f5c5SAndroid Build Coastguard Worker // sh::ShaderVariable::id or sh::InterfaceBlock::id 210*8975f5c5SAndroid Build Coastguard Worker ShaderMap<uint32_t> ids; 211*8975f5c5SAndroid Build Coastguard Worker 212*8975f5c5SAndroid Build Coastguard Worker sh::BlockMemberInfo blockInfo; 213*8975f5c5SAndroid Build Coastguard Worker 214*8975f5c5SAndroid Build Coastguard Worker int32_t topLevelArraySize; 215*8975f5c5SAndroid Build Coastguard Worker uint32_t basicTypeElementCount; 216*8975f5c5SAndroid Build Coastguard Worker } pod; 217*8975f5c5SAndroid Build Coastguard Worker ANGLE_DISABLE_STRUCT_PADDING_WARNINGS 218*8975f5c5SAndroid Build Coastguard Worker }; 219*8975f5c5SAndroid Build Coastguard Worker 220*8975f5c5SAndroid Build Coastguard Worker // Represents a single atomic counter buffer 221*8975f5c5SAndroid Build Coastguard Worker struct AtomicCounterBuffer 222*8975f5c5SAndroid Build Coastguard Worker { 223*8975f5c5SAndroid Build Coastguard Worker AtomicCounterBuffer(); ~AtomicCounterBufferAtomicCounterBuffer224*8975f5c5SAndroid Build Coastguard Worker ~AtomicCounterBuffer() {} 225*8975f5c5SAndroid Build Coastguard Worker 226*8975f5c5SAndroid Build Coastguard Worker ACTIVE_VARIABLE_COMMON_INTERFACES numActiveVariablesAtomicCounterBuffer227*8975f5c5SAndroid Build Coastguard Worker int numActiveVariables() const { return static_cast<int>(memberIndexes.size()); } 228*8975f5c5SAndroid Build Coastguard Worker void unionReferencesWith(const LinkedUniform &otherUniform); 229*8975f5c5SAndroid Build Coastguard Worker 230*8975f5c5SAndroid Build Coastguard Worker std::vector<unsigned int> memberIndexes; 231*8975f5c5SAndroid Build Coastguard Worker 232*8975f5c5SAndroid Build Coastguard Worker ANGLE_ENABLE_STRUCT_PADDING_WARNINGS 233*8975f5c5SAndroid Build Coastguard Worker struct PODStruct 234*8975f5c5SAndroid Build Coastguard Worker { 235*8975f5c5SAndroid Build Coastguard Worker // The id of a linked variable in each shader stage. This id originates from 236*8975f5c5SAndroid Build Coastguard Worker // sh::ShaderVariable::id or sh::InterfaceBlock::id 237*8975f5c5SAndroid Build Coastguard Worker ShaderMap<uint32_t> ids; 238*8975f5c5SAndroid Build Coastguard Worker // The binding as specified by the shader. 239*8975f5c5SAndroid Build Coastguard Worker int inShaderBinding; 240*8975f5c5SAndroid Build Coastguard Worker unsigned int dataSize; 241*8975f5c5SAndroid Build Coastguard Worker ShaderBitSet activeUseBits; 242*8975f5c5SAndroid Build Coastguard Worker uint8_t pads[3]; 243*8975f5c5SAndroid Build Coastguard Worker } pod; 244*8975f5c5SAndroid Build Coastguard Worker ANGLE_DISABLE_STRUCT_PADDING_WARNINGS 245*8975f5c5SAndroid Build Coastguard Worker }; 246*8975f5c5SAndroid Build Coastguard Worker 247*8975f5c5SAndroid Build Coastguard Worker // Helper struct representing a single shader interface block 248*8975f5c5SAndroid Build Coastguard Worker struct InterfaceBlock 249*8975f5c5SAndroid Build Coastguard Worker { 250*8975f5c5SAndroid Build Coastguard Worker InterfaceBlock(); 251*8975f5c5SAndroid Build Coastguard Worker InterfaceBlock(const std::string &nameIn, 252*8975f5c5SAndroid Build Coastguard Worker const std::string &mappedNameIn, 253*8975f5c5SAndroid Build Coastguard Worker bool isArrayIn, 254*8975f5c5SAndroid Build Coastguard Worker bool isReadOnlyIn, 255*8975f5c5SAndroid Build Coastguard Worker unsigned int arrayElementIn, 256*8975f5c5SAndroid Build Coastguard Worker unsigned int firstFieldArraySizeIn, 257*8975f5c5SAndroid Build Coastguard Worker int bindingIn); 258*8975f5c5SAndroid Build Coastguard Worker 259*8975f5c5SAndroid Build Coastguard Worker std::string nameWithArrayIndex() const; 260*8975f5c5SAndroid Build Coastguard Worker std::string mappedNameWithArrayIndex() const; 261*8975f5c5SAndroid Build Coastguard Worker 262*8975f5c5SAndroid Build Coastguard Worker ACTIVE_VARIABLE_COMMON_INTERFACES 263*8975f5c5SAndroid Build Coastguard Worker numActiveVariablesInterfaceBlock264*8975f5c5SAndroid Build Coastguard Worker int numActiveVariables() const { return static_cast<int>(memberIndexes.size()); } 265*8975f5c5SAndroid Build Coastguard Worker 266*8975f5c5SAndroid Build Coastguard Worker std::string name; 267*8975f5c5SAndroid Build Coastguard Worker std::string mappedName; 268*8975f5c5SAndroid Build Coastguard Worker std::vector<unsigned int> memberIndexes; 269*8975f5c5SAndroid Build Coastguard Worker 270*8975f5c5SAndroid Build Coastguard Worker ANGLE_ENABLE_STRUCT_PADDING_WARNINGS 271*8975f5c5SAndroid Build Coastguard Worker struct PODStruct 272*8975f5c5SAndroid Build Coastguard Worker { 273*8975f5c5SAndroid Build Coastguard Worker uint32_t arrayElement; 274*8975f5c5SAndroid Build Coastguard Worker uint32_t firstFieldArraySize; 275*8975f5c5SAndroid Build Coastguard Worker 276*8975f5c5SAndroid Build Coastguard Worker ShaderBitSet activeUseBits; 277*8975f5c5SAndroid Build Coastguard Worker uint8_t isArray : 1; 278*8975f5c5SAndroid Build Coastguard Worker // Only valid for SSBOs, specifies whether it has the readonly qualifier. 279*8975f5c5SAndroid Build Coastguard Worker uint8_t isReadOnly : 1; 280*8975f5c5SAndroid Build Coastguard Worker uint8_t padings : 6; 281*8975f5c5SAndroid Build Coastguard Worker // The binding as specified by the shader (0 if unspecified, per spec) 282*8975f5c5SAndroid Build Coastguard Worker int16_t inShaderBinding; 283*8975f5c5SAndroid Build Coastguard Worker 284*8975f5c5SAndroid Build Coastguard Worker unsigned int dataSize; 285*8975f5c5SAndroid Build Coastguard Worker // The id of a linked variable in each shader stage. This id originates from 286*8975f5c5SAndroid Build Coastguard Worker // sh::ShaderVariable::id or sh::InterfaceBlock::id 287*8975f5c5SAndroid Build Coastguard Worker ShaderMap<uint32_t> ids; 288*8975f5c5SAndroid Build Coastguard Worker } pod; 289*8975f5c5SAndroid Build Coastguard Worker ANGLE_DISABLE_STRUCT_PADDING_WARNINGS 290*8975f5c5SAndroid Build Coastguard Worker }; 291*8975f5c5SAndroid Build Coastguard Worker 292*8975f5c5SAndroid Build Coastguard Worker #undef ACTIVE_VARIABLE_COMMON_INTERFACES 293*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 294*8975f5c5SAndroid Build Coastguard Worker 295*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_UNIFORM_H_ 296