Mesa (staging/22.0): anv: emit timestamp & availability using the same part of CS
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Mar 18 16:22:29 UTC 2022
Module: Mesa
Branch: staging/22.0
Commit: 7a86180509c99810bda9e42a5d452cc0dcf82a3c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7a86180509c99810bda9e42a5d452cc0dcf82a3c
Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date: Fri Jan 14 10:04:48 2022 +0200
anv: emit timestamp & availability using the same part of CS
We've run into issues before where PIPE_CONTROL races MI_STORE_*
commands. So make sure we emit the availability using the same type of
CS so that memory writes are properly ordered.
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Cc: mesa-stable
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14552>
(cherry picked from commit 4e30da7874e6586c7ac94cd34560c782d0f9678d)
---
src/intel/vulkan/genX_query.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c
index 98d5fd87f25..c65ce036197 100644
--- a/src/intel/vulkan/genX_query.c
+++ b/src/intel/vulkan/genX_query.c
@@ -725,7 +725,6 @@ void genX(CmdResetQueryPool)(
switch (pool->type) {
case VK_QUERY_TYPE_OCCLUSION:
- case VK_QUERY_TYPE_TIMESTAMP:
for (uint32_t i = 0; i < queryCount; i++) {
emit_query_pc_availability(cmd_buffer,
anv_query_address(pool, firstQuery + i),
@@ -733,6 +732,23 @@ void genX(CmdResetQueryPool)(
}
break;
+ case VK_QUERY_TYPE_TIMESTAMP: {
+ for (uint32_t i = 0; i < queryCount; i++) {
+ emit_query_pc_availability(cmd_buffer,
+ anv_query_address(pool, firstQuery + i),
+ false);
+ }
+
+ /* Add a CS stall here to make sure the PIPE_CONTROL above has
+ * completed. Otherwise some timestamps written later with MI_STORE_*
+ * commands might race with the PIPE_CONTROL in the loop above.
+ */
+ anv_add_pending_pipe_bits(cmd_buffer, ANV_PIPE_CS_STALL_BIT,
+ "vkCmdResetQueryPool of timestamps");
+ genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
+ break;
+ }
+
case VK_QUERY_TYPE_PIPELINE_STATISTICS:
case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT: {
struct mi_builder b;
@@ -1246,6 +1262,7 @@ void genX(CmdWriteTimestamp2KHR)(
if (stage == VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR) {
mi_store(&b, mi_mem64(anv_address_add(query_addr, 8)),
mi_reg64(TIMESTAMP));
+ emit_query_mi_availability(&b, query_addr, true);
} else {
/* Everything else is bottom-of-pipe */
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_POST_SYNC_BIT;
@@ -1259,9 +1276,9 @@ void genX(CmdWriteTimestamp2KHR)(
if (GFX_VER == 9 && cmd_buffer->device->info.gt == 4)
pc.CommandStreamerStallEnable = true;
}
+ emit_query_pc_availability(cmd_buffer, query_addr, true);
}
- emit_query_pc_availability(cmd_buffer, query_addr, true);
/* When multiview is active the spec requires that N consecutive query
* indices are used, where N is the number of active views in the subpass.
More information about the mesa-commit
mailing list