aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-03-14 20:48:47 -0700
committerAndres Gomez <[email protected]>2017-03-29 19:12:57 +0300
commit9c6fcdfe4549c8184f6c990505da3db6a9c95f94 (patch)
tree7ae4a1d2b8ae2c47ed52559aeb1ef253713720cc /src
parent6e2fb0cbcf5da43357741ddab7fa501ae8236ae3 (diff)
anv/GetQueryPoolResults: Actually implement the spec
The Vulkan spec is fairly clear about when we should and should not write query pool results. We're also supposed to return VK_NOT_READY if VK_QUERY_RESULT_PARTIAL_BIT is not set and we come across any queries which are not yet finished. This fixes rendering corruptions on The Talos Principle where geometry flickers in and out due to bogus query results being returned by the driver. These issues are most noticable on Sky Lake GT4 2hen running on "ultra" settings. Reviewed-By: Lionel Landwerlin <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100182 Cc: "17.0 13.0" <[email protected]> (cherry picked from commit 08df015b9de8ccb16ce6db93890910f8a02be4c6) [Andres Gomez: use anv_query.c instead of genX_query.c] Signed-off-by: Andres Gomez <[email protected]> Conflicts: src/intel/vulkan/genX_query.c
Diffstat (limited to 'src')
-rw-r--r--src/intel/vulkan/anv_query.c52
1 files changed, 36 insertions, 16 deletions
diff --git a/src/intel/vulkan/anv_query.c b/src/intel/vulkan/anv_query.c
index ac7f652dd2d..0cfd9e94bc1 100644
--- a/src/intel/vulkan/anv_query.c
+++ b/src/intel/vulkan/anv_query.c
@@ -136,32 +136,52 @@ VkResult anv_GetQueryPoolResults(
MIN2(size, pool->bo.size - offset));
}
+ VkResult status = VK_SUCCESS;
for (uint32_t i = 0; i < queryCount; i++) {
- switch (pool->type) {
- case VK_QUERY_TYPE_OCCLUSION: {
- result = slot[firstQuery + i].end - slot[firstQuery + i].begin;
- break;
- }
- case VK_QUERY_TYPE_PIPELINE_STATISTICS:
- unreachable("pipeline stats not supported");
- case VK_QUERY_TYPE_TIMESTAMP: {
- result = slot[firstQuery + i].begin;
- break;
- }
- default:
- unreachable("invalid pool type");
+ bool available = slot[firstQuery + i].available;
+
+ /* From the Vulkan 1.0.42 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."
+ */
+ bool write_results = available || (flags & VK_QUERY_RESULT_PARTIAL_BIT);
+
+ if (write_results) {
+ switch (pool->type) {
+ case VK_QUERY_TYPE_OCCLUSION: {
+ result = slot[firstQuery + i].end - slot[firstQuery + i].begin;
+ break;
+ }
+ case VK_QUERY_TYPE_PIPELINE_STATISTICS:
+ unreachable("pipeline stats not supported");
+ case VK_QUERY_TYPE_TIMESTAMP: {
+ result = slot[firstQuery + i].begin;
+ break;
+ }
+ default:
+ unreachable("invalid pool type");
+ }
+ } else {
+ status = VK_NOT_READY;
}
if (flags & VK_QUERY_RESULT_64_BIT) {
uint64_t *dst = pData;
- dst[0] = result;
+ if (write_results)
+ dst[0] = result;
if (flags & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)
dst[1] = slot[firstQuery + i].available;
} else {
uint32_t *dst = pData;
if (result > UINT32_MAX)
result = UINT32_MAX;
- dst[0] = result;
+ if (write_results)
+ dst[0] = result;
if (flags & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)
dst[1] = slot[firstQuery + i].available;
}
@@ -171,5 +191,5 @@ VkResult anv_GetQueryPoolResults(
break;
}
- return VK_SUCCESS;
+ return status;
}