summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-09-01 10:40:16 +0200
committerLiang Qi <liang.qi@qt.io>2017-09-01 10:40:16 +0200
commit409a879f3617a7db7f3abfb3408f2530c139b24b (patch)
tree9238b92b5385139b6c037b45b080329d6f549cb5 /tests
parent5c99313eedada4e502b57798122ab20d71eca0fe (diff)
parent2e4acacfa3a062b8585226500f6cbc65597b8b67 (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp108
1 files changed, 30 insertions, 78 deletions
diff --git a/tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp b/tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp
index 6f455ea56..c35473111 100644
--- a/tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp
+++ b/tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp
@@ -35,76 +35,49 @@ class FakeRenderThread Q_DECL_FINAL : public QThread
public:
FakeRenderThread(Qt3DRender::Render::VSyncFrameAdvanceService *tickService)
: m_tickService(tickService)
+ , m_running(1)
+ , m_submitCount(0)
{
}
- // QThread interface
-protected:
- void run() Q_DECL_FINAL
- {
- QThread::msleep(1000);
- m_tickService->proceedToNextFrame();
- }
-
-private:
- Qt3DRender::Render::VSyncFrameAdvanceService *m_tickService;
-};
-
-class FakeAspectThread Q_DECL_FINAL : public QThread
-{
-public:
- FakeAspectThread(Qt3DRender::Render::VSyncFrameAdvanceService *tickService)
- : m_tickService(tickService)
- , m_count(0)
- , m_running(true)
- , m_waitForStarted(0)
- {
- }
-
- int count() const { return m_count; }
+ int submitCount() const { return m_submitCount; }
void stopRunning()
{
- QMutexLocker lock(&m_mutex);
- m_running = false;
+ m_running.fetchAndStoreOrdered(0);
+ m_submitSemaphore.release(1);
}
- void waitForStarted()
+ void enqueueRenderView()
{
- m_waitForStarted.acquire(1);
+ m_submitSemaphore.release(1);
}
protected:
// QThread interface
void run() Q_DECL_FINAL
{
- m_waitForStarted.release(1);
- while (true) {
-
- bool running = true;
- {
- QMutexLocker lock(&m_mutex);
- running = m_running;
- }
-
- if (!running) {
- qDebug() << "exiting";
- return;
- }
-
- m_tickService->waitForNextFrame();
- ++m_count;
+ m_tickService->proceedToNextFrame();
- QThread::msleep(100);
+ while (true) {
+ if (!isReadyToSubmit())
+ break;
+ ++m_submitCount;
+ m_tickService->proceedToNextFrame();
}
}
private:
+ bool isReadyToSubmit()
+ {
+ m_submitSemaphore.acquire(1);
+ return m_running.load() == 1;
+ }
+
Qt3DRender::Render::VSyncFrameAdvanceService *m_tickService;
- int m_count;
- bool m_running;
- QMutex m_mutex;
- QSemaphore m_waitForStarted;
+ QAtomicInt m_running;
+ QSemaphore m_submitSemaphore;
+ int m_submitCount;
};
class tst_VSyncFrameAdvanceService : public QObject
@@ -118,43 +91,22 @@ private Q_SLOTS:
// GIVEN
Qt3DRender::Render::VSyncFrameAdvanceService tickService(true);
FakeRenderThread renderThread(&tickService);
- QElapsedTimer t;
// WHEN
- t.start();
renderThread.start();
- tickService.waitForNextFrame();
- // THEN
- // we allow for a little margin by checking for 950
- // instead of 1000
- QVERIFY(t.elapsed() >= 950);
- }
-
- void checkWaitForNextFrame()
- {
- // GIVEN
- Qt3DRender::Render::VSyncFrameAdvanceService tickService(false);
- FakeAspectThread aspectThread(&tickService);
-
- // WHEN
- aspectThread.start();
- aspectThread.waitForStarted();
-
- QElapsedTimer t;
- t.start();
-
- while (t.elapsed() < 1000)
- tickService.proceedToNextFrame();
+ for (int i = 0; i < 10; ++i) {
+ tickService.waitForNextFrame();
+ renderThread.enqueueRenderView();
+ }
- aspectThread.stopRunning();
+ tickService.waitForNextFrame();
- // To make sure the aspectThread can finish
- tickService.proceedToNextFrame();
- aspectThread.wait();
+ renderThread.stopRunning();
+ renderThread.wait();
// THEN
- QCOMPARE(aspectThread.count(), 10);
+ QCOMPARE(renderThread.submitCount(), 10);
}
};