Skip to content

Instantly share code, notes, and snippets.

@thevaber
Last active January 25, 2024 20:36
Show Gist options
  • Save thevaber/9ebe2d371e5e2ef134bba60fd6aed750 to your computer and use it in GitHub Desktop.
Save thevaber/9ebe2d371e5e2ef134bba60fd6aed750 to your computer and use it in GitHub Desktop.
/* The validation error message:
Validation Error: [ SYNC-HAZARD-WRITE-RACING-WRITE ] Object 0: handle = 0x29862255390, name = Upload 0, type = VK_OBJECT_TYPE_QUEUE; | MessageID = 0x743c6069 | vkQueueSubmit2KHR():
Hazard WRITE_RACING_WRITE for entry 0, VkCommandBuffer 0x2986403e690[],
Submitted access info (submitted_usage: SYNC_COPY_TRANSFER_WRITE, command: vkCmdCopyBufferToImage, seq_no: 1, reset_no: 1).
Access info (prior_usage: SYNC_IMAGE_LAYOUT_TRANSITION, write_barriers: SYNC_HOST_HOST_READ|SYNC_HOST_HOST_WRITE|SYNC_ACCELERATION_STRUCTURE_COPY_ACCELERATION_STRUCTURE_READ|SYNC_ACCELERATION_STRUCTURE_COPY_ACCELERATION_STRUCTURE_WRITE|SYNC_ACCELERATION_STRUCTURE_COPY_TRANSFER_READ|SYNC_ACCELERATION_STRUCTURE_COPY_TRANSFER_WRITE|SYNC_COPY_TRANSFER_READ|SYNC_COPY_TRANSFER_WRITE|SYNC_RESOLVE_TRANSFER_READ|SYNC_RESOLVE_TRANSFER_WRITE|SYNC_BLIT_TRANSFER_READ|SYNC_BLIT_TRANSFER_WRITE|SYNC_CLEAR_TRANSFER_WRITE,
queue: VkQueue 0x29862255390[Upload 0], submit: 0, batch: 0, batch_tag: 1, command: vkCmdPipelineBarrier2KHR, command_buffer: VkCommandBuffer 0x2986403b390[], seq_no: 1, VkImage 0x51820000000007b[], reset_no: 1).
*/
VkSemaphore semaphore = fresh binary semaphore;
//// image layout transition in queue A
VkCommandBuffer cmd_a = begin command buffer;
vkCmdPipelineBarrier2KHR(cmd_a, &(VkDependencyInfo) {
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
.imageMemoryBarrierCount = 1,
.pImageMemoryBarriers = &(VkImageMemoryBarrier2) {
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
.srcStageMask = VK_PIPELINE_STAGE_2_NONE,
.srcAccessMask = VK_ACCESS_2_NONE,
.dstStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT,
.dstAccessMask = VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR,
.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED,
.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
.image = image,
.subresourceRange = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.levelCount = 1,
.layerCount = 1,
},
},
});
vkEndCommandBuffer(cmd_a);
vkQueueSubmit2KHR(queue_a, 1, &(VkSubmitInfo2) {
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
.commandBufferInfoCount = 1,
.pCommandBufferInfos = &(VkCommandBufferSubmitInfo) {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
.commandBuffer = cmd_a,
},
.signalSemaphoreInfoCount = 1,
.pSignalSemaphoreInfos = &(VkSemaphoreSubmitInfo) {
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
.semaphore = semaphore,
.stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
},
}, NULL);
//// nothing in queue B, but waiting for binary semaphore of the first queue submit
// if this submit is missing, or if it happens after the second queue A submit, or if this submit doesn't wait for the semaphore, then the validation error does not happen
VkCommandBuffer cmd_b = begin command buffer;
vkEndCommandBuffer(cmd_b); // no commands at all
vkQueueSubmit2KHR(queue_B, 1, &(VkSubmitInfo2) {
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
.commandBufferInfoCount = 1,
.pCommandBufferInfos = &(VkCommandBufferSubmitInfo) {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
.commandBuffer = cmd_b,
},
.waitSemaphoreInfoCount = 1,
.pWaitSemaphoreInfos = &(VkSemaphoreSubmitInfo) {
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
.semaphore = semaphore,
.stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
},
}, NULL);
//// copy buffer to image in queue A
VkCommandBuffer cmd_c = begin command buffer;
vkCmdCopyBufferToImage(cmd_c, src_buffer, images[0]->image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1, &(VkBufferImageCopy) {
.bufferRowLength = 1024,
.bufferImageHeight = 1024,
.imageSubresource = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.layerCount = 1,
},
.imageExtent = {
.width = 1024,
.height = 1024,
.depth = 1,
},
});
vkEndCommandBuffer(cmd_c);
vkQueueSubmit2KHR(queue_a, 1, &(VkSubmitInfo2) {
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
.commandBufferInfoCount = 1,
.pCommandBufferInfos = &(VkCommandBufferSubmitInfo) {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
.commandBuffer = cmd_c,
},
}, NULL);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment