3#include "spark/render/CommandBuffer.h"
4#include "spark/render/Export.h"
6#include "spark/base/Exception.h"
7#include "spark/lib/String.h"
13namespace spark::render
36 Graphics = 0x00000001,
42 Transfer = 0x00000004,
48 SPARK_DEFINE_ENUM_FLAGS(QueueType);
53 enum class QueuePriority
77 [[nodiscard]]
virtual bool isBound() const noexcept = 0;
83 [[nodiscard]] virtual QueuePriority priority() const noexcept = 0;
89 [[nodiscard]] virtual QueueType type() const noexcept = 0;
94 virtual
void bind() const noexcept = 0;
99 virtual
void release() const noexcept = 0;
113 [[nodiscard]] std::shared_ptr<
ICommandBuffer> createCommandBuffer(
bool begin_recording = false,
bool secondary = false) const noexcept
115 return genericCreateCommandBuffer(begin_recording, secondary);
125 [[nodiscard]] std::size_t
submit(std::shared_ptr<ICommandBuffer> command_buffer)
const noexcept {
return genericSubmit(std::move(command_buffer)); }
134 [[nodiscard]] std::size_t
submit(std::shared_ptr<const ICommandBuffer> command_buffer)
const noexcept {
return genericSubmit(std::move(command_buffer)); }
143 [[nodiscard]] std::size_t
submit(
const std::vector<std::shared_ptr<const ICommandBuffer>>& command_buffers)
const noexcept {
return genericSubmit(command_buffers); }
152 [[nodiscard]] std::size_t
submit(
const std::vector<std::shared_ptr<ICommandBuffer>>& command_buffers)
const noexcept
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);
170 virtual void waitFor(std::size_t fence)
const noexcept = 0;
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;
192 template <typename CommandBufferType>
196 using command_buffer_type = CommandBufferType;
200 [[nodiscard]]
virtual std::shared_ptr<command_buffer_type>
createCommandBuffer(
bool begin_recording =
false,
bool secondary =
false) const noexcept = 0;
203 [[nodiscard]] virtual std::
size_t submit(std::shared_ptr<command_buffer_type> command_buffer) const noexcept = 0;
206 [[nodiscard]] virtual std::
size_t submit(std::shared_ptr<const command_buffer_type> command_buffer) const noexcept = 0;
209 [[nodiscard]] virtual std::
size_t submit(const std::vector<std::shared_ptr<const command_buffer_type>>& command_buffers) const noexcept = 0;
212 [[nodiscard]] virtual std::
size_t submit(const std::vector<std::shared_ptr<command_buffer_type>>& command_buffers) const noexcept = 0;
215 [[nodiscard]] std::shared_ptr<
ICommandBuffer> genericCreateCommandBuffer(
bool begin_recording,
bool secondary) const noexcept final
217 return createCommandBuffer(begin_recording, secondary);
220 std::size_t genericSubmit(std::shared_ptr<ICommandBuffer> command_buffer)
const noexcept final
222 return submit(std::dynamic_pointer_cast<command_buffer_type>(std::move(command_buffer)));
225 std::size_t genericSubmit(std::shared_ptr<const ICommandBuffer> command_buffer)
const noexcept final
227 return submit(std::dynamic_pointer_cast<const command_buffer_type>(std::move(command_buffer)));
230 std::size_t genericSubmit(
const std::vector<std::shared_ptr<const ICommandBuffer>>& command_buffers)
const noexcept final
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);
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.