• Show log

    Commit

  • Hash : 48103cb2
    Author : Charlie Lao
    Date : 2025-03-03T16:43:33

    Vulkan:Dont use Subject/Observer for SwapchainImageChanged
    
    Because we do deferred ANI (VkAcquireNextImage) call until image is
    needed, we need a way to force Context to go through
    FramebufferVk::syncState call (FramebufferVk::syncState calls
    WindowSurfaceVk::getAttachmentRenderTarget, which end up calling ANI.
    Right now we uses subject/observer mechanism, by sending
    angle::SubjectMessage::SwapchainImageChanged to all observers of
    WindowSurfaceVk. In this case it is egl::Surface. Then eglSurface
    redirects this message to its observers, which are all gl::Framebuffer's
    attachments: color, depth, stencil. Even though only color attachment
    needs to be notified, but because we don't have a separate list of
    observers, depth/stencil attachment also receive the notification and
    they early out. Then gl::Framebuffer sets
    DIRTY_BIT_COLOR_BUFFER_CONTENTS_0 dirty bit and send the
    angle::SubjectMessage::DirtyBitsFlagged to Context, which dirty DrawFBO
    and ReadFBO and dirty cached state. Note that this is specific for swap
    image changed case, there is no surface property change (surface
    property change will still trigger the subject/observer message with
    SubjectMessage::SubjectChanged message, but this occurs rarely). This
    gets worse for apps that uses multiple contexts, for the example
    pokemon_masters_ex has three contexts, each context has its own default
    frame buffer that attach to the same surface, and we never remove
    non-current context from the observer list. This end up with
    egl::Surface has 12 observers and for every frame, it loop over the list
    of 12 observers and send message (virtual function call) to each of
    them. Color attachment also ends up sending two messages to Context, one
    for Read FBO and another for Draw FBO. There are total 21 virtual
    function calls. Even for single context usage, you have 6 virtual
    function calls, for every frame.
    
    EGL spec says "an EGLSurface must be current on only one thread at a
    time", any other context must call EGLMakeCurrent in order to use this
    surface, which will add all necessary dirty bits at that time. So we
    really only need to notify current context. In this CL,
    SwapchainImageChanged no longer uses subject/observer mechanism, so this
    message is removed.
    
    This CL still uses subject/observer mechanism to send DirtyBitsFlagged
    from Framebuffer back to context. We could call setDrawFramebufferDirty
    and setReadFramebufferDirty directly, but that will require to remove
    the "const" decoration out of gl::Context which generates too much code
    diff, so onStateChange(angle::SubjectMessage::DirtyBitsFlagged) is still
    used.
    
    Bug: angleproject:400711938
    Change-Id: I61354516fd0aa307714b7abd30c6b6e45ff7b496
    Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6319893
    Commit-Queue: Charlie Lao <cclao@google.com>
    Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
    Reviewed-by: Yuxin Hu <yuxinhu@google.com>
    

  • 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 thodg_l
    Tags