xref: /aosp_15_r20/external/angle/src/compiler/translator/DirectiveHandler.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2012 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/DirectiveHandler.h"
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Common.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Diagnostics.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace sh
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker 
getBehavior(const std::string & str)19*8975f5c5SAndroid Build Coastguard Worker static TBehavior getBehavior(const std::string &str)
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker     const char kRequire[] = "require";
22*8975f5c5SAndroid Build Coastguard Worker     const char kEnable[]  = "enable";
23*8975f5c5SAndroid Build Coastguard Worker     const char kDisable[] = "disable";
24*8975f5c5SAndroid Build Coastguard Worker     const char kWarn[]    = "warn";
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker     if (str == kRequire)
27*8975f5c5SAndroid Build Coastguard Worker         return EBhRequire;
28*8975f5c5SAndroid Build Coastguard Worker     else if (str == kEnable)
29*8975f5c5SAndroid Build Coastguard Worker         return EBhEnable;
30*8975f5c5SAndroid Build Coastguard Worker     else if (str == kDisable)
31*8975f5c5SAndroid Build Coastguard Worker         return EBhDisable;
32*8975f5c5SAndroid Build Coastguard Worker     else if (str == kWarn)
33*8975f5c5SAndroid Build Coastguard Worker         return EBhWarn;
34*8975f5c5SAndroid Build Coastguard Worker     return EBhUndefined;
35*8975f5c5SAndroid Build Coastguard Worker }
36*8975f5c5SAndroid Build Coastguard Worker 
TDirectiveHandler(TExtensionBehavior & extBehavior,TDiagnostics & diagnostics,int & shaderVersion,sh::GLenum shaderType)37*8975f5c5SAndroid Build Coastguard Worker TDirectiveHandler::TDirectiveHandler(TExtensionBehavior &extBehavior,
38*8975f5c5SAndroid Build Coastguard Worker                                      TDiagnostics &diagnostics,
39*8975f5c5SAndroid Build Coastguard Worker                                      int &shaderVersion,
40*8975f5c5SAndroid Build Coastguard Worker                                      sh::GLenum shaderType)
41*8975f5c5SAndroid Build Coastguard Worker     : mExtensionBehavior(extBehavior),
42*8975f5c5SAndroid Build Coastguard Worker       mDiagnostics(diagnostics),
43*8975f5c5SAndroid Build Coastguard Worker       mShaderVersion(shaderVersion),
44*8975f5c5SAndroid Build Coastguard Worker       mShaderType(shaderType)
45*8975f5c5SAndroid Build Coastguard Worker {}
46*8975f5c5SAndroid Build Coastguard Worker 
~TDirectiveHandler()47*8975f5c5SAndroid Build Coastguard Worker TDirectiveHandler::~TDirectiveHandler() {}
48*8975f5c5SAndroid Build Coastguard Worker 
handleError(const angle::pp::SourceLocation & loc,const std::string & msg)49*8975f5c5SAndroid Build Coastguard Worker void TDirectiveHandler::handleError(const angle::pp::SourceLocation &loc, const std::string &msg)
50*8975f5c5SAndroid Build Coastguard Worker {
51*8975f5c5SAndroid Build Coastguard Worker     mDiagnostics.error(loc, msg.c_str(), "");
52*8975f5c5SAndroid Build Coastguard Worker }
53*8975f5c5SAndroid Build Coastguard Worker 
handlePragma(const angle::pp::SourceLocation & loc,const std::string & name,const std::string & value,bool stdgl)54*8975f5c5SAndroid Build Coastguard Worker void TDirectiveHandler::handlePragma(const angle::pp::SourceLocation &loc,
55*8975f5c5SAndroid Build Coastguard Worker                                      const std::string &name,
56*8975f5c5SAndroid Build Coastguard Worker                                      const std::string &value,
57*8975f5c5SAndroid Build Coastguard Worker                                      bool stdgl)
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker     if (stdgl)
60*8975f5c5SAndroid Build Coastguard Worker     {
61*8975f5c5SAndroid Build Coastguard Worker         const char kInvariant[] = "invariant";
62*8975f5c5SAndroid Build Coastguard Worker         const char kAll[]       = "all";
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker         if (name == kInvariant && value == kAll)
65*8975f5c5SAndroid Build Coastguard Worker         {
66*8975f5c5SAndroid Build Coastguard Worker             if (mShaderVersion == 300 && mShaderType == GL_FRAGMENT_SHADER)
67*8975f5c5SAndroid Build Coastguard Worker             {
68*8975f5c5SAndroid Build Coastguard Worker                 // ESSL 3.00.4 section 4.6.1
69*8975f5c5SAndroid Build Coastguard Worker                 mDiagnostics.error(
70*8975f5c5SAndroid Build Coastguard Worker                     loc, "#pragma STDGL invariant(all) can not be used in fragment shader",
71*8975f5c5SAndroid Build Coastguard Worker                     name.c_str());
72*8975f5c5SAndroid Build Coastguard Worker             }
73*8975f5c5SAndroid Build Coastguard Worker             mPragma.stdgl.invariantAll = true;
74*8975f5c5SAndroid Build Coastguard Worker         }
75*8975f5c5SAndroid Build Coastguard Worker         // The STDGL pragma is used to reserve pragmas for use by future
76*8975f5c5SAndroid Build Coastguard Worker         // revisions of GLSL.  Do not generate an error on unexpected
77*8975f5c5SAndroid Build Coastguard Worker         // name and value.
78*8975f5c5SAndroid Build Coastguard Worker         return;
79*8975f5c5SAndroid Build Coastguard Worker     }
80*8975f5c5SAndroid Build Coastguard Worker     else
81*8975f5c5SAndroid Build Coastguard Worker     {
82*8975f5c5SAndroid Build Coastguard Worker         const char kOptimize[] = "optimize";
83*8975f5c5SAndroid Build Coastguard Worker         const char kDebug[]    = "debug";
84*8975f5c5SAndroid Build Coastguard Worker         const char kOn[]       = "on";
85*8975f5c5SAndroid Build Coastguard Worker         const char kOff[]      = "off";
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker         bool invalidValue = false;
88*8975f5c5SAndroid Build Coastguard Worker         if (name == kOptimize)
89*8975f5c5SAndroid Build Coastguard Worker         {
90*8975f5c5SAndroid Build Coastguard Worker             if (value == kOn)
91*8975f5c5SAndroid Build Coastguard Worker                 mPragma.optimize = true;
92*8975f5c5SAndroid Build Coastguard Worker             else if (value == kOff)
93*8975f5c5SAndroid Build Coastguard Worker                 mPragma.optimize = false;
94*8975f5c5SAndroid Build Coastguard Worker             else
95*8975f5c5SAndroid Build Coastguard Worker                 invalidValue = true;
96*8975f5c5SAndroid Build Coastguard Worker         }
97*8975f5c5SAndroid Build Coastguard Worker         else if (name == kDebug)
98*8975f5c5SAndroid Build Coastguard Worker         {
99*8975f5c5SAndroid Build Coastguard Worker             if (value == kOn)
100*8975f5c5SAndroid Build Coastguard Worker                 mPragma.debug = true;
101*8975f5c5SAndroid Build Coastguard Worker             else if (value == kOff)
102*8975f5c5SAndroid Build Coastguard Worker                 mPragma.debug = false;
103*8975f5c5SAndroid Build Coastguard Worker             else
104*8975f5c5SAndroid Build Coastguard Worker                 invalidValue = true;
105*8975f5c5SAndroid Build Coastguard Worker         }
106*8975f5c5SAndroid Build Coastguard Worker         else
107*8975f5c5SAndroid Build Coastguard Worker         {
108*8975f5c5SAndroid Build Coastguard Worker             mDiagnostics.report(angle::pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, loc, name);
109*8975f5c5SAndroid Build Coastguard Worker             return;
110*8975f5c5SAndroid Build Coastguard Worker         }
111*8975f5c5SAndroid Build Coastguard Worker 
112*8975f5c5SAndroid Build Coastguard Worker         if (invalidValue)
113*8975f5c5SAndroid Build Coastguard Worker         {
114*8975f5c5SAndroid Build Coastguard Worker             mDiagnostics.error(loc, "invalid pragma value - 'on' or 'off' expected", value.c_str());
115*8975f5c5SAndroid Build Coastguard Worker         }
116*8975f5c5SAndroid Build Coastguard Worker     }
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker 
handleExtension(const angle::pp::SourceLocation & loc,const std::string & name,const std::string & behavior)119*8975f5c5SAndroid Build Coastguard Worker void TDirectiveHandler::handleExtension(const angle::pp::SourceLocation &loc,
120*8975f5c5SAndroid Build Coastguard Worker                                         const std::string &name,
121*8975f5c5SAndroid Build Coastguard Worker                                         const std::string &behavior)
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker     const char kExtAll[] = "all";
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker     TBehavior behaviorVal = getBehavior(behavior);
126*8975f5c5SAndroid Build Coastguard Worker     if (behaviorVal == EBhUndefined)
127*8975f5c5SAndroid Build Coastguard Worker     {
128*8975f5c5SAndroid Build Coastguard Worker         mDiagnostics.error(loc, "behavior invalid", name.c_str());
129*8975f5c5SAndroid Build Coastguard Worker         return;
130*8975f5c5SAndroid Build Coastguard Worker     }
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker     if (name == kExtAll)
133*8975f5c5SAndroid Build Coastguard Worker     {
134*8975f5c5SAndroid Build Coastguard Worker         if (behaviorVal == EBhRequire)
135*8975f5c5SAndroid Build Coastguard Worker         {
136*8975f5c5SAndroid Build Coastguard Worker             mDiagnostics.error(loc, "extension cannot have 'require' behavior", name.c_str());
137*8975f5c5SAndroid Build Coastguard Worker         }
138*8975f5c5SAndroid Build Coastguard Worker         else if (behaviorVal == EBhEnable)
139*8975f5c5SAndroid Build Coastguard Worker         {
140*8975f5c5SAndroid Build Coastguard Worker             mDiagnostics.error(loc, "extension cannot have 'enable' behavior", name.c_str());
141*8975f5c5SAndroid Build Coastguard Worker         }
142*8975f5c5SAndroid Build Coastguard Worker         else
143*8975f5c5SAndroid Build Coastguard Worker         {
144*8975f5c5SAndroid Build Coastguard Worker             for (TExtensionBehavior::iterator iter = mExtensionBehavior.begin();
145*8975f5c5SAndroid Build Coastguard Worker                  iter != mExtensionBehavior.end(); ++iter)
146*8975f5c5SAndroid Build Coastguard Worker             {
147*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
148*8975f5c5SAndroid Build Coastguard Worker             }
149*8975f5c5SAndroid Build Coastguard Worker         }
150*8975f5c5SAndroid Build Coastguard Worker         return;
151*8975f5c5SAndroid Build Coastguard Worker     }
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker     TExtensionBehavior::iterator iter = mExtensionBehavior.find(GetExtensionByName(name.c_str()));
154*8975f5c5SAndroid Build Coastguard Worker     if (iter != mExtensionBehavior.end() && CheckExtensionVersion(iter->first, mShaderVersion))
155*8975f5c5SAndroid Build Coastguard Worker     {
156*8975f5c5SAndroid Build Coastguard Worker         iter->second = behaviorVal;
157*8975f5c5SAndroid Build Coastguard Worker         // OVR_multiview is implicitly enabled when OVR_multiview2 is enabled
158*8975f5c5SAndroid Build Coastguard Worker         if (name == "GL_OVR_multiview2")
159*8975f5c5SAndroid Build Coastguard Worker         {
160*8975f5c5SAndroid Build Coastguard Worker             constexpr char kMultiviewExtName[] = "GL_OVR_multiview";
161*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kMultiviewExtName));
162*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
163*8975f5c5SAndroid Build Coastguard Worker             {
164*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
165*8975f5c5SAndroid Build Coastguard Worker             }
166*8975f5c5SAndroid Build Coastguard Worker         }
167*8975f5c5SAndroid Build Coastguard Worker         // All the extensions listed in the spec here:
168*8975f5c5SAndroid Build Coastguard Worker         // https://www.khronos.org/registry/OpenGL/extensions/ANDROID/ANDROID_extension_pack_es31a.txt
169*8975f5c5SAndroid Build Coastguard Worker         // are implicitly enabled when GL_ANDROID_extension_pack_es31a is enabled
170*8975f5c5SAndroid Build Coastguard Worker         if (name == "GL_ANDROID_extension_pack_es31a")
171*8975f5c5SAndroid Build Coastguard Worker         {
172*8975f5c5SAndroid Build Coastguard Worker             constexpr char kGeometryShaderExtName[]      = "GL_EXT_geometry_shader";
173*8975f5c5SAndroid Build Coastguard Worker             constexpr char kTessellationShaderExtName[]  = "GL_EXT_tessellation_shader";
174*8975f5c5SAndroid Build Coastguard Worker             constexpr char kGpuShader5ExtName[]          = "GL_EXT_gpu_shader5";
175*8975f5c5SAndroid Build Coastguard Worker             constexpr char kTextureBufferExtName[]       = "GL_EXT_texture_buffer";
176*8975f5c5SAndroid Build Coastguard Worker             constexpr char kTextureCubeMapArrayExtName[] = "GL_EXT_texture_cube_map_array";
177*8975f5c5SAndroid Build Coastguard Worker             constexpr char kSampleVariablesExtName[]     = "GL_OES_sample_variables";
178*8975f5c5SAndroid Build Coastguard Worker             constexpr char kShaderMultisampleInterpolationExtName[] =
179*8975f5c5SAndroid Build Coastguard Worker                 "GL_OES_shader_multisample_interpolation";
180*8975f5c5SAndroid Build Coastguard Worker             constexpr char kShaderImageAtomicExtName[] = "GL_OES_shader_image_atomic";
181*8975f5c5SAndroid Build Coastguard Worker             constexpr char kTextureStorageMultisample2dArrayExtName[] =
182*8975f5c5SAndroid Build Coastguard Worker                 "GL_OES_texture_storage_multisample_2d_array";
183*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kGeometryShaderExtName));
184*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
185*8975f5c5SAndroid Build Coastguard Worker             {
186*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
187*8975f5c5SAndroid Build Coastguard Worker             }
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kTessellationShaderExtName));
190*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
191*8975f5c5SAndroid Build Coastguard Worker             {
192*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
193*8975f5c5SAndroid Build Coastguard Worker             }
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kGpuShader5ExtName));
196*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
197*8975f5c5SAndroid Build Coastguard Worker             {
198*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
199*8975f5c5SAndroid Build Coastguard Worker             }
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kTextureBufferExtName));
202*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
203*8975f5c5SAndroid Build Coastguard Worker             {
204*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
205*8975f5c5SAndroid Build Coastguard Worker             }
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kTextureCubeMapArrayExtName));
208*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
209*8975f5c5SAndroid Build Coastguard Worker             {
210*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
211*8975f5c5SAndroid Build Coastguard Worker             }
212*8975f5c5SAndroid Build Coastguard Worker 
213*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kSampleVariablesExtName));
214*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
215*8975f5c5SAndroid Build Coastguard Worker             {
216*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
217*8975f5c5SAndroid Build Coastguard Worker             }
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker             iter =
220*8975f5c5SAndroid Build Coastguard Worker                 mExtensionBehavior.find(GetExtensionByName(kShaderMultisampleInterpolationExtName));
221*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
222*8975f5c5SAndroid Build Coastguard Worker             {
223*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
224*8975f5c5SAndroid Build Coastguard Worker             }
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kShaderImageAtomicExtName));
227*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
228*8975f5c5SAndroid Build Coastguard Worker             {
229*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
230*8975f5c5SAndroid Build Coastguard Worker             }
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(
233*8975f5c5SAndroid Build Coastguard Worker                 GetExtensionByName(kTextureStorageMultisample2dArrayExtName));
234*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
235*8975f5c5SAndroid Build Coastguard Worker             {
236*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
237*8975f5c5SAndroid Build Coastguard Worker             }
238*8975f5c5SAndroid Build Coastguard Worker         }
239*8975f5c5SAndroid Build Coastguard Worker         // EXT_shader_io_blocks is implicitly enabled when EXT_geometry_shader or
240*8975f5c5SAndroid Build Coastguard Worker         // EXT_tessellation_shader is enabled.
241*8975f5c5SAndroid Build Coastguard Worker         if (name == "GL_EXT_geometry_shader" || name == "GL_EXT_tessellation_shader")
242*8975f5c5SAndroid Build Coastguard Worker         {
243*8975f5c5SAndroid Build Coastguard Worker             constexpr char kIOBlocksExtName[] = "GL_EXT_shader_io_blocks";
244*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kIOBlocksExtName));
245*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
246*8975f5c5SAndroid Build Coastguard Worker             {
247*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
248*8975f5c5SAndroid Build Coastguard Worker             }
249*8975f5c5SAndroid Build Coastguard Worker         }
250*8975f5c5SAndroid Build Coastguard Worker         // OES_shader_io_blocks is implicitly enabled when OES_geometry_shader or
251*8975f5c5SAndroid Build Coastguard Worker         // OES_tessellation_shader is enabled.
252*8975f5c5SAndroid Build Coastguard Worker         else if (name == "GL_OES_geometry_shader" || name == "GL_OES_tessellation_shader")
253*8975f5c5SAndroid Build Coastguard Worker         {
254*8975f5c5SAndroid Build Coastguard Worker             constexpr char kIOBlocksOESName[] = "GL_OES_shader_io_blocks";
255*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kIOBlocksOESName));
256*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
257*8975f5c5SAndroid Build Coastguard Worker             {
258*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
259*8975f5c5SAndroid Build Coastguard Worker             }
260*8975f5c5SAndroid Build Coastguard Worker         }
261*8975f5c5SAndroid Build Coastguard Worker         // GL_APPLE_clip_distance is implicitly enabled when GL_EXT_clip_cull_distance or
262*8975f5c5SAndroid Build Coastguard Worker         // GL_ANGLE_clip_cull_distance are enabled.
263*8975f5c5SAndroid Build Coastguard Worker         else if (name == "GL_EXT_clip_cull_distance" || name == "GL_ANGLE_clip_cull_distance")
264*8975f5c5SAndroid Build Coastguard Worker         {
265*8975f5c5SAndroid Build Coastguard Worker             constexpr char kAPPLEClipDistanceEXTName[] = "GL_APPLE_clip_distance";
266*8975f5c5SAndroid Build Coastguard Worker             iter = mExtensionBehavior.find(GetExtensionByName(kAPPLEClipDistanceEXTName));
267*8975f5c5SAndroid Build Coastguard Worker             if (iter != mExtensionBehavior.end())
268*8975f5c5SAndroid Build Coastguard Worker             {
269*8975f5c5SAndroid Build Coastguard Worker                 iter->second = behaviorVal;
270*8975f5c5SAndroid Build Coastguard Worker             }
271*8975f5c5SAndroid Build Coastguard Worker         }
272*8975f5c5SAndroid Build Coastguard Worker         return;
273*8975f5c5SAndroid Build Coastguard Worker     }
274*8975f5c5SAndroid Build Coastguard Worker 
275*8975f5c5SAndroid Build Coastguard Worker     switch (behaviorVal)
276*8975f5c5SAndroid Build Coastguard Worker     {
277*8975f5c5SAndroid Build Coastguard Worker         case EBhRequire:
278*8975f5c5SAndroid Build Coastguard Worker             mDiagnostics.error(loc, "extension is not supported", name.c_str());
279*8975f5c5SAndroid Build Coastguard Worker             break;
280*8975f5c5SAndroid Build Coastguard Worker         case EBhEnable:
281*8975f5c5SAndroid Build Coastguard Worker         case EBhWarn:
282*8975f5c5SAndroid Build Coastguard Worker         case EBhDisable:
283*8975f5c5SAndroid Build Coastguard Worker             mDiagnostics.warning(loc, "extension is not supported", name.c_str());
284*8975f5c5SAndroid Build Coastguard Worker             break;
285*8975f5c5SAndroid Build Coastguard Worker         default:
286*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
287*8975f5c5SAndroid Build Coastguard Worker             break;
288*8975f5c5SAndroid Build Coastguard Worker     }
289*8975f5c5SAndroid Build Coastguard Worker }
290*8975f5c5SAndroid Build Coastguard Worker 
handleVersion(const angle::pp::SourceLocation & loc,int version,ShShaderSpec spec,angle::pp::MacroSet * macro_set)291*8975f5c5SAndroid Build Coastguard Worker void TDirectiveHandler::handleVersion(const angle::pp::SourceLocation &loc,
292*8975f5c5SAndroid Build Coastguard Worker                                       int version,
293*8975f5c5SAndroid Build Coastguard Worker                                       ShShaderSpec spec,
294*8975f5c5SAndroid Build Coastguard Worker                                       angle::pp::MacroSet *macro_set)
295*8975f5c5SAndroid Build Coastguard Worker {
296*8975f5c5SAndroid Build Coastguard Worker     if (version == 100 || version == 300 || version == 310 || version == 320)
297*8975f5c5SAndroid Build Coastguard Worker     {
298*8975f5c5SAndroid Build Coastguard Worker         mShaderVersion = version;
299*8975f5c5SAndroid Build Coastguard Worker 
300*8975f5c5SAndroid Build Coastguard Worker         // Add macros for supported extensions
301*8975f5c5SAndroid Build Coastguard Worker         for (const auto &iter : mExtensionBehavior)
302*8975f5c5SAndroid Build Coastguard Worker         {
303*8975f5c5SAndroid Build Coastguard Worker             if (CheckExtensionVersion(iter.first, version))
304*8975f5c5SAndroid Build Coastguard Worker             {
305*8975f5c5SAndroid Build Coastguard Worker                 // OVR_multiview should not be defined for WebGL spec'ed shaders.
306*8975f5c5SAndroid Build Coastguard Worker                 if (IsWebGLBasedSpec(spec) && (iter.first == TExtension::OVR_multiview))
307*8975f5c5SAndroid Build Coastguard Worker                 {
308*8975f5c5SAndroid Build Coastguard Worker                     continue;
309*8975f5c5SAndroid Build Coastguard Worker                 }
310*8975f5c5SAndroid Build Coastguard Worker                 PredefineMacro(macro_set, GetExtensionNameString(iter.first), 1);
311*8975f5c5SAndroid Build Coastguard Worker             }
312*8975f5c5SAndroid Build Coastguard Worker         }
313*8975f5c5SAndroid Build Coastguard Worker     }
314*8975f5c5SAndroid Build Coastguard Worker     else
315*8975f5c5SAndroid Build Coastguard Worker     {
316*8975f5c5SAndroid Build Coastguard Worker         std::stringstream stream = sh::InitializeStream<std::stringstream>();
317*8975f5c5SAndroid Build Coastguard Worker         stream << version;
318*8975f5c5SAndroid Build Coastguard Worker         std::string str = stream.str();
319*8975f5c5SAndroid Build Coastguard Worker         mDiagnostics.error(loc, "client/version number not supported", str.c_str());
320*8975f5c5SAndroid Build Coastguard Worker     }
321*8975f5c5SAndroid Build Coastguard Worker }
322*8975f5c5SAndroid Build Coastguard Worker 
323*8975f5c5SAndroid Build Coastguard Worker }  // namespace sh
324