[Mesa-dev] [PATCH v2 51/64] radeonsi: add a slab allocator for bindless descriptors
Marek Olšák
maraeo at gmail.com
Tue Jun 6 20:59:04 UTC 2017
On Tue, May 30, 2017 at 10:36 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> For each texture/image handles, we need to allocate a new
> buffer for the bindless descriptor. But when the number of
> buffers added to the current CS becomes high, the overhead
> in the winsys (and in the kernel) is important.
>
> To reduce this bottleneck, the idea is to suballocate the
> bindless descriptors using a slab similar to the one used
> in the winsys.
>
> Currently, a buffer can hold 1024 bindless descriptors but
> this limit is arbitrary and could be changed in the future
> for some reasons. Once a slab is allocated the "base" buffer
> is added to a per-context list.
>
> v2: - rename si_resident_descriptor to si_bindless_descriptor
> - make can_reclaim_slab() returns false, always
> - use util_dynarray_*
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
> src/gallium/drivers/radeonsi/si_descriptors.c | 84 +++++++++++++++++++++++++++
> src/gallium/drivers/radeonsi/si_pipe.c | 12 ++++
> src/gallium/drivers/radeonsi/si_pipe.h | 15 +++++
> src/gallium/drivers/radeonsi/si_state.h | 8 +++
> 4 files changed, 119 insertions(+)
>
> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
> index 3e78dd205b..b2e2e4b760 100644
> --- a/src/gallium/drivers/radeonsi/si_descriptors.c
> +++ b/src/gallium/drivers/radeonsi/si_descriptors.c
> @@ -2046,6 +2046,90 @@ void si_emit_compute_shader_userdata(struct si_context *sctx)
> sctx->shader_pointers_dirty &= ~compute_mask;
> }
>
> +/* BINDLESS */
> +
> +struct si_bindless_descriptor_slab
> +{
> + struct pb_slab base;
> + struct r600_resource *buffer;
> + struct si_bindless_descriptor *entries;
> +};
> +
> +bool si_bindless_descriptor_can_reclaim_slab(void *priv,
> + struct pb_slab_entry *entry)
> +{
> + /* Do not allow to reclaim any bindless descriptors for now because the
> + * GPU might be using them. This should be improved later on.
> + */
> + return false;
> +}
> +
> +struct pb_slab *si_bindless_descriptor_slab_alloc(void *priv, unsigned heap,
> + unsigned entry_size,
> + unsigned group_index)
> +{
> + struct si_context *sctx = priv;
> + struct si_screen *sscreen = sctx->screen;
> + struct si_bindless_descriptor_slab *slab;
> +
> + slab = CALLOC_STRUCT(si_bindless_descriptor_slab);
> + if (!slab)
> + return NULL;
> +
> + /* Create a buffer in VRAM for 1024 bindless descriptors. */
> + slab->buffer = (struct r600_resource *)
> + pipe_buffer_create(&sscreen->b.b, 0,
> + PIPE_USAGE_IMMUTABLE, 64 * 1024);
PIPE_USAGE_DEFAULT would be better here. (even though it's the same)
Marek
More information about the mesa-dev
mailing list