Edit

kc3-lang/angle/src/compiler/translator/InfoSink.h

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/compiler/translator/InfoSink.h
  • //
    // Copyright 2002 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.
    //
    
    #ifndef COMPILER_TRANSLATOR_INFOSINK_H_
    #define COMPILER_TRANSLATOR_INFOSINK_H_
    
    #include <math.h>
    #include <stdlib.h>
    #include "GLSLANG/ShaderLang.h"
    #include "compiler/translator/Common.h"
    #include "compiler/translator/Severity.h"
    
    namespace sh
    {
    
    class ImmutableString;
    class TType;
    
    // Returns the fractional part of the given floating-point number.
    inline float fractionalPart(float f)
    {
        float intPart = 0.0f;
        return modff(f, &intPart);
    }
    
    class ImmutableString;
    
    //
    // Encapsulate info logs for all objects that have them.
    //
    // The methods are a general set of tools for getting a variety of
    // messages and types inserted into the log.
    //
    class TInfoSinkBase
    {
      public:
        TInfoSinkBase() {}
    
        template <typename T>
        TInfoSinkBase &operator<<(const T &t)
        {
            TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>();
            stream << t;
            sink.append(stream.str());
            return *this;
        }
        // Override << operator for specific types. It is faster to append strings
        // and characters directly to the sink.
        TInfoSinkBase &operator<<(char c)
        {
            sink.append(1, c);
            return *this;
        }
        TInfoSinkBase &operator<<(const char *str)
        {
            sink.append(str);
            return *this;
        }
        TInfoSinkBase &operator<<(const TPersistString &str)
        {
            sink.append(str);
            return *this;
        }
        TInfoSinkBase &operator<<(const TString &str)
        {
            sink.append(str.c_str());
            return *this;
        }
        TInfoSinkBase &operator<<(const ImmutableString &str);
    
        TInfoSinkBase &operator<<(const TType &type);
    
        // Make sure floats are written with correct precision.
        TInfoSinkBase &operator<<(float f)
        {
            // Make sure that at least one decimal point is written. If a number
            // does not have a fractional part, the default precision format does
            // not write the decimal portion which gets interpreted as integer by
            // the compiler.
            TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>();
            if (fractionalPart(f) == 0.0f)
            {
                stream.precision(1);
                stream << std::showpoint << std::fixed << f;
            }
            else
            {
                stream.unsetf(std::ios::fixed);
                stream.unsetf(std::ios::scientific);
                stream.precision(8);
                stream << f;
            }
            sink.append(stream.str());
            return *this;
        }
        // Write boolean values as their names instead of integral value.
        TInfoSinkBase &operator<<(bool b)
        {
            const char *str = b ? "true" : "false";
            sink.append(str);
            return *this;
        }
    
        void erase()
        {
            sink.clear();
            binarySink.clear();
        }
        int size() { return static_cast<int>(isBinary() ? binarySink.size() : sink.size()); }
    
        const TPersistString &str() const
        {
            ASSERT(!isBinary());
            return sink;
        }
        const char *c_str() const
        {
            ASSERT(!isBinary());
            return sink.c_str();
        }
    
        void prefix(Severity severity);
        void location(int file, int line);
    
        bool isBinary() const { return !binarySink.empty(); }
        void setBinary(BinaryBlob &&binary) { binarySink = std::move(binary); }
        const BinaryBlob &getBinary() const
        {
            ASSERT(isBinary());
            return binarySink;
        }
    
      private:
        // The data in the info sink is either in human readable form (|sink|) or binary (|binarySink|).
        TPersistString sink;
        BinaryBlob binarySink;
    };
    
    class TInfoSink
    {
      public:
        TInfoSinkBase info;
        TInfoSinkBase debug;
        TInfoSinkBase obj;
    };
    
    }  // namespace sh
    
    #endif  // COMPILER_TRANSLATOR_INFOSINK_H_