Fix buffer RAW hazards in MultiQueue synchronization tests
The MultiQueue tests emit barriers between command buffers for two reasons:
1. To express the data dependencies between different pipeline stages.
2. To transfer ownership of the resource between queue families.
The exclusive sharing mode tests need both of these barriers, while the
concurrent mode tests only need to describe the data dependency.
Previously, a barrier was only emitted for the exclusive tests, causing
the concurrent tests to not have a barrier expressing the data dependencies
between the pipeline stages. Now the data dependencies are described for
both the exlusive and concurrent tests, while the ownership transfer is
only performed for exclusive tests.
Affects: dEQP-VK.synchronization.op.multi_queue.*.write_*_read_*.buffer_*
Components: Vulkan
VK-GL-CTS issue: 1650
Change-Id: Ic3bc83a7dcab8686754aea5267afeb10090038d0
(cherry picked from commit 93dc8a343c7ea67a2c8ffb694b45ff44703fbe6f)
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp
index 5e13fca..8f97897 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp
@@ -252,22 +252,17 @@
0u, (const VkBufferMemoryBarrier*)DE_NULL, 1u, &barrier);
}
}
- else if ((resource.getType() == RESOURCE_TYPE_BUFFER || isIndirectBuffer(resource.getType())) &&
- writeFamily != readFamily &&
- VK_SHARING_MODE_EXCLUSIVE == sharingMode)
+ else if (resource.getType() == RESOURCE_TYPE_BUFFER || isIndirectBuffer(resource.getType()))
{
- const VkBufferMemoryBarrier barrier =
+ VkBufferMemoryBarrier barrier = makeBufferMemoryBarrier(secondQueue ? 0u : writeSync.accessMask, !secondQueue ? 0u : readSync.accessMask,
+ resource.getBuffer().handle, resource.getBuffer().offset, resource.getBuffer().size);
+
+ if (writeFamily != readFamily && VK_SHARING_MODE_EXCLUSIVE == sharingMode)
{
- VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- secondQueue ? 0u : writeSync.accessMask , // VkAccessFlags srcAccessMask;
- !secondQueue ? 0u : readSync.accessMask, // VkAccessFlags dstAccessMask;
- writeFamily, // deUint32 srcQueueFamilyIndex;
- readFamily, // deUint32 destQueueFamilyIndex;
- resource.getBuffer().handle, // VkBuffer buffer;
- resource.getBuffer().offset, // VkDeviceSize offset;
- resource.getBuffer().size, // VkDeviceSize size;
- };
+ barrier.srcQueueFamilyIndex = writeFamily;
+ barrier.dstQueueFamilyIndex = readFamily;
+ }
+
vk.cmdPipelineBarrier(cmdBuffer, secondQueue ? VkPipelineStageFlags(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) : writeSync.stageMask, !secondQueue ? VkPipelineStageFlags(VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) : readSync.stageMask, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 1u, (const VkBufferMemoryBarrier*)&barrier, 0u, (const VkImageMemoryBarrier *)DE_NULL);
}
}