Browse Source

Vk: ad a Queue::submit() returning a Fence.

I originally had this API there but then threw it away because it
encouraged inefficient use. However now it's really handy when writing
tests, so I guess I'll keep it.
pull/494/head
Vladimír Vondruš 5 years ago
parent
commit
1508670704
  1. 11
      src/Magnum/Vk/Queue.cpp
  2. 22
      src/Magnum/Vk/Queue.h
  3. 16
      src/Magnum/Vk/Test/QueueVkTest.cpp

11
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<Containers::Reference<const SubmitInfo>
return submit(Containers::arrayView(infos), fence);
}
Fence Queue::submit(const Containers::ArrayView<const Containers::Reference<const SubmitInfo>> infos) {
Vk::Fence fence{*_device};
submit(infos, fence);
return fence;
}
Fence Queue::submit(const std::initializer_list<Containers::Reference<const SubmitInfo>> infos) {
return submit(Containers::arrayView(infos));
}
struct SubmitInfo::State {
Containers::Array<VkCommandBuffer> commandBuffers;
};

22
src/Magnum/Vk/Queue.h

@ -118,6 +118,24 @@ class MAGNUM_VK_EXPORT Queue {
/** @overload */
void submit(std::initializer_list<Containers::Reference<const SubmitInfo>> 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<const Containers::Reference<const SubmitInfo>>, 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<const Containers::Reference<const SubmitInfo>> infos);
/** @overload */
Fence submit(std::initializer_list<Containers::Reference<const SubmitInfo>> 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
*

16
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)

Loading…
Cancel
Save