xref: /aosp_15_r20/external/angle/src/libANGLE/Uniform.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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