[Mesa-dev] [PATCH 2/4] gallium/radeon: don't discard DCC if an external user can write to it
Nicolai Hähnle
nhaehnle at gmail.com
Mon Jun 6 14:16:13 UTC 2016
Patches 1 & 2:
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
On 03.06.2016 12:52, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> We don't import textures with DCC now, but soon we will.
> ---
> src/gallium/drivers/radeon/r600_pipe_common.h | 2 +-
> src/gallium/drivers/radeon/r600_texture.c | 31 +++++++++++++++++++--------
> 2 files changed, 23 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
> index 8072833..2d60da4 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.h
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.h
> @@ -676,7 +676,7 @@ void evergreen_do_fast_color_clear(struct r600_common_context *rctx,
> struct r600_atom *fb_state,
> unsigned *buffers, unsigned *dirty_cbufs,
> const union pipe_color_union *color);
> -void r600_texture_disable_dcc(struct r600_common_screen *rscreen,
> +bool r600_texture_disable_dcc(struct r600_common_screen *rscreen,
> struct r600_texture *rtex);
> void r600_init_screen_texture_functions(struct r600_common_screen *rscreen);
> void r600_init_context_texture_functions(struct r600_common_context *rctx);
> diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
> index 71758c4..0f5c08f 100644
> --- a/src/gallium/drivers/radeon/r600_texture.c
> +++ b/src/gallium/drivers/radeon/r600_texture.c
> @@ -32,7 +32,7 @@
> #include <errno.h>
> #include <inttypes.h>
>
> -static void r600_texture_discard_dcc(struct r600_common_screen *rscreen,
> +static bool r600_texture_discard_dcc(struct r600_common_screen *rscreen,
> struct r600_texture *rtex);
> static void r600_texture_discard_cmask(struct r600_common_screen *rscreen,
> struct r600_texture *rtex);
> @@ -86,7 +86,8 @@ bool r600_prepare_for_dma_blit(struct r600_common_context *rctx,
> src_box->height, src_box->depth))
> return false;
>
> - r600_texture_discard_dcc(rctx->screen, rdst);
> + if (!r600_texture_discard_dcc(rctx->screen, rdst))
> + return false;
> }
>
> /* CMASK as:
> @@ -376,25 +377,37 @@ static void r600_texture_discard_cmask(struct r600_common_screen *rscreen,
> p_atomic_inc(&rscreen->compressed_colortex_counter);
> }
>
> -static void r600_texture_discard_dcc(struct r600_common_screen *rscreen,
> +static bool r600_can_disable_dcc(struct r600_texture *rtex)
> +{
> + /* We can't disable DCC if it can be written by another process. */
> + return rtex->dcc_offset &&
> + (!rtex->resource.is_shared ||
> + !(rtex->resource.external_usage & PIPE_HANDLE_USAGE_WRITE));
> +}
> +
> +static bool r600_texture_discard_dcc(struct r600_common_screen *rscreen,
> struct r600_texture *rtex)
> {
> + if (!r600_can_disable_dcc(rtex))
> + return false;
> +
> /* Disable DCC. */
> rtex->dcc_offset = 0;
> rtex->cb_color_info &= ~VI_S_028C70_DCC_ENABLE(1);
>
> /* Notify all contexts about the change. */
> r600_dirty_all_framebuffer_states(rscreen);
> + return true;
> }
>
> -void r600_texture_disable_dcc(struct r600_common_screen *rscreen,
> +bool r600_texture_disable_dcc(struct r600_common_screen *rscreen,
> struct r600_texture *rtex)
> {
> struct r600_common_context *rctx =
> (struct r600_common_context *)rscreen->aux_context;
>
> - if (!rtex->dcc_offset)
> - return;
> + if (!r600_can_disable_dcc(rtex))
> + return false;
>
> /* Decompress DCC. */
> pipe_mutex_lock(rscreen->aux_context_lock);
> @@ -402,7 +415,7 @@ void r600_texture_disable_dcc(struct r600_common_screen *rscreen,
> rctx->b.flush(&rctx->b, NULL, 0);
> pipe_mutex_unlock(rscreen->aux_context_lock);
>
> - r600_texture_discard_dcc(rscreen, rtex);
> + return r600_texture_discard_dcc(rscreen, rtex);
> }
>
> static void r600_degrade_tile_mode_to_linear(struct r600_common_context *rctx,
> @@ -497,8 +510,8 @@ static boolean r600_texture_get_handle(struct pipe_screen* screen,
> * access.
> */
> if (usage & PIPE_HANDLE_USAGE_WRITE && rtex->dcc_offset) {
> - r600_texture_disable_dcc(rscreen, rtex);
> - update_metadata = true;
> + if (r600_texture_disable_dcc(rscreen, rtex))
> + update_metadata = true;
> }
>
> if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH) &&
>
More information about the mesa-dev
mailing list