[Mesa-dev] [PATCH 1/2] radv: don't overwrite results in VkGetQueryPoolResults() when queries are not available

Samuel Pitoiset samuel.pitoiset at gmail.com
Fri Mar 22 16:20:00 UTC 2019


On 3/22/19 5:18 PM, Samuel Pitoiset wrote:
>
> On 3/22/19 1:03 PM, Samuel Iglesias Gonsálvez wrote:
>> If the query is not available and VK_QUERY_RESULT_WAIT_BIT and
>> VK_QUERY_RESULT_PARTIAL_BIT are both not set, the spec doesn't
>> allow to modify its result.
>>
>>  From Vulkan spec:
>>
>> "If VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are
>> both not set then no result values are written to pData for queries
>> that are in the unavailable state at the time of the call, and
>> vkGetQueryPoolResults returns VK_NOT_READY. However, availability state
>> is still written to pData for those queries
>> if VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set."
>>
>> Signed-off-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
>> ---
>>   src/amd/vulkan/radv_query.c | 52 +++++++++++++++++++++++--------------
>>   1 file changed, 33 insertions(+), 19 deletions(-)
>>
>> diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
>> index e808aa65170..8578680f09d 100644
>> --- a/src/amd/vulkan/radv_query.c
>> +++ b/src/amd/vulkan/radv_query.c
>> @@ -1148,10 +1148,12 @@ VkResult radv_GetQueryPoolResults(
>>               }
>>                 if (flags & VK_QUERY_RESULT_64_BIT) {
>> -                *(uint64_t*)dest = *(uint64_t*)src;
>> +                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
>> +                    *(uint64_t*)dest = *(uint64_t*)src;
>>                   dest += 8;
>>               } else {
>> -                *(uint32_t*)dest = *(uint32_t*)src;
>> +                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
>> +                    *(uint32_t*)dest = *(uint32_t*)src;
>>                   dest += 4;
>>               }
>>               break;
>> @@ -1183,10 +1185,12 @@ VkResult radv_GetQueryPoolResults(
>>               }
>>                 if (flags & VK_QUERY_RESULT_64_BIT) {
>> -                *(uint64_t*)dest = sample_count;
>> +                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
>> +                    *(uint64_t*)dest = sample_count;
>>                   dest += 8;
>>               } else {
>> -                *(uint32_t*)dest = sample_count;
>> +                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
>> +                    *(uint32_t*)dest = sample_count;
>>                   dest += 4;
>>               }
>>               break;
>> @@ -1203,18 +1207,26 @@ VkResult radv_GetQueryPoolResults(
>>               if (flags & VK_QUERY_RESULT_64_BIT) {
>>                   uint64_t *dst = (uint64_t*)dest;
>>                   dest += util_bitcount(pool->pipeline_stats_mask) * 8;
>> -                for(int i = 0; i < 11; ++i)
>> -                    if(pool->pipeline_stats_mask & (1u << i))
>> -                        *dst++ = stop[pipeline_statistics_indices[i]] -
>> - start[pipeline_statistics_indices[i]];
>> +                for(int i = 0; i < 11; ++i) {
>> +                    if(pool->pipeline_stats_mask & (1u << i)) {
>> +                        if (available || (flags & 
>> VK_QUERY_RESULT_PARTIAL_BIT))
>> +                            *dst = 
>> stop[pipeline_statistics_indices[i]] -
>> + start[pipeline_statistics_indices[i]];
>> +                        dst++;
>> +                    }
>> +                }
>>                 } else {
>>                   uint32_t *dst = (uint32_t*)dest;
>>                   dest += util_bitcount(pool->pipeline_stats_mask) * 4;
>> -                for(int i = 0; i < 11; ++i)
>> -                    if(pool->pipeline_stats_mask & (1u << i))
>> -                        *dst++ = stop[pipeline_statistics_indices[i]] -
>> - start[pipeline_statistics_indices[i]];
>> +                for(int i = 0; i < 11; ++i) {
>> +                    if(pool->pipeline_stats_mask & (1u << i)) {
>> +                        if (available || (flags & 
>> VK_QUERY_RESULT_PARTIAL_BIT))
>> +                            *dst = 
>> stop[pipeline_statistics_indices[i]] -
>> + start[pipeline_statistics_indices[i]];
>> +                        dst++;
>> +                    }
>> +                }
>>               }
>>               break;
>>           }
>> @@ -1235,23 +1247,25 @@ VkResult radv_GetQueryPoolResults(
>>                       available = 0;
>>               }
>>   -            if (!available && !(flags & 
>> VK_QUERY_RESULT_PARTIAL_BIT)) {
>> +            if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT))
>>                   result = VK_NOT_READY;
>> -                break;
>> -            }
>
> Removing that break is useless?
After reading patch 2, I understand. This change should be moved to next 
patch.
>
>>                 num_primitives_written = src64[3] - src64[1];
>>               primitive_storage_needed = src64[2] - src64[0];
>>                 if (flags & VK_QUERY_RESULT_64_BIT) {
>> -                *(uint64_t *)dest = num_primitives_written;
>> +                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
>> +                    *(uint64_t *)dest = num_primitives_written;
>>                   dest += 8;
>> -                *(uint64_t *)dest = primitive_storage_needed;
>> +                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
>> +                    *(uint64_t *)dest = primitive_storage_needed;
>>                   dest += 8;
>>               } else {
>> -                *(uint32_t *)dest = num_primitives_written;
>> +                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
>> +                    *(uint32_t *)dest = num_primitives_written;
>>                   dest += 4;
>> -                *(uint32_t *)dest = primitive_storage_needed;
>> +                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
>> +                    *(uint32_t *)dest = primitive_storage_needed;
>>                   dest += 4;
>>               }
>>               break;


More information about the mesa-dev mailing list