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.