Skip to content

Commit d6b6bca

Browse files
committed
.
1 parent 34f9305 commit d6b6bca

2 files changed

Lines changed: 44 additions & 49 deletions

File tree

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

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -206,21 +206,20 @@ void TaskList::FinishDependency( const uint16 bufferID ) {
206206
}
207207
}
208208

209-
template<IsTask T>
210-
void TaskList::ResolveDependencies( Task& task, TaskInitList<T>& dependencies ) {
211-
for ( const T* dep = dependencies.start; dep < dependencies.end; dep++ ) {
212-
if ( !AddedToTaskMemory( ( *dep )->bufferID ) ) {
209+
void TaskList::ResolveDependencies( Task& task, TaskInitList& dependencies ) {
210+
for ( const TaskProxy* dep = dependencies.start; dep < dependencies.end; dep++ ) {
211+
if ( !AddedToTaskMemory( dep->task.bufferID ) ) {
213212
Sys::Drop( "Tried to add task with an unallocated dependency" );
214213
}
215214

216-
if ( IsTrackedDependency( ( *dep )->id ) ) {
215+
if ( IsTrackedDependency( dep->task.id ) ) {
217216
continue;
218217
}
219218

220-
Task& dependency = tasks[( *dep )->bufferID];
219+
Task& dependency = tasks[dep->task.bufferID];
221220

222221
// The dependency has already been executed, but the ringbuffer wrapped around
223-
if ( dependency.gen > ( *dep )->gen ) {
222+
if ( dependency.gen > dep->task.gen ) {
224223
continue;
225224
}
226225

@@ -373,8 +372,7 @@ Task* TaskList::GetTaskMemory( Task& task ) {
373372
return taskMemory;
374373
}
375374

376-
template<IsTask T>
377-
void TaskList::AddTaskExt( Task& task, TaskInitList<T>&& dependencies ) {
375+
void TaskList::AddTaskExt( Task& task, TaskInitList&& dependencies ) {
378376
if ( exiting.load( std::memory_order_relaxed ) && !task.IsShutdownTask() ) {
379377
return;
380378
}
@@ -411,25 +409,29 @@ void TaskList::AddTaskExt( Task& task, TaskInitList<T>&& dependencies ) {
411409
TLM.addTimer.Stop();
412410
}
413411

414-
template<IsTask T>
415-
void TaskList::MarkDependencies( Task& task, TaskInitList<T>&& dependencies ) {
412+
void TaskList::MarkDependencies( Task& task, TaskInitList&& dependencies ) {
416413
Task* mainTask = GetTaskMemory( task );
417414
uint8 dependencyCounter = 0;
418415

419416
if ( IsUpdatedDependency( mainTask->id ) ) {
420417
return;
421418
}
422419

423-
for ( const T* dep = dependencies.start; dep < dependencies.end; dep++ ) {
424-
if ( AddedToTaskList( ( *dep )->id ) ) {
420+
if ( !dependencies.start ) {
421+
mainTask->dependencyCounter.store( 0, std::memory_order_relaxed );
422+
return;
423+
}
424+
425+
for ( const TaskProxy* dep = dependencies.start; dep < dependencies.end; dep++ ) {
426+
if ( AddedToTaskList( dep->task.id ) ) {
425427
continue;
426428
}
427429

428430
Task* taskMemory = GetTaskMemory( ( *dep ).GetTask() );
429431

430432
taskMemory->forwardTasks[GetForwardCounterFast( taskMemory->id )] = mainTask->bufferID;
431433
IncrementForwardCounterFast( &taskMemory->id );
432-
SetBit( &( *dep )->id, TASK_SHIFT_TRACKED_DEPENDENCY );
434+
SetBit( &dep->task.id, TASK_SHIFT_TRACKED_DEPENDENCY );
433435

434436
dependencyCounter++;
435437
}
@@ -445,9 +447,8 @@ void TaskList::MarkDependencies( Task& task, TaskInitList<T>&& dependencies ) {
445447
SetBit( &task.id, TASK_SHIFT_UPDATED_DEPENDENCY );
446448
}
447449

448-
template<IsTask T>
449-
void TaskList::UnMarkDependencies( TaskInitList<T>&& dependencies ) {
450-
for ( const T* dep = dependencies.start; dep < dependencies.end; dep++ ) {
450+
void TaskList::UnMarkDependencies( TaskInitList&& dependencies ) {
451+
for ( const TaskProxy* dep = dependencies.start; dep < dependencies.end; dep++ ) {
451452
UnSetBit( &( *dep )->id, TASK_SHIFT_TRACKED_DEPENDENCY );
452453
UnSetBit( &( *dep )->id, TASK_SHIFT_UPDATED_DEPENDENCY );
453454
}
@@ -464,16 +465,16 @@ void TaskList::AddTask( Task& task, std::initializer_list<TaskProxy> dependencie
464465
}
465466

466467
for ( const TaskProxy& dep : dependencies ) {
467-
AddTaskExt( dep.task, TaskInitList<Task> {} );
468+
AddTaskExt( dep.task );
468469
}
469470

470-
UnMarkDependencies( TaskInitList{ dependencies.begin(), dependencies.end() } );
471+
UnMarkDependencies( TaskInitList { dependencies.begin(), dependencies.end() } );
471472
}
472473

473-
void TaskList::AddTasksExt( std::initializer_list<TaskInit> dependencies ) {
474+
void TaskList::AddTasksExt( std::initializer_list<TaskInitList> dependencies ) {
474475
// TODO: Currently this is an O( 4 * n ) loop. The tasks form a DAG, which we can instead flatten in O( n ), then loop in O( n )
475-
for ( const TaskInit& taskInit : dependencies ) {
476-
MarkDependencies( taskInit.begin()[0].task, TaskInitList { &taskInit.begin()[1], taskInit.end() } );
476+
for ( const TaskInitList& taskInit : dependencies ) {
477+
MarkDependencies( taskInit.start->task, { taskInit.start + 1, taskInit.end } );
477478
}
478479

479480
/* Tracked dependencies are those that we allocated in the AtomicRingBuffer during this function call.
@@ -482,17 +483,17 @@ void TaskList::AddTasksExt( std::initializer_list<TaskInit> dependencies ) {
482483
Otherwise we could end up updating it after other threads have already finished all of the dependencies.
483484
Flattening the DAG would get rid of the need to do this because we'd just add tasks starting from the end of the graph */
484485

485-
for ( const TaskInit& taskInit : dependencies ) {
486-
for ( const TaskProxy* task = &taskInit.begin()[1]; task < taskInit.end(); task++ ) {
486+
for ( const TaskInitList& taskInit : dependencies ) {
487+
for ( const TaskProxy* task = taskInit.start + 1; task < taskInit.end; task++ ) {
487488
if ( IsTrackedDependency( task->task.id ) ) {
488489
Task* taskMemory = GetTaskMemory( task->task );
489490
taskMemory->forwardTaskCounter.store( GetForwardCounterFast( taskMemory->id ), std::memory_order_relaxed );
490491
}
491492
}
492493
}
493494

494-
for ( const TaskInit& taskInit : dependencies ) {
495-
for ( const TaskProxy* task = &taskInit.begin()[1]; task < taskInit.end(); task++ ) {
495+
for ( const TaskInitList& taskInit : dependencies ) {
496+
for ( const TaskProxy* task = taskInit.start + 1; task < taskInit.end; task++ ) {
496497
if ( !IsUpdatedDependency( task->task.id ) && !AddedToTaskList( task->task.id ) ) {
497498
GetTaskMemory( task->task )->dependencyCounter.store( 0, std::memory_order_relaxed );
498499
}
@@ -501,15 +502,15 @@ void TaskList::AddTasksExt( std::initializer_list<TaskInit> dependencies ) {
501502
if ( time < task->task.time && task->task.time - time > eventQueue.minGranularity ) {
502503
eventQueue.AddTask( task->task );
503504
} else {
504-
AddTaskExt( task->task, TaskInitList<Task> {} );
505+
AddTaskExt( task->task );
505506
}
506507
}
507508

508-
AddTaskExt( taskInit.begin()[0].task, TaskInitList{ &taskInit.begin()[1], taskInit.end() } );
509+
AddTaskExt( taskInit.start->task, { taskInit.start + 1, taskInit.end } );
509510
}
510511

511-
for ( const TaskInit& taskInit : dependencies ) {
512-
UnMarkDependencies( TaskInitList{ &taskInit.begin()[1], taskInit.end() } );
512+
for ( const TaskInitList& taskInit : dependencies ) {
513+
UnMarkDependencies( { taskInit.start + 1, taskInit.end } );
513514
}
514515
}
515516

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

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,25 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4747
using TaskInit = std::initializer_list<TaskProxy>;
4848
#define AddTasks( ... ) AddTasksExt( { __VA_ARGS__ } )
4949

50-
template<typename T>
51-
concept IsTask = requires ( T value ) {
52-
{ std::is_convertible<T, Task>::value || std::is_convertible<T, TaskProxy>::value };
53-
};
54-
5550
// Use this for task dependencies because it allows natvis visualisation
56-
template<IsTask T>
5751
struct TaskInitList {
58-
const T* start;
59-
const T* end;
52+
const TaskProxy* start;
53+
const TaskProxy* end;
6054

6155
TaskInitList() :
6256
start( nullptr ),
6357
end( nullptr ) {
6458
}
6559

66-
TaskInitList( const T* newStart, const T* newEnd ) :
60+
TaskInitList( const TaskProxy* newStart, const TaskProxy* newEnd ) :
6761
start( newStart ),
6862
end( newEnd ) {
6963
}
64+
65+
TaskInitList( std::initializer_list<TaskProxy> list ) :
66+
start( list.begin() ),
67+
end( list.end() ) {
68+
}
7069
};
7170

7271
struct ThreadQueue {
@@ -126,7 +125,7 @@ class TaskList :
126125
byte* GetTaskData( const uint64 offset );
127126

128127
void AddTask( Task& task, std::initializer_list<TaskProxy> dependencies = {} );
129-
void AddTasksExt( std::initializer_list<TaskInit> dependencies );
128+
void AddTasksExt( std::initializer_list<TaskInitList> dependencies );
130129
Task* FetchTask( Thread* thread );
131130

132131
void TaskWait( Task& task );
@@ -167,17 +166,12 @@ class TaskList :
167166

168167
Task* GetTaskMemory( Task& task );
169168

170-
template<IsTask T>
171-
void ResolveDependencies( Task& task, TaskInitList<T>& dependencies );
172-
173-
template<IsTask T>
174-
void AddTaskExt( Task& task, TaskInitList<T>&& dependencies );
169+
void ResolveDependencies( Task& task, TaskInitList& dependencies );
175170

176-
template<IsTask T>
177-
void MarkDependencies( Task& task, TaskInitList<T>&& dependencies );
171+
void AddTaskExt( Task& task, TaskInitList&& dependencies = {} );
178172

179-
template<IsTask T>
180-
void UnMarkDependencies( TaskInitList<T>&& dependencies );
173+
void MarkDependencies( Task& task, TaskInitList&& dependencies );
174+
void UnMarkDependencies( TaskInitList&& dependencies );
181175
};
182176

183177
extern TaskList taskList;

0 commit comments

Comments
 (0)