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 b798c474e9c3f592b6dec2600886febfacc57cbe
Author: Cedric BAIL <[email protected]>
AuthorDate: Fri Aug 7 19:18:16 2026 -0600

    evas/drm: drop the framebuffers when the output is reconfigured
    
    _outbuf_reconfigure() updates ob->w, ob->h, the rotation and the format,
    and leaves ob->priv.fb_list and ob->priv.draw alone.  745de87c78 took the
    EINA_LIST_FREE() out of here on the way to somewhere else and it never
    came back.
    
    _outbuf_update_region_push() clips the region against the new ob->w and
    ob->h, then indexes into ob->priv.draw with that buffer's own stride:
    
        dst = ecore_drm2_fb_data_get(buff);
        bpl = ecore_drm2_fb_stride_get(buff);
        RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.w, rect.h, 0, 0, ob->w, ob->h);
        dst += (bpl * rect.y) + (rect.x * bpp);
    
    so a resize to anything larger walks off the end of a mapping sized for
    the old mode and takes the compositor with it.  Reaching that needs a
    second resize after startup rather than the one from the initial 1x1
    canvas, which is why it hid: a stored per-screen configuration being
    applied, a hotplug, or a rotation will all do it.
    
    gl_drm has never had this - its reconfigure destroys and recreates the
    gbm surface.  Do the same here and let _outbuf_fb_assign() allocate at
    the new size on demand.
    
    Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
---
 src/modules/evas/engines/drm/evas_outbuf.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/modules/evas/engines/drm/evas_outbuf.c b/src/modules/evas/engines/drm/evas_outbuf.c
index aa356871fa..4c67c81399 100644
--- a/src/modules/evas/engines/drm/evas_outbuf.c
+++ b/src/modules/evas/engines/drm/evas_outbuf.c
@@ -233,6 +233,7 @@ void
 _outbuf_reconfigure(Outbuf *ob, int w, int h, int rotation, Outbuf_Depth depth)
 {
    unsigned int format = DRM_FORMAT_ARGB8888;
+   Outbuf_Fb *ofb;
 
    switch (depth)
      {
@@ -285,6 +286,18 @@ _outbuf_reconfigure(Outbuf *ob, int w, int h, int rotation, Outbuf_Depth depth)
    ob->priv.unused_duration = 0;
 
    _outbuf_idle_flush(ob);
+
+   /* Every framebuffer we are holding describes the old geometry.
+    * _outbuf_update_region_push() clips against ob->w and ob->h but strides
+    * and offsets into whatever ob->priv.draw points at, so keeping one of
+    * these across a resize means writing past the end of its mapping.
+    * Drop them - _outbuf_fb_assign() allocates at the new size on demand.
+    * The idle flush above has already handed back what the output was
+    * holding, so most of these are freed right here; anything a plane is
+    * still referencing goes when the next swap replaces it. */
+   EINA_LIST_FREE(ob->priv.fb_list, ofb)
+     _outbuf_fb_destroy(ofb);
+   ob->priv.draw = NULL;
 }
 
 Render_Output_Swap_Mode

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

Reply via email to