Skip to content

Commit cf54f53

Browse files
committed
Fix executingThreads and taskCount, add EventQueue.Shutdown()
Also disallow `Delay()` in shutdown tasks.
1 parent c493745 commit cf54f53

6 files changed

Lines changed: 49 additions & 5 deletions

File tree

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,26 @@ void EventQueue::Rotate() {
134134
}
135135
}
136136

137+
void EventQueue::Shutdown() {
138+
if ( exiting.load( std::memory_order_relaxed ) ) {
139+
return;
140+
}
141+
142+
uint32 count = 0;
143+
144+
for ( EventRing& eventRing : eventRings ) {
145+
if ( eventRing.lock.LockWrite() ) {
146+
for ( uint64 sector : eventRing.allocatedEvents ) {
147+
count += CountBits( sector );
148+
}
149+
150+
memset( eventRing.allocatedEvents, 0, EventRing::sectors * EventRing::sectorSize * sizeof( uint64 ) );
151+
152+
eventRing.lock.UnlockWrite();
153+
}
154+
}
155+
156+
exiting.store( true, std::memory_order_relaxed );
157+
}
158+
137159
EventQueue eventQueue;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,12 @@ struct EventQueue {
8282

8383
const uint64 minGranularity = eventRings[0].granularity;
8484

85+
std::atomic<bool> exiting = false;
86+
8587
void AddTask( Task& task );
8688
void Rotate();
89+
90+
void Shutdown();
8791
};
8892

8993
extern EventQueue eventQueue;

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ Task::Task( const Task& other ) {
4848
}
4949

5050
Task& Task::Delay( const uint64 delay ) {
51-
time = TimeNs() + delay;
51+
if ( shutdownTask ) {
52+
Log::Warn( "Shutdown tasks may not be delayed! (task: %s, delay: %u)", Execute, delay );
53+
} else {
54+
time = TimeNs() + delay;
55+
}
5256

5357
return *this;
5458
}

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ void TaskList::AddToThreadQueueExt( Task& task ) {
263263
if ( task.threadMask ) {
264264
uint32 threadMask = task.threadMask;
265265

266+
taskCount.fetch_add( CountBits( threadMask ), std::memory_order_relaxed);
267+
266268
while ( threadMask ) {
267269
const uint32 threadID = FindLSB( threadMask );
268270
threadQueues[threadID].AddTask( threadID, task.bufferID );
@@ -273,6 +275,8 @@ void TaskList::AddToThreadQueueExt( Task& task ) {
273275
return;
274276
}
275277

278+
taskCount.fetch_add( 1, std::memory_order_relaxed );
279+
276280
const uint32 projectedTime = taskTime.time / std::max( taskTime.count, 1ull ) / 1000;
277281

278282
if ( projectedTime < TLM.addToQueueTimer.Time() / TLM.addToQueueCount && !TLM.main ) {
@@ -388,8 +392,6 @@ void TaskList::AddTask( Task& task, TaskInitList<T>&& dependencies ) {
388392
AddToThreadQueue( *taskMemory );
389393
}
390394

391-
taskCount.fetch_add( 1, std::memory_order_relaxed );
392-
393395
TLM.addTimer.Stop();
394396
}
395397

@@ -494,10 +496,17 @@ Task* TaskList::FetchTask( Thread* thread, const bool longestTask ) {
494496
threadQueue.tasks[current] = ThreadQueue::TASK_NONE;
495497
threadQueue.current = ( current + 1 ) % ThreadQueue::MAX_TASKS;
496498

499+
return &tasks[id];
500+
}
501+
502+
void TaskList::TasksCleared( const uint32 count ) {
503+
taskCount.fetch_sub( count, std::memory_order_relaxed );
504+
}
505+
506+
void TaskList::TaskStarted() {
497507
executingThreads.fetch_add( 1, std::memory_order_relaxed );
498-
taskCount.fetch_sub( 1, std::memory_order_relaxed );
499508

500-
return &tasks[id];
509+
taskCount.fetch_sub( 1, std::memory_order_relaxed );
501510
}
502511

503512
bool TaskList::ThreadFinished( const bool hadTask ) {
@@ -506,6 +515,7 @@ bool TaskList::ThreadFinished( const bool hadTask ) {
506515

507516
if ( exit ) {
508517
TLM.exitTimer.Start();
518+
eventQueue.Shutdown();
509519
}
510520

511521
if ( exit && !threadCount ) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ class TaskList :
129129
void AddTasksExt( std::initializer_list<TaskInit> dependencies );
130130
Task* FetchTask( Thread* thread, const bool longestTask );
131131

132+
void TasksCleared( const uint32 count );
133+
void TaskStarted();
132134
bool ThreadFinished( const bool hadTask );
133135

134136
void FinishTask( Task* task );

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ void Thread::Run() {
124124

125125
Log::DebugTag( "id: %u: executing", id );
126126

127+
taskList.TaskStarted();
128+
127129
Timer t;
128130
executing.Start();
129131
task->Execute( task->data );

0 commit comments

Comments
 (0)