Edit

kc3-lang/angle/src/libANGLE/renderer/vulkan/GlslangWrapperVk.cpp

Branch :

  • Show log

    Commit

  • Author : Shahbaz Youssefi
    Date : 2021-02-26 00:00:57
    Hash : 776c6015
    Message : Vulkan: Call glslang at compile time With this change, the ANGLE translator immediately compiles the generated GLSL into SPIR-V with glslang and discards the source. This is in preparation for generating SPIR-V directly, by making the frontend and backend already able to digest it. This change also allows the expensive glslang calls to be parallelized, improving the following perf test by about 20%: LinkProgramBenchmark.Run/vulkan_compile_and_link_multi_thread Previously, the test was run as such in the Vulkan backend: Main Thread 1 Thread 2 Compile1 ---> Compile2 ---------------------> Translator Translator <--- <--------------------- Link glslang for shader1 glslang for shader2 Done With this change, it is run as such: Main Thread 1 Thread 2 Compile1 ---> Compile2 ---------------------> Translator Translator glslang glslang <--- <--------------------- Link Done glslang_wrapper_utils no longer interacts with glslang! A rename will follow. Bug: angleproject:4889 Change-Id: If4303e8ba0ba43b1a2f47f8c0a9133d0bee1a19a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2721195 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/renderer/vulkan/GlslangWrapperVk.cpp
  • //
    // Copyright 2016 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.
    //
    // GlslangWrapperVk: Wrapper for Vulkan's glslang compiler.
    //
    
    #include "libANGLE/renderer/vulkan/GlslangWrapperVk.h"
    
    #include "libANGLE/renderer/vulkan/ContextVk.h"
    #include "libANGLE/renderer/vulkan/vk_cache_utils.h"
    
    namespace rx
    {
    // static
    GlslangSourceOptions GlslangWrapperVk::CreateSourceOptions(const angle::FeaturesVk &features)
    {
        GlslangSourceOptions options;
    
        options.supportsTransformFeedbackExtension =
            features.supportsTransformFeedbackExtension.enabled;
        options.supportsTransformFeedbackEmulation = features.emulateTransformFeedback.enabled;
        options.enableTransformFeedbackEmulation   = options.supportsTransformFeedbackEmulation;
        options.emulateBresenhamLines              = features.basicGLLineRasterization.enabled;
    
        return options;
    }
    
    // static
    void GlslangWrapperVk::ResetGlslangProgramInterfaceInfo(
        GlslangProgramInterfaceInfo *glslangProgramInterfaceInfo)
    {
        glslangProgramInterfaceInfo->uniformsAndXfbDescriptorSetIndex =
            ToUnderlying(DescriptorSetIndex::UniformsAndXfb);
        glslangProgramInterfaceInfo->currentUniformBindingIndex = 0;
        glslangProgramInterfaceInfo->textureDescriptorSetIndex =
            ToUnderlying(DescriptorSetIndex::Texture);
        glslangProgramInterfaceInfo->currentTextureBindingIndex = 0;
        glslangProgramInterfaceInfo->shaderResourceDescriptorSetIndex =
            ToUnderlying(DescriptorSetIndex::ShaderResource);
        glslangProgramInterfaceInfo->currentShaderResourceBindingIndex = 0;
        glslangProgramInterfaceInfo->driverUniformsDescriptorSetIndex =
            ToUnderlying(DescriptorSetIndex::Internal);
    
        glslangProgramInterfaceInfo->locationsUsedForXfbExtension = 0;
    }
    
    // static
    void GlslangWrapperVk::GetShaderCode(const angle::FeaturesVk &features,
                                         const gl::ProgramState &programState,
                                         const gl::ProgramLinkedResources &resources,
                                         GlslangProgramInterfaceInfo *programInterfaceInfo,
                                         gl::ShaderMap<const angle::spirv::Blob *> *spirvBlobsOut,
                                         ShaderInterfaceVariableInfoMap *variableInfoMapOut)
    {
        GlslangSourceOptions options = CreateSourceOptions(features);
        GlslangGetShaderSpirvCode(options, programState, resources, programInterfaceInfo, spirvBlobsOut,
                                  variableInfoMapOut);
    }
    
    // static
    angle::Result GlslangWrapperVk::TransformSpirV(
        const GlslangSpirvOptions &options,
        const ShaderInterfaceVariableInfoMap &variableInfoMap,
        const angle::spirv::Blob &initialSpirvBlob,
        angle::spirv::Blob *shaderCodeOut)
    {
        return GlslangTransformSpirvCode(options, variableInfoMap, initialSpirvBlob, shaderCodeOut);
    }
    }  // namespace rx