From d3f716bdfc043914ebe058b14eac2660748b3a91 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 7 May 2023 17:03:06 -0400 Subject: [PATCH] radeonsi: add a gfx11 version of si_decompress_textures, add assertions < GFX11 si_decompress_textures is renamed to gfx6_decompress_textures. gfx11_decompress_textures is added. Reviewed-by: Qiang Yu Part-of: --- src/gallium/drivers/radeonsi/si_blit.c | 55 +++++++++++++++++++++++--- src/gallium/drivers/radeonsi/si_compute.c | 5 ++- src/gallium/drivers/radeonsi/si_descriptors.c | 6 ++- src/gallium/drivers/radeonsi/si_pipe.h | 3 +- src/gallium/drivers/radeonsi/si_state_draw.cpp | 6 ++- 5 files changed, 65 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 681a79d..19ebae8 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -116,6 +116,8 @@ static unsigned si_blit_dbcb_copy(struct si_context *sctx, struct si_texture *sr unsigned layer, sample, checked_last_layer, max_layer; unsigned fully_copied_levels = 0; + assert(sctx->gfx_level < GFX11); + if (planes & PIPE_MASK_Z) sctx->dbcb_depth_copy_enabled = true; if (planes & PIPE_MASK_S) @@ -550,6 +552,8 @@ static void si_decompress_color_texture(struct si_context *sctx, struct si_textu unsigned first_level, unsigned last_level, bool need_fmask_expand) { + assert(sctx->gfx_level < GFX11); + /* CMASK or DCC can be discarded and we can still end up here. */ if (!tex->cmask_buffer && !tex->surface.fmask_size && !vi_dcc_enabled(tex, first_level)) @@ -566,6 +570,8 @@ static void si_decompress_sampler_color_textures(struct si_context *sctx, unsigned i; unsigned mask = textures->needs_color_decompress_mask; + assert(sctx->gfx_level < GFX11); + while (mask) { struct pipe_sampler_view *view; struct si_texture *tex; @@ -587,6 +593,8 @@ static void si_decompress_image_color_textures(struct si_context *sctx, struct s unsigned i; unsigned mask = images->needs_color_decompress_mask; + assert(sctx->gfx_level < GFX11); + while (mask) { const struct pipe_image_view *view; struct si_texture *tex; @@ -738,8 +746,10 @@ static void si_check_render_feedback(struct si_context *sctx) sctx->need_check_render_feedback = false; } -static void si_decompress_resident_textures(struct si_context *sctx) +static void si_decompress_resident_color_textures(struct si_context *sctx) { + assert(sctx->gfx_level < GFX11); + util_dynarray_foreach (&sctx->resident_tex_needs_color_decompress, struct si_texture_handle *, tex_handle) { struct pipe_sampler_view *view = (*tex_handle)->view; @@ -748,7 +758,10 @@ static void si_decompress_resident_textures(struct si_context *sctx) si_decompress_color_texture(sctx, tex, view->u.tex.first_level, view->u.tex.last_level, false); } +} +static void si_decompress_resident_depth_textures(struct si_context *sctx) +{ util_dynarray_foreach (&sctx->resident_tex_needs_depth_decompress, struct si_texture_handle *, tex_handle) { struct pipe_sampler_view *view = (*tex_handle)->view; @@ -763,6 +776,8 @@ static void si_decompress_resident_textures(struct si_context *sctx) static void si_decompress_resident_images(struct si_context *sctx) { + assert(sctx->gfx_level < GFX11); + util_dynarray_foreach (&sctx->resident_img_needs_color_decompress, struct si_image_handle *, img_handle) { struct pipe_image_view *view = &(*img_handle)->view; @@ -773,7 +788,7 @@ static void si_decompress_resident_images(struct si_context *sctx) } } -void si_decompress_textures(struct si_context *sctx, unsigned shader_mask) +void gfx6_decompress_textures(struct si_context *sctx, unsigned shader_mask) { unsigned compressed_colortex_counter, mask; bool need_flush = false; @@ -815,8 +830,10 @@ void si_decompress_textures(struct si_context *sctx, unsigned shader_mask) } if (shader_mask & u_bit_consecutive(0, SI_NUM_GRAPHICS_SHADERS)) { - if (sctx->uses_bindless_samplers) - si_decompress_resident_textures(sctx); + if (sctx->uses_bindless_samplers) { + si_decompress_resident_color_textures(sctx); + si_decompress_resident_depth_textures(sctx); + } if (sctx->uses_bindless_images) si_decompress_resident_images(sctx); @@ -828,13 +845,39 @@ void si_decompress_textures(struct si_context *sctx, unsigned shader_mask) si_check_render_feedback(sctx); } else if (shader_mask & (1 << PIPE_SHADER_COMPUTE)) { - if (sctx->cs_shader_state.program->sel.info.uses_bindless_samplers) - si_decompress_resident_textures(sctx); + if (sctx->cs_shader_state.program->sel.info.uses_bindless_samplers) { + si_decompress_resident_color_textures(sctx); + si_decompress_resident_depth_textures(sctx); + } if (sctx->cs_shader_state.program->sel.info.uses_bindless_images) si_decompress_resident_images(sctx); } } +void gfx11_decompress_textures(struct si_context *sctx, unsigned shader_mask) +{ + if (sctx->blitter_running) + return; + + /* Decompress depth textures if needed. */ + unsigned mask = sctx->shader_needs_decompress_mask & shader_mask; + u_foreach_bit(i, mask) { + assert(sctx->samplers[i].needs_depth_decompress_mask); + si_decompress_sampler_depth_textures(sctx, &sctx->samplers[i]); + } + + /* Decompress bindless depth textures and disable DCC for render feedback. */ + if (shader_mask & u_bit_consecutive(0, SI_NUM_GRAPHICS_SHADERS)) { + if (sctx->uses_bindless_samplers) + si_decompress_resident_depth_textures(sctx); + + si_check_render_feedback(sctx); + } else if (shader_mask & (1 << PIPE_SHADER_COMPUTE)) { + if (sctx->cs_shader_state.program->sel.info.uses_bindless_samplers) + si_decompress_resident_depth_textures(sctx); + } +} + /* Helper for decompressing a portion of a color or depth resource before * blitting if any decompression is needed. * The driver doesn't decompress resources automatically while u_blitter is diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 3f1a863..9dc5b77 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -898,7 +898,10 @@ static void si_launch_grid(struct pipe_context *ctx, const struct pipe_grid_info sctx->framebuffer.all_DCC_pipe_aligned); } - si_decompress_textures(sctx, 1 << PIPE_SHADER_COMPUTE); + if (sctx->gfx_level < GFX11) + gfx6_decompress_textures(sctx, 1 << PIPE_SHADER_COMPUTE); + else + gfx11_decompress_textures(sctx, 1 << PIPE_SHADER_COMPUTE); } /* Add buffer sizes for memory checking in need_cs_space. */ diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index 5c46796..75136c4 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -496,7 +496,9 @@ static void si_set_sampler_view_desc(struct si_context *sctx, struct si_sampler_ static bool color_needs_decompression(struct si_texture *tex) { - if (tex->is_depth) + struct si_screen *sscreen = (struct si_screen *)tex->buffer.b.b.screen; + + if (sscreen->info.gfx_level >= GFX11 || tex->is_depth) return false; return tex->surface.fmask_size || @@ -1640,6 +1642,8 @@ static void si_resident_handles_update_needs_color_decompress(struct si_context */ void si_update_needs_color_decompress_masks(struct si_context *sctx) { + assert(sctx->gfx_level < GFX11); + for (int i = 0; i < SI_NUM_SHADERS; ++i) { si_samplers_update_needs_color_decompress_mask(&sctx->samplers[i]); si_images_update_needs_color_decompress_mask(&sctx->images[i]); diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 11cb9df..795f3e5 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1332,7 +1332,8 @@ enum si_blitter_op /* bitmask */ void si_blitter_begin(struct si_context *sctx, enum si_blitter_op op); void si_blitter_end(struct si_context *sctx); void si_init_blit_functions(struct si_context *sctx); -void si_decompress_textures(struct si_context *sctx, unsigned shader_mask); +void gfx6_decompress_textures(struct si_context *sctx, unsigned shader_mask); +void gfx11_decompress_textures(struct si_context *sctx, unsigned shader_mask); void si_decompress_subresource(struct pipe_context *ctx, struct pipe_resource *tex, unsigned planes, unsigned level, unsigned first_layer, unsigned last_layer, bool need_fmask_expand); diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index 9c80310..8aa2d44 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -2154,7 +2154,11 @@ static void si_draw(struct pipe_context *ctx, si_check_dirty_buffers_textures(sctx); - si_decompress_textures(sctx, u_bit_consecutive(0, SI_NUM_GRAPHICS_SHADERS)); + if (GFX_VERSION < GFX11) + gfx6_decompress_textures(sctx, u_bit_consecutive(0, SI_NUM_GRAPHICS_SHADERS)); + else + gfx11_decompress_textures(sctx, u_bit_consecutive(0, SI_NUM_GRAPHICS_SHADERS)); + si_need_gfx_cs_space(sctx, num_draws); unsigned instance_count = info->instance_count; -- 2.7.4