Edit

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

Branch :

  • Show log

    Commit

  • Author : Mohan Maiya
    Date : 2021-02-24 09:49:42
    Hash : 550f2a3e
    Message : Vulkan: Shader support for EXT_shader_framebuffer_fetch_non_coherent Translator can accept gl_LastFragData and 'inout' variable to gain access to framebuffer attachment data. The Vulkan translator replaces it with the SubpassInput type variable. Note that this works only for the noncoherent version of the extension. Bug: angleproject:5454 Test: *EXTShaderFramebufferFetchNoncoherent*.* Change-Id: I392f84ee3ad3eb9fbd09d0b7ff83731a9a3f33f6 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2598060 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>

  • src/compiler/translator/ExtensionBehavior.cpp
  • //
    // Copyright 2017 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.
    //
    // ExtensionBehavior.cpp: Extension name enumeration and data structures for storing extension
    // behavior.
    
    #include "compiler/translator/ExtensionBehavior.h"
    
    #include "common/debug.h"
    
    #include <string.h>
    
    #define LIST_EXTENSIONS(OP)                         \
        OP(ANGLE_base_vertex_base_instance)             \
        OP(ANGLE_multi_draw)                            \
        OP(ANGLE_texture_multisample)                   \
        OP(APPLE_clip_distance)                         \
        OP(ARB_texture_rectangle)                       \
        OP(ARM_shader_framebuffer_fetch)                \
        OP(EXT_blend_func_extended)                     \
        OP(EXT_clip_cull_distance)                      \
        OP(EXT_draw_buffers)                            \
        OP(EXT_frag_depth)                              \
        OP(EXT_geometry_shader)                         \
        OP(OES_shader_io_blocks)                        \
        OP(EXT_shader_io_blocks)                        \
        OP(EXT_gpu_shader5)                             \
        OP(EXT_shader_framebuffer_fetch)                \
        OP(EXT_shader_framebuffer_fetch_non_coherent)   \
        OP(EXT_shader_non_constant_global_initializers) \
        OP(EXT_shader_texture_lod)                      \
        OP(EXT_shadow_samplers)                         \
        OP(EXT_tessellation_shader)                     \
        OP(EXT_texture_buffer)                          \
        OP(EXT_texture_cube_map_array)                  \
        OP(EXT_YUV_target)                              \
        OP(NV_EGL_stream_consumer_external)             \
        OP(NV_shader_framebuffer_fetch)                 \
        OP(NV_shader_noperspective_interpolation)       \
        OP(OES_EGL_image_external)                      \
        OP(OES_EGL_image_external_essl3)                \
        OP(OES_sample_variables)                        \
        OP(OES_shader_multisample_interpolation)        \
        OP(OES_shader_image_atomic)                     \
        OP(OES_standard_derivatives)                    \
        OP(OES_texture_3D)                              \
        OP(OES_texture_buffer)                          \
        OP(OES_texture_cube_map_array)                  \
        OP(OES_texture_storage_multisample_2d_array)    \
        OP(OVR_multiview)                               \
        OP(OVR_multiview2)                              \
        OP(WEBGL_video_texture)
    
    namespace sh
    {
    
    #define RETURN_EXTENSION_NAME_CASE(ext) \
        case TExtension::ext:               \
            return "GL_" #ext;
    
    const char *GetExtensionNameString(TExtension extension)
    {
        switch (extension)
        {
            LIST_EXTENSIONS(RETURN_EXTENSION_NAME_CASE)
            default:
                UNREACHABLE();
                return "";
        }
    }
    
    #define RETURN_EXTENSION_IF_NAME_MATCHES(ext)  \
        if (strcmp(extWithoutGLPrefix, #ext) == 0) \
        {                                          \
            return TExtension::ext;                \
        }
    
    TExtension GetExtensionByName(const char *extension)
    {
        // If first characters of the extension don't equal "GL_", early out.
        if (strncmp(extension, "GL_", 3) != 0)
        {
            return TExtension::UNDEFINED;
        }
        const char *extWithoutGLPrefix = extension + 3;
    
        LIST_EXTENSIONS(RETURN_EXTENSION_IF_NAME_MATCHES)
    
        return TExtension::UNDEFINED;
    }
    
    const char *GetBehaviorString(TBehavior b)
    {
        switch (b)
        {
            case EBhRequire:
                return "require";
            case EBhEnable:
                return "enable";
            case EBhWarn:
                return "warn";
            case EBhDisable:
                return "disable";
            default:
                return nullptr;
        }
    }
    
    bool IsExtensionEnabled(const TExtensionBehavior &extBehavior, TExtension extension)
    {
        ASSERT(extension != TExtension::UNDEFINED);
        auto iter = extBehavior.find(extension);
        return iter != extBehavior.end() &&
               (iter->second == EBhEnable || iter->second == EBhRequire || iter->second == EBhWarn);
    }
    
    }  // namespace sh