libweston/compositor: Check whether flushing is allowed
This patch acts as bandaid in the core compositor to avoid the renderer doing a flush after the buffer has been released. Flushing after release can happen due to problems in the internal damage tracking, is violating the protocol, and causes visible glitches. A more proper fix would be to handle compositor side damage correctly. Suggested-by: Pekka Paalanen <pekka.paalanen@collabora.com> Acked-by: Daniel Stone <daniel.stone@collabora.com> Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
This commit is contained in:
+15
-1
@@ -2749,12 +2749,26 @@ weston_output_damage(struct weston_output *output)
|
|||||||
weston_output_schedule_repaint(output);
|
weston_output_schedule_repaint(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME: note that we don't flush any damage when the core wants us to
|
||||||
|
* do so as it will sometimes ask for a flush not necessarily at the
|
||||||
|
* right time.
|
||||||
|
*
|
||||||
|
* A (more) proper way is to handle correctly damage whenever there's
|
||||||
|
* compositor side damage. See the comment for weston_surface_damage().
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
buffer_can_be_accessed_BANDAID_XXX(struct weston_buffer_reference buffer_ref)
|
||||||
|
{
|
||||||
|
return buffer_ref.type == BUFFER_MAY_BE_ACCESSED;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
surface_flush_damage(struct weston_surface *surface)
|
surface_flush_damage(struct weston_surface *surface)
|
||||||
{
|
{
|
||||||
struct weston_buffer *buffer = surface->buffer_ref.buffer;
|
struct weston_buffer *buffer = surface->buffer_ref.buffer;
|
||||||
|
|
||||||
if (buffer && buffer->type == WESTON_BUFFER_SHM)
|
if (buffer->type == WESTON_BUFFER_SHM &&
|
||||||
|
buffer_can_be_accessed_BANDAID_XXX(surface->buffer_ref))
|
||||||
surface->compositor->renderer->flush_damage(surface, buffer);
|
surface->compositor->renderer->flush_damage(surface, buffer);
|
||||||
|
|
||||||
if (pixman_region32_not_empty(&surface->damage))
|
if (pixman_region32_not_empty(&surface->damage))
|
||||||
|
|||||||
Reference in New Issue
Block a user