1 //
2 // Copyright (c) 2015 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 // ExtensionGLSL.cpp: Implements the TExtensionGLSL class that tracks GLSL extension requirements
7 // of shaders.
8 
9 #include "compiler/translator/ExtensionGLSL.h"
10 
11 #include "compiler/translator/VersionGLSL.h"
12 
13 namespace sh
14 {
15 
TExtensionGLSL(ShShaderOutput output)16 TExtensionGLSL::TExtensionGLSL(ShShaderOutput output)
17     : TIntermTraverser(true, false, false), mTargetVersion(ShaderOutputTypeToGLSLVersion(output))
18 {
19 }
20 
getEnabledExtensions() const21 const std::set<std::string> &TExtensionGLSL::getEnabledExtensions() const
22 {
23     return mEnabledExtensions;
24 }
25 
getRequiredExtensions() const26 const std::set<std::string> &TExtensionGLSL::getRequiredExtensions() const
27 {
28     return mRequiredExtensions;
29 }
30 
visitUnary(Visit,TIntermUnary * node)31 bool TExtensionGLSL::visitUnary(Visit, TIntermUnary *node)
32 {
33     checkOperator(node);
34 
35     return true;
36 }
37 
visitAggregate(Visit,TIntermAggregate * node)38 bool TExtensionGLSL::visitAggregate(Visit, TIntermAggregate *node)
39 {
40     checkOperator(node);
41 
42     return true;
43 }
44 
checkOperator(TIntermOperator * node)45 void TExtensionGLSL::checkOperator(TIntermOperator *node)
46 {
47     if (mTargetVersion < GLSL_VERSION_130)
48     {
49         return;
50     }
51 
52     switch (node->getOp())
53     {
54         case EOpAbs:
55             break;
56 
57         case EOpSign:
58             break;
59 
60         case EOpMix:
61             break;
62 
63         case EOpFloatBitsToInt:
64         case EOpFloatBitsToUint:
65         case EOpIntBitsToFloat:
66         case EOpUintBitsToFloat:
67             if (mTargetVersion < GLSL_VERSION_330)
68             {
69                 // Bit conversion functions cannot be emulated.
70                 mRequiredExtensions.insert("GL_ARB_shader_bit_encoding");
71             }
72             break;
73 
74         case EOpPackSnorm2x16:
75         case EOpPackHalf2x16:
76         case EOpUnpackSnorm2x16:
77         case EOpUnpackHalf2x16:
78             if (mTargetVersion < GLSL_VERSION_420)
79             {
80                 mEnabledExtensions.insert("GL_ARB_shading_language_packing");
81 
82                 if (mTargetVersion < GLSL_VERSION_330)
83                 {
84                     // floatBitsToUint and uintBitsToFloat are needed to emulate
85                     // packHalf2x16 and unpackHalf2x16 respectively and cannot be
86                     // emulated themselves.
87                     mRequiredExtensions.insert("GL_ARB_shader_bit_encoding");
88                 }
89             }
90             break;
91 
92         case EOpPackUnorm2x16:
93         case EOpUnpackUnorm2x16:
94             if (mTargetVersion < GLSL_VERSION_410)
95             {
96                 mEnabledExtensions.insert("GL_ARB_shading_language_packing");
97             }
98             break;
99 
100         default:
101             break;
102     }
103 }
104 
105 }  // namespace sh
106