Edit

kc3-lang/angle/src/compiler/translator/ExtensionGLSL.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2016-11-07 13:58:48
    Hash : 45bcc784
    Message : translator: Scope all classes with "sh". I was seeing an odd problem with our PoolAlloc conflicting with the glslang/Vulkan TIntermNode, so the fix was to move everything to a separate namespace. The bison grammars are also regenerated. No functional changes. BUG=angleproject:1576 Change-Id: I959c7afe4c092f0d458432c07b4dcee4d39513f3 Reviewed-on: https://chromium-review.googlesource.com/408267 Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/compiler/translator/ExtensionGLSL.cpp
  • //
    // 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<std::string> &TExtensionGLSL::getEnabledExtensions() const
    {
        return mEnabledExtensions;
    }
    
    const std::set<std::string> &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