[Mesa-dev] [PATCH 2/2] radeonsi: drop few partial flushes when uploading bindless descriptors

Samuel Pitoiset samuel.pitoiset at gmail.com
Mon Jul 3 16:33:30 UTC 2017



On 07/03/2017 06:16 PM, Samuel Pitoiset wrote:
> 
> 
> On 07/03/2017 06:09 PM, Nicolai Hähnle wrote:
>> On 03.07.2017 18:03, Nicolai Hähnle wrote:
>>> On 29.06.2017 21:59, Samuel Pitoiset wrote:
>>>> Only emit partial flushes when the underlying shader stages
>>>> are using bindless samplers or images.
>>>>
>>>> This gets rid of 4% of partial flushes in the DOW3 benchmark.
>>>
>>> Do those flushes still trigger during play?
>>>
>>> I'd think it should be possible to eliminate these partial flushes 
>>> entirely. The logic is that you only ever need the wait in the first 
>>> place when you're overriding a previously used descriptor.
>>>
>>> So what you could do is add a counter (per context, I think?) which 
>>> is incremented whenever a flush happens, and then release descriptors 
>>> lazily based on that.
>>>
>>> Alternatively (maybe easier, not sure): all shaders are guaranteed to 
>>> have finished when the fence of a submit fires, so use that as the 
>>> guard for lazily releasing descriptors.
>>
>> Looking at the other patch, it seems the flushes are triggered for 
>> descriptor changes for buffer invalidations? In that case, forget what 
>> I wrote.
> 
> Yes, most of them are for buffer invalidations.

One thing we can do though is to scan all shaders in order to know if 
they use bindless texture buffers. Maybe this can help for removing more 
partial flushes, what do you think?

> 
>>
>> Cheers,
>> Nicolai
>>
>>
>>>
>>> Anyway, this patch is a nice first step.
>>>
>>> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>>
>>>
>>>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>>>> ---
>>>>   src/gallium/drivers/radeonsi/si_descriptors.c | 18 ++++++++++++++++--
>>>>   1 file changed, 16 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c 
>>>> b/src/gallium/drivers/radeonsi/si_descriptors.c
>>>> index 88f7dcee959..7d8b3670887 100644
>>>> --- a/src/gallium/drivers/radeonsi/si_descriptors.c
>>>> +++ b/src/gallium/drivers/radeonsi/si_descriptors.c
>>>> @@ -1934,14 +1934,28 @@ static void 
>>>> si_upload_bindless_descriptor(struct si_context *sctx,
>>>>   static void si_upload_bindless_descriptors(struct si_context *sctx)
>>>>   {
>>>> +    unsigned shader_uses_bindless_mask;
>>>> +
>>>>       if (!sctx->bindless_descriptors_dirty)
>>>>           return;
>>>>       /* Wait for graphics/compute to be idle before updating the 
>>>> resident
>>>>        * descriptors directly in memory, in case the GPU is using them.
>>>>        */
>>>> -    sctx->b.flags |= SI_CONTEXT_PS_PARTIAL_FLUSH |
>>>> -             SI_CONTEXT_CS_PARTIAL_FLUSH;
>>>> +    sctx->b.flags |= SI_CONTEXT_CS_PARTIAL_FLUSH;
>>>> +
>>>> +    /* To avoid unnecessary partial flushes, check which shader 
>>>> stages are
>>>> +     * using bindless samplers or images.
>>>> +     */
>>>> +    shader_uses_bindless_mask = 
>>>> sctx->shader_uses_bindless_samplers_mask |
>>>> +                    sctx->shader_uses_bindless_images_mask;
>>>> +
>>>> +    if (shader_uses_bindless_mask & (1 << PIPE_SHADER_FRAGMENT)) {
>>>> +        sctx->b.flags |= SI_CONTEXT_PS_PARTIAL_FLUSH;
>>>> +    } else if (shader_uses_bindless_mask) {
>>>> +        sctx->b.flags |= SI_CONTEXT_VS_PARTIAL_FLUSH;
>>>> +    }
>>>> +
>>>>       si_emit_cache_flush(sctx);
>>>>       util_dynarray_foreach(&sctx->resident_tex_handles,
>>>>
>>>
>>>
>>
>>


More information about the mesa-dev mailing list