aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Müller <schnitzeltony@gmail.com>2021-04-07 22:00:18 +0200
committerOtavio Salvador <otavio@ossystems.com.br>2021-04-20 12:10:12 -0300
commitbfb9e6990f896772a8109818ff06a89325b4f484 (patch)
treefeb56533e0f7eed403982b94673e20e36fb460c4
parenta8ee8f6d2703025a0549cf705e31d616d54fb5fb (diff)
downloadmeta-freescale-bfb9e6990f896772a8109818ff06a89325b4f484.tar.gz
meta-freescale-bfb9e6990f896772a8109818ff06a89325b4f484.tar.bz2
meta-freescale-bfb9e6990f896772a8109818ff06a89325b4f484.zip
mesa/etnaviv: Add patches to fix redraw
Without this series mouse pointer was not visible and screen was updated only when mouse was moved. Patch series was suggested in [1] [1] https://gitlab.freedesktop.org/mesa/mesa/-/issues/4584 Signed-off-by: Andreas Müller <schnitzeltony@gmail.com>
-rw-r--r--recipes-graphics/mesa/mesa/0001-frontend-dri-copy-image-use-in-dup_image.patch26
-rw-r--r--recipes-graphics/mesa/mesa/0002-dri-bring-back-use-flags-for-createImageWithModifier.patch119
-rw-r--r--recipes-graphics/mesa/mesa/0003-frontend-dri-add-EXPLICIT_FLUSH-hint-in-dri2_resourc.patch46
-rw-r--r--recipes-graphics/mesa/mesa/0004-etnaviv-remove-double-assigment-of-surface-texture.patch31
-rw-r--r--recipes-graphics/mesa/mesa/0005-etnaviv-compact-etna_state_updates.patch52
-rw-r--r--recipes-graphics/mesa/mesa/0006-etnaviv-flush-used-render-buffers-on-context-flush-w.patch166
-rw-r--r--recipes-graphics/mesa/mesa_%.bbappend10
7 files changed, 450 insertions, 0 deletions
diff --git a/recipes-graphics/mesa/mesa/0001-frontend-dri-copy-image-use-in-dup_image.patch b/recipes-graphics/mesa/mesa/0001-frontend-dri-copy-image-use-in-dup_image.patch
new file mode 100644
index 00000000..9e098310
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0001-frontend-dri-copy-image-use-in-dup_image.patch
@@ -0,0 +1,26 @@
+From 96106df17897b862b87937d6222a3e6483f45480 Mon Sep 17 00:00:00 2001
+From: Lucas Stach <l.stach@pengutronix.de>
+Date: Fri, 13 Nov 2020 14:26:23 +0100
+Subject: [PATCH 1/6] frontend/dri: copy image use in dup_image
+
+Don't lose the use flags when dup'ing an image.
+
+Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
+
+Upstream-Status: Submitted [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7603]
+---
+ src/gallium/frontends/dri/dri2.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c
+index 0c0168497a2..1cd42cd8114 100644
+--- a/src/gallium/frontends/dri/dri2.c
++++ b/src/gallium/frontends/dri/dri2.c
+@@ -1312,6 +1312,7 @@ dri2_dup_image(__DRIimage *image, void *loaderPrivate)
+ img->dri_format = image->dri_format;
+ /* This should be 0 for sub images, but dup is also used for base images. */
+ img->dri_components = image->dri_components;
++ img->use = image->use;
+ img->loader_private = loaderPrivate;
+ img->sPriv = image->sPriv;
+
diff --git a/recipes-graphics/mesa/mesa/0002-dri-bring-back-use-flags-for-createImageWithModifier.patch b/recipes-graphics/mesa/mesa/0002-dri-bring-back-use-flags-for-createImageWithModifier.patch
new file mode 100644
index 00000000..9eee458e
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0002-dri-bring-back-use-flags-for-createImageWithModifier.patch
@@ -0,0 +1,119 @@
+From 00add4be8620175ccc69869e22479962dacdce9d Mon Sep 17 00:00:00 2001
+From: Lucas Stach <l.stach@pengutronix.de>
+Date: Fri, 13 Nov 2020 14:38:41 +0100
+Subject: [PATCH 2/6] dri: bring back use flags for createImageWithModifiers
+
+createImageWithModifiers dropped the use flags that were present with
+the createImage interface as it was believed at the time that all those
+use flags could be expressed as a modifier. This turned out to be untrue,
+as there are some use flags like SCANOUT and the BACKBUFFER hint that
+won't ever get a eqivalent modifier expression.
+
+Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
+
+Upstream-Status: Submitted [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7603]
+---
+ include/GL/internal/dri_interface.h | 1 +
+ src/egl/drivers/dri2/platform_wayland.c | 4 ++--
+ src/gallium/frontends/dri/dri2.c | 5 ++---
+ src/gbm/backends/dri/gbm_dri.c | 2 +-
+ src/loader/loader_dri3_helper.c | 3 +++
+ src/mesa/drivers/dri/i965/intel_screen.c | 2 +-
+ 6 files changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
+index 39d5dd07533..222821428d0 100644
+--- a/include/GL/internal/dri_interface.h
++++ b/include/GL/internal/dri_interface.h
+@@ -1678,6 +1678,7 @@ struct __DRIimageExtensionRec {
+ int width, int height, int format,
+ const uint64_t *modifiers,
+ const unsigned int modifier_count,
++ unsigned int use,
+ void *loaderPrivate);
+
+ /*
+diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
+index c0b26c4b623..bb508cbe421 100644
+--- a/src/egl/drivers/dri2/platform_wayland.c
++++ b/src/egl/drivers/dri2/platform_wayland.c
+@@ -595,7 +595,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
+ dri2_surf->base.Height,
+ linear_dri_image_format,
+ &linear_mod,
+- 1,
++ 1, use_flags,
+ NULL);
+ } else {
+ dri2_surf->back->linear_copy =
+@@ -624,7 +624,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
+ dri2_surf->base.Height,
+ dri_image_format,
+ modifiers,
+- num_modifiers,
++ num_modifiers, use_flags,
+ NULL);
+ } else {
+ dri2_surf->back->dri_image =
+diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c
+index 1cd42cd8114..1f1e7a9a65e 100644
+--- a/src/gallium/frontends/dri/dri2.c
++++ b/src/gallium/frontends/dri/dri2.c
+@@ -1074,12 +1074,11 @@ static __DRIimage *
+ dri2_create_image_with_modifiers(__DRIscreen *dri_screen,
+ int width, int height, int format,
+ const uint64_t *modifiers,
+- const unsigned count,
++ const unsigned count, unsigned int use,
+ void *loaderPrivate)
+ {
+ return dri2_create_image_common(dri_screen, width, height, format,
+- __DRI_IMAGE_USE_SHARE, modifiers, count,
+- loaderPrivate);
++ use, modifiers, count, loaderPrivate);
+ }
+
+ static bool
+diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
+index b5634741554..aff3a107e7d 100644
+--- a/src/gbm/backends/dri/gbm_dri.c
++++ b/src/gbm/backends/dri/gbm_dri.c
+@@ -1173,7 +1173,7 @@ gbm_dri_bo_create(struct gbm_device *gbm,
+ width, height,
+ dri_format,
+ modifiers, count,
+- bo);
++ dri_use, bo);
+
+ if (bo->image) {
+ /* The client passed in a list of invalid modifiers */
+diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
+index ccf8d1795e7..6fc6a2b705a 100644
+--- a/src/loader/loader_dri3_helper.c
++++ b/src/loader/loader_dri3_helper.c
+@@ -1407,6 +1407,9 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
+ format,
+ modifiers,
+ count,
++ __DRI_IMAGE_USE_SHARE |
++ __DRI_IMAGE_USE_SCANOUT |
++ __DRI_IMAGE_USE_BACKBUFFER,
+ buffer);
+ }
+
+diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
+index 4492d43c040..4511b962eef 100644
+--- a/src/mesa/drivers/dri/i965/intel_screen.c
++++ b/src/mesa/drivers/dri/i965/intel_screen.c
+@@ -893,7 +893,7 @@ static __DRIimage *
+ intel_create_image_with_modifiers(__DRIscreen *dri_screen,
+ int width, int height, int format,
+ const uint64_t *modifiers,
+- const unsigned count,
++ const unsigned count, unsigned int use,
+ void *loaderPrivate)
+ {
+ return intel_create_image_common(dri_screen, width, height, format, 0,
+--
+2.26.2
+
diff --git a/recipes-graphics/mesa/mesa/0003-frontend-dri-add-EXPLICIT_FLUSH-hint-in-dri2_resourc.patch b/recipes-graphics/mesa/mesa/0003-frontend-dri-add-EXPLICIT_FLUSH-hint-in-dri2_resourc.patch
new file mode 100644
index 00000000..544c132b
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0003-frontend-dri-add-EXPLICIT_FLUSH-hint-in-dri2_resourc.patch
@@ -0,0 +1,46 @@
+From 587aac46dbadf2aca1489aadd4216e592e11e17b Mon Sep 17 00:00:00 2001
+From: Lucas Stach <l.stach@pengutronix.de>
+Date: Fri, 13 Nov 2020 14:59:52 +0100
+Subject: [PATCH 3/6] frontend/dri: add EXPLICIT_FLUSH hint in
+ dri2_resource_get_param
+
+dri2_resource_get_param() is called from two different places right now.
+Only one of them adds the EXPLICIT_FLUSH hint to the handle usage, which
+may disable the optimizations provided by this hint without a reason.
+
+Make sure to always add this hint when appropriate.
+
+Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
+
+Upstream-Status: Submitted [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7603]
+---
+ src/gallium/frontends/dri/dri2.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c
+index 1f1e7a9a65e..7851ebceb3e 100644
+--- a/src/gallium/frontends/dri/dri2.c
++++ b/src/gallium/frontends/dri/dri2.c
+@@ -1198,6 +1198,9 @@ dri2_resource_get_param(__DRIimage *image, enum pipe_resource_param param,
+ if (!pscreen->resource_get_param)
+ return false;
+
++ if (image->use & __DRI_IMAGE_USE_BACKBUFFER)
++ handle_usage |= PIPE_HANDLE_USAGE_EXPLICIT_FLUSH;
++
+ return pscreen->resource_get_param(pscreen, NULL, image->texture,
+ image->plane, 0, 0, param, handle_usage,
+ value);
+@@ -1242,9 +1245,6 @@ dri2_query_image_by_resource_param(__DRIimage *image, int attrib, int *value)
+
+ handle_usage = PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE;
+
+- if (image->use & __DRI_IMAGE_USE_BACKBUFFER)
+- handle_usage |= PIPE_HANDLE_USAGE_EXPLICIT_FLUSH;
+-
+ if (!dri2_resource_get_param(image, param, handle_usage, &res_param))
+ return false;
+
+--
+2.26.2
+
diff --git a/recipes-graphics/mesa/mesa/0004-etnaviv-remove-double-assigment-of-surface-texture.patch b/recipes-graphics/mesa/mesa/0004-etnaviv-remove-double-assigment-of-surface-texture.patch
new file mode 100644
index 00000000..3865dbc9
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0004-etnaviv-remove-double-assigment-of-surface-texture.patch
@@ -0,0 +1,31 @@
+From 59f74212bbb5e28badd0775929e42856c9a01d35 Mon Sep 17 00:00:00 2001
+From: Lucas Stach <l.stach@pengutronix.de>
+Date: Fri, 13 Nov 2020 15:03:37 +0100
+Subject: [PATCH 4/6] etnaviv: remove double assigment of surface->texture
+
+surf->base.texture is already assigned earlier via a proper
+pipe_resource_reference call. Remove the superfluous assignement.
+
+Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
+Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
+
+Upstream-Status: Submitted [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7603]
+---
+ src/gallium/drivers/etnaviv/etnaviv_surface.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_surface.c b/src/gallium/drivers/etnaviv/etnaviv_surface.c
+index c78973bdb09..52a937652d2 100644
+--- a/src/gallium/drivers/etnaviv/etnaviv_surface.c
++++ b/src/gallium/drivers/etnaviv/etnaviv_surface.c
+@@ -112,7 +112,6 @@ etna_create_surface(struct pipe_context *pctx, struct pipe_resource *prsc,
+ etna_screen_resource_alloc_ts(pctx->screen, rsc);
+ }
+
+- surf->base.texture = &rsc->base;
+ surf->base.format = templat->format;
+ surf->base.width = rsc->levels[level].width;
+ surf->base.height = rsc->levels[level].height;
+--
+2.26.2
+
diff --git a/recipes-graphics/mesa/mesa/0005-etnaviv-compact-etna_state_updates.patch b/recipes-graphics/mesa/mesa/0005-etnaviv-compact-etna_state_updates.patch
new file mode 100644
index 00000000..d9cca38f
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0005-etnaviv-compact-etna_state_updates.patch
@@ -0,0 +1,52 @@
+From 570908323e02c4558f5a9abc2d82621056cd65ab Mon Sep 17 00:00:00 2001
+From: Lucas Stach <l.stach@pengutronix.de>
+Date: Tue, 17 Nov 2020 12:08:13 +0100
+Subject: [PATCH 5/6] etnaviv: compact etna_state_updates
+
+Just reclaim a bit of screen real estate, purely cosmetic change.
+
+Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
+
+Upstream-Status: Submitted [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7603]
+---
+ src/gallium/drivers/etnaviv/etnaviv_state.c | 18 ++++++------------
+ 1 file changed, 6 insertions(+), 12 deletions(-)
+
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c
+index 1b4a7040b50..84fea58ecb5 100644
+--- a/src/gallium/drivers/etnaviv/etnaviv_state.c
++++ b/src/gallium/drivers/etnaviv/etnaviv_state.c
+@@ -749,24 +749,18 @@ struct etna_state_updater {
+ static const struct etna_state_updater etna_state_updates[] = {
+ {
+ etna_shader_update_vertex, ETNA_DIRTY_SHADER | ETNA_DIRTY_VERTEX_ELEMENTS,
+- },
+- {
++ }, {
+ etna_shader_link, ETNA_DIRTY_SHADER,
+- },
+- {
++ }, {
+ etna_update_blend, ETNA_DIRTY_BLEND | ETNA_DIRTY_FRAMEBUFFER
+- },
+- {
++ }, {
+ etna_update_blend_color, ETNA_DIRTY_BLEND_COLOR | ETNA_DIRTY_FRAMEBUFFER,
+- },
+- {
++ }, {
+ etna_update_ts_config, ETNA_DIRTY_DERIVE_TS,
+- },
+- {
++ }, {
+ etna_update_clipping, ETNA_DIRTY_SCISSOR | ETNA_DIRTY_FRAMEBUFFER |
+ ETNA_DIRTY_RASTERIZER | ETNA_DIRTY_VIEWPORT,
+- },
+- {
++ }, {
+ etna_update_zsa, ETNA_DIRTY_ZSA | ETNA_DIRTY_SHADER,
+ }
+ };
+--
+2.26.2
+
diff --git a/recipes-graphics/mesa/mesa/0006-etnaviv-flush-used-render-buffers-on-context-flush-w.patch b/recipes-graphics/mesa/mesa/0006-etnaviv-flush-used-render-buffers-on-context-flush-w.patch
new file mode 100644
index 00000000..ea658a03
--- /dev/null
+++ b/recipes-graphics/mesa/mesa/0006-etnaviv-flush-used-render-buffers-on-context-flush-w.patch
@@ -0,0 +1,166 @@
+From 537c7a6ea3fd2e5a6433e52b406ba39b89f520d9 Mon Sep 17 00:00:00 2001
+From: Lucas Stach <l.stach@pengutronix.de>
+Date: Fri, 13 Nov 2020 15:05:55 +0100
+Subject: [PATCH 6/6] etnaviv: flush used render buffers on context flush when
+ neccessary
+
+Some resources like backbuffers are explicitly flushed by the frontend
+at the appropriate time, others however won't get flushed explicitly.
+Remember those resources when they get emitted as a render buffer and
+flush them on a context flush to make their content visible to other
+entities sharing the buffer.
+
+We still keep the optimized path for most resources where the frontend
+promises to do the flushing for us and only enable implicit flushing
+when a buffer handle is exported/imported without the
+PIPE_HANDLE_USAGE_EXPLICIT_FLUSH flag set.
+
+Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
+
+Upstream-Status: Submitted [https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7603]
+---
+ src/gallium/drivers/etnaviv/etnaviv_context.c | 16 ++++++++++++++++
+ src/gallium/drivers/etnaviv/etnaviv_context.h | 3 +++
+ src/gallium/drivers/etnaviv/etnaviv_resource.c | 7 +++++++
+ src/gallium/drivers/etnaviv/etnaviv_resource.h | 2 ++
+ src/gallium/drivers/etnaviv/etnaviv_state.c | 17 +++++++++++++++++
+ 5 files changed, 45 insertions(+)
+
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c
+index 9c334a450c6..80c5d430419 100644
+--- a/src/gallium/drivers/etnaviv/etnaviv_context.c
++++ b/src/gallium/drivers/etnaviv/etnaviv_context.c
+@@ -128,6 +128,9 @@ etna_context_destroy(struct pipe_context *pctx)
+ _mesa_set_destroy(ctx->used_resources_write, NULL);
+
+ }
++ if (ctx->flush_resources)
++ _mesa_set_destroy(ctx->flush_resources, NULL);
++
+ mtx_unlock(&ctx->lock);
+
+ if (ctx->dummy_desc_bo)
+@@ -475,6 +478,14 @@ etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
+ list_for_each_entry(struct etna_acc_query, aq, &ctx->active_acc_queries, node)
+ etna_acc_query_suspend(aq, ctx);
+
++ /* flush all resources that need an implicit flush */
++ set_foreach(ctx->flush_resources, entry) {
++ struct pipe_resource *prsc = (struct pipe_resource *)entry->key;
++
++ pctx->flush_resource(pctx, prsc);
++ }
++ _mesa_set_clear(ctx->flush_resources, NULL);
++
+ etna_cmd_stream_flush(ctx->stream, ctx->in_fence_fd,
+ (flags & PIPE_FLUSH_FENCE_FD) ? &out_fence_fd : NULL);
+
+@@ -581,6 +592,11 @@ etna_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
+ if (!ctx->used_resources_write)
+ goto fail;
+
++ ctx->flush_resources = _mesa_set_create(NULL, _mesa_hash_pointer,
++ _mesa_key_pointer_equal);
++ if (!ctx->flush_resources)
++ goto fail;
++
+ mtx_init(&ctx->lock, mtx_recursive);
+
+ /* context ctxate setup */
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.h b/src/gallium/drivers/etnaviv/etnaviv_context.h
+index dd6af3d93e6..112902aac8a 100644
+--- a/src/gallium/drivers/etnaviv/etnaviv_context.h
++++ b/src/gallium/drivers/etnaviv/etnaviv_context.h
+@@ -206,6 +206,9 @@ struct etna_context {
+ struct set *used_resources_read;
+ struct set *used_resources_write;
+
++ /* resources that must be flushed implicitly at the context flush time */
++ struct set *flush_resources;
++
+ mtx_t lock;
+ };
+
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c
+index ae4f24b9b44..0c8c28e66aa 100644
+--- a/src/gallium/drivers/etnaviv/etnaviv_resource.c
++++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c
+@@ -265,6 +265,7 @@ etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout,
+ rsc->base.nr_samples = nr_samples;
+ rsc->layout = layout;
+ rsc->halign = halign;
++ rsc->explicit_flush = true;
+
+ pipe_reference_init(&rsc->base.reference, 1);
+ util_range_init(&rsc->valid_buffer_range);
+@@ -519,6 +520,9 @@ etna_resource_from_handle(struct pipe_screen *pscreen,
+ rsc->layout = modifier_to_layout(handle->modifier);
+ rsc->halign = TEXTURE_HALIGN_FOUR;
+
++ if (usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH)
++ rsc->explicit_flush = true;
++
+ level->width = tmpl->width0;
+ level->height = tmpl->height0;
+ level->depth = tmpl->depth0;
+@@ -584,6 +588,9 @@ etna_resource_get_handle(struct pipe_screen *pscreen,
+ handle->offset = rsc->levels[0].offset;
+ handle->modifier = layout_to_modifier(rsc->layout);
+
++ if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH))
++ rsc->explicit_flush = false;
++
+ if (handle->type == WINSYS_HANDLE_TYPE_SHARED) {
+ return etna_bo_get_name(rsc->bo, &handle->handle) == 0;
+ } else if (handle->type == WINSYS_HANDLE_TYPE_KMS) {
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.h b/src/gallium/drivers/etnaviv/etnaviv_resource.h
+index cb83e891d34..167cf4ed069 100644
+--- a/src/gallium/drivers/etnaviv/etnaviv_resource.h
++++ b/src/gallium/drivers/etnaviv/etnaviv_resource.h
+@@ -93,6 +93,8 @@ struct etna_resource {
+ struct pipe_resource *texture;
+ /* for when PE doesn't support the base layout */
+ struct pipe_resource *render;
++ /* frontend flushes resource via an explicit call to flush_resource */
++ bool explicit_flush;
+
+ enum etna_resource_status status;
+
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c
+index 84fea58ecb5..5848735ab14 100644
+--- a/src/gallium/drivers/etnaviv/etnaviv_state.c
++++ b/src/gallium/drivers/etnaviv/etnaviv_state.c
+@@ -741,6 +741,21 @@ etna_update_zsa(struct etna_context *ctx)
+ return true;
+ }
+
++static bool
++etna_record_flush_resources(struct etna_context *ctx)
++{
++ struct pipe_framebuffer_state *fb = &ctx->framebuffer_s;
++
++ if (fb->nr_cbufs > 0) {
++ struct etna_surface *surf = etna_surface(fb->cbufs[0]);
++
++ if (!etna_resource(surf->prsc)->explicit_flush)
++ _mesa_set_add(ctx->flush_resources, surf->prsc);
++ }
++
++ return true;
++}
++
+ struct etna_state_updater {
+ bool (*update)(struct etna_context *ctx);
+ uint32_t dirty;
+@@ -762,6 +777,8 @@ static const struct etna_state_updater etna_state_updates[] = {
+ ETNA_DIRTY_RASTERIZER | ETNA_DIRTY_VIEWPORT,
+ }, {
+ etna_update_zsa, ETNA_DIRTY_ZSA | ETNA_DIRTY_SHADER,
++ }, {
++ etna_record_flush_resources, ETNA_DIRTY_FRAMEBUFFER,
+ }
+ };
+
+--
+2.26.2
+
diff --git a/recipes-graphics/mesa/mesa_%.bbappend b/recipes-graphics/mesa/mesa_%.bbappend
index 738f02c8..c532e51e 100644
--- a/recipes-graphics/mesa/mesa_%.bbappend
+++ b/recipes-graphics/mesa/mesa_%.bbappend
@@ -1,3 +1,13 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+SRC_URI_append_use-mainline-bsp = " \
+ file://0001-frontend-dri-copy-image-use-in-dup_image.patch \
+ file://0002-dri-bring-back-use-flags-for-createImageWithModifier.patch \
+ file://0003-frontend-dri-add-EXPLICIT_FLUSH-hint-in-dri2_resourc.patch \
+ file://0004-etnaviv-remove-double-assigment-of-surface-texture.patch \
+ file://0005-etnaviv-compact-etna_state_updates.patch \
+ file://0006-etnaviv-flush-used-render-buffers-on-context-flush-w.patch \
+"
+
PROVIDES_remove_imxgpu = "virtual/egl"
PROVIDES_remove_imxgpu3d = "virtual/libgl virtual/libgles1 virtual/libgles2"