406
409
vn_cmd_buffer_memory_barrier(cmd_handle, &dep_after, sync2);
413
vn_feedback_cmd_record_flush_barrier(VkCommandBuffer cmd_handle,
418
const VkBufferMemoryBarrier buf_flush_barrier = {
419
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
421
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
422
.dstAccessMask = VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT,
423
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
424
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
429
vn_CmdPipelineBarrier(cmd_handle, VK_PIPELINE_STAGE_TRANSFER_BIT,
430
VK_PIPELINE_STAGE_HOST_BIT, 0, 0, NULL, 1,
431
&buf_flush_barrier, 0, NULL);
410
435
vn_feedback_cmd_record(VkCommandBuffer cmd_handle,
411
436
struct vn_feedback_slot *dst_slot,
482
507
buf_size, VK_SUCCESS);
485
const VkBufferMemoryBarrier buf_barrier_after = {
486
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
488
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
489
.dstAccessMask = VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT,
490
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
491
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
492
.buffer = dst_slot->buffer,
493
.offset = dst_slot->offset,
496
vn_CmdPipelineBarrier(cmd_handle, VK_PIPELINE_STAGE_TRANSFER_BIT,
497
VK_PIPELINE_STAGE_HOST_BIT, 0, 0, NULL, 1,
498
&buf_barrier_after, 0, NULL);
510
vn_feedback_cmd_record_flush_barrier(cmd_handle, dst_slot->buffer,
511
dst_slot->offset, buf_size);
500
513
return vn_EndCommandBuffer(cmd_handle);
517
vn_feedback_query_copy_cmd_record(VkCommandBuffer cmd_handle,
518
VkQueryPool pool_handle,
522
struct vn_query_pool *pool = vn_query_pool_from_handle(pool_handle);
527
/* Results are always 64 bit and include availability bit (also 64 bit) */
528
const size_t slot_size = (pool->result_array_size * 8) + 8;
529
const size_t offset = slot_size * query;
531
/* The first synchronization scope of vkCmdCopyQueryPoolResults does not
532
* include the query feedback buffer. Insert a barrier to ensure ordering
533
* against feedback buffer fill cmd injected in vkCmdResetQueryPool.
535
const VkBufferMemoryBarrier buf_barrier_before = {
536
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
538
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
539
.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
540
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
541
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
542
.buffer = pool->feedback->buffer,
544
.size = slot_size * count,
546
vn_CmdPipelineBarrier(cmd_handle, VK_PIPELINE_STAGE_TRANSFER_BIT,
547
VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 1,
548
&buf_barrier_before, 0, NULL);
550
/* Per spec: "The first synchronization scope includes all commands
551
* which reference the queries in queryPool indicated by query that
552
* occur earlier in submission order. If flags does not include
553
* VK_QUERY_RESULT_WAIT_BIT, vkCmdEndQueryIndexedEXT,
554
* vkCmdWriteTimestamp2, vkCmdEndQuery, and vkCmdWriteTimestamp are
555
* excluded from this scope."
557
* Set VK_QUERY_RESULT_WAIT_BIT to ensure ordering after
558
* vkCmdEndQuery or vkCmdWriteTimestamp makes the query available.
560
* Set VK_QUERY_RESULT_64_BIT as we can convert it to 32 bit if app
563
vn_CmdCopyQueryPoolResults(cmd_handle, pool_handle, query, count,
564
pool->feedback->buffer, offset, slot_size,
565
VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
566
VK_QUERY_RESULT_64_BIT |
567
VK_QUERY_RESULT_WAIT_BIT);
569
/* Per spec: "vkCmdCopyQueryPoolResults is considered to be a transfer
570
* operation, and its writes to buffer memory must be synchronized using
571
* VK_PIPELINE_STAGE_TRANSFER_BIT and VK_ACCESS_TRANSFER_WRITE_BIT
572
* before using the results."
574
vn_feedback_cmd_record_flush_barrier(cmd_handle, pool->feedback->buffer,
575
offset, slot_size * count);
579
vn_feedback_query_reset_cmd_record(VkCommandBuffer cmd_handle,
580
VkQueryPool pool_handle,
581
uint32_t first_query,
584
struct vn_query_pool *pool = vn_query_pool_from_handle(pool_handle);
589
/* Results are always 64 bit and include availability bit (also 64 bit) */
590
const size_t slot_size = (pool->result_array_size * 8) + 8;
591
const size_t offset = slot_size * first_query;
593
const VkBufferMemoryBarrier buf_barrier_before = {
594
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
596
.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
597
.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
598
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
599
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
600
.buffer = pool->feedback->buffer,
602
.size = slot_size * count,
605
vn_CmdPipelineBarrier(cmd_handle, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
606
VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 1,
607
&buf_barrier_before, 0, NULL);
609
vn_CmdFillBuffer(cmd_handle, pool->feedback->buffer, offset,
610
slot_size * count, 0);
612
vn_feedback_cmd_record_flush_barrier(cmd_handle, pool->feedback->buffer,
613
offset, slot_size * count);
504
617
vn_feedback_cmd_alloc(VkDevice dev_handle,
505
618
struct vn_feedback_cmd_pool *pool,