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:
parent
705a6a560e
commit
06ed251c32
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue