Edit

kc3-lang/angle/src/libANGLE/InfoLog.h

Branch :

  • Show log

    Commit

  • Author : Jonah Ryan-Davis
    Date : 2021-03-30 15:57:02
    Hash : 46769f82
    Message : Don't append newline to empty InfoLog stream. Users were seeing different behavior when querying GL_INFO_LOG_LENGTH with ANGLE because ANGLE was always adding a newline to the InfoLog. Bug: chromium:1191293 Change-Id: I50f56326871cdd2f6614f5b1622257845721244c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2795164 Commit-Queue: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/InfoLog.h
  • //
    // Copyright 2020 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.
    //
    // InfoLog.h: Defines the gl::InfoLog class to handle the logs generated when
    // compiling/linking shaders so useful error messages can be returned to the caller.
    
    #ifndef LIBANGLE_INFOLOG_H_
    #define LIBANGLE_INFOLOG_H_
    
    namespace gl
    {
    
    class InfoLog : angle::NonCopyable
    {
      public:
        InfoLog();
        ~InfoLog();
    
        size_t getLength() const;
        void getLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
    
        void appendSanitized(const char *message);
        void reset();
    
        // This helper class ensures we append a newline after writing a line.
        class StreamHelper : angle::NonCopyable
        {
          public:
            StreamHelper(StreamHelper &&rhs) : mStream(rhs.mStream) { rhs.mStream = nullptr; }
    
            StreamHelper &operator=(StreamHelper &&rhs)
            {
                std::swap(mStream, rhs.mStream);
                return *this;
            }
    
            ~StreamHelper()
            {
                // Write newline when destroyed on the stack
                if (mStream && !mStream->str().empty())
                {
                    (*mStream) << std::endl;
                }
            }
    
            template <typename T>
            StreamHelper &operator<<(const T &value)
            {
                (*mStream) << value;
                return *this;
            }
    
          private:
            friend class InfoLog;
    
            StreamHelper(std::stringstream *stream) : mStream(stream) { ASSERT(stream); }
    
            std::stringstream *mStream;
        };
    
        template <typename T>
        StreamHelper operator<<(const T &value)
        {
            ensureInitialized();
            StreamHelper helper(mLazyStream.get());
            helper << value;
            return helper;
        }
    
        std::string str() const { return mLazyStream ? mLazyStream->str() : ""; }
    
        bool empty() const;
    
      private:
        void ensureInitialized()
        {
            if (!mLazyStream)
            {
                mLazyStream.reset(new std::stringstream());
            }
        }
    
        std::unique_ptr<std::stringstream> mLazyStream;
    };
    
    }  // namespace gl
    
    #endif  // LIBANGLE_INFOLOG_H_