Remove CPU Spin lock to help conserve power/perf (#5597)

Signed-off-by: moudgils <moudgils@amazon.com>
monroegm-disable-blank-issue-2
moudgils 4 years ago committed by GitHub
parent a7778c89ff
commit c0192e7543
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -72,6 +72,8 @@ namespace AZ
AZStd::mutex m_workQueueMutex; AZStd::mutex m_workQueueMutex;
AZStd::queue<Command> m_workQueue; AZStd::queue<Command> m_workQueue;
AZStd::condition_variable m_workQueueCondition; AZStd::condition_variable m_workQueueCondition;
AZStd::mutex m_flushCommandsMutex;
AZStd::condition_variable m_flushCommandsCondition;
AZStd::atomic_bool m_isWorkQueueEmpty; AZStd::atomic_bool m_isWorkQueueEmpty;
AZStd::atomic_bool m_isQuitting; AZStd::atomic_bool m_isQuitting;
}; };

@ -71,6 +71,7 @@ namespace AZ
{ {
m_isQuitting = true; m_isQuitting = true;
m_workQueueCondition.notify_all(); m_workQueueCondition.notify_all();
m_flushCommandsCondition.notify_all();
if (m_thread.joinable()) if (m_thread.joinable())
{ {
m_thread.join(); m_thread.join();
@ -102,9 +103,10 @@ namespace AZ
void CommandQueue::FlushCommands() void CommandQueue::FlushCommands()
{ {
AZ_PROFILE_SCOPE(RHI, "CommandQueue: FlushCommands"); AZ_PROFILE_SCOPE(RHI, "CommandQueue: FlushCommands");
while (!m_isWorkQueueEmpty && !m_isQuitting) AZStd::unique_lock<AZStd::mutex> lock(m_flushCommandsMutex);
if (!m_isWorkQueueEmpty && !m_isQuitting)
{ {
AZStd::this_thread::yield(); m_flushCommandsCondition.wait(lock, [this]() { return m_isWorkQueueEmpty.load() || m_isQuitting.load(); });
} }
} }
@ -119,7 +121,11 @@ namespace AZ
if (m_workQueue.empty()) if (m_workQueue.empty())
{ {
m_isWorkQueueEmpty = true; {
AZStd::unique_lock<AZStd::mutex> flushCommandsLock(m_flushCommandsMutex);
m_isWorkQueueEmpty = true;
m_flushCommandsCondition.notify_all();
}
m_workQueueCondition.wait(lock, [this]() { return !m_workQueue.empty() || m_isQuitting; }); m_workQueueCondition.wait(lock, [this]() { return !m_workQueue.empty() || m_isQuitting; });
} }

Loading…
Cancel
Save