[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:18:25 UTC 2019
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?
>
> 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