• Show log

    Commit

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

    Reland "Dont use Subject/Observer for SwapchainImageChanged"
    
    This is reland of the following CL
    https://chromium-review.googlesource.com/c/angle/angle/+/6319893
    
    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
    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>
    Change-Id: I017b0e8934b5194a520828fa5c4af1d6e3ef9aac
    Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6404621
    

  • 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