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.