mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 06:48:06 +02:00
radv: flush pending query reset caches before copying results
From the Vulkan spec 1.1.108:
"vkCmdCopyQueryPoolResults is guaranteed to see the effect of
previous uses of vkCmdResetQueryPool in the same queue, without any
additional synchronization."
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
91672becc3
commit
445098916a
1 changed files with 25 additions and 15 deletions
|
|
@ -1272,6 +1272,21 @@ VkResult radv_GetQueryPoolResults(
|
|||
return result;
|
||||
}
|
||||
|
||||
static void emit_query_flush(struct radv_cmd_buffer *cmd_buffer,
|
||||
struct radv_query_pool *pool)
|
||||
{
|
||||
if (cmd_buffer->pending_reset_query) {
|
||||
if (pool->size >= RADV_BUFFER_OPS_CS_THRESHOLD) {
|
||||
/* Only need to flush caches if the query pool size is
|
||||
* large enough to be resetted using the compute shader
|
||||
* path. Small pools don't need any cache flushes
|
||||
* because we use a CP dma clear.
|
||||
*/
|
||||
si_emit_cache_flush(cmd_buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void radv_CmdCopyQueryPoolResults(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkQueryPool queryPool,
|
||||
|
|
@ -1294,6 +1309,16 @@ void radv_CmdCopyQueryPoolResults(
|
|||
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);
|
||||
|
||||
/* From the Vulkan spec 1.1.108:
|
||||
*
|
||||
* "vkCmdCopyQueryPoolResults is guaranteed to see the effect of
|
||||
* previous uses of vkCmdResetQueryPool in the same queue, without any
|
||||
* additional synchronization."
|
||||
*
|
||||
* So, we have to flush the caches if the compute shader path was used.
|
||||
*/
|
||||
emit_query_flush(cmd_buffer, pool);
|
||||
|
||||
switch (pool->type) {
|
||||
case VK_QUERY_TYPE_OCCLUSION:
|
||||
if (flags & VK_QUERY_RESULT_WAIT_BIT) {
|
||||
|
|
@ -1475,21 +1500,6 @@ static unsigned event_type_for_stream(unsigned stream)
|
|||
}
|
||||
}
|
||||
|
||||
static void emit_query_flush(struct radv_cmd_buffer *cmd_buffer,
|
||||
struct radv_query_pool *pool)
|
||||
{
|
||||
if (cmd_buffer->pending_reset_query) {
|
||||
if (pool->size >= RADV_BUFFER_OPS_CS_THRESHOLD) {
|
||||
/* Only need to flush caches if the query pool size is
|
||||
* large enough to be resetted using the compute shader
|
||||
* path. Small pools don't need any cache flushes
|
||||
* because we use a CP dma clear.
|
||||
*/
|
||||
si_emit_cache_flush(cmd_buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void emit_begin_query(struct radv_cmd_buffer *cmd_buffer,
|
||||
uint64_t va,
|
||||
VkQueryType query_type,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue