@@ -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
0 commit comments