Edit

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

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2020-09-20 21:59:24
    Hash : cb286073
    Message : Use c++ thread_local for current thread. This solves a race condition using the global context. Sadly we can't use an unprotected variable safely because it can be written/read from multiple threads doing MakeCurrent. Has about a 2 ns regression when tested in Linux/Release per call. "null" benchmark test went from 27 -> 29 ns/iteration. Fixes a TSAN warning that popped up in angle_end2end_tests. Test: DrawCallPerfBenchmark.Run/vulkan_null Test: EGLContextASANTest.DestroyContextInUse/ES3_Vulkan Bug: b/168744561 Change-Id: Ic56f3faae81c1087b942a3cfc0e011b9ab439e0f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2419641 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/Thread.h
  • //
    // 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.h : Defines the Thread class which represents a global EGL thread.
    
    #ifndef LIBANGLE_THREAD_H_
    #define LIBANGLE_THREAD_H_
    
    #include <EGL/egl.h>
    
    #include "libANGLE/Debug.h"
    
    namespace angle
    {
    extern bool gUseAndroidOpenGLTlsSlot;
    }  // namespace angle
    
    namespace gl
    {
    class Context;
    }  // namespace gl
    
    namespace egl
    {
    class Error;
    class Debug;
    class Display;
    class Surface;
    
    class Thread : public LabeledObject
    {
      public:
        Thread();
    
        void setLabel(EGLLabelKHR label) override;
        EGLLabelKHR getLabel() const override;
    
        void setSuccess();
        void setError(const Error &error,
                      const Debug *debug,
                      const char *command,
                      const LabeledObject *object);
        EGLint getError() const;
    
        void setAPI(EGLenum api);
        EGLenum getAPI() const;
    
        void setCurrent(gl::Context *context);
        Surface *getCurrentDrawSurface() const;
        Surface *getCurrentReadSurface() const;
        gl::Context *getContext() const;
        Display *getDisplay() const;
    
      private:
        EGLLabelKHR mLabel;
        EGLint mError;
        EGLenum mAPI;
        gl::Context *mContext;
    };
    
    }  // namespace egl
    
    #endif  // LIBANGLE_THREAD_H_