Async render passes
This commit is contained in:
+26
-17
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user