radeonsi: reduce overhead for resident textures which need depth decompression

This is done by introducing a separate list.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Samuel Pitoiset 2017-06-14 13:55:11 +02:00
parent 705a6a560e
commit 06ed251c32
4 changed files with 29 additions and 8 deletions

View File

@ -705,12 +705,18 @@ static void si_decompress_resident_textures(struct si_context *sctx)
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));
util_dynarray_foreach(&sctx->resident_tex_needs_depth_decompress,
struct si_texture_handle *, tex_handle) {
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;
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));
}
}

View File

@ -2352,8 +2352,13 @@ static void si_make_texture_handle_resident(struct pipe_context *ctx,
struct r600_texture *rtex =
(struct r600_texture *)sview->base.texture;
tex_handle->needs_depth_decompress =
depth_needs_decompression(rtex, sview);
if (depth_needs_decompression(rtex, sview)) {
util_dynarray_append(
&sctx->resident_tex_needs_depth_decompress,
struct si_texture_handle *,
tex_handle);
}
tex_handle->needs_color_decompress =
color_needs_decompression(rtex);
@ -2386,6 +2391,12 @@ static void si_make_texture_handle_resident(struct pipe_context *ctx,
util_dynarray_delete_unordered(&sctx->resident_tex_handles,
struct si_texture_handle *,
tex_handle);
if (sview->base.texture->target != PIPE_BUFFER) {
util_dynarray_delete_unordered(
&sctx->resident_tex_needs_depth_decompress,
struct si_texture_handle *, tex_handle);
}
}
}

View File

@ -103,6 +103,7 @@ static void si_destroy_context(struct pipe_context *context)
util_dynarray_fini(&sctx->resident_tex_handles);
util_dynarray_fini(&sctx->resident_img_handles);
util_dynarray_fini(&sctx->resident_tex_needs_depth_decompress);
FREE(sctx);
}
@ -342,6 +343,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
util_dynarray_init(&sctx->resident_tex_handles, NULL);
util_dynarray_init(&sctx->resident_img_handles, NULL);
util_dynarray_init(&sctx->resident_tex_needs_depth_decompress, NULL);
return &sctx->b.b;
fail:

View File

@ -244,7 +244,6 @@ struct si_texture_handle
struct si_bindless_descriptor *desc;
struct pipe_sampler_view *view;
bool needs_color_decompress;
bool needs_depth_decompress;
};
struct si_image_handle
@ -432,6 +431,9 @@ struct si_context {
struct util_dynarray resident_tex_handles;
struct util_dynarray resident_img_handles;
/* Resident bindless handles which need decompression */
struct util_dynarray resident_tex_needs_depth_decompress;
/* Bindless state */
bool uses_bindless_samplers;
bool uses_bindless_images;