MCPcopy Create free account
hub / github.com/KhronosGroup/Vulkan-ValidationLayers / TEST_F

Function TEST_F

tests/unit/sync_val.cpp:22–76  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

20class NegativeSyncVal : public VkSyncValTest {};
21
22TEST_F(NegativeSyncVal, BufferCopy) {
23 TEST_DESCRIPTION("Hazards caused by buffer copy commands");
24 RETURN_IF_SKIP(InitSyncVal());
25
26 const VkBufferUsageFlags usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
27 vkt::Buffer buffer_a(*m_device, 256, usage);
28 vkt::Buffer buffer_b(*m_device, 256, usage);
29 vkt::Buffer buffer_c(*m_device, 256, usage);
30
31 m_command_buffer.Begin();
32 m_command_buffer.Copy(buffer_a, buffer_b);
33 m_errorMonitor->SetDesiredError("SYNC-HAZARD-WRITE-AFTER-READ");
34 m_command_buffer.Copy(buffer_c, buffer_a);
35 m_errorMonitor->VerifyFound();
36
37 // Sync with buffer_a from the first copy (a->b). The second copy caused error and has no effect
38 VkBufferMemoryBarrier buffer_barrier = vku::InitStructHelper();
39 buffer_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
40 buffer_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
41 buffer_barrier.buffer = buffer_a;
42 buffer_barrier.size = 256;
43 vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1,
44 &buffer_barrier, 0, nullptr);
45
46 // Write to buffer_a is protected by the above barrier
47 m_command_buffer.Copy(buffer_c, buffer_a);
48
49 // Cause WAW by writing buffer_a again
50 m_errorMonitor->SetDesiredError("SYNC-HAZARD-WRITE-AFTER-WRITE");
51 m_command_buffer.Copy(buffer_c, buffer_a);
52 m_errorMonitor->VerifyFound();
53
54 // buffer_b was not protected by the above barrier
55 m_errorMonitor->SetDesiredError("SYNC-HAZARD-WRITE-AFTER-WRITE");
56 m_command_buffer.Copy(buffer_c, buffer_b);
57 m_errorMonitor->VerifyFound();
58
59 // Use global barrier to protect buffer_b write
60 VkMemoryBarrier mem_barrier = vku::InitStructHelper();
61 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
62 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
63 vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0,
64 nullptr, 0, nullptr);
65 m_command_buffer.Copy(buffer_c, buffer_b);
66
67 // Protect buffer_c READ but not buffer_b WRITE
68 m_errorMonitor->SetDesiredError("SYNC-HAZARD-READ-AFTER-WRITE");
69 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
70 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
71 vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0,
72 nullptr, 0, nullptr);
73 m_command_buffer.Copy(buffer_b, buffer_c);
74 m_errorMonitor->VerifyFound();
75 m_command_buffer.End();
76}
77
78TEST_F(NegativeSyncVal, BufferCopyWrongBarrier) {
79 TEST_DESCRIPTION("Buffer barrier does not specify proper dst stage/access");

Callers

nothing calls this directly

Calls 15

CmdPipelineBarrierFunction · 0.85
CmdExecuteCommandsFunction · 0.85
CmdCopyBufferFunction · 0.85
CmdCopyImageFunction · 0.85
CmdClearAttachmentsFunction · 0.85
CmdResolveImageFunction · 0.85
IsImageFormatSupportedFunction · 0.85
CmdCopyBufferToImageFunction · 0.85
CmdCopyImageToBufferFunction · 0.85
CmdBlitImageFunction · 0.85

Tested by

no test coverage detected