This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch fix-release-build
in repository efl.

View the commit online.

commit 8225859bb6c716fa4e3ba0de80be9b30341b183d
Author: Cedric BAIL <[email protected]>
AuthorDate: Fri Aug 7 19:17:39 2026 -0600

    evas/drm: pick a framebuffer for every frame again
    
    745de87c78 moved the buffer swap out of _outbuf_redraws_clear() and into
    _outbuf_flush(), which was the point of it, but it also dropped
    
        if (!_outbuf_fb_assign(ob)) return MODE_FULL;
    
    from _outbuf_state_get() and never put an equivalent anywhere else in the
    frame path.  What is left calls _outbuf_fb_assign() only from
    _outbuf_buffer_swap(), guarded by "if (!ofb)" - true exactly once, on the
    first frame.  So ob->priv.draw has been pinned to a single framebuffer
    ever since.
    
    The engine is therefore not double buffered.  Every frame is composited
    into the buffer that is on scanout at the time, which tears, and the
    ageing loop that lives in _outbuf_fb_assign() never runs while
    _outbuf_buffer_swap() keeps resetting age to 0 - so _outbuf_state_get()
    answers MODE_FULL forever and evas repaints the whole screen, every
    frame, into uncached dumb buffer memory.  On a 1080p panel driven by a
    software compositor that is enough to keep a core pinned indefinitely.
    It also means ecore_drm2_fb_flip_complete() sees current.fb == pending.fb
    every time and so never releases, leaking a reference per frame.
    
    Put the assign back where evas asks for the swap mode.  Buffers rotate,
    ages advance, the partial update modes come back, and
    _outbuf_damage_region_set() - which runs just after this and marks
    ob->priv.draw dirty - now marks the buffer the frame is actually going
    into rather than the previous one.
    
    Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
---
 src/modules/evas/engines/drm/evas_outbuf.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/modules/evas/engines/drm/evas_outbuf.c b/src/modules/evas/engines/drm/evas_outbuf.c
index 868f53723b..aa356871fa 100644
--- a/src/modules/evas/engines/drm/evas_outbuf.c
+++ b/src/modules/evas/engines/drm/evas_outbuf.c
@@ -292,7 +292,9 @@ _outbuf_state_get(Outbuf *ob)
 {
    int age;
 
-   if (!ob->priv.draw) return MODE_FULL;
+   /* Evas asks for the swap mode once per frame, before it draws anything,
+    * so this is where the buffer that frame lands in gets picked. */
+   if (!_outbuf_fb_assign(ob)) return MODE_FULL;
 
    age = ob->priv.draw->age;
    if (age > 4) return MODE_FULL;

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to