• Show log

    Commit

  • Hash : b22124bd
    Author : Igor Nazarov
    Date : 2023-01-17T17:44:06

    Implement new "Global Mutex" functionality.
    
    This CL improves performance compared to the existing code as well as
    allows using non-std mutex implementations. Also acts as a base for
    future changes.
    
    CL adds new build option:
        angle_enable_global_mutex_recursion = is_android && angle_enable_vulkan
    
    "mutex_recursion" work same way as `std::recursive_mutex` before. It
    will help in situations when Vulkan API may return back to the ANGLE.
    For example: RenderDoc layer EGL deadlock.
    Automatic loading of "libVkLayer_GLES_RenderDoc.so" layer causes
    deadlock in EGL.
    Recursion stack:
        #01 pc 000000000029ea80  /vendor/lib64/egl/libGLESv2_angle.so (egl::GlobalMutexHelper::lock(int)+596)
        #02 pc 000000000029c59c  /vendor/lib64/egl/libGLESv2_angle.so (EGL_GetError+32)
    
        #04 pc 0000000000062368  /system/lib64/libEGL.so (eglQueryString+20)
        #05 pc 0000000000508fec  /data/local/debug/vulkan/libVkLayer_GLES_RenderDoc.so
    
        #20 pc 0000000000016690  /system/lib64/libvulkan.so (vulkan::api::EnumerateInstanceLayerProperties(unsigned int*, VkLayerProperties*)+40)
        #21 pc 00000000005aa030  /vendor/lib64/egl/libGLESv2_angle.so (rx::RendererVk::initialize(rx::DisplayVk*, egl::Display*, char const*, char const*)+292)
        #26 pc 000000000029c7e8  /vendor/lib64/egl/libGLESv2_angle.so (EGL_Initialize+192)
    
    Additionally, recursive mutex will partially solve Android
    SurfaceTexture deadlock (angleproject:4354).
    
    Some performance numbers for 1000'000 `eglGetError()` calls.
    
        Mutex                                       Time (ms.)
    
            Android S906B
    
        egl::GetGlobalMutex()(std::recursive_mutex)    41.4
    
        (Default)   GlobalMutex (std::recursive_mutex) 39.1
    
        (Recursive) GlobalMutex (std::mutex)           34.9
        (Debug)     GlobalMutex (std::mutex)           34.7
        (Default)   GlobalMutex (std::mutex)           34.4
    
            Windows
    
        egl::GetGlobalMutex()(std::recursive_mutex)    20.5
    
        (Default)   GlobalMutex (std::recursive_mutex) 20.0
    
        (Recursive) GlobalMutex (std::mutex)           21.9
        (Debug)     GlobalMutex (std::mutex)           20.5
        (Default)   GlobalMutex (std::mutex)           19.9
    
    Note: Recursive GlobalMutex enabled only for Android Vulkan by default.
    Original fix:
        https://chromium-review.googlesource.com/c/angle/angle/+/2029218
    
    Bug: angleproject:8101
    Bug: angleproject:4354
    Test: angle_unittests --gtest_filter=GlobalMutexTest.*
    Change-Id: I9e9d9b5c598ad1177ffa147ea690bd955946a712
    Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4401940
    Commit-Queue: Igor Nazarov <i.nazarov@samsung.com>
    Reviewed-by: Charlie Lao <cclao@google.com>
    Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
    

  • Properties

  • Git HTTP https://git.kmx.io/kc3-lang/angle.git
    Git SSH git@git.kmx.io:kc3-lang/angle.git
    Public access ? public
    Description

    A conformant OpenGL ES implementation for Windows, Mac, Linux, iOS and Android.

    Homepage

    Github

    Users
    thodg_m kc3_lang_org thodg_w www_kmx_io thodg_l thodg
    Tags