Async render passes

This commit is contained in:
2021-11-24 12:10:23 +01:00
parent 94be513538
commit 5fafdda770
23 changed files with 199 additions and 162 deletions
+26 -17
View File
@@ -14,7 +14,7 @@ Event::Event(const std::string& name)
void Event::raise()
{
flag->store(1);
getGlobalThreadPool().notify(this);
getGlobalThreadPool().notify(*this);
}
void Event::reset()
{
@@ -47,51 +47,56 @@ ThreadPool::~ThreadPool()
void ThreadPool::addJob(Job&& job)
{
std::unique_lock lock(jobQueueLock);
std::cout << "Adding job " << job.id << std::endl;
//std::cout << "Adding job " << job.id << std::endl;
jobQueue.add(std::move(job));
jobQueueCV.notify_one();
}
void ThreadPool::addJob(MainJob&& job)
{
std::unique_lock lock(mainJobLock);
std::cout << "Adding main job " << job.id << std::endl;
//std::cout << "Adding main job " << job.id << std::endl;
mainJobs.add(std::move(job));
mainJobCV.notify_one();
}
void ThreadPool::enqueueWaiting(Event* event, Job&& job)
void ThreadPool::enqueueWaiting(Event& event, Job job)
{
std::cout << job.id << " waiting for event " << event->name << std::endl;
//std::cout << job.id << " waiting for event " << event.name << std::endl;
std::unique_lock lock(waitingLock);
waitingJobs[*event].add(std::move(job));
waitingJobs[event].add(std::move(job));
}
void ThreadPool::enqueueWaiting(Event* event, MainJob&& job)
void ThreadPool::enqueueWaiting(Event& event, MainJob job)
{
std::cout << job.id << " main waiting for event " << event->name << std::endl;
//std::cout << job.id << " main waiting for event " << event.name << std::endl;
std::unique_lock lock(waitingMainLock);
waitingMainJobs[*event].add(std::move(job));
waitingMainJobs[event].add(std::move(job));
}
void ThreadPool::notify(Event* event)
void ThreadPool::notify(Event& event)
{
{
std::unique_lock lock(jobQueueLock);
std::unique_lock lock2(waitingLock);
while(!waitingJobs[*event].empty())
List<Job>& jobs = waitingJobs[event];
for(auto& job : jobs)
{
std::cout << "Waking up job " << waitingJobs[*event].front().id << std::endl;
Job job = std::move(waitingJobs[*event].retrieve());
//assert(job.id != -1ull);
//std::cout << "Waking up job " << job.id << std::endl;
jobQueue.add(std::move(job));
jobQueueCV.notify_one();
}
jobs.clear();
}
{
std::unique_lock lock(mainJobLock);
std::unique_lock lock2(waitingMainLock);
while(!waitingMainJobs[*event].empty())
List<MainJob>& jobs = waitingMainJobs[event];
for(auto& job : jobs)
{
std::cout << "Waking up main job " << waitingMainJobs[*event].front().id << std::endl;
mainJobs.add(std::move(waitingMainJobs[*event].retrieve()));
//assert(job.id != -1ull);
//std::cout << "Waking up main job " << job.id << std::endl;
mainJobs.add(std::move(job));
mainJobCV.notify_one();
}
jobs.clear();
}
}
void ThreadPool::tryMainJob()
@@ -134,8 +139,12 @@ void ThreadPool::threadLoop(const bool mainThread)
continue;
}
}
std::cout << "Starting job " << job.id << std::endl;
//std::cout << "Starting job " << job.id << std::endl;
job.resume();
if(job.done())
{
job.signal();
}
}
}