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