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::queue<Command> m_workQueue;
AZStd::condition_variable m_workQueueCondition;
AZStd::mutex m_flushCommandsMutex;
AZStd::condition_variable m_flushCommandsCondition;
AZStd::atomic_bool m_isWorkQueueEmpty;
AZStd::atomic_bool m_isQuitting;
};

@ -71,6 +71,7 @@ namespace AZ
{
m_isQuitting = true;
m_workQueueCondition.notify_all();
m_flushCommandsCondition.notify_all();
if (m_thread.joinable())
{
m_thread.join();
@ -102,9 +103,10 @@ namespace AZ
void 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())
{
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; });
}

Loading…
Cancel
Save