diff options
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_blit.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_blit.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 520797a7236..8fdc3f268b1 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -22,6 +22,7 @@ */ #include "si_pipe.h" +#include "si_compute.h" #include "util/u_format.h" #include "util/u_surface.h" @@ -706,6 +707,61 @@ 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) +{ + unsigned num_resident_tex_handles; + unsigned i; + + num_resident_tex_handles = sctx->resident_tex_handles.size / + sizeof(struct si_texture_handle *); + + for (i = 0; i < num_resident_tex_handles; i++) { + struct si_texture_handle *tex_handle = + *util_dynarray_element(&sctx->resident_tex_handles, + struct si_texture_handle *, i); + struct pipe_sampler_view *view = tex_handle->view; + struct si_sampler_view *sview = (struct si_sampler_view *)view; + struct r600_texture *tex = (struct r600_texture *)view->texture; + + if (view->texture->target == PIPE_BUFFER) + continue; + + if (tex_handle->needs_color_decompress) + si_decompress_color_texture(sctx, tex, view->u.tex.first_level, + view->u.tex.last_level); + + if (tex_handle->needs_depth_decompress) + si_decompress_depth(sctx, tex, + sview->is_stencil_sampler ? PIPE_MASK_S : PIPE_MASK_Z, + view->u.tex.first_level, view->u.tex.last_level, + 0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level)); + } +} + +static void si_decompress_resident_images(struct si_context *sctx) +{ + unsigned num_resident_img_handles; + unsigned i; + + num_resident_img_handles = sctx->resident_img_handles.size / + sizeof(struct si_image_handle *); + + for (i = 0; i < num_resident_img_handles; i++) { + struct si_image_handle *img_handle = + *util_dynarray_element(&sctx->resident_img_handles, + struct si_image_handle *, i); + struct pipe_image_view *view = &img_handle->view; + struct r600_texture *tex = (struct r600_texture *)view->resource; + + if (view->resource->target == PIPE_BUFFER) + continue; + + if (img_handle->needs_color_decompress) + si_decompress_color_texture(sctx, tex, view->u.tex.level, + view->u.tex.level); + } +} + static void si_decompress_textures(struct si_context *sctx, unsigned shader_mask) { unsigned compressed_colortex_counter, mask; @@ -736,6 +792,9 @@ static void si_decompress_textures(struct si_context *sctx, unsigned shader_mask } } + si_decompress_resident_textures(sctx); + si_decompress_resident_images(sctx); + si_check_render_feedback(sctx); } |