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