summaryrefslogtreecommitdiffstats
path: root/Projects/Asteroids/src/asteroids_DE.cpp
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-01-08 01:06:37 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-01-08 01:06:37 +0000
commite928434a6c04fafaddf0c4b7239d3202050eea69 (patch)
tree7dfabdaec2eea6935685a4b52aaea387f6485094 /Projects/Asteroids/src/asteroids_DE.cpp
parentUpdated core & samples submodules (added tutorials 4 & 5) (diff)
downloadDiligentEngine-e928434a6c04fafaddf0c4b7239d3202050eea69.tar.gz
DiligentEngine-e928434a6c04fafaddf0c4b7239d3202050eea69.zip
Updated Asteroids demo to use Signal class; Updated submodules (added Tutorial06) & readme
Diffstat (limited to 'Projects/Asteroids/src/asteroids_DE.cpp')
-rw-r--r--Projects/Asteroids/src/asteroids_DE.cpp51
1 files changed, 16 insertions, 35 deletions
diff --git a/Projects/Asteroids/src/asteroids_DE.cpp b/Projects/Asteroids/src/asteroids_DE.cpp
index 73ba096..7593f36 100644
--- a/Projects/Asteroids/src/asteroids_DE.cpp
+++ b/Projects/Asteroids/src/asteroids_DE.cpp
@@ -443,11 +443,7 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G
Asteroids::~Asteroids()
{
- {
- std::unique_lock<std::mutex> lk(mMutex);
- mExitThreads = true;
- }
- mCondVar.notify_all();
+ mUpdateSubsetsSignal.Trigger(true, -1);
for(auto &thread : mWorkerThreads)
{
@@ -610,13 +606,9 @@ void Asteroids::WorkerThreadFunc(Asteroids *pThis, Diligent::Uint32 ThreadNum)
{
for (;;)
{
- // Wait for mUpdateSubsets or mExitThreads flag on conditional variable
- {
- std::unique_lock<std::mutex> lk(pThis->mMutex);
- pThis->mCondVar.wait(lk, [&]{return pThis->mUpdateSubsets || pThis->mExitThreads;});
- }
-
- if(pThis->mExitThreads)
+ // Wait for UpdateSubsets signal
+ auto SignalledValue = pThis->mUpdateSubsetsSignal.Wait();
+ if(SignalledValue < 0)
return;
auto SubsetSize = NUM_ASTEROIDS / pThis->mNumSubsets;
@@ -628,11 +620,9 @@ void Asteroids::WorkerThreadFunc(Asteroids *pThis, Diligent::Uint32 ThreadNum)
// Increment number of completed threads
++pThis->m_NumThreadsCompleted;
- // Wait for mRenderSubsets flag on conditional variable
- {
- std::unique_lock<std::mutex> lk(pThis->mMutex);
- pThis->mCondVar.wait(lk, [&]{return pThis->mRenderSubsets || pThis->mExitThreads;});
- }
+
+ // Wait for RenderSubsets signal
+ pThis->mRenderSubsetsSignal.Wait();
pThis->RenderSubset(1+ThreadNum, pThis->mDeferredCtxt[ThreadNum], *FrameAttribs.camera, SubsetStart, SubsetSize);
@@ -735,13 +725,8 @@ void Asteroids::Render(float frameTime, const OrbitCamera& camera, const Setting
if (settings.multithreadedRendering)
{
- // Set mUpdateSubsets flag
- {
- std::unique_lock<std::mutex> lk(mMutex);
- mUpdateSubsets = true;
- m_NumThreadsCompleted = 0;
- }
- mCondVar.notify_all();
+ m_NumThreadsCompleted = 0;
+ mUpdateSubsetsSignal.Trigger(true);
}
mAsteroids->Update(frameTime, camera.Eye(), settings, 0, SubsetSize);
@@ -751,8 +736,8 @@ void Asteroids::Render(float frameTime, const OrbitCamera& camera, const Setting
// Wait for worker threads to finish
while(m_NumThreadsCompleted < (int)mNumSubsets-1)
std::this_thread::yield();
- // Clear mUpdateSubsets flag while all threads are waiting for mRenderSubsets flag
- mUpdateSubsets = false;
+ // Reset mUpdateSubsetsSignal while all threads are waiting for mRenderSubsetsSignal
+ mUpdateSubsetsSignal.Reset();
}
@@ -763,13 +748,9 @@ void Asteroids::Render(float frameTime, const OrbitCamera& camera, const Setting
if (settings.multithreadedRendering)
{
- // Set mRenderSubsets flag
- {
- std::unique_lock<std::mutex> lk(mMutex);
- mRenderSubsets = true;
- m_NumThreadsCompleted = 0;
- }
- mCondVar.notify_all();
+ // Signal RenderSubsets
+ m_NumThreadsCompleted = 0;
+ mRenderSubsetsSignal.Trigger(true);
}
RenderSubset(0, mDeviceCtxt, camera, 0, SubsetSize);
@@ -779,8 +760,8 @@ void Asteroids::Render(float frameTime, const OrbitCamera& camera, const Setting
// Wait for worker threads to finish
while(m_NumThreadsCompleted < (int)mNumSubsets-1)
std::this_thread::yield();
- // Clear mRenderSubsets flag while all threads are waiting for mUpdateSubsets flag
- mRenderSubsets = false;
+ // Reset mRenderSubsetsSignal while all threads are waiting for mUpdateSubsetsSignal
+ mRenderSubsetsSignal.Reset();
for(auto &cmdList : mCmdLists)
{