From 4f0563a6584dd83462d5cf35a7a1ebc4a4d6378f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 21 Jan 2013 16:19:41 +0100 Subject: [PATCH] st/dri: disallow recursion in dri_flush MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit ST_FLUSH_FRONT may call driThrottle, which is implemented with dri_flush. This prevents double flush as well as fence leaks caused by a recursion in the middle of throttling. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=58839 Reviewed-by: Michel Dänzer Tested-by: Michel Dänzer --- .../state_trackers/dri/common/dri_drawable.c | 13 ++++++++++++- .../state_trackers/dri/common/dri_drawable.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.c b/src/gallium/state_trackers/dri/common/dri_drawable.c index d817a8c2178..87ab76467c7 100644 --- a/src/gallium/state_trackers/dri/common/dri_drawable.c +++ b/src/gallium/state_trackers/dri/common/dri_drawable.c @@ -423,7 +423,14 @@ dri_flush(__DRIcontext *cPriv, return; } - if (!drawable) { + if (drawable) { + /* prevent recursion */ + if (drawable->flushing) + return; + + drawable->flushing = TRUE; + } + else { flags &= ~__DRI2_FLUSH_DRAWABLE; } @@ -478,6 +485,10 @@ dri_flush(__DRIcontext *cPriv, else if (flags & (__DRI2_FLUSH_DRAWABLE | __DRI2_FLUSH_CONTEXT)) { ctx->st->flush(ctx->st, flush_flags, NULL); } + + if (drawable) { + drawable->flushing = FALSE; + } } /** diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.h b/src/gallium/state_trackers/dri/common/dri_drawable.h index caa1faa08f4..56f8a4073a3 100644 --- a/src/gallium/state_trackers/dri/common/dri_drawable.h +++ b/src/gallium/state_trackers/dri/common/dri_drawable.h @@ -65,6 +65,7 @@ struct dri_drawable unsigned int head; unsigned int tail; unsigned int desired_fences; + boolean flushing; /* prevents recursion in dri_flush */ /* used only by DRISW */ struct pipe_surface *drisw_surface; -- 2.30.2