Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled
57 lines
2.1 KiB
C++
57 lines
2.1 KiB
C++
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
|
|
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
JPH_NAMESPACE_BEGIN
|
|
|
|
void JobSystem::Job::AddDependency(int inCount)
|
|
{
|
|
JPH_IF_ENABLE_ASSERTS(uint32 old_value =) mNumDependencies.fetch_add(inCount, memory_order_relaxed);
|
|
JPH_ASSERT(old_value > 0 && old_value != cExecutingState && old_value != cDoneState, "Job is queued, running or done, it is not allowed to add a dependency to a running job");
|
|
}
|
|
|
|
bool JobSystem::Job::RemoveDependency(int inCount)
|
|
{
|
|
uint32 old_value = mNumDependencies.fetch_sub(inCount, memory_order_release);
|
|
JPH_ASSERT(old_value != cExecutingState && old_value != cDoneState, "Job is running or done, it is not allowed to add a dependency to a running job");
|
|
uint32 new_value = old_value - inCount;
|
|
JPH_ASSERT(old_value > new_value, "Test wrap around, this is a logic error");
|
|
return new_value == 0;
|
|
}
|
|
|
|
void JobSystem::Job::RemoveDependencyAndQueue(int inCount)
|
|
{
|
|
if (RemoveDependency(inCount))
|
|
mJobSystem->QueueJob(this);
|
|
}
|
|
|
|
void JobSystem::JobHandle::sRemoveDependencies(const JobHandle *inHandles, uint inNumHandles, int inCount)
|
|
{
|
|
JPH_PROFILE_FUNCTION();
|
|
|
|
JPH_ASSERT(inNumHandles > 0);
|
|
|
|
// Get the job system, all jobs should be part of the same job system
|
|
JobSystem *job_system = inHandles->GetPtr()->GetJobSystem();
|
|
|
|
// Allocate a buffer to store the jobs that need to be queued
|
|
Job **jobs_to_queue = (Job **)JPH_STACK_ALLOC(inNumHandles * sizeof(Job *));
|
|
Job **next_job = jobs_to_queue;
|
|
|
|
// Remove the dependencies on all jobs
|
|
for (const JobHandle *handle = inHandles, *handle_end = inHandles + inNumHandles; handle < handle_end; ++handle)
|
|
{
|
|
Job *job = handle->GetPtr();
|
|
JPH_ASSERT(job->GetJobSystem() == job_system); // All jobs should belong to the same job system
|
|
if (job->RemoveDependency(inCount))
|
|
*(next_job++) = job;
|
|
}
|
|
|
|
// If any jobs need to be scheduled, schedule them as a batch
|
|
uint num_jobs_to_queue = uint(next_job - jobs_to_queue);
|
|
if (num_jobs_to_queue != 0)
|
|
job_system->QueueJobs(jobs_to_queue, num_jobs_to_queue);
|
|
}
|
|
|
|
JPH_NAMESPACE_END
|