SPARK  0.1.0
A general purpose game engine written in C++.
Loading...
Searching...
No Matches
CommandQueue.h
1#pragma once
2
3#include "spark/render/CommandBuffer.h"
4#include "spark/render/Export.h"
5
6#include "spark/base/Exception.h"
7#include "spark/lib/String.h"
8
9#include <algorithm>
10#include <memory>
11#include <utility>
12
13namespace spark::render
14{
30 enum class QueueType
31 {
33 None = 0x00000000,
34
36 Graphics = 0x00000001,
37
39 Compute = 0x00000002,
40
42 Transfer = 0x00000004,
43
45 Other = 0x7FFFFFFF
46 };
47
48 SPARK_DEFINE_ENUM_FLAGS(QueueType);
49
53 enum class QueuePriority
54 {
56 Normal = 33,
57
59 High = 66,
60
62 Realtime = 100
63 };
64
68 class SPARK_RENDER_EXPORT ICommandQueue
69 {
70 public:
71 virtual ~ICommandQueue() noexcept = default;
72
77 [[nodiscard]] virtual bool isBound() const noexcept = 0;
78
83 [[nodiscard]] virtual QueuePriority priority() const noexcept = 0;
84
89 [[nodiscard]] virtual QueueType type() const noexcept = 0;
90
94 virtual void bind() const noexcept = 0;
95
99 virtual void release() const noexcept = 0;
100
113 [[nodiscard]] std::shared_ptr<ICommandBuffer> createCommandBuffer(bool begin_recording = false, bool secondary = false) const noexcept
114 {
115 return genericCreateCommandBuffer(begin_recording, secondary);
116 }
117
125 [[nodiscard]] std::size_t submit(std::shared_ptr<ICommandBuffer> command_buffer) const noexcept { return genericSubmit(std::move(command_buffer)); }
126
134 [[nodiscard]] std::size_t submit(std::shared_ptr<const ICommandBuffer> command_buffer) const noexcept { return genericSubmit(std::move(command_buffer)); }
135
143 [[nodiscard]] std::size_t submit(const std::vector<std::shared_ptr<const ICommandBuffer>>& command_buffers) const noexcept { return genericSubmit(command_buffers); }
144
152 [[nodiscard]] std::size_t submit(const std::vector<std::shared_ptr<ICommandBuffer>>& command_buffers) const noexcept
153 {
154 std::vector<std::shared_ptr<const ICommandBuffer>> command_buffers_vector;
155 command_buffers_vector.reserve(command_buffers.size());
156 std::ranges::transform(command_buffers,
157 std::back_inserter(command_buffers_vector),
158 [](auto& command_buffer) { return std::static_pointer_cast<const ICommandBuffer>(command_buffer); });
159 return genericSubmit(command_buffers_vector);
160 }
161
170 virtual void waitFor(std::size_t fence) const noexcept = 0;
171
176 [[nodiscard]] virtual std::size_t currentFence() const noexcept = 0;
177
178 private:
181 [[nodiscard]] virtual std::shared_ptr<ICommandBuffer> genericCreateCommandBuffer(bool begin_recording, bool secondary) const noexcept = 0;
182 virtual std::size_t genericSubmit(std::shared_ptr<ICommandBuffer> command_buffer) const noexcept = 0;
183 virtual std::size_t genericSubmit(std::shared_ptr<const ICommandBuffer> command_buffer) const noexcept = 0;
184 virtual std::size_t genericSubmit(const std::vector<std::shared_ptr<const ICommandBuffer>>& command_buffers) const noexcept = 0;
186 };
187
192 template <typename CommandBufferType>
194 {
195 public:
196 using command_buffer_type = CommandBufferType;
197
198 public:
200 [[nodiscard]] virtual std::shared_ptr<command_buffer_type> createCommandBuffer(bool begin_recording = false, bool secondary = false) const noexcept = 0;
201
203 [[nodiscard]] virtual std::size_t submit(std::shared_ptr<command_buffer_type> command_buffer) const noexcept = 0;
204
206 [[nodiscard]] virtual std::size_t submit(std::shared_ptr<const command_buffer_type> command_buffer) const noexcept = 0;
207
209 [[nodiscard]] virtual std::size_t submit(const std::vector<std::shared_ptr<const command_buffer_type>>& command_buffers) const noexcept = 0;
210
212 [[nodiscard]] virtual std::size_t submit(const std::vector<std::shared_ptr<command_buffer_type>>& command_buffers) const noexcept = 0;
213
214 private:
215 [[nodiscard]] std::shared_ptr<ICommandBuffer> genericCreateCommandBuffer(bool begin_recording, bool secondary) const noexcept final
216 {
217 return createCommandBuffer(begin_recording, secondary);
218 }
219
220 std::size_t genericSubmit(std::shared_ptr<ICommandBuffer> command_buffer) const noexcept final
221 {
222 return submit(std::dynamic_pointer_cast<command_buffer_type>(std::move(command_buffer)));
223 }
224
225 std::size_t genericSubmit(std::shared_ptr<const ICommandBuffer> command_buffer) const noexcept final
226 {
227 return submit(std::dynamic_pointer_cast<const command_buffer_type>(std::move(command_buffer)));
228 }
229
230 std::size_t genericSubmit(const std::vector<std::shared_ptr<const ICommandBuffer>>& command_buffers) const noexcept final
231 {
232 std::vector<std::shared_ptr<const command_buffer_type>> command_buffers_vector;
233 std::ranges::transform(command_buffers,
234 std::back_inserter(command_buffers_vector),
235 [](auto& command_buffer) { return std::dynamic_pointer_cast<const command_buffer_type>(command_buffer); });
236 return submit(command_buffers_vector);
237 }
238 };
239}
Represents a ICommandQueue.
Definition CommandQueue.h:194
virtual std::shared_ptr< command_buffer_type > createCommandBuffer(bool begin_recording=false, bool secondary=false) const noexcept=0
Creates a command buffer that can be used to allocate commands on the queue.
Interface for a command buffer.
Definition CommandBuffer.h:24
Interface for a command queue.
Definition CommandQueue.h:69
virtual std::size_t currentFence() const noexcept=0
Gets the latest fence inserted into the queue.
std::size_t submit(const std::vector< std::shared_ptr< const ICommandBuffer > > &command_buffers) const noexcept
Submits multiple command buffers to the queue and inserts a fence to wait for them.
Definition CommandQueue.h:143
std::size_t submit(std::shared_ptr< ICommandBuffer > command_buffer) const noexcept
Submits a single command buffer to the queue and inserts a fence to wait for it.
Definition CommandQueue.h:125
std::size_t submit(const std::vector< std::shared_ptr< ICommandBuffer > > &command_buffers) const noexcept
Submits multiple command buffers to the queue and inserts a fence to wait for them.
Definition CommandQueue.h:152
virtual bool isBound() const noexcept=0
Checks whether the queue is currently bound to the parent device.
std::size_t submit(std::shared_ptr< const ICommandBuffer > command_buffer) const noexcept
Submits a single command buffer to the queue and inserts a fence to wait for it.
Definition CommandQueue.h:134
virtual void waitFor(std::size_t fence) const noexcept=0
Waits for fence value fence to complete on the command queue.