diff options
author | Samuel Pitoiset <[email protected]> | 2017-05-15 23:48:08 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2017-06-14 10:04:36 +0200 |
commit | d7e1a66bb5582f594bdd05a1110dc40abc3371dc (patch) | |
tree | 09c2b4bb3284281f5c8c2a524d962088398e231c /src/gallium/drivers/radeonsi/si_blit.c | |
parent | a45e198e2dd4b64bddddcf2dfa3ce09a964ce897 (diff) |
radeonsi: decompress DCC for resident textures/images
Analogous to bound textures/images. We should also update the
resident descriptors and disable COMPRESSION_EN for avoiding
useless DCC fetches, but I postpone this optimization for a
separate series.
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_blit.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_blit.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 524b20a04b5..520797a7236 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -631,6 +631,64 @@ static void si_check_render_feedback_images(struct si_context *sctx, } } +static void si_check_render_feedback_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; + struct r600_texture *tex; + + view = tex_handle->view; + if (view->texture->target == PIPE_BUFFER) + continue; + + tex = (struct r600_texture *)view->texture; + + si_check_render_feedback_texture(sctx, tex, + view->u.tex.first_level, + view->u.tex.last_level, + view->u.tex.first_layer, + view->u.tex.last_layer); + } +} + +static void si_check_render_feedback_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; + struct r600_texture *tex; + + view = &img_handle->view; + if (view->resource->target == PIPE_BUFFER) + continue; + + tex = (struct r600_texture *)view->resource; + + si_check_render_feedback_texture(sctx, tex, + view->u.tex.level, + view->u.tex.level, + view->u.tex.first_layer, + view->u.tex.last_layer); + } +} + static void si_check_render_feedback(struct si_context *sctx) { @@ -641,6 +699,10 @@ static void si_check_render_feedback(struct si_context *sctx) si_check_render_feedback_images(sctx, &sctx->images[i]); si_check_render_feedback_textures(sctx, &sctx->samplers[i]); } + + si_check_render_feedback_resident_images(sctx); + si_check_render_feedback_resident_textures(sctx); + sctx->need_check_render_feedback = false; } |