mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-02 13:50:09 +01:00
venus: add query pool feedback cmds
Add feedback commands to write query results into a coherent buffer to optimize out roundtrip vkGetQueryPoolResults that poll until a result is available. Queries are available after vkCmdEndQuery or vkCmdWriteTimeStamp, so append a vkCmdCopyQueryPoolResults to copy to query results to our coherent buffer. The coherent buffer also needs to be cleared after vkCmdResetQueryPool so append vkCmdFillBuffer. Signed-off-by: Juston Li <justonli@google.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23348>
This commit is contained in:
parent
5d88a3db8b
commit
de4593faa1
3 changed files with 99 additions and 0 deletions
|
|
@ -8,6 +8,7 @@
|
|||
#include "vn_command_buffer.h"
|
||||
#include "vn_device.h"
|
||||
#include "vn_physical_device.h"
|
||||
#include "vn_query_pool.h"
|
||||
#include "vn_queue.h"
|
||||
|
||||
static uint32_t
|
||||
|
|
@ -512,6 +513,87 @@ vn_feedback_cmd_record(VkCommandBuffer cmd_handle,
|
|||
return vn_EndCommandBuffer(cmd_handle);
|
||||
}
|
||||
|
||||
void
|
||||
vn_feedback_query_copy_cmd_record(VkCommandBuffer cmd_handle,
|
||||
VkQueryPool pool_handle,
|
||||
uint32_t query,
|
||||
uint32_t count)
|
||||
{
|
||||
struct vn_query_pool *pool = vn_query_pool_from_handle(pool_handle);
|
||||
|
||||
if (!pool->feedback)
|
||||
return;
|
||||
|
||||
/* Results are always 64 bit and include availability bit (also 64 bit) */
|
||||
const size_t slot_size = (pool->result_array_size * 8) + 8;
|
||||
const size_t offset = slot_size * query;
|
||||
|
||||
/* Per spec: "The first synchronization scope includes all commands
|
||||
* which reference the queries in queryPool indicated by query that
|
||||
* occur earlier in submission order. If flags does not include
|
||||
* VK_QUERY_RESULT_WAIT_BIT, vkCmdEndQueryIndexedEXT,
|
||||
* vkCmdWriteTimestamp2, vkCmdEndQuery, and vkCmdWriteTimestamp are
|
||||
* excluded from this scope."
|
||||
*
|
||||
* Set VK_QUERY_RESULT_WAIT_BIT to ensure ordering after
|
||||
* vkCmdEndQuery or vkCmdWriteTimestamp makes the query available.
|
||||
*
|
||||
* Set VK_QUERY_RESULT_64_BIT as we can convert it to 32 bit if app
|
||||
* requested that.
|
||||
*/
|
||||
vn_CmdCopyQueryPoolResults(cmd_handle, pool_handle, query, count,
|
||||
pool->feedback->buffer, offset, slot_size,
|
||||
VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
|
||||
VK_QUERY_RESULT_64_BIT |
|
||||
VK_QUERY_RESULT_WAIT_BIT);
|
||||
|
||||
/* Per spec: "vkCmdCopyQueryPoolResults is considered to be a transfer
|
||||
* operation, and its writes to buffer memory must be synchronized using
|
||||
* VK_PIPELINE_STAGE_TRANSFER_BIT and VK_ACCESS_TRANSFER_WRITE_BIT
|
||||
* before using the results."
|
||||
*/
|
||||
vn_feedback_cmd_record_flush_barrier(cmd_handle, pool->feedback->buffer,
|
||||
offset, slot_size * count);
|
||||
}
|
||||
|
||||
void
|
||||
vn_feedback_query_reset_cmd_record(VkCommandBuffer cmd_handle,
|
||||
VkQueryPool pool_handle,
|
||||
uint32_t first_query,
|
||||
uint32_t count)
|
||||
{
|
||||
struct vn_query_pool *pool = vn_query_pool_from_handle(pool_handle);
|
||||
|
||||
if (!pool->feedback)
|
||||
return;
|
||||
|
||||
/* Results are always 64 bit and include availability bit (also 64 bit) */
|
||||
const size_t slot_size = (pool->result_array_size * 8) + 8;
|
||||
const size_t offset = slot_size * first_query;
|
||||
|
||||
const VkBufferMemoryBarrier buf_barrier_before = {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
||||
.pNext = NULL,
|
||||
.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
|
||||
.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.buffer = pool->feedback->buffer,
|
||||
.offset = offset,
|
||||
.size = slot_size * count,
|
||||
};
|
||||
|
||||
vn_CmdPipelineBarrier(cmd_handle, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 1,
|
||||
&buf_barrier_before, 0, NULL);
|
||||
|
||||
vn_CmdFillBuffer(cmd_handle, pool->feedback->buffer, offset,
|
||||
slot_size * count, 0);
|
||||
|
||||
vn_feedback_cmd_record_flush_barrier(cmd_handle, pool->feedback->buffer,
|
||||
offset, slot_size * count);
|
||||
}
|
||||
|
||||
VkResult
|
||||
vn_feedback_cmd_alloc(VkDevice dev_handle,
|
||||
struct vn_feedback_cmd_pool *pool,
|
||||
|
|
|
|||
|
|
@ -135,6 +135,19 @@ vn_feedback_event_cmd_record(VkCommandBuffer cmd_handle,
|
|||
VkPipelineStageFlags2 src_stage_mask,
|
||||
VkResult status,
|
||||
bool sync2);
|
||||
|
||||
void
|
||||
vn_feedback_query_copy_cmd_record(VkCommandBuffer commandBuffer,
|
||||
VkQueryPool queryPool,
|
||||
uint32_t query,
|
||||
uint32_t queryCount);
|
||||
|
||||
void
|
||||
vn_feedback_query_reset_cmd_record(VkCommandBuffer commandBuffer,
|
||||
VkQueryPool queryPool,
|
||||
uint32_t query,
|
||||
uint32_t queryCount);
|
||||
|
||||
VkResult
|
||||
vn_feedback_cmd_alloc(VkDevice dev_handle,
|
||||
struct vn_feedback_cmd_pool *pool,
|
||||
|
|
|
|||
|
|
@ -13,10 +13,14 @@
|
|||
|
||||
#include "vn_common.h"
|
||||
|
||||
struct vn_feedback_buffer;
|
||||
|
||||
struct vn_query_pool {
|
||||
struct vn_object_base base;
|
||||
|
||||
VkAllocationCallbacks allocator;
|
||||
|
||||
struct vn_feedback_buffer *feedback;
|
||||
uint32_t result_array_size;
|
||||
};
|
||||
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_query_pool,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue