diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c
index e2431e0b789..ebd2787fd24 100644
--- a/src/amd/vulkan/radv_instance.c
+++ b/src/amd/vulkan/radv_instance.c
@@ -144,6 +144,7 @@ static const driOptionDescription radv_dri_options[] = {
DRI_CONF_RADV_ENABLE_UNIFIED_HEAP_ON_APU(false)
DRI_CONF_RADV_TEX_NON_UNIFORM(false)
DRI_CONF_RADV_RT(false)
+ DRI_CONF_RADV_FLUSH_BEFORE_TIMESTAMP_WRITE(false)
DRI_CONF_RADV_APP_LAYER()
DRI_CONF_SECTION_END
};
@@ -202,6 +203,9 @@ radv_init_dri_options(struct radv_instance *instance)
instance->tex_non_uniform = driQueryOptionb(&instance->dri_options, "radv_tex_non_uniform");
instance->app_layer = driQueryOptionstr(&instance->dri_options, "radv_app_layer");
+
+ instance->flush_before_timestamp_write =
+ driQueryOptionb(&instance->dri_options, "radv_flush_before_timestamp_write");
}
static const struct vk_instance_extension_table radv_instance_extensions_supported = {
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 4d36407e18a..fb4a6a347eb 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -413,6 +413,7 @@ struct radv_instance {
bool flush_before_query_copy;
bool enable_unified_heap_on_apu;
bool tex_non_uniform;
+ bool flush_before_timestamp_write;
char *app_layer;
};
diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
index 801f958a108..144b4a0c5af 100644
--- a/src/amd/vulkan/radv_query.c
+++ b/src/amd/vulkan/radv_query.c
@@ -2145,6 +2145,11 @@ radv_CmdWriteTimestamp2(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 sta
radv_cs_add_buffer(cmd_buffer->device->ws, cs, pool->bo);
+ if (cmd_buffer->device->instance->flush_before_timestamp_write) {
+ /* Make sure previously launched waves have finished */
+ cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_PS_PARTIAL_FLUSH | RADV_CMD_FLAG_CS_PARTIAL_FLUSH;
+ }
+
si_emit_cache_flush(cmd_buffer);
int num_queries = 1;
diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf
index b7cf2c23217..f127955f515 100644
--- a/src/util/00-radv-defaults.conf
+++ b/src/util/00-radv-defaults.conf
@@ -54,6 +54,7 @@ Application bugs worked around in this file:
+
diff --git a/src/util/driconf.h b/src/util/driconf.h
index f1d0a890d90..ea8976a224c 100644
--- a/src/util/driconf.h
+++ b/src/util/driconf.h
@@ -627,6 +627,10 @@
DRI_CONF_OPT_B(radv_rt, def, \
"Expose support for VK_KHR_ray_tracing_pipeline")
+#define DRI_CONF_RADV_FLUSH_BEFORE_TIMESTAMP_WRITE(def) \
+ DRI_CONF_OPT_B(radv_flush_before_timestamp_write, def, \
+ "Wait for previous commands to finish before writing timestamps")
+
#define DRI_CONF_RADV_APP_LAYER() DRI_CONF_OPT_S_NODEF(radv_app_layer, "Select an application layer.")
/**