1 //
2 // Copyright 2002 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 //
8 // Implement the top-level of interface to the compiler,
9 // as defined in ShaderLang.h
10 //
11 
12 #include "GLSLANG/ShaderLang.h"
13 
14 #include "compiler/translator/Compiler.h"
15 #include "compiler/translator/InitializeDll.h"
16 #include "compiler/translator/glslang_wrapper.h"
17 #include "compiler/translator/length_limits.h"
18 #ifdef ANGLE_ENABLE_HLSL
19 #    include "compiler/translator/TranslatorHLSL.h"
20 #endif  // ANGLE_ENABLE_HLSL
21 #include "angle_gl.h"
22 #include "compiler/translator/VariablePacker.h"
23 
24 namespace sh
25 {
26 
27 namespace
28 {
29 
30 bool isInitialized        = false;
31 bool isGlslangInitialized = false;
32 
33 //
34 // This is the platform independent interface between an OGL driver
35 // and the shading language compiler.
36 //
37 
38 template <typename VarT>
39 const std::vector<VarT> *GetVariableList(const TCompiler *compiler);
40 
41 template <>
GetVariableList(const TCompiler * compiler)42 const std::vector<InterfaceBlock> *GetVariableList(const TCompiler *compiler)
43 {
44     return &compiler->getInterfaceBlocks();
45 }
46 
GetCompilerFromHandle(ShHandle handle)47 TCompiler *GetCompilerFromHandle(ShHandle handle)
48 {
49     if (!handle)
50     {
51         return nullptr;
52     }
53 
54     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
55     return base->getAsCompiler();
56 }
57 
58 template <typename VarT>
GetShaderVariables(const ShHandle handle)59 const std::vector<VarT> *GetShaderVariables(const ShHandle handle)
60 {
61     TCompiler *compiler = GetCompilerFromHandle(handle);
62     if (!compiler)
63     {
64         return nullptr;
65     }
66 
67     return GetVariableList<VarT>(compiler);
68 }
69 
70 #ifdef ANGLE_ENABLE_HLSL
GetTranslatorHLSLFromHandle(ShHandle handle)71 TranslatorHLSL *GetTranslatorHLSLFromHandle(ShHandle handle)
72 {
73     if (!handle)
74         return nullptr;
75     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
76     return base->getAsTranslatorHLSL();
77 }
78 #endif  // ANGLE_ENABLE_HLSL
79 
GetGeometryShaderPrimitiveTypeEnum(sh::TLayoutPrimitiveType primitiveType)80 GLenum GetGeometryShaderPrimitiveTypeEnum(sh::TLayoutPrimitiveType primitiveType)
81 {
82     switch (primitiveType)
83     {
84         case EptPoints:
85             return GL_POINTS;
86         case EptLines:
87             return GL_LINES;
88         case EptLinesAdjacency:
89             return GL_LINES_ADJACENCY_EXT;
90         case EptTriangles:
91             return GL_TRIANGLES;
92         case EptTrianglesAdjacency:
93             return GL_TRIANGLES_ADJACENCY_EXT;
94 
95         case EptLineStrip:
96             return GL_LINE_STRIP;
97         case EptTriangleStrip:
98             return GL_TRIANGLE_STRIP;
99 
100         case EptUndefined:
101         default:
102             UNREACHABLE();
103             return GL_INVALID_VALUE;
104     }
105 }
106 
GetTessellationShaderTypeEnum(sh::TLayoutTessEvaluationType type)107 GLenum GetTessellationShaderTypeEnum(sh::TLayoutTessEvaluationType type)
108 {
109     switch (type)
110     {
111         case EtetTriangles:
112             return GL_TRIANGLES;
113         case EtetQuads:
114             return GL_QUADS;
115         case EtetIsolines:
116             return GL_ISOLINES;
117         case EtetEqualSpacing:
118             return GL_EQUAL;
119         case EtetFractionalEvenSpacing:
120             return GL_FRACTIONAL_EVEN;
121         case EtetFractionalOddSpacing:
122             return GL_FRACTIONAL_ODD;
123         case EtetCw:
124             return GL_CW;
125         case EtetCcw:
126             return GL_CCW;
127         case EtetPointMode:
128             return GL_TESS_GEN_POINT_MODE;
129 
130         case EtetUndefined:
131         default:
132             UNREACHABLE();
133             return GL_INVALID_VALUE;
134     }
135 }
136 
137 }  // anonymous namespace
138 
139 //
140 // Driver must call this first, once, before doing any other compiler operations.
141 // Subsequent calls to this function are no-op.
142 //
Initialize()143 bool Initialize()
144 {
145     if (!isInitialized)
146     {
147         isInitialized = InitProcess();
148     }
149     return isInitialized;
150 }
151 
152 //
153 // Cleanup symbol tables
154 //
Finalize()155 bool Finalize()
156 {
157     if (isInitialized)
158     {
159         DetachProcess();
160         isInitialized = false;
161     }
162     return true;
163 }
164 
165 //
166 // Initialize built-in resources with minimum expected values.
167 //
InitBuiltInResources(ShBuiltInResources * resources)168 void InitBuiltInResources(ShBuiltInResources *resources)
169 {
170     // Make comparable.
171     memset(resources, 0, sizeof(*resources));
172 
173     // Constants.
174     resources->MaxVertexAttribs             = 8;
175     resources->MaxVertexUniformVectors      = 128;
176     resources->MaxVaryingVectors            = 8;
177     resources->MaxVertexTextureImageUnits   = 0;
178     resources->MaxCombinedTextureImageUnits = 8;
179     resources->MaxTextureImageUnits         = 8;
180     resources->MaxFragmentUniformVectors    = 16;
181     resources->MaxDrawBuffers               = 1;
182 
183     // Extensions.
184     resources->OES_standard_derivatives                    = 0;
185     resources->OES_EGL_image_external                      = 0;
186     resources->OES_EGL_image_external_essl3                = 0;
187     resources->NV_EGL_stream_consumer_external             = 0;
188     resources->ARB_texture_rectangle                       = 0;
189     resources->EXT_blend_func_extended                     = 0;
190     resources->EXT_draw_buffers                            = 0;
191     resources->EXT_frag_depth                              = 0;
192     resources->EXT_shader_texture_lod                      = 0;
193     resources->WEBGL_debug_shader_precision                = 0;
194     resources->EXT_shader_framebuffer_fetch                = 0;
195     resources->EXT_shader_framebuffer_fetch_non_coherent   = 0;
196     resources->NV_shader_framebuffer_fetch                 = 0;
197     resources->ARM_shader_framebuffer_fetch                = 0;
198     resources->OVR_multiview                               = 0;
199     resources->OVR_multiview2                              = 0;
200     resources->EXT_YUV_target                              = 0;
201     resources->EXT_geometry_shader                         = 0;
202     resources->OES_geometry_shader                         = 0;
203     resources->EXT_gpu_shader5                             = 0;
204     resources->OES_shader_io_blocks                        = 0;
205     resources->EXT_shader_io_blocks                        = 0;
206     resources->EXT_shader_non_constant_global_initializers = 0;
207     resources->NV_shader_noperspective_interpolation       = 0;
208     resources->OES_texture_storage_multisample_2d_array    = 0;
209     resources->OES_texture_3D                              = 0;
210     resources->ANGLE_texture_multisample                   = 0;
211     resources->ANGLE_multi_draw                            = 0;
212     resources->ANGLE_base_vertex_base_instance             = 0;
213     resources->WEBGL_video_texture                         = 0;
214     resources->APPLE_clip_distance                         = 0;
215     resources->OES_texture_cube_map_array                  = 0;
216     resources->EXT_texture_cube_map_array                  = 0;
217     resources->EXT_shadow_samplers                         = 0;
218     resources->OES_shader_multisample_interpolation        = 0;
219     resources->NV_draw_buffers                             = 0;
220     resources->OES_shader_image_atomic                     = 0;
221     resources->EXT_tessellation_shader                     = 0;
222     resources->OES_texture_buffer                          = 0;
223     resources->EXT_texture_buffer                          = 0;
224     resources->OES_sample_variables                        = 0;
225     resources->EXT_clip_cull_distance                      = 0;
226 
227     resources->MaxClipDistances                = 8;
228     resources->MaxCullDistances                = 8;
229     resources->MaxCombinedClipAndCullDistances = 8;
230 
231     // Disable highp precision in fragment shader by default.
232     resources->FragmentPrecisionHigh = 0;
233 
234     // GLSL ES 3.0 constants.
235     resources->MaxVertexOutputVectors  = 16;
236     resources->MaxFragmentInputVectors = 15;
237     resources->MinProgramTexelOffset   = -8;
238     resources->MaxProgramTexelOffset   = 7;
239 
240     // Extensions constants.
241     resources->MaxDualSourceDrawBuffers = 0;
242 
243     resources->MaxViewsOVR = 4;
244 
245     // Disable name hashing by default.
246     resources->HashFunction = nullptr;
247 
248     resources->MaxExpressionComplexity = 256;
249     resources->MaxCallStackDepth       = 256;
250     resources->MaxFunctionParameters   = 1024;
251 
252     // ES 3.1 Revision 4, 7.2 Built-in Constants
253 
254     // ES 3.1, Revision 4, 8.13 Texture minification
255     // "The value of MIN_PROGRAM_TEXTURE_GATHER_OFFSET must be less than or equal to the value of
256     // MIN_PROGRAM_TEXEL_OFFSET. The value of MAX_PROGRAM_TEXTURE_GATHER_OFFSET must be greater than
257     // or equal to the value of MAX_PROGRAM_TEXEL_OFFSET"
258     resources->MinProgramTextureGatherOffset = -8;
259     resources->MaxProgramTextureGatherOffset = 7;
260 
261     resources->MaxImageUnits            = 4;
262     resources->MaxVertexImageUniforms   = 0;
263     resources->MaxFragmentImageUniforms = 0;
264     resources->MaxComputeImageUniforms  = 4;
265     resources->MaxCombinedImageUniforms = 4;
266 
267     resources->MaxUniformLocations = 1024;
268 
269     resources->MaxCombinedShaderOutputResources = 4;
270 
271     resources->MaxComputeWorkGroupCount[0] = 65535;
272     resources->MaxComputeWorkGroupCount[1] = 65535;
273     resources->MaxComputeWorkGroupCount[2] = 65535;
274     resources->MaxComputeWorkGroupSize[0]  = 128;
275     resources->MaxComputeWorkGroupSize[1]  = 128;
276     resources->MaxComputeWorkGroupSize[2]  = 64;
277     resources->MaxComputeUniformComponents = 512;
278     resources->MaxComputeTextureImageUnits = 16;
279 
280     resources->MaxComputeAtomicCounters       = 8;
281     resources->MaxComputeAtomicCounterBuffers = 1;
282 
283     resources->MaxVertexAtomicCounters   = 0;
284     resources->MaxFragmentAtomicCounters = 0;
285     resources->MaxCombinedAtomicCounters = 8;
286     resources->MaxAtomicCounterBindings  = 1;
287 
288     resources->MaxVertexAtomicCounterBuffers   = 0;
289     resources->MaxFragmentAtomicCounterBuffers = 0;
290     resources->MaxCombinedAtomicCounterBuffers = 1;
291     resources->MaxAtomicCounterBufferSize      = 32;
292 
293     resources->MaxUniformBufferBindings       = 32;
294     resources->MaxShaderStorageBufferBindings = 4;
295 
296     resources->MaxGeometryUniformComponents     = 1024;
297     resources->MaxGeometryUniformBlocks         = 12;
298     resources->MaxGeometryInputComponents       = 64;
299     resources->MaxGeometryOutputComponents      = 64;
300     resources->MaxGeometryOutputVertices        = 256;
301     resources->MaxGeometryTotalOutputComponents = 1024;
302     resources->MaxGeometryTextureImageUnits     = 16;
303     resources->MaxGeometryAtomicCounterBuffers  = 0;
304     resources->MaxGeometryAtomicCounters        = 0;
305     resources->MaxGeometryShaderStorageBlocks   = 0;
306     resources->MaxGeometryShaderInvocations     = 32;
307     resources->MaxGeometryImageUniforms         = 0;
308 
309     resources->MaxTessControlInputComponents       = 64;
310     resources->MaxTessControlOutputComponents      = 64;
311     resources->MaxTessControlTextureImageUnits     = 16;
312     resources->MaxTessControlUniformComponents     = 1024;
313     resources->MaxTessControlTotalOutputComponents = 2048;
314     resources->MaxTessControlImageUniforms         = 0;
315     resources->MaxTessControlAtomicCounters        = 0;
316     resources->MaxTessControlAtomicCounterBuffers  = 0;
317 
318     resources->MaxTessPatchComponents = 120;
319     resources->MaxPatchVertices       = 32;
320     resources->MaxTessGenLevel        = 64;
321 
322     resources->MaxTessEvaluationInputComponents      = 64;
323     resources->MaxTessEvaluationOutputComponents     = 64;
324     resources->MaxTessEvaluationTextureImageUnits    = 16;
325     resources->MaxTessEvaluationUniformComponents    = 1024;
326     resources->MaxTessEvaluationImageUniforms        = 0;
327     resources->MaxTessEvaluationAtomicCounters       = 0;
328     resources->MaxTessEvaluationAtomicCounterBuffers = 0;
329 
330     resources->SubPixelBits = 8;
331 
332     resources->MaxSamples = 4;
333 }
334 
335 //
336 // Driver calls these to create and destroy compiler objects.
337 //
ConstructCompiler(sh::GLenum type,ShShaderSpec spec,ShShaderOutput output,const ShBuiltInResources * resources)338 ShHandle ConstructCompiler(sh::GLenum type,
339                            ShShaderSpec spec,
340                            ShShaderOutput output,
341                            const ShBuiltInResources *resources)
342 {
343     TShHandleBase *base = static_cast<TShHandleBase *>(ConstructCompiler(type, spec, output));
344     if (base == nullptr)
345     {
346         return 0;
347     }
348 
349     TCompiler *compiler = base->getAsCompiler();
350     if (compiler == nullptr)
351     {
352         return 0;
353     }
354 
355     // Generate built-in symbol table.
356     if (!compiler->Init(*resources))
357     {
358         Destruct(base);
359         return 0;
360     }
361 
362     return base;
363 }
364 
Destruct(ShHandle handle)365 void Destruct(ShHandle handle)
366 {
367     if (handle == 0)
368         return;
369 
370     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
371 
372     if (base->getAsCompiler())
373         DeleteCompiler(base->getAsCompiler());
374 }
375 
GetBuiltInResourcesString(const ShHandle handle)376 const std::string &GetBuiltInResourcesString(const ShHandle handle)
377 {
378     TCompiler *compiler = GetCompilerFromHandle(handle);
379     ASSERT(compiler);
380     return compiler->getBuiltInResourcesString();
381 }
382 
383 //
384 // Do an actual compile on the given strings.  The result is left
385 // in the given compile object.
386 //
387 // Return:  The return value of ShCompile is really boolean, indicating
388 // success or failure.
389 //
Compile(const ShHandle handle,const char * const shaderStrings[],size_t numStrings,ShCompileOptions compileOptions)390 bool Compile(const ShHandle handle,
391              const char *const shaderStrings[],
392              size_t numStrings,
393              ShCompileOptions compileOptions)
394 {
395     TCompiler *compiler = GetCompilerFromHandle(handle);
396     ASSERT(compiler);
397 
398     return compiler->compile(shaderStrings, numStrings, compileOptions);
399 }
400 
ClearResults(const ShHandle handle)401 void ClearResults(const ShHandle handle)
402 {
403     TCompiler *compiler = GetCompilerFromHandle(handle);
404     ASSERT(compiler);
405     compiler->clearResults();
406 }
407 
GetShaderVersion(const ShHandle handle)408 int GetShaderVersion(const ShHandle handle)
409 {
410     TCompiler *compiler = GetCompilerFromHandle(handle);
411     ASSERT(compiler);
412     return compiler->getShaderVersion();
413 }
414 
GetShaderOutputType(const ShHandle handle)415 ShShaderOutput GetShaderOutputType(const ShHandle handle)
416 {
417     TCompiler *compiler = GetCompilerFromHandle(handle);
418     ASSERT(compiler);
419     return compiler->getOutputType();
420 }
421 
422 //
423 // Return any compiler log of messages for the application.
424 //
GetInfoLog(const ShHandle handle)425 const std::string &GetInfoLog(const ShHandle handle)
426 {
427     TCompiler *compiler = GetCompilerFromHandle(handle);
428     ASSERT(compiler);
429 
430     TInfoSink &infoSink = compiler->getInfoSink();
431     return infoSink.info.str();
432 }
433 
434 //
435 // Return any object code.
436 //
GetObjectCode(const ShHandle handle)437 const std::string &GetObjectCode(const ShHandle handle)
438 {
439     TCompiler *compiler = GetCompilerFromHandle(handle);
440     ASSERT(compiler);
441 
442     TInfoSink &infoSink = compiler->getInfoSink();
443     return infoSink.obj.str();
444 }
445 
446 //
447 // Return any object binary code.
448 //
GetObjectBinaryBlob(const ShHandle handle)449 const BinaryBlob &GetObjectBinaryBlob(const ShHandle handle)
450 {
451     TCompiler *compiler = GetCompilerFromHandle(handle);
452     ASSERT(compiler);
453 
454     TInfoSink &infoSink = compiler->getInfoSink();
455     return infoSink.obj.getBinary();
456 }
457 
GetNameHashingMap(const ShHandle handle)458 const std::map<std::string, std::string> *GetNameHashingMap(const ShHandle handle)
459 {
460     TCompiler *compiler = GetCompilerFromHandle(handle);
461     ASSERT(compiler);
462     return &(compiler->getNameMap());
463 }
464 
GetUniforms(const ShHandle handle)465 const std::vector<ShaderVariable> *GetUniforms(const ShHandle handle)
466 {
467     TCompiler *compiler = GetCompilerFromHandle(handle);
468     if (!compiler)
469     {
470         return nullptr;
471     }
472     return &compiler->getUniforms();
473 }
474 
GetInputVaryings(const ShHandle handle)475 const std::vector<ShaderVariable> *GetInputVaryings(const ShHandle handle)
476 {
477     TCompiler *compiler = GetCompilerFromHandle(handle);
478     if (compiler == nullptr)
479     {
480         return nullptr;
481     }
482     return &compiler->getInputVaryings();
483 }
484 
GetOutputVaryings(const ShHandle handle)485 const std::vector<ShaderVariable> *GetOutputVaryings(const ShHandle handle)
486 {
487     TCompiler *compiler = GetCompilerFromHandle(handle);
488     if (compiler == nullptr)
489     {
490         return nullptr;
491     }
492     return &compiler->getOutputVaryings();
493 }
494 
GetVaryings(const ShHandle handle)495 const std::vector<ShaderVariable> *GetVaryings(const ShHandle handle)
496 {
497     TCompiler *compiler = GetCompilerFromHandle(handle);
498     if (compiler == nullptr)
499     {
500         return nullptr;
501     }
502 
503     switch (compiler->getShaderType())
504     {
505         case GL_VERTEX_SHADER:
506             return &compiler->getOutputVaryings();
507         case GL_FRAGMENT_SHADER:
508             return &compiler->getInputVaryings();
509         case GL_COMPUTE_SHADER:
510             ASSERT(compiler->getOutputVaryings().empty() && compiler->getInputVaryings().empty());
511             return &compiler->getOutputVaryings();
512         // Since geometry shaders have both input and output varyings, we shouldn't call GetVaryings
513         // on a geometry shader.
514         default:
515             return nullptr;
516     }
517 }
518 
GetAttributes(const ShHandle handle)519 const std::vector<ShaderVariable> *GetAttributes(const ShHandle handle)
520 {
521     TCompiler *compiler = GetCompilerFromHandle(handle);
522     if (!compiler)
523     {
524         return nullptr;
525     }
526     return &compiler->getAttributes();
527 }
528 
GetOutputVariables(const ShHandle handle)529 const std::vector<ShaderVariable> *GetOutputVariables(const ShHandle handle)
530 {
531     TCompiler *compiler = GetCompilerFromHandle(handle);
532     if (!compiler)
533     {
534         return nullptr;
535     }
536     return &compiler->getOutputVariables();
537 }
538 
GetInterfaceBlocks(const ShHandle handle)539 const std::vector<InterfaceBlock> *GetInterfaceBlocks(const ShHandle handle)
540 {
541     return GetShaderVariables<InterfaceBlock>(handle);
542 }
543 
GetUniformBlocks(const ShHandle handle)544 const std::vector<InterfaceBlock> *GetUniformBlocks(const ShHandle handle)
545 {
546     ASSERT(handle);
547     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
548     TCompiler *compiler = base->getAsCompiler();
549     ASSERT(compiler);
550 
551     return &compiler->getUniformBlocks();
552 }
553 
GetShaderStorageBlocks(const ShHandle handle)554 const std::vector<InterfaceBlock> *GetShaderStorageBlocks(const ShHandle handle)
555 {
556     ASSERT(handle);
557     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
558     TCompiler *compiler = base->getAsCompiler();
559     ASSERT(compiler);
560 
561     return &compiler->getShaderStorageBlocks();
562 }
563 
GetComputeShaderLocalGroupSize(const ShHandle handle)564 WorkGroupSize GetComputeShaderLocalGroupSize(const ShHandle handle)
565 {
566     ASSERT(handle);
567 
568     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
569     TCompiler *compiler = base->getAsCompiler();
570     ASSERT(compiler);
571 
572     return compiler->getComputeShaderLocalSize();
573 }
574 
GetVertexShaderNumViews(const ShHandle handle)575 int GetVertexShaderNumViews(const ShHandle handle)
576 {
577     ASSERT(handle);
578     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
579     TCompiler *compiler = base->getAsCompiler();
580     ASSERT(compiler);
581 
582     return compiler->getNumViews();
583 }
584 
HasEarlyFragmentTestsOptimization(const ShHandle handle)585 bool HasEarlyFragmentTestsOptimization(const ShHandle handle)
586 {
587     TCompiler *compiler = GetCompilerFromHandle(handle);
588     if (compiler == nullptr)
589     {
590         return false;
591     }
592     return compiler->isEarlyFragmentTestsOptimized();
593 }
594 
GetShaderSpecConstUsageBits(const ShHandle handle)595 uint32_t GetShaderSpecConstUsageBits(const ShHandle handle)
596 {
597     TCompiler *compiler = GetCompilerFromHandle(handle);
598     if (compiler == nullptr)
599     {
600         return 0;
601     }
602     return compiler->getSpecConstUsageBits().bits();
603 }
604 
CheckVariablesWithinPackingLimits(int maxVectors,const std::vector<ShaderVariable> & variables)605 bool CheckVariablesWithinPackingLimits(int maxVectors, const std::vector<ShaderVariable> &variables)
606 {
607     return CheckVariablesInPackingLimits(maxVectors, variables);
608 }
609 
GetShaderStorageBlockRegister(const ShHandle handle,const std::string & shaderStorageBlockName,unsigned int * indexOut)610 bool GetShaderStorageBlockRegister(const ShHandle handle,
611                                    const std::string &shaderStorageBlockName,
612                                    unsigned int *indexOut)
613 {
614 #ifdef ANGLE_ENABLE_HLSL
615     ASSERT(indexOut);
616 
617     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
618     ASSERT(translator);
619 
620     if (!translator->hasShaderStorageBlock(shaderStorageBlockName))
621     {
622         return false;
623     }
624 
625     *indexOut = translator->getShaderStorageBlockRegister(shaderStorageBlockName);
626     return true;
627 #else
628     return false;
629 #endif  // ANGLE_ENABLE_HLSL
630 }
631 
GetUniformBlockRegister(const ShHandle handle,const std::string & uniformBlockName,unsigned int * indexOut)632 bool GetUniformBlockRegister(const ShHandle handle,
633                              const std::string &uniformBlockName,
634                              unsigned int *indexOut)
635 {
636 #ifdef ANGLE_ENABLE_HLSL
637     ASSERT(indexOut);
638 
639     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
640     ASSERT(translator);
641 
642     if (!translator->hasUniformBlock(uniformBlockName))
643     {
644         return false;
645     }
646 
647     *indexOut = translator->getUniformBlockRegister(uniformBlockName);
648     return true;
649 #else
650     return false;
651 #endif  // ANGLE_ENABLE_HLSL
652 }
653 
ShouldUniformBlockUseStructuredBuffer(const ShHandle handle,const std::string & uniformBlockName)654 bool ShouldUniformBlockUseStructuredBuffer(const ShHandle handle,
655                                            const std::string &uniformBlockName)
656 {
657 #ifdef ANGLE_ENABLE_HLSL
658     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
659     ASSERT(translator);
660 
661     return translator->shouldUniformBlockUseStructuredBuffer(uniformBlockName);
662 #else
663     return false;
664 #endif  // ANGLE_ENABLE_HLSL
665 }
666 
GetUniformRegisterMap(const ShHandle handle)667 const std::map<std::string, unsigned int> *GetUniformRegisterMap(const ShHandle handle)
668 {
669 #ifdef ANGLE_ENABLE_HLSL
670     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
671     ASSERT(translator);
672 
673     return translator->getUniformRegisterMap();
674 #else
675     return nullptr;
676 #endif  // ANGLE_ENABLE_HLSL
677 }
678 
GetSlowCompilingUniformBlockSet(const ShHandle handle)679 const std::set<std::string> *GetSlowCompilingUniformBlockSet(const ShHandle handle)
680 {
681 #ifdef ANGLE_ENABLE_HLSL
682     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
683     ASSERT(translator);
684 
685     return translator->getSlowCompilingUniformBlockSet();
686 #else
687     return nullptr;
688 #endif  // ANGLE_ENABLE_HLSL
689 }
690 
GetReadonlyImage2DRegisterIndex(const ShHandle handle)691 unsigned int GetReadonlyImage2DRegisterIndex(const ShHandle handle)
692 {
693 #ifdef ANGLE_ENABLE_HLSL
694     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
695     ASSERT(translator);
696 
697     return translator->getReadonlyImage2DRegisterIndex();
698 #else
699     return 0;
700 #endif  // ANGLE_ENABLE_HLSL
701 }
702 
GetImage2DRegisterIndex(const ShHandle handle)703 unsigned int GetImage2DRegisterIndex(const ShHandle handle)
704 {
705 #ifdef ANGLE_ENABLE_HLSL
706     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
707     ASSERT(translator);
708 
709     return translator->getImage2DRegisterIndex();
710 #else
711     return 0;
712 #endif  // ANGLE_ENABLE_HLSL
713 }
714 
GetUsedImage2DFunctionNames(const ShHandle handle)715 const std::set<std::string> *GetUsedImage2DFunctionNames(const ShHandle handle)
716 {
717 #ifdef ANGLE_ENABLE_HLSL
718     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
719     ASSERT(translator);
720 
721     return translator->getUsedImage2DFunctionNames();
722 #else
723     return nullptr;
724 #endif  // ANGLE_ENABLE_HLSL
725 }
726 
HasValidGeometryShaderInputPrimitiveType(const ShHandle handle)727 bool HasValidGeometryShaderInputPrimitiveType(const ShHandle handle)
728 {
729     ASSERT(handle);
730 
731     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
732     TCompiler *compiler = base->getAsCompiler();
733     ASSERT(compiler);
734 
735     return compiler->getGeometryShaderInputPrimitiveType() != EptUndefined;
736 }
737 
HasValidGeometryShaderOutputPrimitiveType(const ShHandle handle)738 bool HasValidGeometryShaderOutputPrimitiveType(const ShHandle handle)
739 {
740     ASSERT(handle);
741 
742     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
743     TCompiler *compiler = base->getAsCompiler();
744     ASSERT(compiler);
745 
746     return compiler->getGeometryShaderOutputPrimitiveType() != EptUndefined;
747 }
748 
HasValidGeometryShaderMaxVertices(const ShHandle handle)749 bool HasValidGeometryShaderMaxVertices(const ShHandle handle)
750 {
751     ASSERT(handle);
752 
753     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
754     TCompiler *compiler = base->getAsCompiler();
755     ASSERT(compiler);
756 
757     return compiler->getGeometryShaderMaxVertices() >= 0;
758 }
759 
HasValidTessGenMode(const ShHandle handle)760 bool HasValidTessGenMode(const ShHandle handle)
761 {
762     ASSERT(handle);
763 
764     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
765     TCompiler *compiler = base->getAsCompiler();
766     ASSERT(compiler);
767 
768     return compiler->getTessEvaluationShaderInputPrimitiveType() != EtetUndefined;
769 }
770 
HasValidTessGenSpacing(const ShHandle handle)771 bool HasValidTessGenSpacing(const ShHandle handle)
772 {
773     ASSERT(handle);
774 
775     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
776     TCompiler *compiler = base->getAsCompiler();
777     ASSERT(compiler);
778 
779     return compiler->getTessEvaluationShaderInputVertexSpacingType() != EtetUndefined;
780 }
781 
HasValidTessGenVertexOrder(const ShHandle handle)782 bool HasValidTessGenVertexOrder(const ShHandle handle)
783 {
784     ASSERT(handle);
785 
786     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
787     TCompiler *compiler = base->getAsCompiler();
788     ASSERT(compiler);
789 
790     return compiler->getTessEvaluationShaderInputOrderingType() != EtetUndefined;
791 }
792 
HasValidTessGenPointMode(const ShHandle handle)793 bool HasValidTessGenPointMode(const ShHandle handle)
794 {
795     ASSERT(handle);
796 
797     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
798     TCompiler *compiler = base->getAsCompiler();
799     ASSERT(compiler);
800 
801     return compiler->getTessEvaluationShaderInputPointType() != EtetUndefined;
802 }
803 
GetGeometryShaderInputPrimitiveType(const ShHandle handle)804 GLenum GetGeometryShaderInputPrimitiveType(const ShHandle handle)
805 {
806     ASSERT(handle);
807 
808     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
809     TCompiler *compiler = base->getAsCompiler();
810     ASSERT(compiler);
811 
812     return GetGeometryShaderPrimitiveTypeEnum(compiler->getGeometryShaderInputPrimitiveType());
813 }
814 
GetGeometryShaderOutputPrimitiveType(const ShHandle handle)815 GLenum GetGeometryShaderOutputPrimitiveType(const ShHandle handle)
816 {
817     ASSERT(handle);
818 
819     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
820     TCompiler *compiler = base->getAsCompiler();
821     ASSERT(compiler);
822 
823     return GetGeometryShaderPrimitiveTypeEnum(compiler->getGeometryShaderOutputPrimitiveType());
824 }
825 
GetGeometryShaderInvocations(const ShHandle handle)826 int GetGeometryShaderInvocations(const ShHandle handle)
827 {
828     ASSERT(handle);
829 
830     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
831     TCompiler *compiler = base->getAsCompiler();
832     ASSERT(compiler);
833 
834     return compiler->getGeometryShaderInvocations();
835 }
836 
GetGeometryShaderMaxVertices(const ShHandle handle)837 int GetGeometryShaderMaxVertices(const ShHandle handle)
838 {
839     ASSERT(handle);
840 
841     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
842     TCompiler *compiler = base->getAsCompiler();
843     ASSERT(compiler);
844 
845     int maxVertices = compiler->getGeometryShaderMaxVertices();
846     ASSERT(maxVertices >= 0);
847     return maxVertices;
848 }
849 
GetTessControlShaderVertices(const ShHandle handle)850 int GetTessControlShaderVertices(const ShHandle handle)
851 {
852     ASSERT(handle);
853 
854     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
855     TCompiler *compiler = base->getAsCompiler();
856     ASSERT(compiler);
857 
858     int vertices = compiler->getTessControlShaderOutputVertices();
859     return vertices;
860 }
861 
GetTessGenMode(const ShHandle handle)862 GLenum GetTessGenMode(const ShHandle handle)
863 {
864     ASSERT(handle);
865 
866     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
867     TCompiler *compiler = base->getAsCompiler();
868     ASSERT(compiler);
869 
870     return GetTessellationShaderTypeEnum(compiler->getTessEvaluationShaderInputPrimitiveType());
871 }
872 
GetTessGenSpacing(const ShHandle handle)873 GLenum GetTessGenSpacing(const ShHandle handle)
874 {
875     ASSERT(handle);
876 
877     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
878     TCompiler *compiler = base->getAsCompiler();
879     ASSERT(compiler);
880 
881     return GetTessellationShaderTypeEnum(compiler->getTessEvaluationShaderInputVertexSpacingType());
882 }
883 
GetTessGenVertexOrder(const ShHandle handle)884 GLenum GetTessGenVertexOrder(const ShHandle handle)
885 {
886     ASSERT(handle);
887 
888     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
889     TCompiler *compiler = base->getAsCompiler();
890     ASSERT(compiler);
891 
892     return GetTessellationShaderTypeEnum(compiler->getTessEvaluationShaderInputOrderingType());
893 }
894 
GetTessGenPointMode(const ShHandle handle)895 GLenum GetTessGenPointMode(const ShHandle handle)
896 {
897     ASSERT(handle);
898 
899     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
900     TCompiler *compiler = base->getAsCompiler();
901     ASSERT(compiler);
902 
903     return GetTessellationShaderTypeEnum(compiler->getTessEvaluationShaderInputPointType());
904 }
905 
GetShaderSharedMemorySize(const ShHandle handle)906 unsigned int GetShaderSharedMemorySize(const ShHandle handle)
907 {
908     ASSERT(handle);
909 
910     TShHandleBase *base = static_cast<TShHandleBase *>(handle);
911     TCompiler *compiler = base->getAsCompiler();
912     ASSERT(compiler);
913 
914     unsigned int sharedMemorySize = compiler->getSharedMemorySize();
915     return sharedMemorySize;
916 }
917 
InitializeGlslang()918 void InitializeGlslang()
919 {
920     if (!isGlslangInitialized)
921     {
922         GlslangInitialize();
923     }
924     isGlslangInitialized = true;
925 }
926 
FinalizeGlslang()927 void FinalizeGlslang()
928 {
929     if (isGlslangInitialized)
930     {
931         GlslangFinalize();
932     }
933     isGlslangInitialized = false;
934 }
935 
936 // Can't prefix with just _ because then we might introduce a double underscore, which is not safe
937 // in GLSL (ESSL 3.00.6 section 3.8: All identifiers containing a double underscore are reserved for
938 // use by the underlying implementation). u is short for user-defined.
939 const char kUserDefinedNamePrefix[] = "_u";
940 
941 namespace vk
942 {
943 // Interface block name containing the aggregate default uniforms
944 const char kDefaultUniformsNameVS[]  = "defaultUniformsVS";
945 const char kDefaultUniformsNameTCS[] = "defaultUniformsTCS";
946 const char kDefaultUniformsNameTES[] = "defaultUniformsTES";
947 const char kDefaultUniformsNameGS[]  = "defaultUniformsGS";
948 const char kDefaultUniformsNameFS[]  = "defaultUniformsFS";
949 const char kDefaultUniformsNameCS[]  = "defaultUniformsCS";
950 
951 // Interface block and variable names containing driver uniforms
952 const char kDriverUniformsBlockName[] = "ANGLEUniformBlock";
953 const char kDriverUniformsVarName[]   = "ANGLEUniforms";
954 
955 // Interface block array name used for atomic counter emulation
956 const char kAtomicCountersBlockName[] = "ANGLEAtomicCounters";
957 
958 const char kLineRasterEmulationPosition[] = "ANGLEPosition";
959 
960 const char kXfbEmulationGetOffsetsFunctionName[] = "ANGLEGetXfbOffsets";
961 const char kXfbEmulationCaptureFunctionName[]    = "ANGLECaptureXfb";
962 const char kXfbEmulationBufferBlockName[]        = "ANGLEXfbBuffer";
963 const char kXfbEmulationBufferName[]             = "ANGLEXfb";
964 const char kXfbEmulationBufferFieldName[]        = "xfbOut";
965 
966 const char kXfbExtensionPositionOutName[] = "ANGLEXfbPosition";
967 
968 // EXT_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch_non_coherent
969 const char kInputAttachmentName[] = "ANGLEInputAttachment";
970 
971 }  // namespace vk
972 
973 }  // namespace sh
974