diff --git a/.pick_status.json b/.pick_status.json
index 9ce8b2fac91..7fdcf339fcd 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -886,7 +886,7 @@
"description": "radv: Implement radv_flush_before_query_copy to workaround UE Vulkan bugs.",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": null
},
diff --git a/src/amd/vulkan/00-radv-defaults.conf b/src/amd/vulkan/00-radv-defaults.conf
index b6584a1c4cb..c095d06f814 100644
--- a/src/amd/vulkan/00-radv-defaults.conf
+++ b/src/amd/vulkan/00-radv-defaults.conf
@@ -52,6 +52,10 @@ Application bugs worked around in this file:
+
+
+
+
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 29b9e2371b0..4077981fa6d 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -1038,6 +1038,7 @@ static const driOptionDescription radv_dri_options[] = {
DRI_CONF_RADV_DISABLE_ANISO_SINGLE_LEVEL(false)
DRI_CONF_RADV_DISABLE_SINKING_LOAD_INPUT_FS(false)
DRI_CONF_RADV_DGC(false)
+ DRI_CONF_RADV_FLUSH_BEFORE_QUERY_COPY(false)
DRI_CONF_SECTION_END
};
// clang-format on
@@ -1086,6 +1087,9 @@ radv_init_dri_options(struct radv_instance *instance)
instance->disable_sinking_load_input_fs =
driQueryOptionb(&instance->dri_options, "radv_disable_sinking_load_input_fs");
+
+ instance->flush_before_query_copy =
+ driQueryOptionb(&instance->dri_options, "radv_flush_before_query_copy");
}
VKAPI_ATTR VkResult VKAPI_CALL
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index caf2bbadab0..f664aad423b 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -370,6 +370,7 @@ struct radv_instance {
bool disable_aniso_single_level;
bool zero_vram;
bool disable_sinking_load_input_fs;
+ bool flush_before_query_copy;
};
VkResult radv_init_wsi(struct radv_physical_device *physical_device);
diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
index 229a640d295..6fea696b1f6 100644
--- a/src/amd/vulkan/radv_query.c
+++ b/src/amd/vulkan/radv_query.c
@@ -1501,6 +1501,12 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo
radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, pool->bo);
radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, dst_buffer->bo);
+ /* Workaround engines that forget to properly specify WAIT_BIT because some driver implicitly
+ * synchronizes before query copy.
+ */
+ if (cmd_buffer->device->instance->flush_before_query_copy)
+ cmd_buffer->state.flush_bits |= cmd_buffer->active_query_flush_bits;
+
/* From the Vulkan spec 1.1.108:
*
* "vkCmdCopyQueryPoolResults is guaranteed to see the effect of
diff --git a/src/util/driconf.h b/src/util/driconf.h
index 1b59743f1d1..df619ad22d5 100644
--- a/src/util/driconf.h
+++ b/src/util/driconf.h
@@ -582,6 +582,11 @@
DRI_CONF_OPT_B(radv_dgc, def, \
"Expose an experimental implementation of VK_NV_device_generated_commands")
+#define DRI_CONF_RADV_FLUSH_BEFORE_QUERY_COPY(def) \
+ DRI_CONF_OPT_B( \
+ radv_flush_before_query_copy, def, \
+ "Wait for timestamps to be written before a query copy command")
+
/**
* \brief ANV specific configuration options
*/