From: Samuel Pitoiset Date: Mon, 15 May 2017 22:55:14 +0000 (+0200) Subject: radeonsi: add all resident buffers to the current CS X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=333c8f65cfd6f1153a614cef482b529778d3a6a6;p=mesa.git radeonsi: add all resident buffers to the current CS Resident buffers have to be added to every new command stream. Though, this could be slightly improved when current shaders don't use any bindless textures/images but usually applications tend to use bindless for almost every draw call, and the winsys thread might help when buffers are added early. Signed-off-by: Samuel Pitoiset Reviewed-by: Marek Olšák --- diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index c13cf3d7893..b5722b76420 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -2364,6 +2364,56 @@ static void si_make_image_handle_resident(struct pipe_context *ctx, } +void si_all_resident_buffers_begin_new_cs(struct si_context *sctx) +{ + unsigned num_resident_tex_handles, num_resident_img_handles; + unsigned num_bindless_descriptors; + unsigned i; + + num_resident_tex_handles = sctx->resident_tex_handles.size / + sizeof(struct si_texture_handle *); + num_resident_img_handles = sctx->resident_img_handles.size / + sizeof(struct si_image_handle *); + num_bindless_descriptors = sctx->bindless_descriptors.size / + sizeof(struct r600_resource *); + + /* Add all bindless descriptors. */ + for (i = 0; i < num_bindless_descriptors; i++) { + struct r600_resource *desc = + *util_dynarray_element(&sctx->bindless_descriptors, + struct r600_resource *, i); + + radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, desc, + RADEON_USAGE_READWRITE, + RADEON_PRIO_DESCRIPTORS); + } + + /* Add all resident texture handles. */ + 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 si_sampler_view *sview = + (struct si_sampler_view *)tex_handle->view; + + si_sampler_view_add_buffer(sctx, sview->base.texture, + RADEON_USAGE_READ, + sview->is_stencil_sampler, false); + } + + /* Add all resident image handles. */ + 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; + + si_sampler_view_add_buffer(sctx, view->resource, + RADEON_USAGE_READWRITE, + false, false); + } +} + /* INIT/DEINIT/UPLOAD */ /* GFX9 has only 4KB of CE, while previous chips had 32KB. In order diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c b/src/gallium/drivers/radeonsi/si_hw_context.c index 92c09cb633f..345825af002 100644 --- a/src/gallium/drivers/radeonsi/si_hw_context.c +++ b/src/gallium/drivers/radeonsi/si_hw_context.c @@ -235,6 +235,7 @@ void si_begin_new_cs(struct si_context *ctx) si_mark_atom_dirty(ctx, &ctx->b.streamout.enable_atom); si_mark_atom_dirty(ctx, &ctx->b.render_cond_atom); si_all_descriptors_begin_new_cs(ctx); + si_all_resident_buffers_begin_new_cs(ctx); ctx->b.scissors.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; ctx->b.viewports.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1; diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index 55227a156b5..c9e0770c7ba 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -328,6 +328,7 @@ bool si_upload_graphics_shader_descriptors(struct si_context *sctx); bool si_upload_compute_shader_descriptors(struct si_context *sctx); void si_release_all_descriptors(struct si_context *sctx); void si_all_descriptors_begin_new_cs(struct si_context *sctx); +void si_all_resident_buffers_begin_new_cs(struct si_context *sctx); void si_upload_const_buffer(struct si_context *sctx, struct r600_resource **rbuffer, const uint8_t *ptr, unsigned size, uint32_t *const_offset); void si_update_all_texture_descriptors(struct si_context *sctx);