tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ExtensionGLSL.cpp (3153B)


      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 
     16 TExtensionGLSL::TExtensionGLSL(ShShaderOutput output)
     17    : TIntermTraverser(true, false, false), mTargetVersion(ShaderOutputTypeToGLSLVersion(output))
     18 {}
     19 
     20 const std::set<std::string> &TExtensionGLSL::getEnabledExtensions() const
     21 {
     22    return mEnabledExtensions;
     23 }
     24 
     25 const std::set<std::string> &TExtensionGLSL::getRequiredExtensions() const
     26 {
     27    return mRequiredExtensions;
     28 }
     29 
     30 bool TExtensionGLSL::visitUnary(Visit, TIntermUnary *node)
     31 {
     32    checkOperator(node);
     33 
     34    return true;
     35 }
     36 
     37 bool TExtensionGLSL::visitAggregate(Visit, TIntermAggregate *node)
     38 {
     39    checkOperator(node);
     40 
     41    return true;
     42 }
     43 
     44 void 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        case EOpBeginInvocationInterlockNV:
    100        case EOpEndInvocationInterlockNV:
    101            mRequiredExtensions.insert("GL_NV_fragment_shader_interlock");
    102            break;
    103 
    104        case EOpBeginFragmentShaderOrderingINTEL:
    105            mRequiredExtensions.insert("GL_INTEL_fragment_shader_ordering");
    106            break;
    107 
    108        case EOpBeginInvocationInterlockARB:
    109        case EOpEndInvocationInterlockARB:
    110            mRequiredExtensions.insert("GL_ARB_fragment_shader_interlock");
    111            break;
    112 
    113        default:
    114            break;
    115    }
    116 }
    117 
    118 }  // namespace sh