From 970b979da1639d57e89169f96cc0064db9dae43a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 1 Mar 2016 21:50:25 +0100 Subject: [PATCH] gallium/radeon: eliminate fast color clear before sharing MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Michel Dänzer Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeon/r600_texture.c | 16 ++++++++++++++++ src/gallium/drivers/radeonsi/si_blit.c | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c index 229fa5efa78..ec2f2454b1c 100644 --- a/src/gallium/drivers/radeon/r600_texture.c +++ b/src/gallium/drivers/radeon/r600_texture.c @@ -249,6 +249,17 @@ static void r600_texture_init_metadata(struct r600_texture *rtex, metadata->scanout = (surface->flags & RADEON_SURF_SCANOUT) != 0; } +static void r600_eliminate_fast_color_clear(struct r600_common_screen *rscreen, + struct r600_texture *rtex) +{ + struct pipe_context *ctx = rscreen->aux_context; + + pipe_mutex_lock(rscreen->aux_context_lock); + ctx->flush_resource(ctx, &rtex->resource.b.b); + ctx->flush(ctx, NULL, 0); + pipe_mutex_unlock(rscreen->aux_context_lock); +} + static boolean r600_texture_get_handle(struct pipe_screen* screen, struct pipe_resource *resource, struct winsys_handle *whandle, @@ -271,6 +282,11 @@ static boolean r600_texture_get_handle(struct pipe_screen* screen, res->external_usage = usage; if (resource->target != PIPE_BUFFER) { + if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH)) { + /* Eliminate fast clear (both CMASK and DCC) */ + r600_eliminate_fast_color_clear(rscreen, rtex); + } + r600_texture_init_metadata(rtex, &metadata); rscreen->ws->buffer_set_metadata(res->buf, &metadata); } diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 115877060ba..53c67055a5e 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -761,7 +761,7 @@ static void si_flush_resource(struct pipe_context *ctx, assert(res->target != PIPE_BUFFER); - if (!rtex->is_depth && rtex->cmask.size) { + if (!rtex->is_depth && (rtex->cmask.size || rtex->dcc_buffer)) { si_blit_decompress_color(ctx, rtex, 0, res->last_level, 0, util_max_layer(res, 0)); } -- 2.30.2