Kompute
Loading...
Searching...
No Matches
Sequence.hpp
1// SPDX-License-Identifier: Apache-2.0
2#pragma once
3
4#include "kompute/Core.hpp"
5
6#include "kompute/operations/OpAlgoDispatch.hpp"
7#include "kompute/operations/OpBase.hpp"
8
9namespace kp {
10
14class Sequence : public std::enable_shared_from_this<Sequence>
15{
16 public:
27 Sequence(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
28 std::shared_ptr<vk::Device> device,
29 std::shared_ptr<vk::Queue> computeQueue,
30 uint32_t queueIndex,
31 uint32_t totalTimestamps = 0) noexcept;
32
37 Sequence(const Sequence&) = delete;
38 Sequence(const Sequence&&) = delete;
39 Sequence& operator=(const Sequence&) = delete;
40 Sequence& operator=(const Sequence&&) = delete;
41
46 ~Sequence() noexcept;
47
58 std::shared_ptr<Sequence> record(std::shared_ptr<OpBase> op);
59
71 template<typename T, typename... TArgs>
72 std::shared_ptr<Sequence> record(
73 std::vector<std::shared_ptr<Memory>> memObjects,
74 TArgs&&... params)
75 {
76 std::shared_ptr<T> op{ new T(memObjects,
77 std::forward<TArgs>(params)...) };
78 return this->record(op);
79 }
92 template<typename T, typename... TArgs>
93 std::shared_ptr<Sequence> record(std::shared_ptr<Algorithm> algorithm,
94 TArgs&&... params)
95 {
96 std::shared_ptr<T> op{ new T(algorithm,
97 std::forward<TArgs>(params)...) };
98 return this->record(op);
99 }
100
107 std::shared_ptr<Sequence> eval();
108
116 std::shared_ptr<Sequence> eval(std::shared_ptr<OpBase> op);
117
127 template<typename T, typename... TArgs>
128 std::shared_ptr<Sequence> eval(
129 std::vector<std::shared_ptr<Memory>> memObjects,
130 TArgs&&... params)
131 {
132 std::shared_ptr<T> op{ new T(memObjects,
133 std::forward<TArgs>(params)...) };
134 return this->eval(op);
135 }
146 template<typename T, typename... TArgs>
147 std::shared_ptr<Sequence> eval(std::shared_ptr<Algorithm> algorithm,
148 TArgs&&... params)
149 {
150 std::shared_ptr<T> op{ new T(algorithm,
151 std::forward<TArgs>(params)...) };
152 return this->eval(op);
153 }
154
163 std::shared_ptr<Sequence> evalAsync();
172 std::shared_ptr<Sequence> evalAsync(std::shared_ptr<OpBase> op);
182 template<typename T, typename... TArgs>
183 std::shared_ptr<Sequence> evalAsync(
184 std::vector<std::shared_ptr<Memory>> memObjects,
185 TArgs&&... params)
186 {
187 std::shared_ptr<T> op{ new T(memObjects,
188 std::forward<TArgs>(params)...) };
189 return this->evalAsync(op);
190 }
201 template<typename T, typename... TArgs>
202 std::shared_ptr<Sequence> evalAsync(std::shared_ptr<Algorithm> algorithm,
203 TArgs&&... params)
204 {
205 std::shared_ptr<T> op{ new T(algorithm,
206 std::forward<TArgs>(params)...) };
207 return this->evalAsync(op);
208 }
209
217 std::shared_ptr<Sequence> evalAwait(uint64_t waitFor = UINT64_MAX);
218
223 void clear();
224
229 std::vector<std::uint64_t> getTimestamps();
230
235 void begin();
236
241 void end();
242
248 bool isRecording() const;
249
256 bool isInit() const;
257
263 void rerecord();
264
271 bool isRunning() const;
272
277 void destroy();
278
279 private:
280 // -------------- NEVER OWNED RESOURCES
281 std::shared_ptr<vk::PhysicalDevice> mPhysicalDevice = nullptr;
282 std::shared_ptr<vk::Device> mDevice = nullptr;
283 std::shared_ptr<vk::Queue> mComputeQueue = nullptr;
284 uint32_t mQueueIndex = -1;
285
286 // -------------- OPTIONALLY OWNED RESOURCES
287 std::shared_ptr<vk::CommandPool> mCommandPool = nullptr;
288 bool mFreeCommandPool = false;
289 std::shared_ptr<vk::CommandBuffer> mCommandBuffer = nullptr;
290 bool mFreeCommandBuffer = false;
291
292 // -------------- ALWAYS OWNED RESOURCES
293 vk::Fence mFence;
294 std::vector<std::shared_ptr<OpBase>> mOperations{};
295 std::shared_ptr<vk::QueryPool> timestampQueryPool = nullptr;
296
297 // State
298 bool mRecording = false;
299 bool mIsRunning = false;
300
301 // Create functions
302 void createCommandPool();
303 void createCommandBuffer();
304 void createTimestampQueryPool(uint32_t totalTimestamps);
305};
306
307} // End namespace kp
Definition Memory.hpp:16
Definition OpBase.hpp:20
Definition Sequence.hpp:15
bool isRecording() const
std::shared_ptr< Sequence > record(std::shared_ptr< Algorithm > algorithm, TArgs &&... params)
Definition Sequence.hpp:93
std::shared_ptr< Sequence > record(std::shared_ptr< OpBase > op)
std::shared_ptr< Sequence > eval()
std::shared_ptr< Sequence > evalAsync()
std::shared_ptr< Sequence > evalAsync(std::shared_ptr< Algorithm > algorithm, TArgs &&... params)
Definition Sequence.hpp:202
std::shared_ptr< Sequence > evalAsync(std::shared_ptr< OpBase > op)
std::shared_ptr< Sequence > evalAsync(std::vector< std::shared_ptr< Memory > > memObjects, TArgs &&... params)
Definition Sequence.hpp:183
bool isRunning() const
void rerecord()
bool isInit() const
std::shared_ptr< Sequence > eval(std::vector< std::shared_ptr< Memory > > memObjects, TArgs &&... params)
Definition Sequence.hpp:128
std::shared_ptr< Sequence > eval(std::shared_ptr< OpBase > op)
std::shared_ptr< Sequence > eval(std::shared_ptr< Algorithm > algorithm, TArgs &&... params)
Definition Sequence.hpp:147
std::vector< std::uint64_t > getTimestamps()
std::shared_ptr< Sequence > evalAwait(uint64_t waitFor=UINT64_MAX)
Sequence(std::shared_ptr< vk::PhysicalDevice > physicalDevice, std::shared_ptr< vk::Device > device, std::shared_ptr< vk::Queue > computeQueue, uint32_t queueIndex, uint32_t totalTimestamps=0) noexcept
void destroy()