[Mesa-dev] [PATCH v4 6/6] radeonsi: try to re-use previously deleted bindless descriptor slots
Samuel Pitoiset
samuel.pitoiset at gmail.com
Wed Aug 23 07:38:03 UTC 2017
On 08/23/2017 09:34 AM, Samuel Pitoiset wrote:
>
>
> On 08/23/2017 07:30 AM, Timothy Arceri wrote:
>> This is causing piglit regressions for me. For example:
>>
>> ./bin/shader_runner
>> tests/spec/arb_bindless_texture/execution/images/multiple-resident-images-reading.shader_test
>> -auto -fb
>>
>> Unexpected GL error: GL_OUT_OF_MEMORY 0x505
>> (Error at
>> /home/tarceri/git/Mesa_arrays_of_arrays_piglit/tests/shaders/shader_runner.c:3560)
>>
>> glMakeImageHandleResidentARB error
>> PIGLIT: {"result": "fail" }
>
> Mmh, you are right, but I can only reproduce with a non-debug build, weird.
Figured, funny. :-) I will send a patch.
>
>>
>>
>> On 22/08/17 07:22, Marek Olšák wrote:
>>> Reviewed-by: Marek Olšák <marek.olsak at amd.com>
>>>
>>> So let's commit this!
>>>
>>> Marek
>>>
>>> On Mon, Aug 21, 2017 at 4:50 PM, Samuel Pitoiset
>>> <samuel.pitoiset at gmail.com> wrote:
>>>> Currently, when the array is full it is resized but it can grow
>>>> over and over because we don't try to re-use descriptor slots.
>>>>
>>>> v4: - rebase on top of idalloc changes
>>>> v3: - use new idalloc gallium module
>>>>
>>>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>>>> ---
>>>> src/gallium/drivers/radeonsi/si_descriptors.c | 36
>>>> +++++++++++++++++++++------
>>>> src/gallium/drivers/radeonsi/si_pipe.h | 2 ++
>>>> 2 files changed, 31 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c
>>>> b/src/gallium/drivers/radeonsi/si_descriptors.c
>>>> index f14fce103f..c869dac9bb 100644
>>>> --- a/src/gallium/drivers/radeonsi/si_descriptors.c
>>>> +++ b/src/gallium/drivers/radeonsi/si_descriptors.c
>>>> @@ -61,6 +61,7 @@
>>>> #include "gfx9d.h"
>>>>
>>>> #include "util/hash_table.h"
>>>> +#include "util/u_idalloc.h"
>>>> #include "util/u_format.h"
>>>> #include "util/u_memory.h"
>>>> #include "util/u_upload_mgr.h"
>>>> @@ -2335,23 +2336,27 @@ static void
>>>> si_init_bindless_descriptors(struct si_context *sctx,
>>>> * considered to be a valid handle.
>>>> */
>>>> sctx->num_bindless_descriptors = 1;
>>>> +
>>>> + /* Track which bindless slots are used (or not). */
>>>> + util_idalloc_init(&sctx->bindless_used_slots);
>>>> + util_idalloc_resize(&sctx->bindless_used_slots, num_elements);
>>>> +
>>>> + /* Reserve slot 0 because it's an invalid handle for
>>>> bindless. */
>>>> + assert(!util_idalloc_alloc(&sctx->bindless_used_slots));
>>>> }
>>>>
>>>> static void si_release_bindless_descriptors(struct si_context *sctx)
>>>> {
>>>> si_release_descriptors(&sctx->bindless_descriptors);
>>>> + util_idalloc_fini(&sctx->bindless_used_slots);
>>>> }
>>>>
>>>> -static unsigned
>>>> -si_create_bindless_descriptor(struct si_context *sctx, uint32_t
>>>> *desc_list,
>>>> - unsigned size)
>>>> +static unsigned si_get_first_free_bindless_slot(struct si_context
>>>> *sctx)
>>>> {
>>>> struct si_descriptors *desc = &sctx->bindless_descriptors;
>>>> - unsigned desc_slot, desc_slot_offset;
>>>> -
>>>> - /* Reserve a new slot for this bindless descriptor. */
>>>> - desc_slot = sctx->num_bindless_descriptors++;
>>>> + unsigned desc_slot;
>>>>
>>>> + desc_slot = util_idalloc_alloc(&sctx->bindless_used_slots);
>>>> if (desc_slot >= desc->num_elements) {
>>>> /* The array of bindless descriptors is full,
>>>> resize it. */
>>>> unsigned slot_size = desc->element_dw_size * 4;
>>>> @@ -2363,6 +2368,20 @@ si_create_bindless_descriptor(struct
>>>> si_context *sctx, uint32_t *desc_list,
>>>> desc->num_active_slots = new_num_elements;
>>>> }
>>>>
>>>> + assert(desc_slot);
>>>> + return desc_slot;
>>>> +}
>>>> +
>>>> +static unsigned
>>>> +si_create_bindless_descriptor(struct si_context *sctx, uint32_t
>>>> *desc_list,
>>>> + unsigned size)
>>>> +{
>>>> + struct si_descriptors *desc = &sctx->bindless_descriptors;
>>>> + unsigned desc_slot, desc_slot_offset;
>>>> +
>>>> + /* Find a free slot. */
>>>> + desc_slot = si_get_first_free_bindless_slot(sctx);
>>>> +
>>>> /* For simplicity, sampler and image bindless descriptors
>>>> use fixed
>>>> * 16-dword slots for now. Image descriptors only need
>>>> 8-dword but this
>>>> * doesn't really matter because no real apps use image
>>>> handles.
>>>> @@ -2475,6 +2494,9 @@ static void si_delete_texture_handle(struct
>>>> pipe_context *ctx, uint64_t handle)
>>>>
>>>> tex_handle = (struct si_texture_handle *)entry->data;
>>>>
>>>> + /* Allow this descriptor slot to be re-used. */
>>>> + util_idalloc_free(&sctx->bindless_used_slots,
>>>> tex_handle->desc_slot);
>>>> +
>>>> pipe_sampler_view_reference(&tex_handle->view, NULL);
>>>> _mesa_hash_table_remove(sctx->tex_handles, entry);
>>>> FREE(tex_handle);
>>>> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h
>>>> b/src/gallium/drivers/radeonsi/si_pipe.h
>>>> index 56c3b08188..8a475d3b05 100644
>>>> --- a/src/gallium/drivers/radeonsi/si_pipe.h
>>>> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
>>>> @@ -29,6 +29,7 @@
>>>> #include "si_shader.h"
>>>>
>>>> #include "util/u_dynarray.h"
>>>> +#include "util/u_idalloc.h"
>>>>
>>>> #ifdef PIPE_ARCH_BIG_ENDIAN
>>>> #define SI_BIG_ENDIAN 1
>>>> @@ -430,6 +431,7 @@ struct si_context {
>>>>
>>>> /* Bindless descriptors. */
>>>> struct si_descriptors bindless_descriptors;
>>>> + struct util_idalloc bindless_used_slots;
>>>> unsigned num_bindless_descriptors;
>>>> bool bindless_descriptors_dirty;
>>>> bool graphics_bindless_pointer_dirty;
>>>> --
>>>> 2.14.1
>>>>
>>>> _______________________________________________
>>>> mesa-dev mailing list
>>>> mesa-dev at lists.freedesktop.org
>>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>
More information about the mesa-dev
mailing list