xref: /aosp_15_r20/external/angle/src/common/CompiledShaderState.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2022 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 // CompiledShaderState.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //   Implements CompiledShaderState, and helper functions for serializing and deserializing
8*8975f5c5SAndroid Build Coastguard Worker //   shader variables.
9*8975f5c5SAndroid Build Coastguard Worker //
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "common/CompiledShaderState.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/BinaryStream.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace gl
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker namespace
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker template <typename VarT>
GetActiveShaderVariables(const std::vector<VarT> * variableList)21*8975f5c5SAndroid Build Coastguard Worker std::vector<VarT> GetActiveShaderVariables(const std::vector<VarT> *variableList)
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker     ASSERT(variableList);
24*8975f5c5SAndroid Build Coastguard Worker     std::vector<VarT> result;
25*8975f5c5SAndroid Build Coastguard Worker     for (size_t varIndex = 0; varIndex < variableList->size(); varIndex++)
26*8975f5c5SAndroid Build Coastguard Worker     {
27*8975f5c5SAndroid Build Coastguard Worker         const VarT &var = variableList->at(varIndex);
28*8975f5c5SAndroid Build Coastguard Worker         if (var.active)
29*8975f5c5SAndroid Build Coastguard Worker         {
30*8975f5c5SAndroid Build Coastguard Worker             result.push_back(var);
31*8975f5c5SAndroid Build Coastguard Worker         }
32*8975f5c5SAndroid Build Coastguard Worker     }
33*8975f5c5SAndroid Build Coastguard Worker     return result;
34*8975f5c5SAndroid Build Coastguard Worker }
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker template <typename VarT>
GetShaderVariables(const std::vector<VarT> * variableList)37*8975f5c5SAndroid Build Coastguard Worker const std::vector<VarT> &GetShaderVariables(const std::vector<VarT> *variableList)
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker     ASSERT(variableList);
40*8975f5c5SAndroid Build Coastguard Worker     return *variableList;
41*8975f5c5SAndroid Build Coastguard Worker }
42*8975f5c5SAndroid Build Coastguard Worker }  // namespace
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker // true if varying x has a higher priority in packing than y
CompareShaderVar(const sh::ShaderVariable & x,const sh::ShaderVariable & y)45*8975f5c5SAndroid Build Coastguard Worker bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y)
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker     if (x.type == y.type)
48*8975f5c5SAndroid Build Coastguard Worker     {
49*8975f5c5SAndroid Build Coastguard Worker         return x.getArraySizeProduct() > y.getArraySizeProduct();
50*8975f5c5SAndroid Build Coastguard Worker     }
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     // Special case for handling structs: we sort these to the end of the list
53*8975f5c5SAndroid Build Coastguard Worker     if (x.type == GL_NONE)
54*8975f5c5SAndroid Build Coastguard Worker     {
55*8975f5c5SAndroid Build Coastguard Worker         return false;
56*8975f5c5SAndroid Build Coastguard Worker     }
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker     if (y.type == GL_NONE)
59*8975f5c5SAndroid Build Coastguard Worker     {
60*8975f5c5SAndroid Build Coastguard Worker         return true;
61*8975f5c5SAndroid Build Coastguard Worker     }
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     return gl::VariableSortOrder(x.type) < gl::VariableSortOrder(y.type);
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker 
WriteShaderVar(gl::BinaryOutputStream * stream,const sh::ShaderVariable & var)66*8975f5c5SAndroid Build Coastguard Worker void WriteShaderVar(gl::BinaryOutputStream *stream, const sh::ShaderVariable &var)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.type);
69*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.precision);
70*8975f5c5SAndroid Build Coastguard Worker     stream->writeString(var.name);
71*8975f5c5SAndroid Build Coastguard Worker     stream->writeString(var.mappedName);
72*8975f5c5SAndroid Build Coastguard Worker     stream->writeVector(var.arraySizes);
73*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.staticUse);
74*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.active);
75*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt<size_t>(var.fields.size());
76*8975f5c5SAndroid Build Coastguard Worker     for (const sh::ShaderVariable &shaderVariable : var.fields)
77*8975f5c5SAndroid Build Coastguard Worker     {
78*8975f5c5SAndroid Build Coastguard Worker         WriteShaderVar(stream, shaderVariable);
79*8975f5c5SAndroid Build Coastguard Worker     }
80*8975f5c5SAndroid Build Coastguard Worker     stream->writeString(var.structOrBlockName);
81*8975f5c5SAndroid Build Coastguard Worker     stream->writeString(var.mappedStructOrBlockName);
82*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.isRowMajorLayout);
83*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.location);
84*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.hasImplicitLocation);
85*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.binding);
86*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.imageUnitFormat);
87*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.offset);
88*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.rasterOrdered);
89*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.readonly);
90*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.writeonly);
91*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.isFragmentInOut);
92*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.index);
93*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.yuv);
94*8975f5c5SAndroid Build Coastguard Worker     stream->writeEnum(var.interpolation);
95*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.isInvariant);
96*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.isShaderIOBlock);
97*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.isPatch);
98*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(var.texelFetchStaticUse);
99*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.getFlattenedOffsetInParentArrays());
100*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(var.id);
101*8975f5c5SAndroid Build Coastguard Worker }
102*8975f5c5SAndroid Build Coastguard Worker 
LoadShaderVar(gl::BinaryInputStream * stream,sh::ShaderVariable * var)103*8975f5c5SAndroid Build Coastguard Worker void LoadShaderVar(gl::BinaryInputStream *stream, sh::ShaderVariable *var)
104*8975f5c5SAndroid Build Coastguard Worker {
105*8975f5c5SAndroid Build Coastguard Worker     var->type      = stream->readInt<GLenum>();
106*8975f5c5SAndroid Build Coastguard Worker     var->precision = stream->readInt<GLenum>();
107*8975f5c5SAndroid Build Coastguard Worker     stream->readString(&var->name);
108*8975f5c5SAndroid Build Coastguard Worker     stream->readString(&var->mappedName);
109*8975f5c5SAndroid Build Coastguard Worker     stream->readVector(&var->arraySizes);
110*8975f5c5SAndroid Build Coastguard Worker     var->staticUse      = stream->readBool();
111*8975f5c5SAndroid Build Coastguard Worker     var->active         = stream->readBool();
112*8975f5c5SAndroid Build Coastguard Worker     size_t elementCount = stream->readInt<size_t>();
113*8975f5c5SAndroid Build Coastguard Worker     var->fields.resize(elementCount);
114*8975f5c5SAndroid Build Coastguard Worker     for (sh::ShaderVariable &variable : var->fields)
115*8975f5c5SAndroid Build Coastguard Worker     {
116*8975f5c5SAndroid Build Coastguard Worker         LoadShaderVar(stream, &variable);
117*8975f5c5SAndroid Build Coastguard Worker     }
118*8975f5c5SAndroid Build Coastguard Worker     stream->readString(&var->structOrBlockName);
119*8975f5c5SAndroid Build Coastguard Worker     stream->readString(&var->mappedStructOrBlockName);
120*8975f5c5SAndroid Build Coastguard Worker     var->isRowMajorLayout    = stream->readBool();
121*8975f5c5SAndroid Build Coastguard Worker     var->location            = stream->readInt<int>();
122*8975f5c5SAndroid Build Coastguard Worker     var->hasImplicitLocation = stream->readBool();
123*8975f5c5SAndroid Build Coastguard Worker     var->binding             = stream->readInt<int>();
124*8975f5c5SAndroid Build Coastguard Worker     var->imageUnitFormat     = stream->readInt<GLenum>();
125*8975f5c5SAndroid Build Coastguard Worker     var->offset              = stream->readInt<int>();
126*8975f5c5SAndroid Build Coastguard Worker     var->rasterOrdered       = stream->readBool();
127*8975f5c5SAndroid Build Coastguard Worker     var->readonly            = stream->readBool();
128*8975f5c5SAndroid Build Coastguard Worker     var->writeonly           = stream->readBool();
129*8975f5c5SAndroid Build Coastguard Worker     var->isFragmentInOut     = stream->readBool();
130*8975f5c5SAndroid Build Coastguard Worker     var->index               = stream->readInt<int>();
131*8975f5c5SAndroid Build Coastguard Worker     var->yuv                 = stream->readBool();
132*8975f5c5SAndroid Build Coastguard Worker     var->interpolation       = stream->readEnum<sh::InterpolationType>();
133*8975f5c5SAndroid Build Coastguard Worker     var->isInvariant         = stream->readBool();
134*8975f5c5SAndroid Build Coastguard Worker     var->isShaderIOBlock     = stream->readBool();
135*8975f5c5SAndroid Build Coastguard Worker     var->isPatch             = stream->readBool();
136*8975f5c5SAndroid Build Coastguard Worker     var->texelFetchStaticUse = stream->readBool();
137*8975f5c5SAndroid Build Coastguard Worker     var->setParentArrayIndex(stream->readInt<int>());
138*8975f5c5SAndroid Build Coastguard Worker     var->id = stream->readInt<uint32_t>();
139*8975f5c5SAndroid Build Coastguard Worker }
140*8975f5c5SAndroid Build Coastguard Worker 
WriteShInterfaceBlock(gl::BinaryOutputStream * stream,const sh::InterfaceBlock & block)141*8975f5c5SAndroid Build Coastguard Worker void WriteShInterfaceBlock(gl::BinaryOutputStream *stream, const sh::InterfaceBlock &block)
142*8975f5c5SAndroid Build Coastguard Worker {
143*8975f5c5SAndroid Build Coastguard Worker     stream->writeString(block.name);
144*8975f5c5SAndroid Build Coastguard Worker     stream->writeString(block.mappedName);
145*8975f5c5SAndroid Build Coastguard Worker     stream->writeString(block.instanceName);
146*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(block.arraySize);
147*8975f5c5SAndroid Build Coastguard Worker     stream->writeEnum(block.layout);
148*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(block.isRowMajorLayout);
149*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(block.binding);
150*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(block.staticUse);
151*8975f5c5SAndroid Build Coastguard Worker     stream->writeBool(block.active);
152*8975f5c5SAndroid Build Coastguard Worker     stream->writeEnum(block.blockType);
153*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt(block.id);
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker     stream->writeInt<size_t>(block.fields.size());
156*8975f5c5SAndroid Build Coastguard Worker     for (const sh::ShaderVariable &shaderVariable : block.fields)
157*8975f5c5SAndroid Build Coastguard Worker     {
158*8975f5c5SAndroid Build Coastguard Worker         WriteShaderVar(stream, shaderVariable);
159*8975f5c5SAndroid Build Coastguard Worker     }
160*8975f5c5SAndroid Build Coastguard Worker }
161*8975f5c5SAndroid Build Coastguard Worker 
LoadShInterfaceBlock(gl::BinaryInputStream * stream,sh::InterfaceBlock * block)162*8975f5c5SAndroid Build Coastguard Worker void LoadShInterfaceBlock(gl::BinaryInputStream *stream, sh::InterfaceBlock *block)
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker     block->name             = stream->readString();
165*8975f5c5SAndroid Build Coastguard Worker     block->mappedName       = stream->readString();
166*8975f5c5SAndroid Build Coastguard Worker     block->instanceName     = stream->readString();
167*8975f5c5SAndroid Build Coastguard Worker     block->arraySize        = stream->readInt<unsigned int>();
168*8975f5c5SAndroid Build Coastguard Worker     block->layout           = stream->readEnum<sh::BlockLayoutType>();
169*8975f5c5SAndroid Build Coastguard Worker     block->isRowMajorLayout = stream->readBool();
170*8975f5c5SAndroid Build Coastguard Worker     block->binding          = stream->readInt<int>();
171*8975f5c5SAndroid Build Coastguard Worker     block->staticUse        = stream->readBool();
172*8975f5c5SAndroid Build Coastguard Worker     block->active           = stream->readBool();
173*8975f5c5SAndroid Build Coastguard Worker     block->blockType        = stream->readEnum<sh::BlockType>();
174*8975f5c5SAndroid Build Coastguard Worker     block->id               = stream->readInt<uint32_t>();
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker     block->fields.resize(stream->readInt<size_t>());
177*8975f5c5SAndroid Build Coastguard Worker     for (sh::ShaderVariable &variable : block->fields)
178*8975f5c5SAndroid Build Coastguard Worker     {
179*8975f5c5SAndroid Build Coastguard Worker         LoadShaderVar(stream, &variable);
180*8975f5c5SAndroid Build Coastguard Worker     }
181*8975f5c5SAndroid Build Coastguard Worker }
182*8975f5c5SAndroid Build Coastguard Worker 
CompiledShaderState(gl::ShaderType type)183*8975f5c5SAndroid Build Coastguard Worker CompiledShaderState::CompiledShaderState(gl::ShaderType type)
184*8975f5c5SAndroid Build Coastguard Worker     : shaderType(type),
185*8975f5c5SAndroid Build Coastguard Worker       shaderVersion(100),
186*8975f5c5SAndroid Build Coastguard Worker       numViews(-1),
187*8975f5c5SAndroid Build Coastguard Worker       geometryShaderInputPrimitiveType(gl::PrimitiveMode::Triangles),
188*8975f5c5SAndroid Build Coastguard Worker       geometryShaderOutputPrimitiveType(gl::PrimitiveMode::Triangles),
189*8975f5c5SAndroid Build Coastguard Worker       geometryShaderMaxVertices(0),
190*8975f5c5SAndroid Build Coastguard Worker       geometryShaderInvocations(1),
191*8975f5c5SAndroid Build Coastguard Worker       tessControlShaderVertices(0),
192*8975f5c5SAndroid Build Coastguard Worker       tessGenMode(0),
193*8975f5c5SAndroid Build Coastguard Worker       tessGenSpacing(0),
194*8975f5c5SAndroid Build Coastguard Worker       tessGenVertexOrder(0),
195*8975f5c5SAndroid Build Coastguard Worker       tessGenPointMode(0)
196*8975f5c5SAndroid Build Coastguard Worker {
197*8975f5c5SAndroid Build Coastguard Worker     localSize.fill(-1);
198*8975f5c5SAndroid Build Coastguard Worker }
199*8975f5c5SAndroid Build Coastguard Worker 
~CompiledShaderState()200*8975f5c5SAndroid Build Coastguard Worker CompiledShaderState::~CompiledShaderState() {}
201*8975f5c5SAndroid Build Coastguard Worker 
buildCompiledShaderState(const ShHandle compilerHandle,const bool isBinaryOutput)202*8975f5c5SAndroid Build Coastguard Worker void CompiledShaderState::buildCompiledShaderState(const ShHandle compilerHandle,
203*8975f5c5SAndroid Build Coastguard Worker                                                    const bool isBinaryOutput)
204*8975f5c5SAndroid Build Coastguard Worker {
205*8975f5c5SAndroid Build Coastguard Worker     if (isBinaryOutput)
206*8975f5c5SAndroid Build Coastguard Worker     {
207*8975f5c5SAndroid Build Coastguard Worker         compiledBinary = sh::GetObjectBinaryBlob(compilerHandle);
208*8975f5c5SAndroid Build Coastguard Worker     }
209*8975f5c5SAndroid Build Coastguard Worker     else
210*8975f5c5SAndroid Build Coastguard Worker     {
211*8975f5c5SAndroid Build Coastguard Worker         translatedSource = sh::GetObjectCode(compilerHandle);
212*8975f5c5SAndroid Build Coastguard Worker     }
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     // Gather the shader information
215*8975f5c5SAndroid Build Coastguard Worker     shaderVersion = sh::GetShaderVersion(compilerHandle);
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker     uniforms            = GetShaderVariables(sh::GetUniforms(compilerHandle));
218*8975f5c5SAndroid Build Coastguard Worker     uniformBlocks       = GetShaderVariables(sh::GetUniformBlocks(compilerHandle));
219*8975f5c5SAndroid Build Coastguard Worker     shaderStorageBlocks = GetShaderVariables(sh::GetShaderStorageBlocks(compilerHandle));
220*8975f5c5SAndroid Build Coastguard Worker     metadataFlags       = sh::CompilerMetadataFlags(sh::GetMetadataFlags(compilerHandle));
221*8975f5c5SAndroid Build Coastguard Worker     specConstUsageBits  = SpecConstUsageBits(sh::GetShaderSpecConstUsageBits(compilerHandle));
222*8975f5c5SAndroid Build Coastguard Worker 
223*8975f5c5SAndroid Build Coastguard Worker     switch (shaderType)
224*8975f5c5SAndroid Build Coastguard Worker     {
225*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Compute:
226*8975f5c5SAndroid Build Coastguard Worker         {
227*8975f5c5SAndroid Build Coastguard Worker             allAttributes    = GetShaderVariables(sh::GetAttributes(compilerHandle));
228*8975f5c5SAndroid Build Coastguard Worker             activeAttributes = GetActiveShaderVariables(&allAttributes);
229*8975f5c5SAndroid Build Coastguard Worker             localSize        = sh::GetComputeShaderLocalGroupSize(compilerHandle);
230*8975f5c5SAndroid Build Coastguard Worker             break;
231*8975f5c5SAndroid Build Coastguard Worker         }
232*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Vertex:
233*8975f5c5SAndroid Build Coastguard Worker         {
234*8975f5c5SAndroid Build Coastguard Worker             outputVaryings   = GetShaderVariables(sh::GetOutputVaryings(compilerHandle));
235*8975f5c5SAndroid Build Coastguard Worker             allAttributes    = GetShaderVariables(sh::GetAttributes(compilerHandle));
236*8975f5c5SAndroid Build Coastguard Worker             activeAttributes = GetActiveShaderVariables(&allAttributes);
237*8975f5c5SAndroid Build Coastguard Worker             numViews         = sh::GetVertexShaderNumViews(compilerHandle);
238*8975f5c5SAndroid Build Coastguard Worker             break;
239*8975f5c5SAndroid Build Coastguard Worker         }
240*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Fragment:
241*8975f5c5SAndroid Build Coastguard Worker         {
242*8975f5c5SAndroid Build Coastguard Worker             allAttributes    = GetShaderVariables(sh::GetAttributes(compilerHandle));
243*8975f5c5SAndroid Build Coastguard Worker             activeAttributes = GetActiveShaderVariables(&allAttributes);
244*8975f5c5SAndroid Build Coastguard Worker             inputVaryings    = GetShaderVariables(sh::GetInputVaryings(compilerHandle));
245*8975f5c5SAndroid Build Coastguard Worker             // TODO(jmadill): Figure out why we only sort in the FS, and if we need to.
246*8975f5c5SAndroid Build Coastguard Worker             std::sort(inputVaryings.begin(), inputVaryings.end(), CompareShaderVar);
247*8975f5c5SAndroid Build Coastguard Worker             activeOutputVariables =
248*8975f5c5SAndroid Build Coastguard Worker                 GetActiveShaderVariables(sh::GetOutputVariables(compilerHandle));
249*8975f5c5SAndroid Build Coastguard Worker             advancedBlendEquations =
250*8975f5c5SAndroid Build Coastguard Worker                 gl::BlendEquationBitSet(sh::GetAdvancedBlendEquations(compilerHandle));
251*8975f5c5SAndroid Build Coastguard Worker             pixelLocalStorageFormats = *sh::GetPixelLocalStorageFormats(compilerHandle);
252*8975f5c5SAndroid Build Coastguard Worker             break;
253*8975f5c5SAndroid Build Coastguard Worker         }
254*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Geometry:
255*8975f5c5SAndroid Build Coastguard Worker         {
256*8975f5c5SAndroid Build Coastguard Worker             inputVaryings  = GetShaderVariables(sh::GetInputVaryings(compilerHandle));
257*8975f5c5SAndroid Build Coastguard Worker             outputVaryings = GetShaderVariables(sh::GetOutputVaryings(compilerHandle));
258*8975f5c5SAndroid Build Coastguard Worker 
259*8975f5c5SAndroid Build Coastguard Worker             if (metadataFlags[sh::MetadataFlags::HasValidGeometryShaderInputPrimitiveType])
260*8975f5c5SAndroid Build Coastguard Worker             {
261*8975f5c5SAndroid Build Coastguard Worker                 geometryShaderInputPrimitiveType = gl::FromGLenum<gl::PrimitiveMode>(
262*8975f5c5SAndroid Build Coastguard Worker                     sh::GetGeometryShaderInputPrimitiveType(compilerHandle));
263*8975f5c5SAndroid Build Coastguard Worker             }
264*8975f5c5SAndroid Build Coastguard Worker             if (metadataFlags[sh::MetadataFlags::HasValidGeometryShaderOutputPrimitiveType])
265*8975f5c5SAndroid Build Coastguard Worker             {
266*8975f5c5SAndroid Build Coastguard Worker                 geometryShaderOutputPrimitiveType = gl::FromGLenum<gl::PrimitiveMode>(
267*8975f5c5SAndroid Build Coastguard Worker                     sh::GetGeometryShaderOutputPrimitiveType(compilerHandle));
268*8975f5c5SAndroid Build Coastguard Worker             }
269*8975f5c5SAndroid Build Coastguard Worker             if (metadataFlags[sh::MetadataFlags::HasValidGeometryShaderMaxVertices])
270*8975f5c5SAndroid Build Coastguard Worker             {
271*8975f5c5SAndroid Build Coastguard Worker                 geometryShaderMaxVertices = sh::GetGeometryShaderMaxVertices(compilerHandle);
272*8975f5c5SAndroid Build Coastguard Worker             }
273*8975f5c5SAndroid Build Coastguard Worker             geometryShaderInvocations = sh::GetGeometryShaderInvocations(compilerHandle);
274*8975f5c5SAndroid Build Coastguard Worker             break;
275*8975f5c5SAndroid Build Coastguard Worker         }
276*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::TessControl:
277*8975f5c5SAndroid Build Coastguard Worker         {
278*8975f5c5SAndroid Build Coastguard Worker             inputVaryings             = GetShaderVariables(sh::GetInputVaryings(compilerHandle));
279*8975f5c5SAndroid Build Coastguard Worker             outputVaryings            = GetShaderVariables(sh::GetOutputVaryings(compilerHandle));
280*8975f5c5SAndroid Build Coastguard Worker             tessControlShaderVertices = sh::GetTessControlShaderVertices(compilerHandle);
281*8975f5c5SAndroid Build Coastguard Worker             break;
282*8975f5c5SAndroid Build Coastguard Worker         }
283*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::TessEvaluation:
284*8975f5c5SAndroid Build Coastguard Worker         {
285*8975f5c5SAndroid Build Coastguard Worker             inputVaryings  = GetShaderVariables(sh::GetInputVaryings(compilerHandle));
286*8975f5c5SAndroid Build Coastguard Worker             outputVaryings = GetShaderVariables(sh::GetOutputVaryings(compilerHandle));
287*8975f5c5SAndroid Build Coastguard Worker             if (metadataFlags[sh::MetadataFlags::HasValidTessGenMode])
288*8975f5c5SAndroid Build Coastguard Worker             {
289*8975f5c5SAndroid Build Coastguard Worker                 tessGenMode = sh::GetTessGenMode(compilerHandle);
290*8975f5c5SAndroid Build Coastguard Worker             }
291*8975f5c5SAndroid Build Coastguard Worker             if (metadataFlags[sh::MetadataFlags::HasValidTessGenSpacing])
292*8975f5c5SAndroid Build Coastguard Worker             {
293*8975f5c5SAndroid Build Coastguard Worker                 tessGenSpacing = sh::GetTessGenSpacing(compilerHandle);
294*8975f5c5SAndroid Build Coastguard Worker             }
295*8975f5c5SAndroid Build Coastguard Worker             if (metadataFlags[sh::MetadataFlags::HasValidTessGenVertexOrder])
296*8975f5c5SAndroid Build Coastguard Worker             {
297*8975f5c5SAndroid Build Coastguard Worker                 tessGenVertexOrder = sh::GetTessGenVertexOrder(compilerHandle);
298*8975f5c5SAndroid Build Coastguard Worker             }
299*8975f5c5SAndroid Build Coastguard Worker             if (metadataFlags[sh::MetadataFlags::HasValidTessGenPointMode])
300*8975f5c5SAndroid Build Coastguard Worker             {
301*8975f5c5SAndroid Build Coastguard Worker                 tessGenPointMode = sh::GetTessGenPointMode(compilerHandle);
302*8975f5c5SAndroid Build Coastguard Worker             }
303*8975f5c5SAndroid Build Coastguard Worker             break;
304*8975f5c5SAndroid Build Coastguard Worker         }
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker         default:
307*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
308*8975f5c5SAndroid Build Coastguard Worker     }
309*8975f5c5SAndroid Build Coastguard Worker }
310*8975f5c5SAndroid Build Coastguard Worker 
serialize(gl::BinaryOutputStream & stream) const311*8975f5c5SAndroid Build Coastguard Worker void CompiledShaderState::serialize(gl::BinaryOutputStream &stream) const
312*8975f5c5SAndroid Build Coastguard Worker {
313*8975f5c5SAndroid Build Coastguard Worker     stream.writeInt(shaderVersion);
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     stream.writeInt(uniforms.size());
316*8975f5c5SAndroid Build Coastguard Worker     for (const sh::ShaderVariable &shaderVariable : uniforms)
317*8975f5c5SAndroid Build Coastguard Worker     {
318*8975f5c5SAndroid Build Coastguard Worker         WriteShaderVar(&stream, shaderVariable);
319*8975f5c5SAndroid Build Coastguard Worker     }
320*8975f5c5SAndroid Build Coastguard Worker 
321*8975f5c5SAndroid Build Coastguard Worker     stream.writeInt(uniformBlocks.size());
322*8975f5c5SAndroid Build Coastguard Worker     for (const sh::InterfaceBlock &interfaceBlock : uniformBlocks)
323*8975f5c5SAndroid Build Coastguard Worker     {
324*8975f5c5SAndroid Build Coastguard Worker         WriteShInterfaceBlock(&stream, interfaceBlock);
325*8975f5c5SAndroid Build Coastguard Worker     }
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker     stream.writeInt(shaderStorageBlocks.size());
328*8975f5c5SAndroid Build Coastguard Worker     for (const sh::InterfaceBlock &interfaceBlock : shaderStorageBlocks)
329*8975f5c5SAndroid Build Coastguard Worker     {
330*8975f5c5SAndroid Build Coastguard Worker         WriteShInterfaceBlock(&stream, interfaceBlock);
331*8975f5c5SAndroid Build Coastguard Worker     }
332*8975f5c5SAndroid Build Coastguard Worker 
333*8975f5c5SAndroid Build Coastguard Worker     stream.writeInt(metadataFlags.bits());
334*8975f5c5SAndroid Build Coastguard Worker     stream.writeInt(specConstUsageBits.bits());
335*8975f5c5SAndroid Build Coastguard Worker 
336*8975f5c5SAndroid Build Coastguard Worker     switch (shaderType)
337*8975f5c5SAndroid Build Coastguard Worker     {
338*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Compute:
339*8975f5c5SAndroid Build Coastguard Worker         {
340*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(allAttributes.size());
341*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : allAttributes)
342*8975f5c5SAndroid Build Coastguard Worker             {
343*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
344*8975f5c5SAndroid Build Coastguard Worker             }
345*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(activeAttributes.size());
346*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : activeAttributes)
347*8975f5c5SAndroid Build Coastguard Worker             {
348*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
349*8975f5c5SAndroid Build Coastguard Worker             }
350*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(localSize[0]);
351*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(localSize[1]);
352*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(localSize[2]);
353*8975f5c5SAndroid Build Coastguard Worker             break;
354*8975f5c5SAndroid Build Coastguard Worker         }
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Vertex:
357*8975f5c5SAndroid Build Coastguard Worker         {
358*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(outputVaryings.size());
359*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : outputVaryings)
360*8975f5c5SAndroid Build Coastguard Worker             {
361*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
362*8975f5c5SAndroid Build Coastguard Worker             }
363*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(allAttributes.size());
364*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : allAttributes)
365*8975f5c5SAndroid Build Coastguard Worker             {
366*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
367*8975f5c5SAndroid Build Coastguard Worker             }
368*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(activeAttributes.size());
369*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : activeAttributes)
370*8975f5c5SAndroid Build Coastguard Worker             {
371*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
372*8975f5c5SAndroid Build Coastguard Worker             }
373*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(numViews);
374*8975f5c5SAndroid Build Coastguard Worker             break;
375*8975f5c5SAndroid Build Coastguard Worker         }
376*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Fragment:
377*8975f5c5SAndroid Build Coastguard Worker         {
378*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(inputVaryings.size());
379*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : inputVaryings)
380*8975f5c5SAndroid Build Coastguard Worker             {
381*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
382*8975f5c5SAndroid Build Coastguard Worker             }
383*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(activeOutputVariables.size());
384*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : activeOutputVariables)
385*8975f5c5SAndroid Build Coastguard Worker             {
386*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
387*8975f5c5SAndroid Build Coastguard Worker             }
388*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(advancedBlendEquations.bits());
389*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt<size_t>(pixelLocalStorageFormats.size());
390*8975f5c5SAndroid Build Coastguard Worker             stream.writeBytes(reinterpret_cast<const uint8_t *>(pixelLocalStorageFormats.data()),
391*8975f5c5SAndroid Build Coastguard Worker                               pixelLocalStorageFormats.size());
392*8975f5c5SAndroid Build Coastguard Worker             break;
393*8975f5c5SAndroid Build Coastguard Worker         }
394*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Geometry:
395*8975f5c5SAndroid Build Coastguard Worker         {
396*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(inputVaryings.size());
397*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : inputVaryings)
398*8975f5c5SAndroid Build Coastguard Worker             {
399*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
400*8975f5c5SAndroid Build Coastguard Worker             }
401*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(outputVaryings.size());
402*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : outputVaryings)
403*8975f5c5SAndroid Build Coastguard Worker             {
404*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
405*8975f5c5SAndroid Build Coastguard Worker             }
406*8975f5c5SAndroid Build Coastguard Worker 
407*8975f5c5SAndroid Build Coastguard Worker             {
408*8975f5c5SAndroid Build Coastguard Worker                 unsigned char value = static_cast<unsigned char>(geometryShaderInputPrimitiveType);
409*8975f5c5SAndroid Build Coastguard Worker                 stream.writeBytes(&value, 1);
410*8975f5c5SAndroid Build Coastguard Worker             }
411*8975f5c5SAndroid Build Coastguard Worker             {
412*8975f5c5SAndroid Build Coastguard Worker                 unsigned char value = static_cast<unsigned char>(geometryShaderOutputPrimitiveType);
413*8975f5c5SAndroid Build Coastguard Worker                 stream.writeBytes(&value, 1);
414*8975f5c5SAndroid Build Coastguard Worker             }
415*8975f5c5SAndroid Build Coastguard Worker             {
416*8975f5c5SAndroid Build Coastguard Worker                 int value = static_cast<int>(geometryShaderMaxVertices);
417*8975f5c5SAndroid Build Coastguard Worker                 stream.writeInt(value);
418*8975f5c5SAndroid Build Coastguard Worker             }
419*8975f5c5SAndroid Build Coastguard Worker 
420*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(geometryShaderInvocations);
421*8975f5c5SAndroid Build Coastguard Worker             break;
422*8975f5c5SAndroid Build Coastguard Worker         }
423*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::TessControl:
424*8975f5c5SAndroid Build Coastguard Worker         {
425*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(inputVaryings.size());
426*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : inputVaryings)
427*8975f5c5SAndroid Build Coastguard Worker             {
428*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
429*8975f5c5SAndroid Build Coastguard Worker             }
430*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(outputVaryings.size());
431*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : outputVaryings)
432*8975f5c5SAndroid Build Coastguard Worker             {
433*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
434*8975f5c5SAndroid Build Coastguard Worker             }
435*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(tessControlShaderVertices);
436*8975f5c5SAndroid Build Coastguard Worker             break;
437*8975f5c5SAndroid Build Coastguard Worker         }
438*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::TessEvaluation:
439*8975f5c5SAndroid Build Coastguard Worker         {
440*8975f5c5SAndroid Build Coastguard Worker             unsigned int value;
441*8975f5c5SAndroid Build Coastguard Worker 
442*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(inputVaryings.size());
443*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : inputVaryings)
444*8975f5c5SAndroid Build Coastguard Worker             {
445*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
446*8975f5c5SAndroid Build Coastguard Worker             }
447*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(outputVaryings.size());
448*8975f5c5SAndroid Build Coastguard Worker             for (const sh::ShaderVariable &shaderVariable : outputVaryings)
449*8975f5c5SAndroid Build Coastguard Worker             {
450*8975f5c5SAndroid Build Coastguard Worker                 WriteShaderVar(&stream, shaderVariable);
451*8975f5c5SAndroid Build Coastguard Worker             }
452*8975f5c5SAndroid Build Coastguard Worker 
453*8975f5c5SAndroid Build Coastguard Worker             value = (unsigned int)(tessGenMode);
454*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(value);
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker             value = (unsigned int)tessGenSpacing;
457*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(value);
458*8975f5c5SAndroid Build Coastguard Worker 
459*8975f5c5SAndroid Build Coastguard Worker             value = (unsigned int)tessGenVertexOrder;
460*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(value);
461*8975f5c5SAndroid Build Coastguard Worker 
462*8975f5c5SAndroid Build Coastguard Worker             value = (unsigned int)tessGenPointMode;
463*8975f5c5SAndroid Build Coastguard Worker             stream.writeInt(value);
464*8975f5c5SAndroid Build Coastguard Worker             break;
465*8975f5c5SAndroid Build Coastguard Worker         }
466*8975f5c5SAndroid Build Coastguard Worker         default:
467*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
468*8975f5c5SAndroid Build Coastguard Worker     }
469*8975f5c5SAndroid Build Coastguard Worker 
470*8975f5c5SAndroid Build Coastguard Worker     stream.writeString(translatedSource);
471*8975f5c5SAndroid Build Coastguard Worker     stream.writeVector(compiledBinary);
472*8975f5c5SAndroid Build Coastguard Worker }
473*8975f5c5SAndroid Build Coastguard Worker 
deserialize(gl::BinaryInputStream & stream)474*8975f5c5SAndroid Build Coastguard Worker void CompiledShaderState::deserialize(gl::BinaryInputStream &stream)
475*8975f5c5SAndroid Build Coastguard Worker {
476*8975f5c5SAndroid Build Coastguard Worker     stream.readInt(&shaderVersion);
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker     size_t size;
479*8975f5c5SAndroid Build Coastguard Worker     size = stream.readInt<size_t>();
480*8975f5c5SAndroid Build Coastguard Worker     uniforms.resize(size);
481*8975f5c5SAndroid Build Coastguard Worker     for (sh::ShaderVariable &shaderVariable : uniforms)
482*8975f5c5SAndroid Build Coastguard Worker     {
483*8975f5c5SAndroid Build Coastguard Worker         LoadShaderVar(&stream, &shaderVariable);
484*8975f5c5SAndroid Build Coastguard Worker     }
485*8975f5c5SAndroid Build Coastguard Worker 
486*8975f5c5SAndroid Build Coastguard Worker     size = stream.readInt<size_t>();
487*8975f5c5SAndroid Build Coastguard Worker     uniformBlocks.resize(size);
488*8975f5c5SAndroid Build Coastguard Worker     for (sh::InterfaceBlock &interfaceBlock : uniformBlocks)
489*8975f5c5SAndroid Build Coastguard Worker     {
490*8975f5c5SAndroid Build Coastguard Worker         LoadShInterfaceBlock(&stream, &interfaceBlock);
491*8975f5c5SAndroid Build Coastguard Worker     }
492*8975f5c5SAndroid Build Coastguard Worker 
493*8975f5c5SAndroid Build Coastguard Worker     size = stream.readInt<size_t>();
494*8975f5c5SAndroid Build Coastguard Worker     shaderStorageBlocks.resize(size);
495*8975f5c5SAndroid Build Coastguard Worker     for (sh::InterfaceBlock &interfaceBlock : shaderStorageBlocks)
496*8975f5c5SAndroid Build Coastguard Worker     {
497*8975f5c5SAndroid Build Coastguard Worker         LoadShInterfaceBlock(&stream, &interfaceBlock);
498*8975f5c5SAndroid Build Coastguard Worker     }
499*8975f5c5SAndroid Build Coastguard Worker 
500*8975f5c5SAndroid Build Coastguard Worker     metadataFlags      = sh::CompilerMetadataFlags(stream.readInt<uint32_t>());
501*8975f5c5SAndroid Build Coastguard Worker     specConstUsageBits = SpecConstUsageBits(stream.readInt<uint32_t>());
502*8975f5c5SAndroid Build Coastguard Worker 
503*8975f5c5SAndroid Build Coastguard Worker     switch (shaderType)
504*8975f5c5SAndroid Build Coastguard Worker     {
505*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Compute:
506*8975f5c5SAndroid Build Coastguard Worker         {
507*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
508*8975f5c5SAndroid Build Coastguard Worker             allAttributes.resize(size);
509*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : allAttributes)
510*8975f5c5SAndroid Build Coastguard Worker             {
511*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
512*8975f5c5SAndroid Build Coastguard Worker             }
513*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
514*8975f5c5SAndroid Build Coastguard Worker             activeAttributes.resize(size);
515*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : activeAttributes)
516*8975f5c5SAndroid Build Coastguard Worker             {
517*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
518*8975f5c5SAndroid Build Coastguard Worker             }
519*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&localSize[0]);
520*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&localSize[1]);
521*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&localSize[2]);
522*8975f5c5SAndroid Build Coastguard Worker             break;
523*8975f5c5SAndroid Build Coastguard Worker         }
524*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Vertex:
525*8975f5c5SAndroid Build Coastguard Worker         {
526*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
527*8975f5c5SAndroid Build Coastguard Worker             outputVaryings.resize(size);
528*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : outputVaryings)
529*8975f5c5SAndroid Build Coastguard Worker             {
530*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
531*8975f5c5SAndroid Build Coastguard Worker             }
532*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
533*8975f5c5SAndroid Build Coastguard Worker             allAttributes.resize(size);
534*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : allAttributes)
535*8975f5c5SAndroid Build Coastguard Worker             {
536*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
537*8975f5c5SAndroid Build Coastguard Worker             }
538*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
539*8975f5c5SAndroid Build Coastguard Worker             activeAttributes.resize(size);
540*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : activeAttributes)
541*8975f5c5SAndroid Build Coastguard Worker             {
542*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
543*8975f5c5SAndroid Build Coastguard Worker             }
544*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&numViews);
545*8975f5c5SAndroid Build Coastguard Worker             break;
546*8975f5c5SAndroid Build Coastguard Worker         }
547*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Fragment:
548*8975f5c5SAndroid Build Coastguard Worker         {
549*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
550*8975f5c5SAndroid Build Coastguard Worker             inputVaryings.resize(size);
551*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : inputVaryings)
552*8975f5c5SAndroid Build Coastguard Worker             {
553*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
554*8975f5c5SAndroid Build Coastguard Worker             }
555*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
556*8975f5c5SAndroid Build Coastguard Worker             activeOutputVariables.resize(size);
557*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : activeOutputVariables)
558*8975f5c5SAndroid Build Coastguard Worker             {
559*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
560*8975f5c5SAndroid Build Coastguard Worker             }
561*8975f5c5SAndroid Build Coastguard Worker             int advancedBlendEquationBits;
562*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&advancedBlendEquationBits);
563*8975f5c5SAndroid Build Coastguard Worker             advancedBlendEquations = gl::BlendEquationBitSet(advancedBlendEquationBits);
564*8975f5c5SAndroid Build Coastguard Worker             pixelLocalStorageFormats.resize(stream.readInt<size_t>());
565*8975f5c5SAndroid Build Coastguard Worker             stream.readBytes(reinterpret_cast<uint8_t *>(pixelLocalStorageFormats.data()),
566*8975f5c5SAndroid Build Coastguard Worker                              pixelLocalStorageFormats.size());
567*8975f5c5SAndroid Build Coastguard Worker             break;
568*8975f5c5SAndroid Build Coastguard Worker         }
569*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::Geometry:
570*8975f5c5SAndroid Build Coastguard Worker         {
571*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
572*8975f5c5SAndroid Build Coastguard Worker             inputVaryings.resize(size);
573*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : inputVaryings)
574*8975f5c5SAndroid Build Coastguard Worker             {
575*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
576*8975f5c5SAndroid Build Coastguard Worker             }
577*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
578*8975f5c5SAndroid Build Coastguard Worker             outputVaryings.resize(size);
579*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : outputVaryings)
580*8975f5c5SAndroid Build Coastguard Worker             {
581*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
582*8975f5c5SAndroid Build Coastguard Worker             }
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker             {
585*8975f5c5SAndroid Build Coastguard Worker                 unsigned char value;
586*8975f5c5SAndroid Build Coastguard Worker                 stream.readBytes(&value, 1);
587*8975f5c5SAndroid Build Coastguard Worker                 geometryShaderInputPrimitiveType = static_cast<gl::PrimitiveMode>(value);
588*8975f5c5SAndroid Build Coastguard Worker             }
589*8975f5c5SAndroid Build Coastguard Worker 
590*8975f5c5SAndroid Build Coastguard Worker             {
591*8975f5c5SAndroid Build Coastguard Worker                 unsigned char value;
592*8975f5c5SAndroid Build Coastguard Worker                 stream.readBytes(&value, 1);
593*8975f5c5SAndroid Build Coastguard Worker                 geometryShaderOutputPrimitiveType = static_cast<gl::PrimitiveMode>(value);
594*8975f5c5SAndroid Build Coastguard Worker             }
595*8975f5c5SAndroid Build Coastguard Worker 
596*8975f5c5SAndroid Build Coastguard Worker             {
597*8975f5c5SAndroid Build Coastguard Worker                 int value;
598*8975f5c5SAndroid Build Coastguard Worker                 stream.readInt(&value);
599*8975f5c5SAndroid Build Coastguard Worker                 geometryShaderMaxVertices = static_cast<GLint>(value);
600*8975f5c5SAndroid Build Coastguard Worker             }
601*8975f5c5SAndroid Build Coastguard Worker 
602*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&geometryShaderInvocations);
603*8975f5c5SAndroid Build Coastguard Worker             break;
604*8975f5c5SAndroid Build Coastguard Worker         }
605*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::TessControl:
606*8975f5c5SAndroid Build Coastguard Worker         {
607*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
608*8975f5c5SAndroid Build Coastguard Worker             inputVaryings.resize(size);
609*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : inputVaryings)
610*8975f5c5SAndroid Build Coastguard Worker             {
611*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
612*8975f5c5SAndroid Build Coastguard Worker             }
613*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
614*8975f5c5SAndroid Build Coastguard Worker             outputVaryings.resize(size);
615*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : outputVaryings)
616*8975f5c5SAndroid Build Coastguard Worker             {
617*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
618*8975f5c5SAndroid Build Coastguard Worker             }
619*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&tessControlShaderVertices);
620*8975f5c5SAndroid Build Coastguard Worker             break;
621*8975f5c5SAndroid Build Coastguard Worker         }
622*8975f5c5SAndroid Build Coastguard Worker         case gl::ShaderType::TessEvaluation:
623*8975f5c5SAndroid Build Coastguard Worker         {
624*8975f5c5SAndroid Build Coastguard Worker             unsigned int value;
625*8975f5c5SAndroid Build Coastguard Worker 
626*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
627*8975f5c5SAndroid Build Coastguard Worker             inputVaryings.resize(size);
628*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : inputVaryings)
629*8975f5c5SAndroid Build Coastguard Worker             {
630*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
631*8975f5c5SAndroid Build Coastguard Worker             }
632*8975f5c5SAndroid Build Coastguard Worker             size = stream.readInt<size_t>();
633*8975f5c5SAndroid Build Coastguard Worker             outputVaryings.resize(size);
634*8975f5c5SAndroid Build Coastguard Worker             for (sh::ShaderVariable &shaderVariable : outputVaryings)
635*8975f5c5SAndroid Build Coastguard Worker             {
636*8975f5c5SAndroid Build Coastguard Worker                 LoadShaderVar(&stream, &shaderVariable);
637*8975f5c5SAndroid Build Coastguard Worker             }
638*8975f5c5SAndroid Build Coastguard Worker 
639*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&value);
640*8975f5c5SAndroid Build Coastguard Worker             tessGenMode = (GLenum)value;
641*8975f5c5SAndroid Build Coastguard Worker 
642*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&value);
643*8975f5c5SAndroid Build Coastguard Worker             tessGenSpacing = (GLenum)value;
644*8975f5c5SAndroid Build Coastguard Worker 
645*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&value);
646*8975f5c5SAndroid Build Coastguard Worker             tessGenVertexOrder = (GLenum)value;
647*8975f5c5SAndroid Build Coastguard Worker 
648*8975f5c5SAndroid Build Coastguard Worker             stream.readInt(&value);
649*8975f5c5SAndroid Build Coastguard Worker             tessGenPointMode = (GLenum)value;
650*8975f5c5SAndroid Build Coastguard Worker             break;
651*8975f5c5SAndroid Build Coastguard Worker         }
652*8975f5c5SAndroid Build Coastguard Worker         default:
653*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
654*8975f5c5SAndroid Build Coastguard Worker     }
655*8975f5c5SAndroid Build Coastguard Worker 
656*8975f5c5SAndroid Build Coastguard Worker     stream.readString(&translatedSource);
657*8975f5c5SAndroid Build Coastguard Worker     stream.readVector(&compiledBinary);
658*8975f5c5SAndroid Build Coastguard Worker }
659*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
660