Skip to content

Commit 9fdd62d

Browse files
committed
TaskList fixes and improvements
1 parent 66ba4db commit 9fdd62d

2 files changed

Lines changed: 26 additions & 9 deletions

File tree

src/engine/renderer-vulkan/Thread/TaskList.cpp

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,19 @@ void TaskRing::UnlockQueue( const uint8_t queue ) {
123123
queueLocks -= SetBit( 0ull, queue );
124124
}
125125

126-
void TaskRing::RemoveTask( const uint8_t queue, const uint8_t taskID ) {
127-
LockQueue( queue );
126+
void TaskRing::RemoveTask( const uint8_t queue, const uint8_t taskID, const bool queueLocked ) {
127+
if ( !queueLocked ) {
128+
LockQueue( queue );
129+
}
128130

129131
UnSetBit( &queues[queue].availableTasks, taskID );
130132
queues[queue].tasks[taskID] = 0;
131133

132134
taskCount.fetch_sub( 1, std::memory_order_relaxed );
133135

134-
UnlockQueue( queue );
136+
if ( !queueLocked ) {
137+
UnlockQueue( queue );
138+
}
135139
}
136140

137141
bool TaskList::AddedToTaskRing( const uint16_t id ) {
@@ -241,7 +245,7 @@ bool TaskList::ResolveDependencies( Task& task, TaskInitList<T>& dependencies )
241245
counter++;
242246
}
243247

244-
task.dependencyCounter += counter;
248+
task.dependencyCounter.fetch_add( counter, std::memory_order_relaxed );
245249

246250
return counter;
247251
}
@@ -260,8 +264,10 @@ void TaskList::AddTask( Task& task, TaskInitList<T>&& dependencies ) {
260264

261265
task.bufferID = taskMemory - tasks.memory;
262266

267+
*taskMemory = task;
268+
263269
TaskRing* taskRing;
264-
if ( ResolveDependencies( task, dependencies ) ) {
270+
if ( ResolveDependencies( *taskMemory, dependencies ) ) {
265271
task.id = forwardTaskRing.AddToTaskRing( task, false );
266272
taskRing = &forwardTaskRing;
267273
} else {
@@ -271,13 +277,18 @@ void TaskList::AddTask( Task& task, TaskInitList<T>&& dependencies ) {
271277

272278
SetBit( &task.id, TASK_SHIFT_ALLOCATED );
273279

274-
task.dependencyCounter--;
280+
taskMemory->id = task.id;
275281

276-
*taskMemory = task;
282+
const uint32_t counter = taskMemory->dependencyCounter.fetch_sub( 1, std::memory_order_relaxed ) - 1;
283+
284+
if ( !counter && taskRing == &forwardTaskRing ) {
285+
forwardTaskRing.RemoveTask( IDToTaskQueue( task.id ), IDToTaskID( task.id ), true );
286+
taskRing->AddToTaskRing( task );
287+
}
277288

278289
taskRing->UnlockQueue( IDToTaskQueue( task.id ) );
279290

280-
TLM.addTimer.Stop();
291+
TLM.addTimer.Stop();
281292
}
282293

283294
void TaskList::AddTask( Task& task, std::initializer_list<Task> dependencies ) {
@@ -304,6 +315,12 @@ Task* TaskList::FetchTask( Thread* thread, const bool longestTask ) {
304315
uint64_t mask = 0;
305316

306317
TLM.fetchOuterTimer.Start();
318+
319+
if ( !mainTaskRing.taskCount.load( std::memory_order_relaxed ) ) {
320+
TLM.fetchOuterTimer.Stop();
321+
return nullptr;
322+
}
323+
307324
while ( true ) {
308325
uint64_t expected = mainTaskRing.queueLocks.load();
309326
uint64_t desired;

src/engine/renderer-vulkan/Thread/TaskList.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ struct TaskRing {
6767
void LockQueue( const uint8_t queue );
6868
void UnlockQueue( const uint8_t queue );
6969

70-
void RemoveTask( const uint8_t queue, const uint8_t taskID );
70+
void RemoveTask( const uint8_t queue, const uint8_t taskID, const bool queueLocked = false );
7171

7272
uint16_t AddToTaskRing( Task& task, const bool unlockQueueAfterAdd = true );
7373
};

0 commit comments

Comments
 (0)