radv: write availability status vkGetQueryPoolResults() when the data is not available
authorSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Thu, 21 Mar 2019 16:43:56 +0000 (17:43 +0100)
committerSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Mon, 25 Mar 2019 07:21:22 +0000 (08:21 +0100)
If VK_QUERY_RESULT_WITH_AVAILABILY_BIT is set and
VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are both not
set, we need return to VK_NOT_READY only and set the availability
status field for each query.

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@igalia.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/amd/vulkan/radv_query.c

index ae544b3df939b5a3e01582b9a198de2b2d79a0bd..63a2ab773a83f48a0b32d819f79a4a137d3239c0 100644 (file)
@@ -1141,11 +1141,8 @@ VkResult radv_GetQueryPoolResults(
                                available = *(uint64_t *)src != TIMESTAMP_NOT_READY;
                        }
 
-                       if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
+                       if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT))
                                result = VK_NOT_READY;
-                               break;
-
-                       }
 
                        if (flags & VK_QUERY_RESULT_64_BIT) {
                                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
@@ -1178,11 +1175,8 @@ VkResult radv_GetQueryPoolResults(
                                }
                        }
 
-                       if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
+                       if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT))
                                result = VK_NOT_READY;
-                               break;
-
-                       }
 
                        if (flags & VK_QUERY_RESULT_64_BIT) {
                                if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT))
@@ -1196,11 +1190,8 @@ VkResult radv_GetQueryPoolResults(
                        break;
                }
                case VK_QUERY_TYPE_PIPELINE_STATISTICS: {
-                       if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
+                       if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT))
                                result = VK_NOT_READY;
-                               break;
-
-                       }
 
                        const uint64_t *start = (uint64_t*)src;
                        const uint64_t *stop = (uint64_t*)(src + pipelinestat_block_size);
@@ -1247,10 +1238,8 @@ 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;
-                       }
 
                        num_primitives_written = src64[3] - src64[1];
                        primitive_storage_needed = src64[2] - src64[0];