// // Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // ExtensionGLSL.cpp: Implements the TExtensionGLSL class that tracks GLSL extension requirements // of shaders. #include "compiler/translator/ExtensionGLSL.h" #include "compiler/translator/VersionGLSL.h" namespace sh { TExtensionGLSL::TExtensionGLSL(ShShaderOutput output) : TIntermTraverser(true, false, false), mTargetVersion(ShaderOutputTypeToGLSLVersion(output)) {} const std::set &TExtensionGLSL::getEnabledExtensions() const { return mEnabledExtensions; } const std::set &TExtensionGLSL::getRequiredExtensions() const { return mRequiredExtensions; } bool TExtensionGLSL::visitUnary(Visit, TIntermUnary *node) { checkOperator(node); return true; } bool TExtensionGLSL::visitAggregate(Visit, TIntermAggregate *node) { checkOperator(node); return true; } void TExtensionGLSL::checkOperator(TIntermOperator *node) { if (mTargetVersion < GLSL_VERSION_130) { return; } switch (node->getOp()) { case EOpAbs: break; case EOpSign: break; case EOpMix: break; case EOpFloatBitsToInt: case EOpFloatBitsToUint: case EOpIntBitsToFloat: case EOpUintBitsToFloat: if (mTargetVersion < GLSL_VERSION_330) { // Bit conversion functions cannot be emulated. mRequiredExtensions.insert("GL_ARB_shader_bit_encoding"); } break; case EOpPackSnorm2x16: case EOpPackHalf2x16: case EOpUnpackSnorm2x16: case EOpUnpackHalf2x16: if (mTargetVersion < GLSL_VERSION_420) { mEnabledExtensions.insert("GL_ARB_shading_language_packing"); if (mTargetVersion < GLSL_VERSION_330) { // floatBitsToUint and uintBitsToFloat are needed to emulate // packHalf2x16 and unpackHalf2x16 respectively and cannot be // emulated themselves. mRequiredExtensions.insert("GL_ARB_shader_bit_encoding"); } } break; case EOpPackUnorm2x16: case EOpUnpackUnorm2x16: if (mTargetVersion < GLSL_VERSION_410) { mEnabledExtensions.insert("GL_ARB_shading_language_packing"); } break; default: break; } } } // namespace sh