Shkyera Engine
Easy to use, game engine for Python
Loading...
Searching...
No Matches
JobSystem.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Common/TypeInfo.hpp>
4#include <ECS/Entity.hpp>
5#include <ECS/SparseSet.hpp>
7#include <condition_variable>
8#include <deque>
9#include <functional>
10#include <mutex>
11#include <type_traits>
12#include <vector>
13
14namespace shkyera {
15
17using JobExecutor = std::function<void()>;
18
24class JobSystem {
25 private:
26 enum class JobStatus : uint8_t { PENDING, RUNNING, DONE };
27
42
43 JobSystem() = default;
44
53
61 bool isScheduled(JobHandle handle) const;
62
69 std::optional<JobHandle> getJob();
70
78
79 std::mutex _mutex;
80 std::condition_variable _cv;
82
85
86 friend class SparseSet<Job>;
88
89 public:
96 static JobSystem& getInstance();
97
104
109 void wait();
110
115 public:
122 JobBuilder(JobExecutor function);
123 ~JobBuilder() = default;
124 JobBuilder(const JobBuilder&) = delete;
125 JobBuilder& operator=(const JobBuilder&) = delete;
128
137
145 template <typename ResourceType>
147 static_assert(std::is_base_of_v<ResourceTag, ResourceType>, "ResourceType is not tagged with ResourceTag");
150 return *this;
151 }
152
160 template <typename ResourceType>
162 static_assert(std::is_base_of_v<ResourceTag, ResourceType>, "ResourceType is not tagged with ResourceTag");
165 return *this;
166 }
167
175 _job.readResources.emplace(typeId);
176 return *this;
177 }
178
187 _job.writeResources.emplace(typeId);
188 return *this;
189 }
190
196 void useMainThread() { _job.mainThread |= true; }
197
204
205 private:
207 };
208};
209
211
212} // namespace shkyera
Definition JobSystem.hpp:114
JobBuilder & writeResource()
Definition JobSystem.hpp:161
JobBuilder & readResource()
Definition JobSystem.hpp:146
JobBuilder & operator=(const JobBuilder &)=delete
JobBuilder & writeResource(TypeID typeId)
Definition JobSystem.hpp:186
JobBuilder & operator=(JobBuilder &&)=delete
JobBuilder & readResource(TypeID typeId)
Definition JobSystem.hpp:174
void useMainThread()
Definition JobSystem.hpp:196
Job _job
Definition JobSystem.hpp:206
JobHandle submit()
Definition JobSystem.cpp:159
JobBuilder & dependsOn(JobHandle handle)
Definition JobSystem.cpp:154
JobBuilder(const JobBuilder &)=delete
JobBuilder(JobBuilder &&)=delete
Definition JobSystem.hpp:24
void markJobAsDone(JobHandle handle)
Definition JobSystem.cpp:139
TypeSet _resourcesWritten
Definition JobSystem.hpp:84
std::mutex _mutex
Definition JobSystem.hpp:79
std::optional< JobHandle > getJob()
Definition JobSystem.cpp:105
static JobSystem & getInstance()
Definition JobSystem.cpp:96
JobExecutor pull()
Definition JobSystem.cpp:14
JobStatus
Definition JobSystem.hpp:26
bool isScheduled(JobHandle handle) const
Definition JobSystem.cpp:101
JobHandle _nextJobHandle
Definition JobSystem.hpp:81
TypeSet _resourcesRead
Definition JobSystem.hpp:83
SparseSet< Job > _jobs
Definition JobSystem.hpp:87
std::condition_variable _cv
Definition JobSystem.hpp:80
JobHandle submit(Job &&job)
Definition JobSystem.cpp:80
void wait()
Definition JobSystem.cpp:40
Definition SparseSet.hpp:22
Definition Asset.hpp:6
uint32_t Entity
Definition Entity.hpp:7
std::function< void()> JobExecutor
Definition JobSystem.hpp:17
std::set< TypeID > TypeSet
Definition TypeInfo.hpp:28
Entity JobHandle
Definition JobSystem.hpp:16
Definition Clock.hpp:9
Definition JobSystem.hpp:28
JobExecutor function
Definition JobSystem.hpp:38
TypeSet writeResources
Definition JobSystem.hpp:40
TypeSet readResources
Definition JobSystem.hpp:39
std::vector< JobHandle > dependsOn
Definition JobSystem.hpp:37
bool mainThread
Definition JobSystem.hpp:35
JobStatus status
Definition JobSystem.hpp:36
Job(Job &&) noexcept=default
Definition TypeInfo.hpp:22