diff --git a/src/Magnum/Vk/CommandBuffer.h b/src/Magnum/Vk/CommandBuffer.h index 32d26e3a9..328bebacd 100644 --- a/src/Magnum/Vk/CommandBuffer.h +++ b/src/Magnum/Vk/CommandBuffer.h @@ -358,7 +358,7 @@ class MAGNUM_VK_EXPORT CommandBuffer { #endif /** - * @brief Insert a memory dependency + * @brief Insert an execution barrier with optional memory dependencies * @param sourceStages Source stages. Has to contain at least * one stage. * @param destinationStages Destination stages. Has to contain at @@ -395,6 +395,18 @@ class MAGNUM_VK_EXPORT CommandBuffer { /** @overload */ CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, std::initializer_list memoryBarriers, std::initializer_list bufferMemoryBarriers, std::initializer_list imageMemoryBarriers, DependencyFlags dependencyFlags = {}); + /** + * @brief Insert an execution barrier without memory dependencies + * @return Reference to self (for method chaining) + * + * Equivalent to calling @ref pipelineBarrier(PipelineStages, PipelineStages, Containers::ArrayView, Containers::ArrayView, Containers::ArrayView, DependencyFlags) + * with empty @p memoryBarriers, @p bufferBarriers and + * @p imageBarriers. Useful when an execution barrier is enough, for + * example when you need reads from one stage to finish before another + * stage starts writing to the same location. + */ + CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, DependencyFlags dependencyFlags = {}); + /** * @brief Insert a global memory dependency * @return Reference to self (for method chaining) diff --git a/src/Magnum/Vk/Pipeline.cpp b/src/Magnum/Vk/Pipeline.cpp index d3b749fac..52f18a037 100644 --- a/src/Magnum/Vk/Pipeline.cpp +++ b/src/Magnum/Vk/Pipeline.cpp @@ -101,6 +101,10 @@ CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, return pipelineBarrier(sourceStages, destinationStages, Containers::arrayView(memoryBarriers), Containers::arrayView(bufferMemoryBarriers), Containers::arrayView(imageMemoryBarriers), dependencyFlags); } +CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, const PipelineStages destinationStages, const DependencyFlags dependencyFlags) { + return pipelineBarrier(sourceStages, destinationStages, {}, {}, {}, dependencyFlags); +} + CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, const PipelineStages destinationStages, const Containers::ArrayView memoryBarriers, const DependencyFlags dependencyFlags) { return pipelineBarrier(sourceStages, destinationStages, memoryBarriers, {}, {}, dependencyFlags); } diff --git a/src/Magnum/Vk/Test/PipelineVkTest.cpp b/src/Magnum/Vk/Test/PipelineVkTest.cpp index e27e91d8f..32a73c9ba 100644 --- a/src/Magnum/Vk/Test/PipelineVkTest.cpp +++ b/src/Magnum/Vk/Test/PipelineVkTest.cpp @@ -38,16 +38,18 @@ struct PipelineVkTest: VulkanTester { explicit PipelineVkTest(); void pipelineBarrier(); - void pipelineBarrierGeneral(); - void pipelineBarrierBuffer(); - void pipelineBarrierImage(); + void pipelineBarrierExecutionOnly(); + void pipelineBarrierGlobalMemory(); + void pipelineBarrierBufferMemory(); + void pipelineBarrierImageMemory(); }; PipelineVkTest::PipelineVkTest() { addTests({&PipelineVkTest::pipelineBarrier, - &PipelineVkTest::pipelineBarrierGeneral, - &PipelineVkTest::pipelineBarrierBuffer, - &PipelineVkTest::pipelineBarrierImage}); + &PipelineVkTest::pipelineBarrierExecutionOnly, + &PipelineVkTest::pipelineBarrierGlobalMemory, + &PipelineVkTest::pipelineBarrierBufferMemory, + &PipelineVkTest::pipelineBarrierImageMemory}); } void PipelineVkTest::pipelineBarrier() { @@ -79,7 +81,22 @@ void PipelineVkTest::pipelineBarrier() { CORRADE_VERIFY(true); } -void PipelineVkTest::pipelineBarrierGeneral() { +void PipelineVkTest::pipelineBarrierExecutionOnly() { + CommandPool pool{device(), CommandPoolCreateInfo{ + device().properties().pickQueueFamily(QueueFlag::Graphics)}}; + + /* A subset of the above, just to test the convenience overloads */ + + pool.allocate() + .begin() + .pipelineBarrier(PipelineStage::Transfer, PipelineStage::Host) + .end(); + + /* Does not do anything visible, so just test that it didn't blow up */ + CORRADE_VERIFY(true); +} + +void PipelineVkTest::pipelineBarrierGlobalMemory() { CommandPool pool{device(), CommandPoolCreateInfo{ device().properties().pickQueueFamily(QueueFlag::Graphics)}}; @@ -96,7 +113,7 @@ void PipelineVkTest::pipelineBarrierGeneral() { CORRADE_VERIFY(true); } -void PipelineVkTest::pipelineBarrierBuffer() { +void PipelineVkTest::pipelineBarrierBufferMemory() { CommandPool pool{device(), CommandPoolCreateInfo{ device().properties().pickQueueFamily(QueueFlag::Graphics)}}; @@ -115,7 +132,7 @@ void PipelineVkTest::pipelineBarrierBuffer() { CORRADE_VERIFY(true); } -void PipelineVkTest::pipelineBarrierImage() { +void PipelineVkTest::pipelineBarrierImageMemory() { CommandPool pool{device(), CommandPoolCreateInfo{ device().properties().pickQueueFamily(QueueFlag::Graphics)}};