diff --git a/src/Magnum/Vk/Queue.cpp b/src/Magnum/Vk/Queue.cpp index d56cebc35..378437713 100644 --- a/src/Magnum/Vk/Queue.cpp +++ b/src/Magnum/Vk/Queue.cpp @@ -31,6 +31,7 @@ #include "Magnum/Vk/Assert.h" #include "Magnum/Vk/Device.h" +#include "Magnum/Vk/Fence.h" namespace Magnum { namespace Vk { @@ -83,6 +84,16 @@ void Queue::submit(std::initializer_list return submit(Containers::arrayView(infos), fence); } +Fence Queue::submit(const Containers::ArrayView> infos) { + Vk::Fence fence{*_device}; + submit(infos, fence); + return fence; +} + +Fence Queue::submit(const std::initializer_list> infos) { + return submit(Containers::arrayView(infos)); +} + struct SubmitInfo::State { Containers::Array commandBuffers; }; diff --git a/src/Magnum/Vk/Queue.h b/src/Magnum/Vk/Queue.h index e856e4dcf..97240bc6a 100644 --- a/src/Magnum/Vk/Queue.h +++ b/src/Magnum/Vk/Queue.h @@ -118,6 +118,24 @@ class MAGNUM_VK_EXPORT Queue { /** @overload */ void submit(std::initializer_list> infos, VkFence fence); + /** + * @brief Submit a sequence of semaphores or command buffers to a queue and return a new fence to wait on + * + * Compared to @ref submit(Containers::ArrayView>, VkFence) + * creates a new @ref Fence and returns it for a more convenient + * one-off submission. + * + * @m_class{m-note m-success} + * + * @par + * When submitting multiple times it's recommended to + * @ref Fence::reset() "reset()" an existing fence and reuse it + * instead of letting this function create a new one every time. + */ + Fence submit(Containers::ArrayView> infos); + /** @overload */ + Fence submit(std::initializer_list> infos); + private: /* Can't be a reference because of the NoCreate constructor */ Device* _device; @@ -145,6 +163,10 @@ class MAGNUM_VK_EXPORT SubmitInfo { */ explicit SubmitInfo(); + /** @todo implicit constructor taking the command buffer list directly, + needs AnyReference first because queue.submit({{a}}) would now fail + on deleted Reference(T&&) */ + /** * @brief Construct without initializing the contents * diff --git a/src/Magnum/Vk/Test/QueueVkTest.cpp b/src/Magnum/Vk/Test/QueueVkTest.cpp index 7f1d7cd27..ab3629c5d 100644 --- a/src/Magnum/Vk/Test/QueueVkTest.cpp +++ b/src/Magnum/Vk/Test/QueueVkTest.cpp @@ -41,11 +41,13 @@ struct QueueVkTest: VulkanTester { void submit(); void submitOne(); + void submitImplicitFence(); }; QueueVkTest::QueueVkTest() { addTests({&QueueVkTest::submit, - &QueueVkTest::submitOne}); + &QueueVkTest::submitOne, + &QueueVkTest::submitImplicitFence}); } void QueueVkTest::submit() { @@ -97,6 +99,18 @@ void QueueVkTest::submitOne() { CORRADE_VERIFY(fence.wait(std::chrono::milliseconds{1000})); } +void QueueVkTest::submitImplicitFence() { + CommandPool pool{device(), CommandPoolCreateInfo{ + device().properties().pickQueueFamily(QueueFlag::Graphics)}}; + + CommandBuffer a = pool.allocate(); + a.begin() + .end(); + + CORRADE_VERIFY(queue().submit({SubmitInfo{}.setCommandBuffers({a})}) + .wait(std::chrono::milliseconds{1000})); +} + }}}} CORRADE_TEST_MAIN(Magnum::Vk::Test::QueueVkTest)