From 0bb82d2b73614b31fa703ad0e5ec45fcfecd5f01 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 28 Dec 2016 16:04:22 -0500 Subject: [PATCH 01/10] use libquazip5.so in debug --- cmake/externals/quazip/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/externals/quazip/CMakeLists.txt b/cmake/externals/quazip/CMakeLists.txt index f00403640a..b8b3fe43d8 100644 --- a/cmake/externals/quazip/CMakeLists.txt +++ b/cmake/externals/quazip/CMakeLists.txt @@ -38,13 +38,13 @@ set(${EXTERNAL_NAME_UPPER}_DLL_PATH ${INSTALL_DIR}/lib CACHE FILEPATH "Location if (APPLE) set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libquazip5.1.0.0.dylib CACHE FILEPATH "Location of QuaZip release library") - set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libquazip5d.1.0.0.dylib CACHE FILEPATH "Location of QuaZip release library") + set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libquazip5.1.0.0.dylib CACHE FILEPATH "Location of QuaZip release library") elseif (WIN32) set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/lib/quazip5.lib CACHE FILEPATH "Location of QuaZip release library") - set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/quazip5d.lib CACHE FILEPATH "Location of QuaZip release library") + set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/quazip5.lib CACHE FILEPATH "Location of QuaZip release library") else () set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libquazip5.so CACHE FILEPATH "Location of QuaZip release library") - set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libquazip5d.so CACHE FILEPATH "Location of QuaZip release library") + set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libquazip5.so CACHE FILEPATH "Location of QuaZip release library") endif () include(SelectLibraryConfigurations) @@ -52,4 +52,4 @@ select_library_configurations(${EXTERNAL_NAME_UPPER}) # Force selected libraries into the cache set(${EXTERNAL_NAME_UPPER}_LIBRARY ${${EXTERNAL_NAME_UPPER}_LIBRARY} CACHE FILEPATH "Location of QuaZip libraries") -set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Location of QuaZip libraries") \ No newline at end of file +set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Location of QuaZip libraries") From f79c6e08f5c40aa0d8c07cd428a6325760fe3e62 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 28 Dec 2016 14:18:23 -0800 Subject: [PATCH 02/10] Track dropped frames as reported by the Oculus SDK --- interface/src/Application.cpp | 1 + libraries/plugins/src/plugins/DisplayPlugin.h | 4 ++++ plugins/oculus/src/OculusDisplayPlugin.cpp | 14 +++++++++++--- plugins/oculus/src/OculusDisplayPlugin.h | 4 ++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d92ba53f6e..eb2f6f5896 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1271,6 +1271,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo properties["sim_rate"] = getAverageSimsPerSecond(); properties["avatar_sim_rate"] = getAvatarSimrate(); properties["has_async_reprojection"] = displayPlugin->hasAsyncReprojection(); + properties["hardware_stats"] = displayPlugin->getHardwareStats(); auto bandwidthRecorder = DependencyManager::get(); properties["packet_rate_in"] = bandwidthRecorder->getCachedTotalAverageInputPacketsPerSecond(); diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 6b55d8ed64..2491aed817 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -194,6 +195,9 @@ public: virtual float newFramePresentRate() const { return -1.0f; } // Rate at which rendered frames are being skipped virtual float droppedFrameRate() const { return -1.0f; } + + // Hardware specific stats + virtual QJsonObject getHardwareStats() const { return QJsonObject(); } uint32_t presentCount() const { return _presentedFrameIndex; } // Time since last call to incrementPresentCount (only valid if DEBUG_PAINT_DELAY is defined) diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp index 88ca02edc2..7a56124298 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDisplayPlugin.cpp @@ -147,19 +147,27 @@ void OculusDisplayPlugin::hmdPresent() { logWarning("Failed to present"); } - static int droppedFrames = 0; + static int compositorDroppedFrames = 0; + static int appDroppedFrames = 0; ovrPerfStats perfStats; ovr_GetPerfStats(_session, &perfStats); for (int i = 0; i < perfStats.FrameStatsCount; ++i) { const auto& frameStats = perfStats.FrameStats[i]; - int delta = frameStats.CompositorDroppedFrameCount - droppedFrames; + int delta = frameStats.CompositorDroppedFrameCount - compositorDroppedFrames; _stutterRate.increment(delta); - droppedFrames = frameStats.CompositorDroppedFrameCount; + compositorDroppedFrames = frameStats.CompositorDroppedFrameCount; + appDroppedFrames = frameStats.AppDroppedFrameCount; } + _hardwareStats["app_dropped_frame_count"] = appDroppedFrames; } _presentRate.increment(); } + +QJsonObject OculusDisplayPlugin::getHardwareStats() const { + return _hardwareStats; +} + bool OculusDisplayPlugin::isHmdMounted() const { ovrSessionStatus status; return (OVR_SUCCESS(ovr_GetSessionStatus(_session, &status)) && diff --git a/plugins/oculus/src/OculusDisplayPlugin.h b/plugins/oculus/src/OculusDisplayPlugin.h index fce8e9e6ce..a953e01e2f 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.h +++ b/plugins/oculus/src/OculusDisplayPlugin.h @@ -19,6 +19,8 @@ public: QString getPreferredAudioInDevice() const override; QString getPreferredAudioOutDevice() const override; + + virtual QJsonObject getHardwareStats() const; protected: bool internalActivate() override; @@ -33,5 +35,7 @@ private: ovrTextureSwapChain _textureSwapChain; gpu::FramebufferPointer _outputFramebuffer; bool _customized { false }; + + QJsonObject _hardwareStats; }; From 522403cf48390343b7df40cfcdbce8fec3d31514 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 28 Dec 2016 18:08:17 -0800 Subject: [PATCH 03/10] fix build error on linux --- tests/shared/src/TraceTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/shared/src/TraceTests.cpp b/tests/shared/src/TraceTests.cpp index 5536d17ca6..a3ef2e8725 100644 --- a/tests/shared/src/TraceTests.cpp +++ b/tests/shared/src/TraceTests.cpp @@ -28,7 +28,7 @@ void TraceTests::testTraceSerialization() { auto start = usecTimestampNow(); PROFILE_RANGE(test, "TestEvent") for (size_t i = 0; i < 10000; ++i) { - SAMPLE_PROFILE_COUNTER(0.1f, test, "TestCounter", { { "i", i } }) + SAMPLE_PROFILE_COUNTER(0.1f, test, "TestCounter", { { "i", (int)i } }) } auto duration = usecTimestampNow() - start; duration /= USECS_PER_MSEC; From 9763566bdb73c7cf63d4ca7c4630c1747e295849 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 28 Dec 2016 18:09:31 -0800 Subject: [PATCH 04/10] fix bitrot from April 2016 --- tests/shared/src/MovingPercentileTests.cpp | 34 ++++++++++++---------- tests/shared/src/MovingPercentileTests.h | 2 +- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/tests/shared/src/MovingPercentileTests.cpp b/tests/shared/src/MovingPercentileTests.cpp index fbbc3c7b9e..741c966525 100644 --- a/tests/shared/src/MovingPercentileTests.cpp +++ b/tests/shared/src/MovingPercentileTests.cpp @@ -39,19 +39,21 @@ void MovingPercentileTests::testRunningMedian() { } -float MovingPercentileTests::random() { - return rand() / (float)RAND_MAX; +int64_t MovingPercentileTests::random() { + return ((int64_t) rand() << 48) ^ + ((int64_t) rand() << 32) ^ + ((int64_t) rand() << 16) ^ + ((int64_t) rand()); } void MovingPercentileTests::testRunningMinForN (int n) { - // Stores the last n samples - QQueue samples; + QQueue samples; MovingPercentile movingMin (n, 0.0f); for (int s = 0; s < 3 * n; ++s) { - float sample = random(); + int64_t sample = random(); samples.push_back(sample); if (samples.size() > n) @@ -64,30 +66,32 @@ void MovingPercentileTests::testRunningMinForN (int n) { movingMin.updatePercentile(sample); // Calculate the minimum of the moving samples - float expectedMin = std::numeric_limits::max(); + int64_t expectedMin = std::numeric_limits::max(); int prevSize = samples.size(); - for (auto val : samples) + for (auto val : samples) { expectedMin = std::min(val, expectedMin); + } QCOMPARE(samples.size(), prevSize); - QCOMPARE(movingMin.getValueAtPercentile(), expectedMin); + QVERIFY(movingMin.getValueAtPercentile() - expectedMin == 0L); } } void MovingPercentileTests::testRunningMaxForN (int n) { // Stores the last n samples - QQueue samples; + QQueue samples; MovingPercentile movingMax (n, 1.0f); for (int s = 0; s < 10000; ++s) { - float sample = random(); + int64_t sample = random(); samples.push_back(sample); - if (samples.size() > n) + if (samples.size() > n) { samples.pop_front(); + } if (samples.size() == 0) { QFAIL_WITH_MESSAGE("\n\n\n\tWTF\n\tsamples.size() = " << samples.size() << ", n = " << n); @@ -96,22 +100,22 @@ void MovingPercentileTests::testRunningMaxForN (int n) { movingMax.updatePercentile(sample); // Calculate the maximum of the moving samples - float expectedMax = std::numeric_limits::min(); + int64_t expectedMax = std::numeric_limits::min(); for (auto val : samples) expectedMax = std::max(val, expectedMax); - QCOMPARE(movingMax.getValueAtPercentile(), expectedMax); + QVERIFY(movingMax.getValueAtPercentile() - expectedMax == 0L); } } void MovingPercentileTests::testRunningMedianForN (int n) { // Stores the last n samples - QQueue samples; + QQueue samples; MovingPercentile movingMedian (n, 0.5f); for (int s = 0; s < 10000; ++s) { - float sample = random(); + int64_t sample = random(); samples.push_back(sample); if (samples.size() > n) diff --git a/tests/shared/src/MovingPercentileTests.h b/tests/shared/src/MovingPercentileTests.h index ffc8ddb0f6..d9c96d2752 100644 --- a/tests/shared/src/MovingPercentileTests.h +++ b/tests/shared/src/MovingPercentileTests.h @@ -25,7 +25,7 @@ private slots: private: // Utilities and helper functions - float random(); + int64_t random(); void testRunningMinForN (int n); void testRunningMaxForN (int n); void testRunningMedianForN (int n); From 39538db63afd75a0c2562740dc726cd640e61cb5 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 28 Dec 2016 18:10:45 -0800 Subject: [PATCH 05/10] fix bitrot from changed glm::vec3 API? --- tests/shared/src/GeometryUtilTests.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/shared/src/GeometryUtilTests.cpp b/tests/shared/src/GeometryUtilTests.cpp index 79472a1128..ccb3dc8a0e 100644 --- a/tests/shared/src/GeometryUtilTests.cpp +++ b/tests/shared/src/GeometryUtilTests.cpp @@ -255,11 +255,11 @@ void GeometryUtilTests::testTwistSwingDecomposition() { glm::quat measuredTwistRotation; glm::quat measuredSwingRotation; swingTwistDecomposition(totalRotation, twistAxis, measuredSwingRotation, measuredTwistRotation); - + // dot decomposed with components float twistDot = fabsf(glm::dot(twistRotation, measuredTwistRotation)); float swingDot = fabsf(glm::dot(swingRotation, measuredSwingRotation)); - + // the dot products should be very close to 1.0 const float MIN_ERROR = 1.0e-6f; QCOMPARE_WITH_ABS_ERROR(1.0f, twistDot, MIN_ERROR); @@ -277,7 +277,7 @@ void GeometryUtilTests::testSphereCapsulePenetration() { glm::vec3 capsuleEnd(0.0f, 10.0f, 0.0f); float capsuleRadius = 1.0f; - glm::vec3 penetration(glm::vec3::_null); + glm::vec3 penetration(0.0f); bool hit = findSphereCapsulePenetration(sphereCenter, sphereRadius, capsuleStart, capsuleEnd, capsuleRadius, penetration); QCOMPARE(hit, true); QCOMPARE_WITH_ABS_ERROR(penetration, glm::vec3(-0.5f, 0.0f, 0.0f), EPSILON); From 96a9ef8f44dde9669ae17fa3db354062b1e25d6d Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 28 Dec 2016 18:11:54 -0800 Subject: [PATCH 06/10] fix bitrot after UDT overhaul --- tests/networking/src/PacketTests.cpp | 30 +++++++++++------------ tests/networking/src/ResourceTests.cpp | 33 +++++++------------------- 2 files changed, 23 insertions(+), 40 deletions(-) diff --git a/tests/networking/src/PacketTests.cpp b/tests/networking/src/PacketTests.cpp index cbb949aa84..ff2149930e 100644 --- a/tests/networking/src/PacketTests.cpp +++ b/tests/networking/src/PacketTests.cpp @@ -12,29 +12,29 @@ #include "PacketTests.h" #include "../QTestExtensions.h" -#include +#include QTEST_MAIN(PacketTests) -std::unique_ptr copyToReadPacket(std::unique_ptr& packet) { +std::unique_ptr copyToReadPacket(std::unique_ptr& packet) { auto size = packet->getDataSize(); auto data = std::unique_ptr(new char[size]); memcpy(data.get(), packet->getData(), size); - return Packet::fromReceivedPacket(std::move(data), size, HifiSockAddr()); + return NLPacket::fromReceivedPacket(std::move(data), size, HifiSockAddr()); } void PacketTests::emptyPacketTest() { - auto packet = Packet::create(PacketType::Unknown); + auto packet = NLPacket::create(PacketType::Unknown); QCOMPARE(packet->getType(), PacketType::Unknown); QCOMPARE(packet->getPayloadSize(), 0); - QCOMPARE(packet->getDataSize(), packet->totalHeadersSize()); + QCOMPARE(packet->getDataSize(), NLPacket::totalHeaderSize(packet->getType())); QCOMPARE(packet->bytesLeftToRead(), 0); QCOMPARE(packet->bytesAvailableForWrite(), packet->getPayloadCapacity()); } void PacketTests::packetTypeTest() { - auto packet = Packet::create(PacketType::EntityAdd); + auto packet = NLPacket::create(PacketType::EntityAdd); QCOMPARE(packet->getType(), PacketType::EntityAdd); @@ -46,7 +46,7 @@ void PacketTests::packetTypeTest() { } void PacketTests::writeTest() { - auto packet = Packet::create(PacketType::Unknown); + auto packet = NLPacket::create(PacketType::Unknown); QCOMPARE(packet->getPayloadSize(), 0); @@ -62,7 +62,7 @@ void PacketTests::writeTest() { void PacketTests::readTest() { // Test reads for several different size packets for (int i = 1; i < 4; i++) { - auto packet = Packet::create(PacketType::Unknown); + auto packet = NLPacket::create(PacketType::Unknown); auto size = packet->getPayloadCapacity(); size /= i; @@ -91,7 +91,7 @@ void PacketTests::readTest() { } void PacketTests::writePastCapacityTest() { - auto packet = Packet::create(PacketType::Unknown); + auto packet = NLPacket::create(PacketType::Unknown); auto size = packet->getPayloadCapacity(); char* data = new char[size]; @@ -111,20 +111,20 @@ void PacketTests::writePastCapacityTest() { QCOMPARE(packet->bytesAvailableForWrite(), 0); QCOMPARE(packet->getPayloadSize(), size); - QCOMPARE(Packet::PACKET_WRITE_ERROR, packet->write("data")); - - // Packet::write() shouldn't allow the caller to write if no space is left + QCOMPARE(NLPacket::PACKET_WRITE_ERROR, packet->write("data")); // asserts in DEBUG + + // NLPacket::write() shouldn't allow the caller to write if no space is left QCOMPARE(packet->getPayloadSize(), size); } void PacketTests::primitiveTest() { - auto packet = Packet::create(PacketType::Unknown); + auto packet = NLPacket::create(PacketType::Unknown); int value1 = 5; char value2 = 10; bool value3 = true; qint64 value4 = -93404; - + packet->writePrimitive(value1); packet->writePrimitive(value2); packet->writePrimitive(value3); @@ -133,7 +133,7 @@ void PacketTests::primitiveTest() { auto recvPacket = copyToReadPacket(packet); // Peek & read first value - { + { int peekValue = 0; QCOMPARE(recvPacket->peekPrimitive(&peekValue), (int)sizeof(peekValue)); QCOMPARE(peekValue, value1); diff --git a/tests/networking/src/ResourceTests.cpp b/tests/networking/src/ResourceTests.cpp index e6dcf18230..a96abc1b0c 100644 --- a/tests/networking/src/ResourceTests.cpp +++ b/tests/networking/src/ResourceTests.cpp @@ -37,25 +37,10 @@ void ResourceTests::initTestCase() { static QSharedPointer resource; -static bool waitForSignal(QObject *sender, const char *signal, int timeout = 1000) { - QEventLoop loop; - QTimer timer; - timer.setInterval(timeout); - timer.setSingleShot(true); - - loop.connect(sender, signal, SLOT(quit())); - loop.connect(&timer, SIGNAL(timeout()), SLOT(quit())); - timer.start(); - loop.exec(); - - return timer.isActive(); -} - void ResourceTests::downloadFirst() { - // download the Mery fst file QUrl meryUrl = QUrl("http://hifi-public.s3.amazonaws.com/marketplace/contents/e21c0b95-e502-4d15-8c41-ea2fc40f1125/3585ddf674869a67d31d5964f7b52de1.fst"); - resource = QSharedPointer::create(meryUrl, false); + resource = QSharedPointer::create(meryUrl); resource->setSelf(resource); const int timeout = 1000; @@ -64,9 +49,9 @@ void ResourceTests::downloadFirst() { timer.setInterval(timeout); timer.setSingleShot(true); - loop.connect(resource, SIGNAL(loaded(QNetworkReply&)), SLOT(quit())); - loop.connect(resource, SIGNAL(failed(QNetworkReply::NetworkError)), SLOT(quit())); - loop.connect(&timer, SIGNAL(timeout()), SLOT(quit())); + connect(resource.data(), &Resource::loaded, &loop, &QEventLoop::quit); + connect(resource.data(), &Resource::failed, &loop, &QEventLoop::quit); + connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); timer.start(); resource->ensureLoading(); @@ -76,10 +61,9 @@ void ResourceTests::downloadFirst() { } void ResourceTests::downloadAgain() { - // download the Mery fst file QUrl meryUrl = QUrl("http://hifi-public.s3.amazonaws.com/marketplace/contents/e21c0b95-e502-4d15-8c41-ea2fc40f1125/3585ddf674869a67d31d5964f7b52de1.fst"); - resource = QSharedPointer::create(meryUrl, false); + resource = QSharedPointer::create(meryUrl); resource->setSelf(resource); const int timeout = 1000; @@ -88,14 +72,13 @@ void ResourceTests::downloadAgain() { timer.setInterval(timeout); timer.setSingleShot(true); - loop.connect(resource, SIGNAL(loaded(QNetworkReply&)), SLOT(quit())); - loop.connect(resource, SIGNAL(failed(QNetworkReply::NetworkError)), SLOT(quit())); - loop.connect(&timer, SIGNAL(timeout()), SLOT(quit())); + connect(resource.data(), &Resource::loaded, &loop, &QEventLoop::quit); + connect(resource.data(), &Resource::failed, &loop, &QEventLoop::quit); + connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); timer.start(); resource->ensureLoading(); loop.exec(); QVERIFY(resource->isLoaded()); - } From 1e38170ba9a17d498c1a32ac4526e466a77cc897 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 28 Dec 2016 18:12:22 -0800 Subject: [PATCH 07/10] fix bitrot from AudioRingBuffer API change --- tests/audio/src/AudioRingBufferTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/audio/src/AudioRingBufferTests.cpp b/tests/audio/src/AudioRingBufferTests.cpp index ea384cad61..7021197792 100644 --- a/tests/audio/src/AudioRingBufferTests.cpp +++ b/tests/audio/src/AudioRingBufferTests.cpp @@ -36,7 +36,7 @@ void AudioRingBufferTests::runAllTests() { int readIndexAt; - AudioRingBuffer ringBuffer(10, false, 10); // makes buffer of 100 int16_t samples + AudioRingBuffer ringBuffer(10, 10); // makes buffer of 100 int16_t samples for (int T = 0; T < 300; T++) { writeIndexAt = 0; From be0ca41eb3206b61b93f7ef62935c8012aed06b8 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 28 Dec 2016 18:27:34 -0800 Subject: [PATCH 08/10] make implicit cast explicit --- libraries/shared/src/GLMHelpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/GLMHelpers.cpp b/libraries/shared/src/GLMHelpers.cpp index 6aa4f68f22..ec244553f8 100644 --- a/libraries/shared/src/GLMHelpers.cpp +++ b/libraries/shared/src/GLMHelpers.cpp @@ -370,7 +370,7 @@ glm::quat glmExtractRotation(const glm::mat4& matrix) { glm::vec3 extractScale(const glm::mat4& matrix) { glm::mat3 m(matrix); float det = glm::determinant(m); - if (det < 0) { + if (det < 0.0f) { // left handed matrix, flip sign to compensate. return glm::vec3(-glm::length(m[0]), glm::length(m[1]), glm::length(m[2])); } else { From f46b8f3e6df4041426b4340b31647f67987462cc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 29 Dec 2016 10:17:40 -0800 Subject: [PATCH 09/10] Track compositor dropped frames as well. --- plugins/oculus/src/OculusDisplayPlugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp index 7a56124298..bad346b1ca 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDisplayPlugin.cpp @@ -159,6 +159,7 @@ void OculusDisplayPlugin::hmdPresent() { appDroppedFrames = frameStats.AppDroppedFrameCount; } _hardwareStats["app_dropped_frame_count"] = appDroppedFrames; + _hardwareStats["compositor_dropped_frame_count"] = compositorDroppedFrames; } _presentRate.increment(); } From e5901fa875de8701bf1d94abad5fd39d3e982df2 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 29 Dec 2016 11:09:09 -0800 Subject: [PATCH 10/10] Make getHardwareStats thread safe --- plugins/oculus/src/OculusDisplayPlugin.cpp | 16 +++++++++++++--- plugins/oculus/src/OculusDisplayPlugin.h | 4 +++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp index bad346b1ca..060823a748 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDisplayPlugin.cpp @@ -22,6 +22,13 @@ const char* OculusDisplayPlugin::NAME { "Oculus Rift" }; static ovrPerfHudMode currentDebugMode = ovrPerfHud_Off; + +OculusDisplayPlugin::OculusDisplayPlugin() { + _appDroppedFrames.store(0); + _compositorDroppedFrames.store(0); +} + + bool OculusDisplayPlugin::internalActivate() { bool result = Parent::internalActivate(); currentDebugMode = ovrPerfHud_Off; @@ -158,15 +165,18 @@ void OculusDisplayPlugin::hmdPresent() { compositorDroppedFrames = frameStats.CompositorDroppedFrameCount; appDroppedFrames = frameStats.AppDroppedFrameCount; } - _hardwareStats["app_dropped_frame_count"] = appDroppedFrames; - _hardwareStats["compositor_dropped_frame_count"] = compositorDroppedFrames; + _appDroppedFrames.store(appDroppedFrames); + _compositorDroppedFrames.store(compositorDroppedFrames); } _presentRate.increment(); } QJsonObject OculusDisplayPlugin::getHardwareStats() const { - return _hardwareStats; + QJsonObject hardwareStats; + hardwareStats["app_dropped_frame_count"] = _appDroppedFrames.load(); + hardwareStats["compositor_dropped_frame_count"] = _compositorDroppedFrames.load(); + return hardwareStats; } bool OculusDisplayPlugin::isHmdMounted() const { diff --git a/plugins/oculus/src/OculusDisplayPlugin.h b/plugins/oculus/src/OculusDisplayPlugin.h index a953e01e2f..e44596d6e9 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.h +++ b/plugins/oculus/src/OculusDisplayPlugin.h @@ -12,6 +12,7 @@ class OculusDisplayPlugin : public OculusBaseDisplayPlugin { using Parent = OculusBaseDisplayPlugin; public: + OculusDisplayPlugin(); ~OculusDisplayPlugin(); const QString getName() const override { return NAME; } @@ -36,6 +37,7 @@ private: gpu::FramebufferPointer _outputFramebuffer; bool _customized { false }; - QJsonObject _hardwareStats; + std::atomic_int _compositorDroppedFrames; + std::atomic_int _appDroppedFrames; };