Edit

kc3-lang/angle/src/libANGLE/Thread.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2020-11-19 18:11:42
    Hash : cfe14e28
    Message : EGL: Remove egl::Error from validation code. Instead of using an egl::Error return value, errors are recorded on the egl::Thread immediately at the call site. This makes the code work the same way as in the GL entry points. Updates the EGL "try" macros to include a special handler for the EGL validation entry points. Uses a special ValidationContext helper class to preserve the existing info. Bug: angleproject:5378 Change-Id: I897f221a41fe406676950600e4ac559081b9f541 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2551790 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com>

  • src/libANGLE/Thread.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.
    //
    
    // Thread.cpp : Defines the Thread class which represents a global EGL thread.
    
    #include "libANGLE/Thread.h"
    
    #include "libANGLE/Context.h"
    #include "libANGLE/Debug.h"
    #include "libANGLE/Error.h"
    
    namespace angle
    {
    bool gUseAndroidOpenGLTlsSlot;
    }  // namespace angle
    
    namespace egl
    {
    namespace
    {
    Debug *sDebug = nullptr;
    }  // namespace
    
    Thread::Thread()
        : mLabel(nullptr),
          mError(EGL_SUCCESS),
          mAPI(EGL_OPENGL_ES_API),
          mContext(static_cast<gl::Context *>(EGL_NO_CONTEXT))
    {}
    
    void Thread::setLabel(EGLLabelKHR label)
    {
        mLabel = label;
    }
    
    EGLLabelKHR Thread::getLabel() const
    {
        return mLabel;
    }
    
    void Thread::setSuccess()
    {
        mError = EGL_SUCCESS;
    }
    
    void Thread::setError(EGLint error,
                          const char *command,
                          const LabeledObject *object,
                          const char *message)
    {
        mError = error;
        if (error != EGL_SUCCESS && message)
        {
            EnsureDebugAllocated();
            sDebug->insertMessage(error, command, ErrorCodeToMessageType(error), getLabel(),
                                  object ? object->getLabel() : nullptr, message);
        }
    }
    
    void Thread::setError(const Error &error, const char *command, const LabeledObject *object)
    {
        mError = error.getCode();
        if (error.isError() && !error.getMessage().empty())
        {
            EnsureDebugAllocated();
            sDebug->insertMessage(error.getCode(), command, ErrorCodeToMessageType(error.getCode()),
                                  getLabel(), object ? object->getLabel() : nullptr,
                                  error.getMessage());
        }
    }
    
    EGLint Thread::getError() const
    {
        return mError;
    }
    
    void Thread::setAPI(EGLenum api)
    {
        mAPI = api;
    }
    
    EGLenum Thread::getAPI() const
    {
        return mAPI;
    }
    
    void Thread::setCurrent(gl::Context *context)
    {
        mContext = context;
    }
    
    Surface *Thread::getCurrentDrawSurface() const
    {
        if (mContext)
        {
            return mContext->getCurrentDrawSurface();
        }
        return nullptr;
    }
    
    Surface *Thread::getCurrentReadSurface() const
    {
        if (mContext)
        {
            return mContext->getCurrentReadSurface();
        }
        return nullptr;
    }
    
    gl::Context *Thread::getContext() const
    {
        return mContext;
    }
    
    Display *Thread::getDisplay() const
    {
        if (mContext)
        {
            return mContext->getDisplay();
        }
        return nullptr;
    }
    
    void EnsureDebugAllocated()
    {
        // All EGL calls use a global lock, this is thread safe
        if (sDebug == nullptr)
        {
            sDebug = new Debug();
        }
    }
    
    void DeallocateDebug()
    {
        SafeDelete(sDebug);
    }
    
    Debug *GetDebug()
    {
        EnsureDebugAllocated();
        return sDebug;
    }
    }  // namespace egl