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