Skip to content

Commit a11c7c6

Browse files
committed
Fix double TaskList::Shutdown(), NUKE forwardTaskRing
Massively improves performance and fixes some deadlocks.
1 parent b4974f8 commit a11c7c6

2 files changed

Lines changed: 7 additions & 21 deletions

File tree

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

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ TaskList::TaskList() {
4747
}
4848

4949
TaskList::~TaskList() {
50-
Shutdown();
5150
}
5251

5352
void TaskList::AdjustThreadCount( uint32_t newMaxThreads ) {
@@ -169,7 +168,7 @@ constexpr TaskRing& TaskList::TaskRingIDToTaskRing( const TaskRingID taskRingID
169168
case MAIN:
170169
return mainTaskRing;
171170
case FORWARD:
172-
return forwardTaskRing;
171+
return mainTaskRing; // forwardTaskRing;
173172
default:
174173
ASSERT_UNREACHABLE();
175174
}
@@ -212,7 +211,6 @@ uint16_t TaskRing::AddToTaskRing( Task& task, const bool unlockQueueAfterAdd ) {
212211
void TaskList::MoveToTaskRing( TaskRing& taskRing, Task& task ) {
213212
TLM.addTimer.Start();
214213

215-
IDToTaskRing( task.id ).RemoveTask( IDToTaskQueue( task.id ), IDToTaskID( task.id ) );
216214
taskRing.AddToTaskRing( task );
217215

218216
TLM.addTimer.Stop();
@@ -229,7 +227,7 @@ void TaskList::FinishDependency( const uint16_t bufferID ) {
229227
}
230228

231229
template<IsTask T>
232-
bool TaskList::ResolveDependencies( Task& task, TaskInitList<T>& dependencies ) {
230+
void TaskList::ResolveDependencies( Task& task, TaskInitList<T>& dependencies ) {
233231
uint32_t counter = 0;
234232
for ( const T* dep = dependencies.start; dep < dependencies.end; dep++ ) {
235233
if ( !BitSet( ( *dep )->id, TASK_SHIFT_ALLOCATED ) ) {
@@ -256,8 +254,6 @@ bool TaskList::ResolveDependencies( Task& task, TaskInitList<T>& dependencies )
256254
}
257255

258256
task.dependencyCounter.fetch_add( counter, std::memory_order_relaxed );
259-
260-
return counter;
261257
}
262258

263259
template<IsTask T>
@@ -276,28 +272,18 @@ void TaskList::AddTask( Task& task, TaskInitList<T>&& dependencies ) {
276272

277273
*taskMemory = task;
278274

279-
TaskRing* taskRing;
280-
if ( ResolveDependencies( *taskMemory, dependencies ) ) {
281-
task.id = forwardTaskRing.AddToTaskRing( *taskMemory, false );
282-
taskRing = &forwardTaskRing;
283-
} else {
284-
task.id = mainTaskRing.AddToTaskRing( *taskMemory, false );
285-
taskRing = &mainTaskRing;
286-
}
275+
ResolveDependencies( *taskMemory, dependencies );
287276

288277
SetBit( &task.id, TASK_SHIFT_ALLOCATED );
289278

290279
taskMemory->id = task.id;
291280

292281
const uint32_t counter = taskMemory->dependencyCounter.fetch_sub( 1, std::memory_order_relaxed ) - 1;
293282

294-
if ( !counter && taskRing == &forwardTaskRing ) {
295-
forwardTaskRing.RemoveTask( IDToTaskQueue( task.id ), IDToTaskID( task.id ), true );
296-
taskRing->AddToTaskRing( task );
283+
if ( !counter ) {
284+
mainTaskRing.AddToTaskRing( *taskMemory );
297285
}
298286

299-
taskRing->UnlockQueue( IDToTaskQueue( task.id ) );
300-
301287
TLM.addTimer.Stop();
302288
}
303289

@@ -361,6 +347,7 @@ Task* TaskList::FetchTask( Thread* thread, const bool longestTask ) {
361347

362348
break;
363349
}
350+
364351
TLM.fetchQueueLockTimer.Stop();
365352

366353
task = FindLSB( mainTaskRing.queues[queue].availableTasks );

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ class TaskList :
143143
private:
144144
AtomicRingBuffer<Task> tasks { "GlobalTaskMemory" };
145145
TaskRing mainTaskRing{ MAIN };
146-
TaskRing forwardTaskRing{ FORWARD };
147146

148147
uint32_t currentMaxThreads = 0;
149148
Thread threads[MAX_THREADS];
@@ -154,7 +153,7 @@ class TaskList :
154153
constexpr TaskRing& TaskRingIDToTaskRing( const TaskRingID taskRingID );
155154

156155
template<IsTask T>
157-
bool ResolveDependencies( Task& task, TaskInitList<T>& dependencies );
156+
void ResolveDependencies( Task& task, TaskInitList<T>& dependencies );
158157

159158
void MoveToTaskRing( TaskRing& taskRing, Task& task );
160159
};

0 commit comments

Comments
 (0)