xref: /aosp_15_r20/external/angle/include/GLSLANG/ShaderLang.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 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 #ifndef GLSLANG_SHADERLANG_H_
7*8975f5c5SAndroid Build Coastguard Worker #define GLSLANG_SHADERLANG_H_
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include <stddef.h>
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "KHR/khrplatform.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include <array>
14*8975f5c5SAndroid Build Coastguard Worker #include <map>
15*8975f5c5SAndroid Build Coastguard Worker #include <set>
16*8975f5c5SAndroid Build Coastguard Worker #include <string>
17*8975f5c5SAndroid Build Coastguard Worker #include <vector>
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker //
20*8975f5c5SAndroid Build Coastguard Worker // This is the platform independent interface between an OGL driver
21*8975f5c5SAndroid Build Coastguard Worker // and the shading language compiler.
22*8975f5c5SAndroid Build Coastguard Worker //
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker // Note: make sure to increment ANGLE_SH_VERSION when changing ShaderVars.h
25*8975f5c5SAndroid Build Coastguard Worker #include "ShaderVars.h"
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker // Version number for shader translation API.
28*8975f5c5SAndroid Build Coastguard Worker // It is incremented every time the API changes.
29*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SH_VERSION 371
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker enum ShShaderSpec
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker     SH_GLES2_SPEC,
34*8975f5c5SAndroid Build Coastguard Worker     SH_WEBGL_SPEC,
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker     SH_GLES3_SPEC,
37*8975f5c5SAndroid Build Coastguard Worker     SH_WEBGL2_SPEC,
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker     SH_GLES3_1_SPEC,
40*8975f5c5SAndroid Build Coastguard Worker     SH_WEBGL3_SPEC,
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker     SH_GLES3_2_SPEC,
43*8975f5c5SAndroid Build Coastguard Worker };
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker enum ShShaderOutput
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker     // NULL output for testing.
48*8975f5c5SAndroid Build Coastguard Worker     SH_NULL_OUTPUT,
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     // ESSL output only supported in some configurations.
51*8975f5c5SAndroid Build Coastguard Worker     SH_ESSL_OUTPUT,
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     // GLSL output only supported in some configurations.
54*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_COMPATIBILITY_OUTPUT,
55*8975f5c5SAndroid Build Coastguard Worker     // Note: GL introduced core profiles in 1.5.
56*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_130_OUTPUT,
57*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_140_OUTPUT,
58*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_150_CORE_OUTPUT,
59*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_330_CORE_OUTPUT,
60*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_400_CORE_OUTPUT,
61*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_410_CORE_OUTPUT,
62*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_420_CORE_OUTPUT,
63*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_430_CORE_OUTPUT,
64*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_440_CORE_OUTPUT,
65*8975f5c5SAndroid Build Coastguard Worker     SH_GLSL_450_CORE_OUTPUT,
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     // Prefer using these to specify HLSL output type:
68*8975f5c5SAndroid Build Coastguard Worker     SH_HLSL_3_0_OUTPUT,  // D3D 9
69*8975f5c5SAndroid Build Coastguard Worker     SH_HLSL_4_1_OUTPUT,  // D3D 11
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     // Output SPIR-V for the Vulkan backend.
72*8975f5c5SAndroid Build Coastguard Worker     SH_SPIRV_VULKAN_OUTPUT,
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker     // Output for MSL
75*8975f5c5SAndroid Build Coastguard Worker     SH_MSL_METAL_OUTPUT,
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     // Output for WGSL
78*8975f5c5SAndroid Build Coastguard Worker     SH_WGSL_OUTPUT,
79*8975f5c5SAndroid Build Coastguard Worker };
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker struct ShCompileOptionsMetal
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker     // Direct-to-metal backend constants:
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     // Binding index for driver uniforms:
86*8975f5c5SAndroid Build Coastguard Worker     int driverUniformsBindingIndex = 0;
87*8975f5c5SAndroid Build Coastguard Worker     // Binding index for default uniforms:
88*8975f5c5SAndroid Build Coastguard Worker     int defaultUniformsBindingIndex = 0;
89*8975f5c5SAndroid Build Coastguard Worker     // Binding index for UBO's argument buffer
90*8975f5c5SAndroid Build Coastguard Worker     int UBOArgumentBufferBindingIndex = 0;
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker     bool generateShareableShaders = false;
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker     // Insert asm("") instructions into loop bodies, telling the compiler that all loops have side
95*8975f5c5SAndroid Build Coastguard Worker     // effects and cannot be optimized out.
96*8975f5c5SAndroid Build Coastguard Worker     bool injectAsmStatementIntoLoopBodies = false;
97*8975f5c5SAndroid Build Coastguard Worker };
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker // For ANGLE_shader_pixel_local_storage.
100*8975f5c5SAndroid Build Coastguard Worker // Instructs the compiler which pixel local storage configuration to generate code for.
101*8975f5c5SAndroid Build Coastguard Worker enum class ShPixelLocalStorageType : uint8_t
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker     NotSupported,
104*8975f5c5SAndroid Build Coastguard Worker     ImageLoadStore,
105*8975f5c5SAndroid Build Coastguard Worker     FramebufferFetch,
106*8975f5c5SAndroid Build Coastguard Worker };
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker // For ANGLE_shader_pixel_local_storage.
109*8975f5c5SAndroid Build Coastguard Worker // Used to track the PLS format at each binding index in a shader.
110*8975f5c5SAndroid Build Coastguard Worker enum class ShPixelLocalStorageFormat : uint8_t
111*8975f5c5SAndroid Build Coastguard Worker {
112*8975f5c5SAndroid Build Coastguard Worker     NotPLS,  // Indicates that no PLS uniform was declared at the binding index in question.
113*8975f5c5SAndroid Build Coastguard Worker     RGBA8,
114*8975f5c5SAndroid Build Coastguard Worker     RGBA8I,
115*8975f5c5SAndroid Build Coastguard Worker     RGBA8UI,
116*8975f5c5SAndroid Build Coastguard Worker     R32F,
117*8975f5c5SAndroid Build Coastguard Worker     R32UI,
118*8975f5c5SAndroid Build Coastguard Worker };
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker // For ANGLE_shader_pixel_local_storage_coherent.
121*8975f5c5SAndroid Build Coastguard Worker // Instructs the compiler which fragment synchronization method to use, if any.
122*8975f5c5SAndroid Build Coastguard Worker enum class ShFragmentSynchronizationType : uint8_t
123*8975f5c5SAndroid Build Coastguard Worker {
124*8975f5c5SAndroid Build Coastguard Worker     NotSupported,  // Fragments cannot be ordered or synchronized.
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker     Automatic,  // Fragments are automatically raster-ordered and synchronized.
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     FragmentShaderInterlock_NV_GL,
129*8975f5c5SAndroid Build Coastguard Worker     FragmentShaderOrdering_INTEL_GL,
130*8975f5c5SAndroid Build Coastguard Worker     FragmentShaderInterlock_ARB_GL,  // Also compiles to SPV_EXT_fragment_shader_interlock.
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker     RasterizerOrderViews_D3D,
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker     RasterOrderGroups_Metal,
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum,
137*8975f5c5SAndroid Build Coastguard Worker     EnumCount = InvalidEnum,
138*8975f5c5SAndroid Build Coastguard Worker };
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker struct ShPixelLocalStorageOptions
141*8975f5c5SAndroid Build Coastguard Worker {
142*8975f5c5SAndroid Build Coastguard Worker     ShPixelLocalStorageType type = ShPixelLocalStorageType::NotSupported;
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker     // For ANGLE_shader_pixel_local_storage_coherent.
145*8975f5c5SAndroid Build Coastguard Worker     ShFragmentSynchronizationType fragmentSyncType = ShFragmentSynchronizationType::NotSupported;
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     // ShPixelLocalStorageType::ImageLoadStore only: Can we use rgba8/rgba8i/rgba8ui image formats?
148*8975f5c5SAndroid Build Coastguard Worker     // Or do we need to manually pack and unpack from r32i/r32ui?
149*8975f5c5SAndroid Build Coastguard Worker     bool supportsNativeRGBA8ImageFormats = false;
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/42266263 -- Metal [[raster_order_group()]] does not work for read_write textures
152*8975f5c5SAndroid Build Coastguard Worker     // on AMD when the render pass doesn't have a color attachment on slot 0. To work around this we
153*8975f5c5SAndroid Build Coastguard Worker     // attach one of the PLS textures to GL_COLOR_ATTACHMENT0, if there isn't one already.
154*8975f5c5SAndroid Build Coastguard Worker     bool renderPassNeedsAMDRasterOrderGroupsWorkaround = false;
155*8975f5c5SAndroid Build Coastguard Worker };
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker struct ShCompileOptions
158*8975f5c5SAndroid Build Coastguard Worker {
159*8975f5c5SAndroid Build Coastguard Worker     ShCompileOptions();
160*8975f5c5SAndroid Build Coastguard Worker     ShCompileOptions(const ShCompileOptions &other);
161*8975f5c5SAndroid Build Coastguard Worker     ShCompileOptions &operator=(const ShCompileOptions &other);
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     // Translates intermediate tree to glsl, hlsl, msl, or SPIR-V binary.  Can be queried by
164*8975f5c5SAndroid Build Coastguard Worker     // calling sh::GetObjectCode().
165*8975f5c5SAndroid Build Coastguard Worker     uint64_t objectCode : 1;
166*8975f5c5SAndroid Build Coastguard Worker 
167*8975f5c5SAndroid Build Coastguard Worker     // Whether debug info should be output in the shader.
168*8975f5c5SAndroid Build Coastguard Worker     uint64_t outputDebugInfo : 1;
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker     // Tracks the source path for shaders.  Can be queried with getSourcePath().
171*8975f5c5SAndroid Build Coastguard Worker     uint64_t sourcePath : 1;
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker     // Whether the internal representation of the AST should be output.
174*8975f5c5SAndroid Build Coastguard Worker     uint64_t intermediateTree : 1;
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker     // If requested, validates the AST after every transformation.  Useful for debugging.
177*8975f5c5SAndroid Build Coastguard Worker     uint64_t validateAST : 1;
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker     // Validates loop and indexing in the shader to ensure that they do not exceed the minimum
180*8975f5c5SAndroid Build Coastguard Worker     // functionality mandated in GLSL 1.0 spec, Appendix A, Section 4 and 5.  There is no need to
181*8975f5c5SAndroid Build Coastguard Worker     // specify this parameter when compiling for WebGL - it is implied.
182*8975f5c5SAndroid Build Coastguard Worker     uint64_t validateLoopIndexing : 1;
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker     // Emits #line directives in HLSL.
185*8975f5c5SAndroid Build Coastguard Worker     uint64_t lineDirectives : 1;
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker     // Due to spec difference between GLSL 4.1 or lower and ESSL3, some platforms (for example, Mac
188*8975f5c5SAndroid Build Coastguard Worker     // OSX core profile) require a variable's "invariant"/"centroid" qualifiers to match between
189*8975f5c5SAndroid Build Coastguard Worker     // vertex and fragment shader. A simple solution to allow such shaders to link is to omit the
190*8975f5c5SAndroid Build Coastguard Worker     // two qualifiers.  AMD driver in Linux requires invariant qualifier to match between vertex and
191*8975f5c5SAndroid Build Coastguard Worker     // fragment shaders, while ESSL3 disallows invariant qualifier in fragment shader and GLSL >=
192*8975f5c5SAndroid Build Coastguard Worker     // 4.2 doesn't require invariant qualifier to match between shaders. Remove invariant qualifier
193*8975f5c5SAndroid Build Coastguard Worker     // from vertex shader to workaround AMD driver bug.
194*8975f5c5SAndroid Build Coastguard Worker     // Note that the two flags take effect on ESSL3 input shaders translated to GLSL 4.1 or lower
195*8975f5c5SAndroid Build Coastguard Worker     // and to GLSL 4.2 or newer on Linux AMD.
196*8975f5c5SAndroid Build Coastguard Worker     // TODO(zmo): This is not a good long-term solution. Simply dropping these qualifiers may break
197*8975f5c5SAndroid Build Coastguard Worker     // some developers' content. A more complex workaround of dynamically generating, compiling, and
198*8975f5c5SAndroid Build Coastguard Worker     // re-linking shaders that use these qualifiers should be implemented.
199*8975f5c5SAndroid Build Coastguard Worker     uint64_t removeInvariantAndCentroidForESSL3 : 1;
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker     // This flag works around bug in Intel Mac drivers related to abs(i) where i is an integer.
202*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateAbsIntFunction : 1;
203*8975f5c5SAndroid Build Coastguard Worker 
204*8975f5c5SAndroid Build Coastguard Worker     // Enforce the GLSL 1.017 Appendix A section 7 packing restrictions.  This flag only enforces
205*8975f5c5SAndroid Build Coastguard Worker     // (and can only enforce) the packing restrictions for uniform variables in both vertex and
206*8975f5c5SAndroid Build Coastguard Worker     // fragment shaders. ShCheckVariablesWithinPackingLimits() lets embedders enforce the packing
207*8975f5c5SAndroid Build Coastguard Worker     // restrictions for varying variables during program link time.
208*8975f5c5SAndroid Build Coastguard Worker     uint64_t enforcePackingRestrictions : 1;
209*8975f5c5SAndroid Build Coastguard Worker 
210*8975f5c5SAndroid Build Coastguard Worker     // This flag ensures all indirect (expression-based) array indexing is clamped to the bounds of
211*8975f5c5SAndroid Build Coastguard Worker     // the array. This ensures, for example, that you cannot read off the end of a uniform, whether
212*8975f5c5SAndroid Build Coastguard Worker     // an array vec234, or mat234 type.
213*8975f5c5SAndroid Build Coastguard Worker     uint64_t clampIndirectArrayBounds : 1;
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker     // This flag limits the complexity of an expression.
216*8975f5c5SAndroid Build Coastguard Worker     uint64_t limitExpressionComplexity : 1;
217*8975f5c5SAndroid Build Coastguard Worker 
218*8975f5c5SAndroid Build Coastguard Worker     // This flag limits the depth of the call stack.
219*8975f5c5SAndroid Build Coastguard Worker     uint64_t limitCallStackDepth : 1;
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker     // This flag initializes gl_Position to vec4(0,0,0,0) at the beginning of the vertex shader's
222*8975f5c5SAndroid Build Coastguard Worker     // main(), and has no effect in the fragment shader. It is intended as a workaround for drivers
223*8975f5c5SAndroid Build Coastguard Worker     // which incorrectly fail to link programs if gl_Position is not written.
224*8975f5c5SAndroid Build Coastguard Worker     uint64_t initGLPosition : 1;
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker     // This flag replaces
227*8975f5c5SAndroid Build Coastguard Worker     //   "a && b" with "a ? b : false",
228*8975f5c5SAndroid Build Coastguard Worker     //   "a || b" with "a ? true : b".
229*8975f5c5SAndroid Build Coastguard Worker     // This is to work around a MacOSX driver bug that |b| is executed independent of |a|'s value.
230*8975f5c5SAndroid Build Coastguard Worker     uint64_t unfoldShortCircuit : 1;
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker     // This flag initializes output variables to 0 at the beginning of main().  It is to avoid
233*8975f5c5SAndroid Build Coastguard Worker     // undefined behaviors.
234*8975f5c5SAndroid Build Coastguard Worker     uint64_t initOutputVariables : 1;
235*8975f5c5SAndroid Build Coastguard Worker 
236*8975f5c5SAndroid Build Coastguard Worker     // This flag scalarizes vec/ivec/bvec/mat constructor args.  It is intended as a workaround for
237*8975f5c5SAndroid Build Coastguard Worker     // Linux/Mac driver bugs.
238*8975f5c5SAndroid Build Coastguard Worker     uint64_t scalarizeVecAndMatConstructorArgs : 1;
239*8975f5c5SAndroid Build Coastguard Worker 
240*8975f5c5SAndroid Build Coastguard Worker     // This flag overwrites a struct name with a unique prefix.  It is intended as a workaround for
241*8975f5c5SAndroid Build Coastguard Worker     // drivers that do not handle struct scopes correctly, including all Mac drivers and Linux AMD.
242*8975f5c5SAndroid Build Coastguard Worker     uint64_t regenerateStructNames : 1;
243*8975f5c5SAndroid Build Coastguard Worker 
244*8975f5c5SAndroid Build Coastguard Worker     // This flag works around bugs in Mac drivers related to do-while by transforming them into an
245*8975f5c5SAndroid Build Coastguard Worker     // other construct.
246*8975f5c5SAndroid Build Coastguard Worker     uint64_t rewriteDoWhileLoops : 1;
247*8975f5c5SAndroid Build Coastguard Worker 
248*8975f5c5SAndroid Build Coastguard Worker     // This flag works around a bug in the HLSL compiler optimizer that folds certain constant pow
249*8975f5c5SAndroid Build Coastguard Worker     // expressions incorrectly. Only applies to the HLSL back-end. It works by expanding the integer
250*8975f5c5SAndroid Build Coastguard Worker     // pow expressions into a series of multiplies.
251*8975f5c5SAndroid Build Coastguard Worker     uint64_t expandSelectHLSLIntegerPowExpressions : 1;
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker     // Flatten "#pragma STDGL invariant(all)" into the declarations of varying variables and
254*8975f5c5SAndroid Build Coastguard Worker     // built-in GLSL variables. This compiler option is enabled automatically when needed.
255*8975f5c5SAndroid Build Coastguard Worker     uint64_t flattenPragmaSTDGLInvariantAll : 1;
256*8975f5c5SAndroid Build Coastguard Worker 
257*8975f5c5SAndroid Build Coastguard Worker     // Some drivers do not take into account the base level of the texture in the results of the
258*8975f5c5SAndroid Build Coastguard Worker     // HLSL GetDimensions builtin.  This flag instructs the compiler to manually add the base level
259*8975f5c5SAndroid Build Coastguard Worker     // offsetting.
260*8975f5c5SAndroid Build Coastguard Worker     uint64_t HLSLGetDimensionsIgnoresBaseLevel : 1;
261*8975f5c5SAndroid Build Coastguard Worker 
262*8975f5c5SAndroid Build Coastguard Worker     // This flag works around an issue in translating GLSL function texelFetchOffset on INTEL
263*8975f5c5SAndroid Build Coastguard Worker     // drivers. It works by translating texelFetchOffset into texelFetch.
264*8975f5c5SAndroid Build Coastguard Worker     uint64_t rewriteTexelFetchOffsetToTexelFetch : 1;
265*8975f5c5SAndroid Build Coastguard Worker 
266*8975f5c5SAndroid Build Coastguard Worker     // This flag works around condition bug of for and while loops in Intel Mac OSX drivers.
267*8975f5c5SAndroid Build Coastguard Worker     // Condition calculation is not correct. Rewrite it from "CONDITION" to "CONDITION && true".
268*8975f5c5SAndroid Build Coastguard Worker     uint64_t addAndTrueToLoopCondition : 1;
269*8975f5c5SAndroid Build Coastguard Worker 
270*8975f5c5SAndroid Build Coastguard Worker     // This flag works around a bug in evaluating unary minus operator on integer on some INTEL
271*8975f5c5SAndroid Build Coastguard Worker     // drivers. It works by translating -(int) into ~(int) + 1.
272*8975f5c5SAndroid Build Coastguard Worker     uint64_t rewriteIntegerUnaryMinusOperator : 1;
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     // This flag works around a bug in evaluating isnan() on some INTEL D3D and Mac OSX drivers.  It
275*8975f5c5SAndroid Build Coastguard Worker     // works by using an expression to emulate this function.
276*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateIsnanFloatFunction : 1;
277*8975f5c5SAndroid Build Coastguard Worker 
278*8975f5c5SAndroid Build Coastguard Worker     // This flag will use all uniforms of unused std140 and shared uniform blocks at the beginning
279*8975f5c5SAndroid Build Coastguard Worker     // of the vertex/fragment shader's main(). It is intended as a workaround for Mac drivers with
280*8975f5c5SAndroid Build Coastguard Worker     // shader version 4.10. In those drivers, they will treat unused std140 and shared uniform
281*8975f5c5SAndroid Build Coastguard Worker     // blocks' members as inactive. However, WebGL2.0 based on OpenGL ES3.0.4 requires all members
282*8975f5c5SAndroid Build Coastguard Worker     // of a named uniform block declared with a shared or std140 layout qualifier to be considered
283*8975f5c5SAndroid Build Coastguard Worker     // active. The uniform block itself is also considered active.
284*8975f5c5SAndroid Build Coastguard Worker     uint64_t useUnusedStandardSharedBlocks : 1;
285*8975f5c5SAndroid Build Coastguard Worker 
286*8975f5c5SAndroid Build Coastguard Worker     // This flag works around a bug in unary minus operator on float numbers on Intel Mac OSX 10.11
287*8975f5c5SAndroid Build Coastguard Worker     // drivers. It works by translating -float into 0.0 - float.
288*8975f5c5SAndroid Build Coastguard Worker     uint64_t rewriteFloatUnaryMinusOperator : 1;
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker     // This flag works around a bug in evaluating atan(y, x) on some NVIDIA OpenGL drivers.  It
291*8975f5c5SAndroid Build Coastguard Worker     // works by using an expression to emulate this function.
292*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateAtan2FloatFunction : 1;
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     // Set to initialize uninitialized local and global temporary variables. Should only be used
295*8975f5c5SAndroid Build Coastguard Worker     // with GLSL output. In HLSL output variables are initialized regardless of if this flag is set.
296*8975f5c5SAndroid Build Coastguard Worker     uint64_t initializeUninitializedLocals : 1;
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker     // The flag modifies the shader in the following way:
299*8975f5c5SAndroid Build Coastguard Worker     //
300*8975f5c5SAndroid Build Coastguard Worker     // Every occurrence of gl_InstanceID is replaced by the global temporary variable InstanceID.
301*8975f5c5SAndroid Build Coastguard Worker     // Every occurrence of gl_ViewID_OVR is replaced by the varying variable ViewID_OVR.
302*8975f5c5SAndroid Build Coastguard Worker     // At the beginning of the body of main() in a vertex shader the following initializers are
303*8975f5c5SAndroid Build Coastguard Worker     // added:
304*8975f5c5SAndroid Build Coastguard Worker     //   ViewID_OVR = uint(gl_InstanceID) % num_views;
305*8975f5c5SAndroid Build Coastguard Worker     //   InstanceID = gl_InstanceID / num_views;
306*8975f5c5SAndroid Build Coastguard Worker     // ViewID_OVR is added as a varying variable to both the vertex and fragment shaders.
307*8975f5c5SAndroid Build Coastguard Worker     uint64_t initializeBuiltinsForInstancedMultiview : 1;
308*8975f5c5SAndroid Build Coastguard Worker 
309*8975f5c5SAndroid Build Coastguard Worker     // With the flag enabled the GLSL/ESSL vertex shader is modified to include code for viewport
310*8975f5c5SAndroid Build Coastguard Worker     // selection in the following way:
311*8975f5c5SAndroid Build Coastguard Worker     // - Code to enable the extension ARB_shader_viewport_layer_array/NV_viewport_array2 is
312*8975f5c5SAndroid Build Coastguard Worker     // included.
313*8975f5c5SAndroid Build Coastguard Worker     // - Code to select the viewport index or layer is inserted at the beginning of main after
314*8975f5c5SAndroid Build Coastguard Worker     //   ViewID_OVR's initialization.
315*8975f5c5SAndroid Build Coastguard Worker     // - A declaration of the uniform multiviewBaseViewLayerIndex.
316*8975f5c5SAndroid Build Coastguard Worker     // Note: The initializeBuiltinsForInstancedMultiview flag also has to be enabled to have the
317*8975f5c5SAndroid Build Coastguard Worker     // temporary variable ViewID_OVR declared and initialized.
318*8975f5c5SAndroid Build Coastguard Worker     uint64_t selectViewInNvGLSLVertexShader : 1;
319*8975f5c5SAndroid Build Coastguard Worker 
320*8975f5c5SAndroid Build Coastguard Worker     // If the flag is enabled, gl_PointSize is clamped to the maximum point size specified in
321*8975f5c5SAndroid Build Coastguard Worker     // ShBuiltInResources in vertex shaders.
322*8975f5c5SAndroid Build Coastguard Worker     uint64_t clampPointSize : 1;
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     // This flag indicates whether advanced blend equation should be emulated.  Currently only
325*8975f5c5SAndroid Build Coastguard Worker     // implemented for the Vulkan backend.
326*8975f5c5SAndroid Build Coastguard Worker     uint64_t addAdvancedBlendEquationsEmulation : 1;
327*8975f5c5SAndroid Build Coastguard Worker 
328*8975f5c5SAndroid Build Coastguard Worker     // Don't use loops to initialize uninitialized variables. Only has an effect if some kind of
329*8975f5c5SAndroid Build Coastguard Worker     // variable initialization is turned on.
330*8975f5c5SAndroid Build Coastguard Worker     uint64_t dontUseLoopsToInitializeVariables : 1;
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker     // Don't use D3D constant register zero when allocating space for uniforms. This is targeted to
333*8975f5c5SAndroid Build Coastguard Worker     // work around a bug in NVIDIA D3D driver version 388.59 where in very specific cases the driver
334*8975f5c5SAndroid Build Coastguard Worker     // would not handle constant register zero correctly. Only has an effect on HLSL translation.
335*8975f5c5SAndroid Build Coastguard Worker     uint64_t skipD3DConstantRegisterZero : 1;
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker     // Clamp gl_FragDepth to the range [0.0, 1.0] in case it is statically used.
338*8975f5c5SAndroid Build Coastguard Worker     uint64_t clampFragDepth : 1;
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker     // Rewrite expressions like "v.x = z = expression;". Works around a bug in NVIDIA OpenGL drivers
341*8975f5c5SAndroid Build Coastguard Worker     // prior to version 397.31.
342*8975f5c5SAndroid Build Coastguard Worker     uint64_t rewriteRepeatedAssignToSwizzled : 1;
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker     // Rewrite gl_DrawID as a uniform int
345*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateGLDrawID : 1;
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker     // This flag initializes shared variables to 0.  It is to avoid ompute shaders being able to
348*8975f5c5SAndroid Build Coastguard Worker     // read undefined values that could be coming from another webpage/application.
349*8975f5c5SAndroid Build Coastguard Worker     uint64_t initSharedVariables : 1;
350*8975f5c5SAndroid Build Coastguard Worker 
351*8975f5c5SAndroid Build Coastguard Worker     // Forces the value returned from an atomic operations to be always be resolved. This is
352*8975f5c5SAndroid Build Coastguard Worker     // targeted to workaround a bug in NVIDIA D3D driver where the return value from
353*8975f5c5SAndroid Build Coastguard Worker     // RWByteAddressBuffer.InterlockedAdd does not get resolved when used in the .yzw components of
354*8975f5c5SAndroid Build Coastguard Worker     // a RWByteAddressBuffer.Store operation. Only has an effect on HLSL translation.
355*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261924
356*8975f5c5SAndroid Build Coastguard Worker     uint64_t forceAtomicValueResolution : 1;
357*8975f5c5SAndroid Build Coastguard Worker 
358*8975f5c5SAndroid Build Coastguard Worker     // Rewrite gl_BaseVertex and gl_BaseInstance as uniform int
359*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateGLBaseVertexBaseInstance : 1;
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker     // Workaround for a driver bug with nested switches.
362*8975f5c5SAndroid Build Coastguard Worker     uint64_t wrapSwitchInIfTrue : 1;
363*8975f5c5SAndroid Build Coastguard Worker 
364*8975f5c5SAndroid Build Coastguard Worker     // This flag controls how to translate WEBGL_video_texture sampling function.
365*8975f5c5SAndroid Build Coastguard Worker     uint64_t takeVideoTextureAsExternalOES : 1;
366*8975f5c5SAndroid Build Coastguard Worker 
367*8975f5c5SAndroid Build Coastguard Worker     // This flag works around a inconsistent behavior in Mac AMD driver where gl_VertexID doesn't
368*8975f5c5SAndroid Build Coastguard Worker     // include base vertex value. It replaces gl_VertexID with (gl_VertexID + angle_BaseVertex) when
369*8975f5c5SAndroid Build Coastguard Worker     // angle_BaseVertex is available.
370*8975f5c5SAndroid Build Coastguard Worker     uint64_t addBaseVertexToVertexID : 1;
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker     // This works around the dynamic lvalue indexing of swizzled vectors on various platforms.
373*8975f5c5SAndroid Build Coastguard Worker     uint64_t removeDynamicIndexingOfSwizzledVector : 1;
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker     // This flag works around a slow fxc compile performance issue with dynamic uniform indexing.
376*8975f5c5SAndroid Build Coastguard Worker     uint64_t allowTranslateUniformBlockToStructuredBuffer : 1;
377*8975f5c5SAndroid Build Coastguard Worker 
378*8975f5c5SAndroid Build Coastguard Worker     // This flag allows us to add a decoration for layout(yuv) in shaders.
379*8975f5c5SAndroid Build Coastguard Worker     uint64_t addVulkanYUVLayoutQualifier : 1;
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker     // This flag allows disabling ARB_texture_rectangle on a per-compile basis. This is necessary
382*8975f5c5SAndroid Build Coastguard Worker     // for WebGL contexts becuase ARB_texture_rectangle may be necessary for the WebGL
383*8975f5c5SAndroid Build Coastguard Worker     // implementation internally but shouldn't be exposed to WebGL user code.
384*8975f5c5SAndroid Build Coastguard Worker     uint64_t disableARBTextureRectangle : 1;
385*8975f5c5SAndroid Build Coastguard Worker 
386*8975f5c5SAndroid Build Coastguard Worker     // This flag works around a driver bug by rewriting uses of row-major matrices as column-major
387*8975f5c5SAndroid Build Coastguard Worker     // in ESSL 3.00 and greater shaders.
388*8975f5c5SAndroid Build Coastguard Worker     uint64_t rewriteRowMajorMatrices : 1;
389*8975f5c5SAndroid Build Coastguard Worker 
390*8975f5c5SAndroid Build Coastguard Worker     // Drop any explicit precision qualifiers from shader.
391*8975f5c5SAndroid Build Coastguard Worker     uint64_t ignorePrecisionQualifiers : 1;
392*8975f5c5SAndroid Build Coastguard Worker 
393*8975f5c5SAndroid Build Coastguard Worker     // Ask compiler to generate code for depth correction to conform to the Vulkan clip space.  If
394*8975f5c5SAndroid Build Coastguard Worker     // VK_EXT_depth_clip_control is supported, this code is not generated, saving a uniform look up.
395*8975f5c5SAndroid Build Coastguard Worker     uint64_t addVulkanDepthCorrection : 1;
396*8975f5c5SAndroid Build Coastguard Worker 
397*8975f5c5SAndroid Build Coastguard Worker     uint64_t forceShaderPrecisionHighpToMediump : 1;
398*8975f5c5SAndroid Build Coastguard Worker 
399*8975f5c5SAndroid Build Coastguard Worker     // Allow compiler to use specialization constant to do pre-rotation and y flip.
400*8975f5c5SAndroid Build Coastguard Worker     uint64_t useSpecializationConstant : 1;
401*8975f5c5SAndroid Build Coastguard Worker 
402*8975f5c5SAndroid Build Coastguard Worker     // Ask compiler to generate Vulkan transform feedback emulation support code.
403*8975f5c5SAndroid Build Coastguard Worker     uint64_t addVulkanXfbEmulationSupportCode : 1;
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker     // Ask compiler to generate Vulkan transform feedback support code when using the
406*8975f5c5SAndroid Build Coastguard Worker     // VK_EXT_transform_feedback extension.
407*8975f5c5SAndroid Build Coastguard Worker     uint64_t addVulkanXfbExtensionSupportCode : 1;
408*8975f5c5SAndroid Build Coastguard Worker 
409*8975f5c5SAndroid Build Coastguard Worker     // This flag initializes fragment shader's output variables to zero at the beginning of the
410*8975f5c5SAndroid Build Coastguard Worker     // fragment shader's main(). It is intended as a workaround for drivers which get context lost
411*8975f5c5SAndroid Build Coastguard Worker     // if gl_FragColor is not written.
412*8975f5c5SAndroid Build Coastguard Worker     uint64_t initFragmentOutputVariables : 1;
413*8975f5c5SAndroid Build Coastguard Worker 
414*8975f5c5SAndroid Build Coastguard Worker     // Always write explicit location layout qualifiers for fragment outputs.
415*8975f5c5SAndroid Build Coastguard Worker     uint64_t explicitFragmentLocations : 1;
416*8975f5c5SAndroid Build Coastguard Worker 
417*8975f5c5SAndroid Build Coastguard Worker     // Insert explicit casts for float/double/unsigned/signed int on macOS 10.15 with Intel driver
418*8975f5c5SAndroid Build Coastguard Worker     uint64_t addExplicitBoolCasts : 1;
419*8975f5c5SAndroid Build Coastguard Worker 
420*8975f5c5SAndroid Build Coastguard Worker     // Add round() after applying dither.  This works around a Qualcomm quirk where values can get
421*8975f5c5SAndroid Build Coastguard Worker     // ceil()ed instead.
422*8975f5c5SAndroid Build Coastguard Worker     uint64_t roundOutputAfterDithering : 1;
423*8975f5c5SAndroid Build Coastguard Worker 
424*8975f5c5SAndroid Build Coastguard Worker     // issuetracker.google.com/274859104 add OpQuantizeToF16 instruction to cast
425*8975f5c5SAndroid Build Coastguard Worker     // mediump floating-point values to 16 bit. ARM compiler utilized RelaxedPrecision
426*8975f5c5SAndroid Build Coastguard Worker     // to minimize type case and keep a mediump float as 32 bit when assigning it with
427*8975f5c5SAndroid Build Coastguard Worker     // a highp floating-point value. It is possible that GLSL shader code is comparing
428*8975f5c5SAndroid Build Coastguard Worker     // two meiump values, but ARM compiler is comparing a 32 bit value with a 16 bit value,
429*8975f5c5SAndroid Build Coastguard Worker     // causing the comparison to fail.
430*8975f5c5SAndroid Build Coastguard Worker     uint64_t castMediumpFloatTo16Bit : 1;
431*8975f5c5SAndroid Build Coastguard Worker 
432*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/42265995: packUnorm4x8 fails on Pixel 4 if it is not passed a highp vec4.
433*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/42265995): This workaround is currently only applied for pixel local
434*8975f5c5SAndroid Build Coastguard Worker     // storage. We may want to apply it generally.
435*8975f5c5SAndroid Build Coastguard Worker     uint64_t passHighpToPackUnormSnormBuiltins : 1;
436*8975f5c5SAndroid Build Coastguard Worker 
437*8975f5c5SAndroid Build Coastguard Worker     // Use an integer uniform to pass a bitset of enabled clip distances.
438*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateClipDistanceState : 1;
439*8975f5c5SAndroid Build Coastguard Worker 
440*8975f5c5SAndroid Build Coastguard Worker     // Use a uniform to emulate GL_CLIP_ORIGIN_EXT state.
441*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateClipOrigin : 1;
442*8975f5c5SAndroid Build Coastguard Worker 
443*8975f5c5SAndroid Build Coastguard Worker     // issuetracker.google.com/266235549 add aliased memory decoration to ssbo if the variable is
444*8975f5c5SAndroid Build Coastguard Worker     // not declared with "restrict" memory qualifier in GLSL
445*8975f5c5SAndroid Build Coastguard Worker     uint64_t aliasedUnlessRestrict : 1;
446*8975f5c5SAndroid Build Coastguard Worker 
447*8975f5c5SAndroid Build Coastguard Worker     // Use fragment shaders to compute and set coverage mask based on the alpha value
448*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateAlphaToCoverage : 1;
449*8975f5c5SAndroid Build Coastguard Worker 
450*8975f5c5SAndroid Build Coastguard Worker     // Rescope globals that are only used in one function to be function-local.
451*8975f5c5SAndroid Build Coastguard Worker     uint64_t rescopeGlobalVariables : 1;
452*8975f5c5SAndroid Build Coastguard Worker 
453*8975f5c5SAndroid Build Coastguard Worker     // Pre-transform explicit cubemap derivatives for Apple GPUs.
454*8975f5c5SAndroid Build Coastguard Worker     uint64_t preTransformTextureCubeGradDerivatives : 1;
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker     // Workaround for a driver bug with the use of the OpSelect SPIR-V instruction.
457*8975f5c5SAndroid Build Coastguard Worker     uint64_t avoidOpSelectWithMismatchingRelaxedPrecision : 1;
458*8975f5c5SAndroid Build Coastguard Worker 
459*8975f5c5SAndroid Build Coastguard Worker     // Whether SPIR-V 1.4 can be emitted.  If not set, SPIR-V 1.3 is emitted.
460*8975f5c5SAndroid Build Coastguard Worker     uint64_t emitSPIRV14 : 1;
461*8975f5c5SAndroid Build Coastguard Worker 
462*8975f5c5SAndroid Build Coastguard Worker     // Reject shaders with obvious undefined behavior:
463*8975f5c5SAndroid Build Coastguard Worker     //
464*8975f5c5SAndroid Build Coastguard Worker     // - Shader contains easy-to-detect infinite loops
465*8975f5c5SAndroid Build Coastguard Worker     //
466*8975f5c5SAndroid Build Coastguard Worker     uint64_t rejectWebglShadersWithUndefinedBehavior : 1;
467*8975f5c5SAndroid Build Coastguard Worker 
468*8975f5c5SAndroid Build Coastguard Worker     // Emulate r32f image with an r32ui image
469*8975f5c5SAndroid Build Coastguard Worker     uint64_t emulateR32fImageAtomicExchange : 1;
470*8975f5c5SAndroid Build Coastguard Worker 
471*8975f5c5SAndroid Build Coastguard Worker     // Rewrite for and while loops to loop normal form.
472*8975f5c5SAndroid Build Coastguard Worker     uint64_t simplifyLoopConditions : 1;
473*8975f5c5SAndroid Build Coastguard Worker 
474*8975f5c5SAndroid Build Coastguard Worker     // Specify struct in one statement, declare instance in other.
475*8975f5c5SAndroid Build Coastguard Worker     uint64_t separateCompoundStructDeclarations : 1;
476*8975f5c5SAndroid Build Coastguard Worker 
477*8975f5c5SAndroid Build Coastguard Worker     ShCompileOptionsMetal metal;
478*8975f5c5SAndroid Build Coastguard Worker     ShPixelLocalStorageOptions pls;
479*8975f5c5SAndroid Build Coastguard Worker };
480*8975f5c5SAndroid Build Coastguard Worker 
481*8975f5c5SAndroid Build Coastguard Worker // The 64 bits hash function. The first parameter is the input string; the
482*8975f5c5SAndroid Build Coastguard Worker // second parameter is the string length.
483*8975f5c5SAndroid Build Coastguard Worker using ShHashFunction64 = khronos_uint64_t (*)(const char *, size_t);
484*8975f5c5SAndroid Build Coastguard Worker 
485*8975f5c5SAndroid Build Coastguard Worker //
486*8975f5c5SAndroid Build Coastguard Worker // Implementation dependent built-in resources (constants and extensions).
487*8975f5c5SAndroid Build Coastguard Worker // The names for these resources has been obtained by stripping gl_/GL_.
488*8975f5c5SAndroid Build Coastguard Worker //
489*8975f5c5SAndroid Build Coastguard Worker struct ShBuiltInResources
490*8975f5c5SAndroid Build Coastguard Worker {
491*8975f5c5SAndroid Build Coastguard Worker     ShBuiltInResources();
492*8975f5c5SAndroid Build Coastguard Worker     ShBuiltInResources(const ShBuiltInResources &other);
493*8975f5c5SAndroid Build Coastguard Worker     ShBuiltInResources &operator=(const ShBuiltInResources &other);
494*8975f5c5SAndroid Build Coastguard Worker 
495*8975f5c5SAndroid Build Coastguard Worker     // Constants.
496*8975f5c5SAndroid Build Coastguard Worker     int MaxVertexAttribs;
497*8975f5c5SAndroid Build Coastguard Worker     int MaxVertexUniformVectors;
498*8975f5c5SAndroid Build Coastguard Worker     int MaxVaryingVectors;
499*8975f5c5SAndroid Build Coastguard Worker     int MaxVertexTextureImageUnits;
500*8975f5c5SAndroid Build Coastguard Worker     int MaxCombinedTextureImageUnits;
501*8975f5c5SAndroid Build Coastguard Worker     int MaxTextureImageUnits;
502*8975f5c5SAndroid Build Coastguard Worker     int MaxFragmentUniformVectors;
503*8975f5c5SAndroid Build Coastguard Worker     int MaxDrawBuffers;
504*8975f5c5SAndroid Build Coastguard Worker 
505*8975f5c5SAndroid Build Coastguard Worker     // Extensions.
506*8975f5c5SAndroid Build Coastguard Worker     // Set to 1 to enable the extension, else 0.
507*8975f5c5SAndroid Build Coastguard Worker     int OES_standard_derivatives;
508*8975f5c5SAndroid Build Coastguard Worker     int OES_EGL_image_external;
509*8975f5c5SAndroid Build Coastguard Worker     int OES_EGL_image_external_essl3;
510*8975f5c5SAndroid Build Coastguard Worker     int NV_EGL_stream_consumer_external;
511*8975f5c5SAndroid Build Coastguard Worker     int ARB_texture_rectangle;
512*8975f5c5SAndroid Build Coastguard Worker     int EXT_blend_func_extended;
513*8975f5c5SAndroid Build Coastguard Worker     int EXT_conservative_depth;
514*8975f5c5SAndroid Build Coastguard Worker     int EXT_draw_buffers;
515*8975f5c5SAndroid Build Coastguard Worker     int EXT_frag_depth;
516*8975f5c5SAndroid Build Coastguard Worker     int EXT_shader_texture_lod;
517*8975f5c5SAndroid Build Coastguard Worker     int EXT_shader_framebuffer_fetch;
518*8975f5c5SAndroid Build Coastguard Worker     int EXT_shader_framebuffer_fetch_non_coherent;
519*8975f5c5SAndroid Build Coastguard Worker     int NV_shader_framebuffer_fetch;
520*8975f5c5SAndroid Build Coastguard Worker     int NV_shader_noperspective_interpolation;
521*8975f5c5SAndroid Build Coastguard Worker     int ARM_shader_framebuffer_fetch;
522*8975f5c5SAndroid Build Coastguard Worker     int ARM_shader_framebuffer_fetch_depth_stencil;
523*8975f5c5SAndroid Build Coastguard Worker     int OVR_multiview;
524*8975f5c5SAndroid Build Coastguard Worker     int OVR_multiview2;
525*8975f5c5SAndroid Build Coastguard Worker     int EXT_multisampled_render_to_texture;
526*8975f5c5SAndroid Build Coastguard Worker     int EXT_multisampled_render_to_texture2;
527*8975f5c5SAndroid Build Coastguard Worker     int EXT_YUV_target;
528*8975f5c5SAndroid Build Coastguard Worker     int EXT_geometry_shader;
529*8975f5c5SAndroid Build Coastguard Worker     int OES_geometry_shader;
530*8975f5c5SAndroid Build Coastguard Worker     int OES_shader_io_blocks;
531*8975f5c5SAndroid Build Coastguard Worker     int EXT_shader_io_blocks;
532*8975f5c5SAndroid Build Coastguard Worker     int EXT_gpu_shader5;
533*8975f5c5SAndroid Build Coastguard Worker     int OES_gpu_shader5;
534*8975f5c5SAndroid Build Coastguard Worker     int EXT_shader_non_constant_global_initializers;
535*8975f5c5SAndroid Build Coastguard Worker     int OES_texture_storage_multisample_2d_array;
536*8975f5c5SAndroid Build Coastguard Worker     int OES_texture_3D;
537*8975f5c5SAndroid Build Coastguard Worker     int ANGLE_shader_pixel_local_storage;
538*8975f5c5SAndroid Build Coastguard Worker     int ANGLE_texture_multisample;
539*8975f5c5SAndroid Build Coastguard Worker     int ANGLE_multi_draw;
540*8975f5c5SAndroid Build Coastguard Worker     // TODO(angleproject:3402) remove after chromium side removal to pass compilation
541*8975f5c5SAndroid Build Coastguard Worker     int ANGLE_base_vertex_base_instance;
542*8975f5c5SAndroid Build Coastguard Worker     int WEBGL_video_texture;
543*8975f5c5SAndroid Build Coastguard Worker     int APPLE_clip_distance;
544*8975f5c5SAndroid Build Coastguard Worker     int OES_texture_cube_map_array;
545*8975f5c5SAndroid Build Coastguard Worker     int EXT_texture_cube_map_array;
546*8975f5c5SAndroid Build Coastguard Worker     int EXT_texture_query_lod;
547*8975f5c5SAndroid Build Coastguard Worker     int EXT_texture_shadow_lod;
548*8975f5c5SAndroid Build Coastguard Worker     int EXT_shadow_samplers;
549*8975f5c5SAndroid Build Coastguard Worker     int OES_shader_multisample_interpolation;
550*8975f5c5SAndroid Build Coastguard Worker     int OES_shader_image_atomic;
551*8975f5c5SAndroid Build Coastguard Worker     int EXT_tessellation_shader;
552*8975f5c5SAndroid Build Coastguard Worker     int OES_tessellation_shader;
553*8975f5c5SAndroid Build Coastguard Worker     int OES_texture_buffer;
554*8975f5c5SAndroid Build Coastguard Worker     int EXT_texture_buffer;
555*8975f5c5SAndroid Build Coastguard Worker     int OES_sample_variables;
556*8975f5c5SAndroid Build Coastguard Worker     int EXT_clip_cull_distance;
557*8975f5c5SAndroid Build Coastguard Worker     int ANGLE_clip_cull_distance;
558*8975f5c5SAndroid Build Coastguard Worker     int EXT_primitive_bounding_box;
559*8975f5c5SAndroid Build Coastguard Worker     int OES_primitive_bounding_box;
560*8975f5c5SAndroid Build Coastguard Worker     int EXT_separate_shader_objects;
561*8975f5c5SAndroid Build Coastguard Worker     int ANGLE_base_vertex_base_instance_shader_builtin;
562*8975f5c5SAndroid Build Coastguard Worker     int ANDROID_extension_pack_es31a;
563*8975f5c5SAndroid Build Coastguard Worker     int KHR_blend_equation_advanced;
564*8975f5c5SAndroid Build Coastguard Worker 
565*8975f5c5SAndroid Build Coastguard Worker     // Set to 1 to enable replacing GL_EXT_draw_buffers #extension directives
566*8975f5c5SAndroid Build Coastguard Worker     // with GL_NV_draw_buffers in ESSL output. This flag can be used to emulate
567*8975f5c5SAndroid Build Coastguard Worker     // EXT_draw_buffers by using it in combination with GLES3.0 glDrawBuffers
568*8975f5c5SAndroid Build Coastguard Worker     // function. This applies to Tegra K1 devices.
569*8975f5c5SAndroid Build Coastguard Worker     int NV_draw_buffers;
570*8975f5c5SAndroid Build Coastguard Worker 
571*8975f5c5SAndroid Build Coastguard Worker     // Set to 1 if highp precision is supported in the ESSL 1.00 version of the
572*8975f5c5SAndroid Build Coastguard Worker     // fragment language. Does not affect versions of the language where highp
573*8975f5c5SAndroid Build Coastguard Worker     // support is mandatory.
574*8975f5c5SAndroid Build Coastguard Worker     // Default is 0.
575*8975f5c5SAndroid Build Coastguard Worker     int FragmentPrecisionHigh;
576*8975f5c5SAndroid Build Coastguard Worker 
577*8975f5c5SAndroid Build Coastguard Worker     // GLSL ES 3.0 constants.
578*8975f5c5SAndroid Build Coastguard Worker     int MaxVertexOutputVectors;
579*8975f5c5SAndroid Build Coastguard Worker     int MaxFragmentInputVectors;
580*8975f5c5SAndroid Build Coastguard Worker     int MinProgramTexelOffset;
581*8975f5c5SAndroid Build Coastguard Worker     int MaxProgramTexelOffset;
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker     // Extension constants.
584*8975f5c5SAndroid Build Coastguard Worker 
585*8975f5c5SAndroid Build Coastguard Worker     // Value of GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT for OpenGL ES output context.
586*8975f5c5SAndroid Build Coastguard Worker     // Value of GL_MAX_DUAL_SOURCE_DRAW_BUFFERS for OpenGL output context.
587*8975f5c5SAndroid Build Coastguard Worker     // GLES SL version 100 gl_MaxDualSourceDrawBuffersEXT value for EXT_blend_func_extended.
588*8975f5c5SAndroid Build Coastguard Worker     int MaxDualSourceDrawBuffers;
589*8975f5c5SAndroid Build Coastguard Worker 
590*8975f5c5SAndroid Build Coastguard Worker     // Value of GL_MAX_VIEWS_OVR.
591*8975f5c5SAndroid Build Coastguard Worker     int MaxViewsOVR;
592*8975f5c5SAndroid Build Coastguard Worker 
593*8975f5c5SAndroid Build Coastguard Worker     // Name Hashing.
594*8975f5c5SAndroid Build Coastguard Worker     // Set a 64 bit hash function to enable user-defined name hashing.
595*8975f5c5SAndroid Build Coastguard Worker     // Default is NULL.
596*8975f5c5SAndroid Build Coastguard Worker     ShHashFunction64 HashFunction;
597*8975f5c5SAndroid Build Coastguard Worker 
598*8975f5c5SAndroid Build Coastguard Worker     // The maximum complexity an expression can be when limitExpressionComplexity is turned on.
599*8975f5c5SAndroid Build Coastguard Worker     int MaxExpressionComplexity;
600*8975f5c5SAndroid Build Coastguard Worker 
601*8975f5c5SAndroid Build Coastguard Worker     // The maximum depth of certain nestable statements (while, switch);
602*8975f5c5SAndroid Build Coastguard Worker     int MaxStatementDepth;
603*8975f5c5SAndroid Build Coastguard Worker 
604*8975f5c5SAndroid Build Coastguard Worker     // The maximum depth a call stack can be.
605*8975f5c5SAndroid Build Coastguard Worker     int MaxCallStackDepth;
606*8975f5c5SAndroid Build Coastguard Worker 
607*8975f5c5SAndroid Build Coastguard Worker     // The maximum number of parameters a function can have when limitExpressionComplexity is turned
608*8975f5c5SAndroid Build Coastguard Worker     // on.
609*8975f5c5SAndroid Build Coastguard Worker     int MaxFunctionParameters;
610*8975f5c5SAndroid Build Coastguard Worker 
611*8975f5c5SAndroid Build Coastguard Worker     // GLES 3.1 constants
612*8975f5c5SAndroid Build Coastguard Worker 
613*8975f5c5SAndroid Build Coastguard Worker     // texture gather offset constraints.
614*8975f5c5SAndroid Build Coastguard Worker     int MinProgramTextureGatherOffset;
615*8975f5c5SAndroid Build Coastguard Worker     int MaxProgramTextureGatherOffset;
616*8975f5c5SAndroid Build Coastguard Worker 
617*8975f5c5SAndroid Build Coastguard Worker     // maximum number of available image units
618*8975f5c5SAndroid Build Coastguard Worker     int MaxImageUnits;
619*8975f5c5SAndroid Build Coastguard Worker 
620*8975f5c5SAndroid Build Coastguard Worker     // OES_sample_variables constant
621*8975f5c5SAndroid Build Coastguard Worker     // maximum number of available samples
622*8975f5c5SAndroid Build Coastguard Worker     int MaxSamples;
623*8975f5c5SAndroid Build Coastguard Worker 
624*8975f5c5SAndroid Build Coastguard Worker     // maximum number of image uniforms in a vertex shader
625*8975f5c5SAndroid Build Coastguard Worker     int MaxVertexImageUniforms;
626*8975f5c5SAndroid Build Coastguard Worker 
627*8975f5c5SAndroid Build Coastguard Worker     // maximum number of image uniforms in a fragment shader
628*8975f5c5SAndroid Build Coastguard Worker     int MaxFragmentImageUniforms;
629*8975f5c5SAndroid Build Coastguard Worker 
630*8975f5c5SAndroid Build Coastguard Worker     // maximum number of image uniforms in a compute shader
631*8975f5c5SAndroid Build Coastguard Worker     int MaxComputeImageUniforms;
632*8975f5c5SAndroid Build Coastguard Worker 
633*8975f5c5SAndroid Build Coastguard Worker     // maximum total number of image uniforms in a program
634*8975f5c5SAndroid Build Coastguard Worker     int MaxCombinedImageUniforms;
635*8975f5c5SAndroid Build Coastguard Worker 
636*8975f5c5SAndroid Build Coastguard Worker     // maximum number of uniform locations
637*8975f5c5SAndroid Build Coastguard Worker     int MaxUniformLocations;
638*8975f5c5SAndroid Build Coastguard Worker 
639*8975f5c5SAndroid Build Coastguard Worker     // maximum number of ssbos and images in a shader
640*8975f5c5SAndroid Build Coastguard Worker     int MaxCombinedShaderOutputResources;
641*8975f5c5SAndroid Build Coastguard Worker 
642*8975f5c5SAndroid Build Coastguard Worker     // maximum number of groups in each dimension
643*8975f5c5SAndroid Build Coastguard Worker     std::array<int, 3> MaxComputeWorkGroupCount;
644*8975f5c5SAndroid Build Coastguard Worker     // maximum number of threads per work group in each dimension
645*8975f5c5SAndroid Build Coastguard Worker     std::array<int, 3> MaxComputeWorkGroupSize;
646*8975f5c5SAndroid Build Coastguard Worker 
647*8975f5c5SAndroid Build Coastguard Worker     // maximum number of total uniform components
648*8975f5c5SAndroid Build Coastguard Worker     int MaxComputeUniformComponents;
649*8975f5c5SAndroid Build Coastguard Worker 
650*8975f5c5SAndroid Build Coastguard Worker     // maximum number of texture image units in a compute shader
651*8975f5c5SAndroid Build Coastguard Worker     int MaxComputeTextureImageUnits;
652*8975f5c5SAndroid Build Coastguard Worker 
653*8975f5c5SAndroid Build Coastguard Worker     // maximum number of atomic counters in a compute shader
654*8975f5c5SAndroid Build Coastguard Worker     int MaxComputeAtomicCounters;
655*8975f5c5SAndroid Build Coastguard Worker 
656*8975f5c5SAndroid Build Coastguard Worker     // maximum number of atomic counter buffers in a compute shader
657*8975f5c5SAndroid Build Coastguard Worker     int MaxComputeAtomicCounterBuffers;
658*8975f5c5SAndroid Build Coastguard Worker 
659*8975f5c5SAndroid Build Coastguard Worker     // maximum number of atomic counters in a vertex shader
660*8975f5c5SAndroid Build Coastguard Worker     int MaxVertexAtomicCounters;
661*8975f5c5SAndroid Build Coastguard Worker 
662*8975f5c5SAndroid Build Coastguard Worker     // maximum number of atomic counters in a fragment shader
663*8975f5c5SAndroid Build Coastguard Worker     int MaxFragmentAtomicCounters;
664*8975f5c5SAndroid Build Coastguard Worker 
665*8975f5c5SAndroid Build Coastguard Worker     // maximum number of atomic counters in a program
666*8975f5c5SAndroid Build Coastguard Worker     int MaxCombinedAtomicCounters;
667*8975f5c5SAndroid Build Coastguard Worker 
668*8975f5c5SAndroid Build Coastguard Worker     // maximum binding for an atomic counter
669*8975f5c5SAndroid Build Coastguard Worker     int MaxAtomicCounterBindings;
670*8975f5c5SAndroid Build Coastguard Worker 
671*8975f5c5SAndroid Build Coastguard Worker     // maximum number of atomic counter buffers in a vertex shader
672*8975f5c5SAndroid Build Coastguard Worker     int MaxVertexAtomicCounterBuffers;
673*8975f5c5SAndroid Build Coastguard Worker 
674*8975f5c5SAndroid Build Coastguard Worker     // maximum number of atomic counter buffers in a fragment shader
675*8975f5c5SAndroid Build Coastguard Worker     int MaxFragmentAtomicCounterBuffers;
676*8975f5c5SAndroid Build Coastguard Worker 
677*8975f5c5SAndroid Build Coastguard Worker     // maximum number of atomic counter buffers in a program
678*8975f5c5SAndroid Build Coastguard Worker     int MaxCombinedAtomicCounterBuffers;
679*8975f5c5SAndroid Build Coastguard Worker 
680*8975f5c5SAndroid Build Coastguard Worker     // maximum number of buffer object storage in machine units
681*8975f5c5SAndroid Build Coastguard Worker     int MaxAtomicCounterBufferSize;
682*8975f5c5SAndroid Build Coastguard Worker 
683*8975f5c5SAndroid Build Coastguard Worker     // maximum number of uniform block bindings
684*8975f5c5SAndroid Build Coastguard Worker     int MaxUniformBufferBindings;
685*8975f5c5SAndroid Build Coastguard Worker 
686*8975f5c5SAndroid Build Coastguard Worker     // maximum number of shader storage buffer bindings
687*8975f5c5SAndroid Build Coastguard Worker     int MaxShaderStorageBufferBindings;
688*8975f5c5SAndroid Build Coastguard Worker 
689*8975f5c5SAndroid Build Coastguard Worker     // minimum point size (lower limit from ALIASED_POINT_SIZE_RANGE)
690*8975f5c5SAndroid Build Coastguard Worker     float MinPointSize;
691*8975f5c5SAndroid Build Coastguard Worker 
692*8975f5c5SAndroid Build Coastguard Worker     // maximum point size (higher limit from ALIASED_POINT_SIZE_RANGE)
693*8975f5c5SAndroid Build Coastguard Worker     float MaxPointSize;
694*8975f5c5SAndroid Build Coastguard Worker 
695*8975f5c5SAndroid Build Coastguard Worker     // EXT_geometry_shader constants
696*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryUniformComponents;
697*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryUniformBlocks;
698*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryInputComponents;
699*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryOutputComponents;
700*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryOutputVertices;
701*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryTotalOutputComponents;
702*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryTextureImageUnits;
703*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryAtomicCounterBuffers;
704*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryAtomicCounters;
705*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryShaderStorageBlocks;
706*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryShaderInvocations;
707*8975f5c5SAndroid Build Coastguard Worker     int MaxGeometryImageUniforms;
708*8975f5c5SAndroid Build Coastguard Worker 
709*8975f5c5SAndroid Build Coastguard Worker     // EXT_tessellation_shader constants
710*8975f5c5SAndroid Build Coastguard Worker     int MaxTessControlInputComponents;
711*8975f5c5SAndroid Build Coastguard Worker     int MaxTessControlOutputComponents;
712*8975f5c5SAndroid Build Coastguard Worker     int MaxTessControlTextureImageUnits;
713*8975f5c5SAndroid Build Coastguard Worker     int MaxTessControlUniformComponents;
714*8975f5c5SAndroid Build Coastguard Worker     int MaxTessControlTotalOutputComponents;
715*8975f5c5SAndroid Build Coastguard Worker     int MaxTessControlImageUniforms;
716*8975f5c5SAndroid Build Coastguard Worker     int MaxTessControlAtomicCounters;
717*8975f5c5SAndroid Build Coastguard Worker     int MaxTessControlAtomicCounterBuffers;
718*8975f5c5SAndroid Build Coastguard Worker 
719*8975f5c5SAndroid Build Coastguard Worker     int MaxTessPatchComponents;
720*8975f5c5SAndroid Build Coastguard Worker     int MaxPatchVertices;
721*8975f5c5SAndroid Build Coastguard Worker     int MaxTessGenLevel;
722*8975f5c5SAndroid Build Coastguard Worker 
723*8975f5c5SAndroid Build Coastguard Worker     int MaxTessEvaluationInputComponents;
724*8975f5c5SAndroid Build Coastguard Worker     int MaxTessEvaluationOutputComponents;
725*8975f5c5SAndroid Build Coastguard Worker     int MaxTessEvaluationTextureImageUnits;
726*8975f5c5SAndroid Build Coastguard Worker     int MaxTessEvaluationUniformComponents;
727*8975f5c5SAndroid Build Coastguard Worker     int MaxTessEvaluationImageUniforms;
728*8975f5c5SAndroid Build Coastguard Worker     int MaxTessEvaluationAtomicCounters;
729*8975f5c5SAndroid Build Coastguard Worker     int MaxTessEvaluationAtomicCounterBuffers;
730*8975f5c5SAndroid Build Coastguard Worker 
731*8975f5c5SAndroid Build Coastguard Worker     // Subpixel bits used in rasterization.
732*8975f5c5SAndroid Build Coastguard Worker     int SubPixelBits;
733*8975f5c5SAndroid Build Coastguard Worker 
734*8975f5c5SAndroid Build Coastguard Worker     // APPLE_clip_distance / EXT_clip_cull_distance / ANGLE_clip_cull_distance constants
735*8975f5c5SAndroid Build Coastguard Worker     int MaxClipDistances;
736*8975f5c5SAndroid Build Coastguard Worker     int MaxCullDistances;
737*8975f5c5SAndroid Build Coastguard Worker     int MaxCombinedClipAndCullDistances;
738*8975f5c5SAndroid Build Coastguard Worker 
739*8975f5c5SAndroid Build Coastguard Worker     // ANGLE_shader_pixel_local_storage.
740*8975f5c5SAndroid Build Coastguard Worker     int MaxPixelLocalStoragePlanes;
741*8975f5c5SAndroid Build Coastguard Worker     int MaxColorAttachmentsWithActivePixelLocalStorage;
742*8975f5c5SAndroid Build Coastguard Worker     int MaxCombinedDrawBuffersAndPixelLocalStoragePlanes;
743*8975f5c5SAndroid Build Coastguard Worker };
744*8975f5c5SAndroid Build Coastguard Worker 
745*8975f5c5SAndroid Build Coastguard Worker //
746*8975f5c5SAndroid Build Coastguard Worker // ShHandle held by but opaque to the driver.  It is allocated,
747*8975f5c5SAndroid Build Coastguard Worker // managed, and de-allocated by the compiler. Its contents
748*8975f5c5SAndroid Build Coastguard Worker // are defined by and used by the compiler.
749*8975f5c5SAndroid Build Coastguard Worker //
750*8975f5c5SAndroid Build Coastguard Worker // If handle creation fails, 0 will be returned.
751*8975f5c5SAndroid Build Coastguard Worker //
752*8975f5c5SAndroid Build Coastguard Worker using ShHandle = void *;
753*8975f5c5SAndroid Build Coastguard Worker 
754*8975f5c5SAndroid Build Coastguard Worker namespace sh
755*8975f5c5SAndroid Build Coastguard Worker {
756*8975f5c5SAndroid Build Coastguard Worker using BinaryBlob       = std::vector<uint32_t>;
757*8975f5c5SAndroid Build Coastguard Worker using ShaderBinaryBlob = std::vector<uint8_t>;
758*8975f5c5SAndroid Build Coastguard Worker 
759*8975f5c5SAndroid Build Coastguard Worker //
760*8975f5c5SAndroid Build Coastguard Worker // Driver must call this first, once, before doing any other compiler operations.
761*8975f5c5SAndroid Build Coastguard Worker // If the function succeeds, the return value is true, else false.
762*8975f5c5SAndroid Build Coastguard Worker //
763*8975f5c5SAndroid Build Coastguard Worker bool Initialize();
764*8975f5c5SAndroid Build Coastguard Worker //
765*8975f5c5SAndroid Build Coastguard Worker // Driver should call this at shutdown.
766*8975f5c5SAndroid Build Coastguard Worker // If the function succeeds, the return value is true, else false.
767*8975f5c5SAndroid Build Coastguard Worker //
768*8975f5c5SAndroid Build Coastguard Worker bool Finalize();
769*8975f5c5SAndroid Build Coastguard Worker 
770*8975f5c5SAndroid Build Coastguard Worker //
771*8975f5c5SAndroid Build Coastguard Worker // Initialize built-in resources with minimum expected values.
772*8975f5c5SAndroid Build Coastguard Worker // Parameters:
773*8975f5c5SAndroid Build Coastguard Worker // resources: The object to initialize. Will be comparable with memcmp.
774*8975f5c5SAndroid Build Coastguard Worker //
775*8975f5c5SAndroid Build Coastguard Worker void InitBuiltInResources(ShBuiltInResources *resources);
776*8975f5c5SAndroid Build Coastguard Worker 
777*8975f5c5SAndroid Build Coastguard Worker //
778*8975f5c5SAndroid Build Coastguard Worker // Returns a copy of the current ShBuiltInResources stored in the compiler.
779*8975f5c5SAndroid Build Coastguard Worker // Parameters:
780*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the handle of the compiler to be used.
781*8975f5c5SAndroid Build Coastguard Worker ShBuiltInResources GetBuiltInResources(const ShHandle handle);
782*8975f5c5SAndroid Build Coastguard Worker 
783*8975f5c5SAndroid Build Coastguard Worker //
784*8975f5c5SAndroid Build Coastguard Worker // Returns the a concatenated list of the items in ShBuiltInResources as a null-terminated string.
785*8975f5c5SAndroid Build Coastguard Worker // This function must be updated whenever ShBuiltInResources is changed.
786*8975f5c5SAndroid Build Coastguard Worker // Parameters:
787*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the handle of the compiler to be used.
788*8975f5c5SAndroid Build Coastguard Worker const std::string &GetBuiltInResourcesString(const ShHandle handle);
789*8975f5c5SAndroid Build Coastguard Worker 
790*8975f5c5SAndroid Build Coastguard Worker //
791*8975f5c5SAndroid Build Coastguard Worker // Driver calls these to create and destroy compiler objects.
792*8975f5c5SAndroid Build Coastguard Worker //
793*8975f5c5SAndroid Build Coastguard Worker // Returns the handle of constructed compiler, null if the requested compiler is not supported.
794*8975f5c5SAndroid Build Coastguard Worker // Parameters:
795*8975f5c5SAndroid Build Coastguard Worker // type: Specifies the type of shader - GL_FRAGMENT_SHADER or GL_VERTEX_SHADER.
796*8975f5c5SAndroid Build Coastguard Worker // spec: Specifies the language spec the compiler must conform to - SH_GLES2_SPEC or SH_WEBGL_SPEC.
797*8975f5c5SAndroid Build Coastguard Worker // output: Specifies the output code type - for example SH_ESSL_OUTPUT, SH_GLSL_OUTPUT,
798*8975f5c5SAndroid Build Coastguard Worker //         SH_HLSL_3_0_OUTPUT or SH_HLSL_4_1_OUTPUT. Note: Each output type may only
799*8975f5c5SAndroid Build Coastguard Worker //         be supported in some configurations.
800*8975f5c5SAndroid Build Coastguard Worker // resources: Specifies the built-in resources.
801*8975f5c5SAndroid Build Coastguard Worker ShHandle ConstructCompiler(sh::GLenum type,
802*8975f5c5SAndroid Build Coastguard Worker                            ShShaderSpec spec,
803*8975f5c5SAndroid Build Coastguard Worker                            ShShaderOutput output,
804*8975f5c5SAndroid Build Coastguard Worker                            const ShBuiltInResources *resources);
805*8975f5c5SAndroid Build Coastguard Worker void Destruct(ShHandle handle);
806*8975f5c5SAndroid Build Coastguard Worker 
807*8975f5c5SAndroid Build Coastguard Worker //
808*8975f5c5SAndroid Build Coastguard Worker // Compiles the given shader source.
809*8975f5c5SAndroid Build Coastguard Worker // If the function succeeds, the return value is true, else false.
810*8975f5c5SAndroid Build Coastguard Worker // Parameters:
811*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the handle of compiler to be used.
812*8975f5c5SAndroid Build Coastguard Worker // shaderStrings: Specifies an array of pointers to null-terminated strings containing the shader
813*8975f5c5SAndroid Build Coastguard Worker // source code.
814*8975f5c5SAndroid Build Coastguard Worker // numStrings: Specifies the number of elements in shaderStrings array.
815*8975f5c5SAndroid Build Coastguard Worker // compileOptions: A mask of compile options defined above.
816*8975f5c5SAndroid Build Coastguard Worker bool Compile(const ShHandle handle,
817*8975f5c5SAndroid Build Coastguard Worker              const char *const shaderStrings[],
818*8975f5c5SAndroid Build Coastguard Worker              size_t numStrings,
819*8975f5c5SAndroid Build Coastguard Worker              const ShCompileOptions &compileOptions);
820*8975f5c5SAndroid Build Coastguard Worker 
821*8975f5c5SAndroid Build Coastguard Worker // Clears the results from the previous compilation.
822*8975f5c5SAndroid Build Coastguard Worker void ClearResults(const ShHandle handle);
823*8975f5c5SAndroid Build Coastguard Worker 
824*8975f5c5SAndroid Build Coastguard Worker // Return the version of the shader language.
825*8975f5c5SAndroid Build Coastguard Worker int GetShaderVersion(const ShHandle handle);
826*8975f5c5SAndroid Build Coastguard Worker 
827*8975f5c5SAndroid Build Coastguard Worker // Return the currently set language output type.
828*8975f5c5SAndroid Build Coastguard Worker ShShaderOutput GetShaderOutputType(const ShHandle handle);
829*8975f5c5SAndroid Build Coastguard Worker 
830*8975f5c5SAndroid Build Coastguard Worker // Returns null-terminated information log for a compiled shader.
831*8975f5c5SAndroid Build Coastguard Worker // Parameters:
832*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
833*8975f5c5SAndroid Build Coastguard Worker const std::string &GetInfoLog(const ShHandle handle);
834*8975f5c5SAndroid Build Coastguard Worker 
835*8975f5c5SAndroid Build Coastguard Worker // Returns null-terminated object code for a compiled shader.  Only valid for output types that
836*8975f5c5SAndroid Build Coastguard Worker // generate human-readable code (GLSL, ESSL or HLSL).
837*8975f5c5SAndroid Build Coastguard Worker // Parameters:
838*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
839*8975f5c5SAndroid Build Coastguard Worker const std::string &GetObjectCode(const ShHandle handle);
840*8975f5c5SAndroid Build Coastguard Worker 
841*8975f5c5SAndroid Build Coastguard Worker // Returns object binary blob for a compiled shader.  Only valid for output types that
842*8975f5c5SAndroid Build Coastguard Worker // generate binary blob (SPIR-V).
843*8975f5c5SAndroid Build Coastguard Worker // Parameters:
844*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
845*8975f5c5SAndroid Build Coastguard Worker const BinaryBlob &GetObjectBinaryBlob(const ShHandle handle);
846*8975f5c5SAndroid Build Coastguard Worker 
847*8975f5c5SAndroid Build Coastguard Worker // Returns a full binary for a compiled shader, to be loaded with glShaderBinary during runtime.
848*8975f5c5SAndroid Build Coastguard Worker // Parameters:
849*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
850*8975f5c5SAndroid Build Coastguard Worker bool GetShaderBinary(const ShHandle handle,
851*8975f5c5SAndroid Build Coastguard Worker                      const char *const shaderStrings[],
852*8975f5c5SAndroid Build Coastguard Worker                      size_t numStrings,
853*8975f5c5SAndroid Build Coastguard Worker                      const ShCompileOptions &compileOptions,
854*8975f5c5SAndroid Build Coastguard Worker                      ShaderBinaryBlob *const binaryOut);
855*8975f5c5SAndroid Build Coastguard Worker 
856*8975f5c5SAndroid Build Coastguard Worker // Returns a (original_name, hash) map containing all the user defined names in the shader,
857*8975f5c5SAndroid Build Coastguard Worker // including variable names, function names, struct names, and struct field names.
858*8975f5c5SAndroid Build Coastguard Worker // Parameters:
859*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
860*8975f5c5SAndroid Build Coastguard Worker const std::map<std::string, std::string> *GetNameHashingMap(const ShHandle handle);
861*8975f5c5SAndroid Build Coastguard Worker 
862*8975f5c5SAndroid Build Coastguard Worker // Shader variable inspection.
863*8975f5c5SAndroid Build Coastguard Worker // Returns a pointer to a list of variables of the designated type.
864*8975f5c5SAndroid Build Coastguard Worker // (See ShaderVars.h for type definitions, included above)
865*8975f5c5SAndroid Build Coastguard Worker // Returns NULL on failure.
866*8975f5c5SAndroid Build Coastguard Worker // Parameters:
867*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
868*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::ShaderVariable> *GetUniforms(const ShHandle handle);
869*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::ShaderVariable> *GetVaryings(const ShHandle handle);
870*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::ShaderVariable> *GetInputVaryings(const ShHandle handle);
871*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::ShaderVariable> *GetOutputVaryings(const ShHandle handle);
872*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::ShaderVariable> *GetAttributes(const ShHandle handle);
873*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::ShaderVariable> *GetOutputVariables(const ShHandle handle);
874*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::InterfaceBlock> *GetInterfaceBlocks(const ShHandle handle);
875*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::InterfaceBlock> *GetUniformBlocks(const ShHandle handle);
876*8975f5c5SAndroid Build Coastguard Worker const std::vector<sh::InterfaceBlock> *GetShaderStorageBlocks(const ShHandle handle);
877*8975f5c5SAndroid Build Coastguard Worker sh::WorkGroupSize GetComputeShaderLocalGroupSize(const ShHandle handle);
878*8975f5c5SAndroid Build Coastguard Worker // Returns the number of views specified through the num_views layout qualifier. If num_views is
879*8975f5c5SAndroid Build Coastguard Worker // not set, the function returns -1.
880*8975f5c5SAndroid Build Coastguard Worker int GetVertexShaderNumViews(const ShHandle handle);
881*8975f5c5SAndroid Build Coastguard Worker // Returns the pixel local storage uniform format at each binding index, or "NotPLS" if there is
882*8975f5c5SAndroid Build Coastguard Worker // not one.
883*8975f5c5SAndroid Build Coastguard Worker const std::vector<ShPixelLocalStorageFormat> *GetPixelLocalStorageFormats(const ShHandle handle);
884*8975f5c5SAndroid Build Coastguard Worker 
885*8975f5c5SAndroid Build Coastguard Worker // Returns specialization constant usage bits
886*8975f5c5SAndroid Build Coastguard Worker uint32_t GetShaderSpecConstUsageBits(const ShHandle handle);
887*8975f5c5SAndroid Build Coastguard Worker 
888*8975f5c5SAndroid Build Coastguard Worker // Returns true if the passed in variables pack in maxVectors followingthe packing rules from the
889*8975f5c5SAndroid Build Coastguard Worker // GLSL 1.017 spec, Appendix A, section 7.
890*8975f5c5SAndroid Build Coastguard Worker // Returns false otherwise. Also look at the enforcePackingRestrictions flag above.
891*8975f5c5SAndroid Build Coastguard Worker // Parameters:
892*8975f5c5SAndroid Build Coastguard Worker // maxVectors: the available rows of registers.
893*8975f5c5SAndroid Build Coastguard Worker // variables: an array of variables.
894*8975f5c5SAndroid Build Coastguard Worker bool CheckVariablesWithinPackingLimits(int maxVectors,
895*8975f5c5SAndroid Build Coastguard Worker                                        const std::vector<sh::ShaderVariable> &variables);
896*8975f5c5SAndroid Build Coastguard Worker 
897*8975f5c5SAndroid Build Coastguard Worker // Gives the compiler-assigned register for a shader storage block.
898*8975f5c5SAndroid Build Coastguard Worker // The method writes the value to the output variable "indexOut".
899*8975f5c5SAndroid Build Coastguard Worker // Returns true if it found a valid shader storage block, false otherwise.
900*8975f5c5SAndroid Build Coastguard Worker // Parameters:
901*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
902*8975f5c5SAndroid Build Coastguard Worker // shaderStorageBlockName: Specifies the shader storage block
903*8975f5c5SAndroid Build Coastguard Worker // indexOut: output variable that stores the assigned register
904*8975f5c5SAndroid Build Coastguard Worker bool GetShaderStorageBlockRegister(const ShHandle handle,
905*8975f5c5SAndroid Build Coastguard Worker                                    const std::string &shaderStorageBlockName,
906*8975f5c5SAndroid Build Coastguard Worker                                    unsigned int *indexOut);
907*8975f5c5SAndroid Build Coastguard Worker 
908*8975f5c5SAndroid Build Coastguard Worker // Gives the compiler-assigned register for a uniform block.
909*8975f5c5SAndroid Build Coastguard Worker // The method writes the value to the output variable "indexOut".
910*8975f5c5SAndroid Build Coastguard Worker // Returns true if it found a valid uniform block, false otherwise.
911*8975f5c5SAndroid Build Coastguard Worker // Parameters:
912*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
913*8975f5c5SAndroid Build Coastguard Worker // uniformBlockName: Specifies the uniform block
914*8975f5c5SAndroid Build Coastguard Worker // indexOut: output variable that stores the assigned register
915*8975f5c5SAndroid Build Coastguard Worker bool GetUniformBlockRegister(const ShHandle handle,
916*8975f5c5SAndroid Build Coastguard Worker                              const std::string &uniformBlockName,
917*8975f5c5SAndroid Build Coastguard Worker                              unsigned int *indexOut);
918*8975f5c5SAndroid Build Coastguard Worker 
919*8975f5c5SAndroid Build Coastguard Worker bool ShouldUniformBlockUseStructuredBuffer(const ShHandle handle,
920*8975f5c5SAndroid Build Coastguard Worker                                            const std::string &uniformBlockName);
921*8975f5c5SAndroid Build Coastguard Worker const std::set<std::string> *GetSlowCompilingUniformBlockSet(const ShHandle handle);
922*8975f5c5SAndroid Build Coastguard Worker 
923*8975f5c5SAndroid Build Coastguard Worker // Gives a map from uniform names to compiler-assigned registers in the default uniform block.
924*8975f5c5SAndroid Build Coastguard Worker // Note that the map contains also registers of samplers that have been extracted from structs.
925*8975f5c5SAndroid Build Coastguard Worker const std::map<std::string, unsigned int> *GetUniformRegisterMap(const ShHandle handle);
926*8975f5c5SAndroid Build Coastguard Worker 
927*8975f5c5SAndroid Build Coastguard Worker // Sampler, image and atomic counters share registers(t type and u type),
928*8975f5c5SAndroid Build Coastguard Worker // GetReadonlyImage2DRegisterIndex and GetImage2DRegisterIndex return the first index into
929*8975f5c5SAndroid Build Coastguard Worker // a range of reserved registers for image2D/iimage2D/uimage2D variables.
930*8975f5c5SAndroid Build Coastguard Worker // Parameters: handle: Specifies the compiler
931*8975f5c5SAndroid Build Coastguard Worker unsigned int GetReadonlyImage2DRegisterIndex(const ShHandle handle);
932*8975f5c5SAndroid Build Coastguard Worker unsigned int GetImage2DRegisterIndex(const ShHandle handle);
933*8975f5c5SAndroid Build Coastguard Worker 
934*8975f5c5SAndroid Build Coastguard Worker // The method records these used function names related with image2D/iimage2D/uimage2D, these
935*8975f5c5SAndroid Build Coastguard Worker // functions will be dynamically generated.
936*8975f5c5SAndroid Build Coastguard Worker // Parameters:
937*8975f5c5SAndroid Build Coastguard Worker // handle: Specifies the compiler
938*8975f5c5SAndroid Build Coastguard Worker const std::set<std::string> *GetUsedImage2DFunctionNames(const ShHandle handle);
939*8975f5c5SAndroid Build Coastguard Worker 
940*8975f5c5SAndroid Build Coastguard Worker uint8_t GetClipDistanceArraySize(const ShHandle handle);
941*8975f5c5SAndroid Build Coastguard Worker uint8_t GetCullDistanceArraySize(const ShHandle handle);
942*8975f5c5SAndroid Build Coastguard Worker GLenum GetGeometryShaderInputPrimitiveType(const ShHandle handle);
943*8975f5c5SAndroid Build Coastguard Worker GLenum GetGeometryShaderOutputPrimitiveType(const ShHandle handle);
944*8975f5c5SAndroid Build Coastguard Worker int GetGeometryShaderInvocations(const ShHandle handle);
945*8975f5c5SAndroid Build Coastguard Worker int GetGeometryShaderMaxVertices(const ShHandle handle);
946*8975f5c5SAndroid Build Coastguard Worker unsigned int GetShaderSharedMemorySize(const ShHandle handle);
947*8975f5c5SAndroid Build Coastguard Worker int GetTessControlShaderVertices(const ShHandle handle);
948*8975f5c5SAndroid Build Coastguard Worker GLenum GetTessGenMode(const ShHandle handle);
949*8975f5c5SAndroid Build Coastguard Worker GLenum GetTessGenSpacing(const ShHandle handle);
950*8975f5c5SAndroid Build Coastguard Worker GLenum GetTessGenVertexOrder(const ShHandle handle);
951*8975f5c5SAndroid Build Coastguard Worker GLenum GetTessGenPointMode(const ShHandle handle);
952*8975f5c5SAndroid Build Coastguard Worker 
953*8975f5c5SAndroid Build Coastguard Worker // Returns a bitset of sh::MetadataFlags.  This bundles various bits purely for convenience.
954*8975f5c5SAndroid Build Coastguard Worker uint32_t GetMetadataFlags(const ShHandle handle);
955*8975f5c5SAndroid Build Coastguard Worker 
956*8975f5c5SAndroid Build Coastguard Worker // Returns the blend equation list supported in the fragment shader.  This is a bitset of
957*8975f5c5SAndroid Build Coastguard Worker // gl::BlendEquationType, and can only include bits from KHR_blend_equation_advanced.
958*8975f5c5SAndroid Build Coastguard Worker uint32_t GetAdvancedBlendEquations(const ShHandle handle);
959*8975f5c5SAndroid Build Coastguard Worker 
960*8975f5c5SAndroid Build Coastguard Worker //
961*8975f5c5SAndroid Build Coastguard Worker // Helper function to identify specs that are based on the WebGL spec.
962*8975f5c5SAndroid Build Coastguard Worker //
IsWebGLBasedSpec(ShShaderSpec spec)963*8975f5c5SAndroid Build Coastguard Worker inline bool IsWebGLBasedSpec(ShShaderSpec spec)
964*8975f5c5SAndroid Build Coastguard Worker {
965*8975f5c5SAndroid Build Coastguard Worker     return (spec == SH_WEBGL_SPEC || spec == SH_WEBGL2_SPEC || spec == SH_WEBGL3_SPEC);
966*8975f5c5SAndroid Build Coastguard Worker }
967*8975f5c5SAndroid Build Coastguard Worker 
968*8975f5c5SAndroid Build Coastguard Worker // Can't prefix with just _ because then we might introduce a double underscore, which is not safe
969*8975f5c5SAndroid Build Coastguard Worker // in GLSL (ESSL 3.00.6 section 3.8: All identifiers containing a double underscore are reserved for
970*8975f5c5SAndroid Build Coastguard Worker // use by the underlying implementation). u is short for user-defined.
971*8975f5c5SAndroid Build Coastguard Worker extern const char kUserDefinedNamePrefix[];
972*8975f5c5SAndroid Build Coastguard Worker 
973*8975f5c5SAndroid Build Coastguard Worker enum class MetadataFlags
974*8975f5c5SAndroid Build Coastguard Worker {
975*8975f5c5SAndroid Build Coastguard Worker     // Applicable to vertex shaders (technically all pre-rasterization shaders could use this flag,
976*8975f5c5SAndroid Build Coastguard Worker     // but the current and only user is GL, which does not support geometry/tessellation).
977*8975f5c5SAndroid Build Coastguard Worker     HasClipDistance,
978*8975f5c5SAndroid Build Coastguard Worker     // Applicable to fragment shaders
979*8975f5c5SAndroid Build Coastguard Worker     HasDiscard,
980*8975f5c5SAndroid Build Coastguard Worker     EnablesPerSampleShading,
981*8975f5c5SAndroid Build Coastguard Worker     HasInputAttachment0,
982*8975f5c5SAndroid Build Coastguard Worker     // Flag for attachment i is HasInputAttachment0 + i
983*8975f5c5SAndroid Build Coastguard Worker     HasInputAttachment7 = HasInputAttachment0 + 7,
984*8975f5c5SAndroid Build Coastguard Worker     HasDepthInputAttachment,
985*8975f5c5SAndroid Build Coastguard Worker     HasStencilInputAttachment,
986*8975f5c5SAndroid Build Coastguard Worker     // Applicable to geometry shaders
987*8975f5c5SAndroid Build Coastguard Worker     HasValidGeometryShaderInputPrimitiveType,
988*8975f5c5SAndroid Build Coastguard Worker     HasValidGeometryShaderOutputPrimitiveType,
989*8975f5c5SAndroid Build Coastguard Worker     HasValidGeometryShaderMaxVertices,
990*8975f5c5SAndroid Build Coastguard Worker     // Applicable to tessellation shaders
991*8975f5c5SAndroid Build Coastguard Worker     HasValidTessGenMode,
992*8975f5c5SAndroid Build Coastguard Worker     HasValidTessGenSpacing,
993*8975f5c5SAndroid Build Coastguard Worker     HasValidTessGenVertexOrder,
994*8975f5c5SAndroid Build Coastguard Worker     HasValidTessGenPointMode,
995*8975f5c5SAndroid Build Coastguard Worker 
996*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum,
997*8975f5c5SAndroid Build Coastguard Worker     EnumCount = InvalidEnum,
998*8975f5c5SAndroid Build Coastguard Worker };
999*8975f5c5SAndroid Build Coastguard Worker 
1000*8975f5c5SAndroid Build Coastguard Worker namespace vk
1001*8975f5c5SAndroid Build Coastguard Worker {
1002*8975f5c5SAndroid Build Coastguard Worker 
1003*8975f5c5SAndroid Build Coastguard Worker // Specialization constant ids
1004*8975f5c5SAndroid Build Coastguard Worker enum class SpecializationConstantId : uint32_t
1005*8975f5c5SAndroid Build Coastguard Worker {
1006*8975f5c5SAndroid Build Coastguard Worker     SurfaceRotation = 0,
1007*8975f5c5SAndroid Build Coastguard Worker     Dither          = 1,
1008*8975f5c5SAndroid Build Coastguard Worker 
1009*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum = 2,
1010*8975f5c5SAndroid Build Coastguard Worker     EnumCount   = InvalidEnum,
1011*8975f5c5SAndroid Build Coastguard Worker };
1012*8975f5c5SAndroid Build Coastguard Worker 
1013*8975f5c5SAndroid Build Coastguard Worker enum class SpecConstUsage : uint32_t
1014*8975f5c5SAndroid Build Coastguard Worker {
1015*8975f5c5SAndroid Build Coastguard Worker     Rotation = 0,
1016*8975f5c5SAndroid Build Coastguard Worker     Dither   = 1,
1017*8975f5c5SAndroid Build Coastguard Worker 
1018*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum = 2,
1019*8975f5c5SAndroid Build Coastguard Worker     EnumCount   = InvalidEnum,
1020*8975f5c5SAndroid Build Coastguard Worker };
1021*8975f5c5SAndroid Build Coastguard Worker 
1022*8975f5c5SAndroid Build Coastguard Worker enum ColorAttachmentDitherControl
1023*8975f5c5SAndroid Build Coastguard Worker {
1024*8975f5c5SAndroid Build Coastguard Worker     // See comments in ContextVk::updateDither and EmulateDithering.cpp
1025*8975f5c5SAndroid Build Coastguard Worker     kDitherControlNoDither   = 0,
1026*8975f5c5SAndroid Build Coastguard Worker     kDitherControlDither4444 = 1,
1027*8975f5c5SAndroid Build Coastguard Worker     kDitherControlDither5551 = 2,
1028*8975f5c5SAndroid Build Coastguard Worker     kDitherControlDither565  = 3,
1029*8975f5c5SAndroid Build Coastguard Worker };
1030*8975f5c5SAndroid Build Coastguard Worker 
1031*8975f5c5SAndroid Build Coastguard Worker namespace spirv
1032*8975f5c5SAndroid Build Coastguard Worker {
1033*8975f5c5SAndroid Build Coastguard Worker enum NonSemanticInstruction
1034*8975f5c5SAndroid Build Coastguard Worker {
1035*8975f5c5SAndroid Build Coastguard Worker     // The overview instruction containing information such as what predefined ids are present in
1036*8975f5c5SAndroid Build Coastguard Worker     // the SPIR-V.  Simultaneously, this instruction identifies the location where the
1037*8975f5c5SAndroid Build Coastguard Worker     // types/constants/variables section ends and the functions section starts.
1038*8975f5c5SAndroid Build Coastguard Worker     kNonSemanticOverview,
1039*8975f5c5SAndroid Build Coastguard Worker     // The instruction identifying the entry to the shader, i.e. at the start of main()
1040*8975f5c5SAndroid Build Coastguard Worker     kNonSemanticEnter,
1041*8975f5c5SAndroid Build Coastguard Worker     // The instruction identifying where vertex or fragment data is output.
1042*8975f5c5SAndroid Build Coastguard Worker     // This is before return from main() in vertex, tessellation, and fragment shaders,
1043*8975f5c5SAndroid Build Coastguard Worker     // and before OpEmitVertex in geometry shaders.
1044*8975f5c5SAndroid Build Coastguard Worker     kNonSemanticOutput,
1045*8975f5c5SAndroid Build Coastguard Worker     // The instruction identifying the location where transform feedback emulation should be
1046*8975f5c5SAndroid Build Coastguard Worker     // written.
1047*8975f5c5SAndroid Build Coastguard Worker     kNonSemanticTransformFeedbackEmulation,
1048*8975f5c5SAndroid Build Coastguard Worker };
1049*8975f5c5SAndroid Build Coastguard Worker 
1050*8975f5c5SAndroid Build Coastguard Worker // The non-semantic instruction id has many bits available.  With kNonSemanticOverview, they are
1051*8975f5c5SAndroid Build Coastguard Worker // used to provide additional overview details.  Providing this information in the instruction's
1052*8975f5c5SAndroid Build Coastguard Worker // payload require OpConstants and recovering those, which is unnecessary complexity.
1053*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kNonSemanticInstructionBits       = 4;
1054*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kNonSemanticInstructionMask       = 0xF;
1055*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kOverviewHasSampleRateShadingMask = 0x10;
1056*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kOverviewHasSampleIDMask          = 0x20;
1057*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kOverviewHasOutputPerVertexMask   = 0x40;
1058*8975f5c5SAndroid Build Coastguard Worker 
1059*8975f5c5SAndroid Build Coastguard Worker enum ReservedIds
1060*8975f5c5SAndroid Build Coastguard Worker {
1061*8975f5c5SAndroid Build Coastguard Worker     kIdInvalid = 0,
1062*8975f5c5SAndroid Build Coastguard Worker 
1063*8975f5c5SAndroid Build Coastguard Worker     // =============================================================================================
1064*8975f5c5SAndroid Build Coastguard Worker     // Ids that are fixed and are always present in the SPIR-V where applicable.  The SPIR-V
1065*8975f5c5SAndroid Build Coastguard Worker     // transformer can thus reliably use these ids.
1066*8975f5c5SAndroid Build Coastguard Worker 
1067*8975f5c5SAndroid Build Coastguard Worker     // Global information
1068*8975f5c5SAndroid Build Coastguard Worker     kIdNonSemanticInstructionSet,
1069*8975f5c5SAndroid Build Coastguard Worker     kIdEntryPoint,
1070*8975f5c5SAndroid Build Coastguard Worker 
1071*8975f5c5SAndroid Build Coastguard Worker     // Basic types
1072*8975f5c5SAndroid Build Coastguard Worker     kIdVoid,
1073*8975f5c5SAndroid Build Coastguard Worker     kIdFloat,
1074*8975f5c5SAndroid Build Coastguard Worker     kIdVec2,
1075*8975f5c5SAndroid Build Coastguard Worker     kIdVec3,
1076*8975f5c5SAndroid Build Coastguard Worker     kIdVec4,
1077*8975f5c5SAndroid Build Coastguard Worker     kIdMat2,
1078*8975f5c5SAndroid Build Coastguard Worker     kIdMat3,
1079*8975f5c5SAndroid Build Coastguard Worker     kIdMat4,
1080*8975f5c5SAndroid Build Coastguard Worker     kIdInt,
1081*8975f5c5SAndroid Build Coastguard Worker     kIdIVec4,
1082*8975f5c5SAndroid Build Coastguard Worker     kIdUint,
1083*8975f5c5SAndroid Build Coastguard Worker 
1084*8975f5c5SAndroid Build Coastguard Worker     // Common constants
1085*8975f5c5SAndroid Build Coastguard Worker     kIdIntZero,
1086*8975f5c5SAndroid Build Coastguard Worker     kIdIntOne,
1087*8975f5c5SAndroid Build Coastguard Worker     kIdIntTwo,
1088*8975f5c5SAndroid Build Coastguard Worker     kIdIntThree,
1089*8975f5c5SAndroid Build Coastguard Worker 
1090*8975f5c5SAndroid Build Coastguard Worker     // Type pointers
1091*8975f5c5SAndroid Build Coastguard Worker     kIdIntInputTypePointer,
1092*8975f5c5SAndroid Build Coastguard Worker     kIdVec4OutputTypePointer,
1093*8975f5c5SAndroid Build Coastguard Worker     kIdIVec4FunctionTypePointer,
1094*8975f5c5SAndroid Build Coastguard Worker     kIdOutputPerVertexTypePointer,
1095*8975f5c5SAndroid Build Coastguard Worker 
1096*8975f5c5SAndroid Build Coastguard Worker     // Pre-rotation and Z-correction support
1097*8975f5c5SAndroid Build Coastguard Worker     kIdTransformPositionFunction,
1098*8975f5c5SAndroid Build Coastguard Worker     kIdInputPerVertexBlockArray,
1099*8975f5c5SAndroid Build Coastguard Worker     kIdOutputPerVertexBlockArray,
1100*8975f5c5SAndroid Build Coastguard Worker     kIdOutputPerVertexVar,
1101*8975f5c5SAndroid Build Coastguard Worker 
1102*8975f5c5SAndroid Build Coastguard Worker     // Transform feedback support
1103*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationGetOffsetsFunction,
1104*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationCaptureFunction,
1105*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationBufferVarZero,
1106*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationBufferVarOne,
1107*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationBufferVarTwo,
1108*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationBufferVarThree,
1109*8975f5c5SAndroid Build Coastguard Worker 
1110*8975f5c5SAndroid Build Coastguard Worker     // Multisampling support
1111*8975f5c5SAndroid Build Coastguard Worker     kIdSampleID,
1112*8975f5c5SAndroid Build Coastguard Worker 
1113*8975f5c5SAndroid Build Coastguard Worker     // =============================================================================================
1114*8975f5c5SAndroid Build Coastguard Worker     // ANGLE internal shader variables, which are not produced as ShaderVariables.
1115*8975f5c5SAndroid Build Coastguard Worker     // kIdShaderVariablesBegin marks the beginning of these ids.  variableId -> info maps in the
1116*8975f5c5SAndroid Build Coastguard Worker     // backend can use |variableId - kIdShaderVariablesBegin| as key into a flat array.
1117*8975f5c5SAndroid Build Coastguard Worker     //
1118*8975f5c5SAndroid Build Coastguard Worker     // Note that for blocks, only the block id is in this section as that is the id used in the
1119*8975f5c5SAndroid Build Coastguard Worker     // variableId -> info maps.
1120*8975f5c5SAndroid Build Coastguard Worker     kIdShaderVariablesBegin,
1121*8975f5c5SAndroid Build Coastguard Worker 
1122*8975f5c5SAndroid Build Coastguard Worker     // gl_PerVertex
1123*8975f5c5SAndroid Build Coastguard Worker     kIdInputPerVertexBlock = kIdShaderVariablesBegin,
1124*8975f5c5SAndroid Build Coastguard Worker     kIdOutputPerVertexBlock,
1125*8975f5c5SAndroid Build Coastguard Worker     // The driver and default uniform blocks
1126*8975f5c5SAndroid Build Coastguard Worker     kIdDriverUniformsBlock,
1127*8975f5c5SAndroid Build Coastguard Worker     kIdDefaultUniformsBlock,
1128*8975f5c5SAndroid Build Coastguard Worker     // The atomic counter block
1129*8975f5c5SAndroid Build Coastguard Worker     kIdAtomicCounterBlock,
1130*8975f5c5SAndroid Build Coastguard Worker     // Buffer block used for transform feedback emulation
1131*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationBufferBlockZero,
1132*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationBufferBlockOne,
1133*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationBufferBlockTwo,
1134*8975f5c5SAndroid Build Coastguard Worker     kIdXfbEmulationBufferBlockThree,
1135*8975f5c5SAndroid Build Coastguard Worker     // Additional varying added to hold untransformed gl_Position for transform feedback capture
1136*8975f5c5SAndroid Build Coastguard Worker     kIdXfbExtensionPosition,
1137*8975f5c5SAndroid Build Coastguard Worker     // Input attachments used for framebuffer fetch and advanced blend emulation
1138*8975f5c5SAndroid Build Coastguard Worker     kIdInputAttachment0,
1139*8975f5c5SAndroid Build Coastguard Worker     kIdInputAttachment7 = kIdInputAttachment0 + 7,
1140*8975f5c5SAndroid Build Coastguard Worker     kIdDepthInputAttachment,
1141*8975f5c5SAndroid Build Coastguard Worker     kIdStencilInputAttachment,
1142*8975f5c5SAndroid Build Coastguard Worker 
1143*8975f5c5SAndroid Build Coastguard Worker     kIdFirstUnreserved,
1144*8975f5c5SAndroid Build Coastguard Worker };
1145*8975f5c5SAndroid Build Coastguard Worker }  // namespace spirv
1146*8975f5c5SAndroid Build Coastguard Worker 
1147*8975f5c5SAndroid Build Coastguard Worker // Packing information for driver uniform's misc field:
1148*8975f5c5SAndroid Build Coastguard Worker // - 1 bit for whether surface rotation results in swapped axes
1149*8975f5c5SAndroid Build Coastguard Worker // - 5 bits for advanced blend equation
1150*8975f5c5SAndroid Build Coastguard Worker // - 6 bits for sample count
1151*8975f5c5SAndroid Build Coastguard Worker // - 8 bits for enabled clip planes
1152*8975f5c5SAndroid Build Coastguard Worker // - 1 bit for whether depth should be transformed to Vulkan clip space
1153*8975f5c5SAndroid Build Coastguard Worker // - 1 bit for whether alpha to coverage is enabled
1154*8975f5c5SAndroid Build Coastguard Worker // - 1 bit for whether the framebuffer is layered
1155*8975f5c5SAndroid Build Coastguard Worker // - 9 bits unused
1156*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscSwapXYMask                  = 0x1;
1157*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscAdvancedBlendEquationOffset = 1;
1158*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscAdvancedBlendEquationMask   = 0x1F;
1159*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscSampleCountOffset           = 6;
1160*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscSampleCountMask             = 0x3F;
1161*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscEnabledClipPlanesOffset     = 12;
1162*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscEnabledClipPlanesMask       = 0xFF;
1163*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscTransformDepthOffset        = 20;
1164*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscTransformDepthMask          = 0x1;
1165*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscAlphaToCoverageOffset       = 21;
1166*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscAlphaToCoverageMask         = 0x1;
1167*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscLayeredFramebufferOffset    = 22;
1168*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kDriverUniformsMiscLayeredFramebufferMask      = 0x1;
1169*8975f5c5SAndroid Build Coastguard Worker }  // namespace vk
1170*8975f5c5SAndroid Build Coastguard Worker 
1171*8975f5c5SAndroid Build Coastguard Worker namespace mtl
1172*8975f5c5SAndroid Build Coastguard Worker {
1173*8975f5c5SAndroid Build Coastguard Worker // Specialization constant to enable multisampled rendering behavior.
1174*8975f5c5SAndroid Build Coastguard Worker extern const char kMultisampledRenderingConstName[];
1175*8975f5c5SAndroid Build Coastguard Worker 
1176*8975f5c5SAndroid Build Coastguard Worker // Specialization constant to emulate rasterizer discard.
1177*8975f5c5SAndroid Build Coastguard Worker extern const char kRasterizerDiscardEnabledConstName[];
1178*8975f5c5SAndroid Build Coastguard Worker 
1179*8975f5c5SAndroid Build Coastguard Worker // Specialization constant to enable depth write in fragment shaders.
1180*8975f5c5SAndroid Build Coastguard Worker extern const char kDepthWriteEnabledConstName[];
1181*8975f5c5SAndroid Build Coastguard Worker 
1182*8975f5c5SAndroid Build Coastguard Worker // Specialization constant to enable alpha to coverage.
1183*8975f5c5SAndroid Build Coastguard Worker extern const char kEmulateAlphaToCoverageConstName[];
1184*8975f5c5SAndroid Build Coastguard Worker 
1185*8975f5c5SAndroid Build Coastguard Worker // Specialization constant to write helper sample mask output.
1186*8975f5c5SAndroid Build Coastguard Worker extern const char kWriteHelperSampleMaskConstName[];
1187*8975f5c5SAndroid Build Coastguard Worker 
1188*8975f5c5SAndroid Build Coastguard Worker // Specialization constant to enable sample mask output.
1189*8975f5c5SAndroid Build Coastguard Worker extern const char kSampleMaskWriteEnabledConstName[];
1190*8975f5c5SAndroid Build Coastguard Worker }  // namespace mtl
1191*8975f5c5SAndroid Build Coastguard Worker 
1192*8975f5c5SAndroid Build Coastguard Worker }  // namespace sh
1193*8975f5c5SAndroid Build Coastguard Worker 
1194*8975f5c5SAndroid Build Coastguard Worker #endif  // GLSLANG_SHADERLANG_H_
1195