@@ -3374,6 +3374,69 @@ TEST_F(NegativeSyncVal, CmdQuery) {
33743374 // TODO:CmdWriteTimestamp
33753375}
33763376
3377+ TEST_F (NegativeSyncVal, ReadAfterCopyQueryPoolResults) {
3378+ TEST_DESCRIPTION (" Read the last query result in a later command buffer without synchronization" );
3379+ RETURN_IF_SKIP (InitSyncVal ());
3380+ if (!m_device->Physical ().limits_ .timestampComputeAndGraphics ) {
3381+ GTEST_SKIP () << " Timestamps not supported" ;
3382+ }
3383+
3384+ vkt::QueryPool query_pool (*m_device, VK_QUERY_TYPE_TIMESTAMP , 2 );
3385+ vkt::Buffer results (*m_device, 64 , VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT );
3386+ vkt::Buffer dst (*m_device, 4 , VK_BUFFER_USAGE_TRANSFER_DST_BIT );
3387+
3388+ m_command_buffer.Begin ();
3389+ vk::CmdResetQueryPool (m_command_buffer, query_pool, 0 , 2 );
3390+ vk::CmdWriteTimestamp (m_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT , query_pool, 0 );
3391+ vk::CmdWriteTimestamp (m_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT , query_pool, 1 );
3392+ vk::CmdCopyQueryPoolResults (m_command_buffer, query_pool, 0 , 2 , results, 16 /* offset */ , 16 /* stride */ ,
3393+ VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT );
3394+ m_command_buffer.End ();
3395+
3396+ // The second result occupies [32, 40). Read its upper four bytes
3397+ VkBufferCopy region{};
3398+ region.srcOffset = 36 ;
3399+ region.dstOffset = 0 ;
3400+ region.size = 4 ;
3401+
3402+ vkt::CommandBuffer read_cb (*m_device, m_command_pool);
3403+ read_cb.Begin ();
3404+ vk::CmdCopyBuffer (read_cb, results, dst, 1 , ®ion);
3405+ read_cb.End ();
3406+
3407+ m_errorMonitor->SetDesiredError (" SYNC-HAZARD-READ-AFTER-WRITE" );
3408+ m_default_queue->Submit ({m_command_buffer, read_cb});
3409+ m_errorMonitor->VerifyFound ();
3410+ m_default_queue->Wait ();
3411+ }
3412+
3413+ TEST_F (NegativeSyncVal, CopyQueryPoolResultsAfterWrite) {
3414+ TEST_DESCRIPTION (" Copy a query result over a buffer write from another command buffer" );
3415+ RETURN_IF_SKIP (InitSyncVal ());
3416+ if (!m_device->Physical ().limits_ .timestampComputeAndGraphics ) {
3417+ GTEST_SKIP () << " Timestamps not supported" ;
3418+ }
3419+
3420+ vkt::QueryPool query_pool (*m_device, VK_QUERY_TYPE_TIMESTAMP , 1 );
3421+ vkt::Buffer results (*m_device, 4 , VK_BUFFER_USAGE_TRANSFER_DST_BIT );
3422+
3423+ m_command_buffer.Begin ();
3424+ vk::CmdFillBuffer (m_command_buffer, results, 0 , 4 , 0 );
3425+ m_command_buffer.End ();
3426+
3427+ vkt::CommandBuffer query_cb (*m_device, m_command_pool);
3428+ query_cb.Begin ();
3429+ vk::CmdResetQueryPool (query_cb, query_pool, 0 , 1 );
3430+ vk::CmdWriteTimestamp (query_cb, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT , query_pool, 0 );
3431+ vk::CmdCopyQueryPoolResults (query_cb, query_pool, 0 , 1 , results, 0 , 4 , VK_QUERY_RESULT_WAIT_BIT );
3432+ query_cb.End ();
3433+
3434+ m_errorMonitor->SetDesiredError (" SYNC-HAZARD-WRITE-AFTER-WRITE" );
3435+ m_default_queue->Submit ({m_command_buffer, query_cb});
3436+ m_errorMonitor->VerifyFound ();
3437+ m_default_queue->Wait ();
3438+ }
3439+
33773440TEST_F (NegativeSyncVal, CmdDrawDepthStencil) {
33783441 RETURN_IF_SKIP (InitSyncValFramework ());
33793442 RETURN_IF_SKIP (InitState ());
0 commit comments