From 07299291fca218aea3167950227362d5af2ba23d Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 6 Jul 2018 19:29:06 +0200 Subject: [PATCH] clarifying the engine inspector and engine profiler --- interface/src/SecondaryCamera.cpp | 2 +- libraries/task/src/task/Config.cpp | 54 +++++++++++++++++ libraries/task/src/task/Config.h | 37 ++---------- .../utilities/lib/jet/qml/TaskListView.qml | 2 +- .../lib/jet/qml/TaskTimeFrameView.qml | 2 +- .../utilities/render/deferredLighting.qml | 19 ++++-- .../utilities/render/engineInspector.js | 2 +- .../utilities/render/engineInspector.qml | 20 +++---- .../utilities/render/engineProfiler.js | 59 +++++++++++++++++++ .../utilities/render/engineProfiler.qml | 31 ++++++++++ scripts/developer/utilities/render/luci.js | 32 ++++++++-- 11 files changed, 202 insertions(+), 58 deletions(-) create mode 100644 scripts/developer/utilities/render/engineProfiler.js create mode 100644 scripts/developer/utilities/render/engineProfiler.qml diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index a940aab4db..184762632f 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -171,7 +171,7 @@ void SecondaryCameraJobConfig::setOrientation(glm::quat orient) { } void SecondaryCameraJobConfig::enableSecondaryCameraRenderConfigs(bool enabled) { - qApp->getRenderEngine()->getConfiguration()->getConfig()->setEnabled(enabled); + qApp->getRenderEngine()->getConfiguration()->getConfig("SecondaryCameraJob")->setEnabled(enabled); setEnabled(enabled); } diff --git a/libraries/task/src/task/Config.cpp b/libraries/task/src/task/Config.cpp index b378237c9c..ac7105be29 100644 --- a/libraries/task/src/task/Config.cpp +++ b/libraries/task/src/task/Config.cpp @@ -68,3 +68,57 @@ void TaskConfig::refresh() { _task->applyConfiguration(); } +TaskConfig* TaskConfig::getRootConfig(const std::string& jobPath, std::string& jobName) const { + TaskConfig* root = const_cast (this); + + std::list tokens; + std::size_t pos = 0, sepPos; + while ((sepPos = jobPath.find_first_of('.', pos)) != std::string::npos) { + std::string token = jobPath.substr(pos, sepPos - pos); + if (!token.empty()) { + tokens.push_back(token); + } + pos = sepPos + 1; + } + { + std::string token = jobPath.substr(pos, sepPos - pos); + if (!token.empty()) { + tokens.push_back(token); + } + } + + if (tokens.empty()) { + return root; + } + else { + while (tokens.size() > 1) { + auto taskName = tokens.front(); + tokens.pop_front(); + root = root->findChild((taskName.empty() ? QString() : QString(taskName.c_str()))); + if (!root) { + return nullptr; + } + } + jobName = tokens.front(); + } + return root; +} + +JobConfig* TaskConfig::getJobConfig(const std::string& jobPath) const { + std::string jobName; + auto root = getRootConfig(jobPath, jobName); + + if (!root) { + return nullptr; + } + if (jobName.empty()) { + return root; + } else { + + auto found = root->findChild((jobName.empty() ? QString() : QString(jobName.c_str()))); + if (!found) { + return nullptr; + } + return found; + } +} diff --git a/libraries/task/src/task/Config.h b/libraries/task/src/task/Config.h index 4a9414fd42..b76c57521f 100644 --- a/libraries/task/src/task/Config.h +++ b/libraries/task/src/task/Config.h @@ -219,41 +219,16 @@ public: // optional sub_parent_names and finally from there looking for the job_name (assuming every job in the path were found) // // getter for qml integration, prefer the templated getter -#pragma optimize("", off) Q_INVOKABLE QObject* getConfig(const QString& name) { return getConfig(name.toStdString()); } + // getter for cpp (strictly typed), prefer this getter - template typename T::Config* getConfig(std::string job = "") const { - const TaskConfig* root = this; - std::string jobPath = (job); - //QString path = (job.empty() ? QString() : QString(job.c_str())); // an empty string is not a null string - //auto tokens = path.split('.', QString::SkipEmptyParts); - std::list tokens; - std::size_t pos = 0, found; - while ((found = jobPath.find_first_of('.', pos)) != std::string::npos) { - tokens.push_back(jobPath.substr(pos, found - pos)); - pos = found + 1; - } - tokens.push_back(jobPath.substr(pos)); + TaskConfig* getRootConfig(const std::string& jobPath, std::string& jobName) const; + JobConfig* getJobConfig(const std::string& jobPath) const; - QString jobToken; - if (tokens.empty()) { - // return dynamic_cast(const_cast (root)); - //tokens.push_back(std::string()); - } else { - while (tokens.size() > 1) { - auto name = tokens.front(); - tokens.pop_front(); - root = root->findChild((name.empty() ? QString() : QString(name.c_str()))); - if (!root) { - return nullptr; - } - } - jobToken = QString(tokens.front().c_str()); - } - - return root->findChild(jobToken); + template typename T::Config* getConfig(std::string jobPath = "") const { + return dynamic_cast(getJobConfig(jobPath)); } -#pragma optimize("", on) + Q_INVOKABLE bool isTask() const override { return true; } Q_INVOKABLE QObjectList getSubConfigs() const override { auto list = findChildren(QRegExp(".*"), Qt::FindDirectChildrenOnly); diff --git a/scripts/developer/utilities/lib/jet/qml/TaskListView.qml b/scripts/developer/utilities/lib/jet/qml/TaskListView.qml index f8997dfaf4..1229ef7dc7 100644 --- a/scripts/developer/utilities/lib/jet/qml/TaskListView.qml +++ b/scripts/developer/utilities/lib/jet/qml/TaskListView.qml @@ -19,7 +19,7 @@ import "../jet.js" as Jet Rectangle { HifiConstants { id: hifi;} - color: hifi.colors.baseGray; + // color: hifi.colors.baseGray; id: root; property var rootConfig : Workload diff --git a/scripts/developer/utilities/lib/jet/qml/TaskTimeFrameView.qml b/scripts/developer/utilities/lib/jet/qml/TaskTimeFrameView.qml index 4eca5075d0..267344fca5 100644 --- a/scripts/developer/utilities/lib/jet/qml/TaskTimeFrameView.qml +++ b/scripts/developer/utilities/lib/jet/qml/TaskTimeFrameView.qml @@ -19,7 +19,7 @@ import "../jet.js" as Jet Rectangle { HifiConstants { id: hifi;} - color: hifi.colors.baseGray; + // color: hifi.colors.baseGray; id: root; property var rootConfig : Workload diff --git a/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index 8a4a8f0622..abb15d5a38 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -277,11 +277,20 @@ Rectangle { } } Separator {} - HifiControls.Button { - text: "Engine" - // activeFocusOnPress: false - onClicked: { - sendToScript({method: "openEngineView"}); + Row { + HifiControls.Button { + text: "Inspector" + // activeFocusOnPress: false + onClicked: { + sendToScript({method: "openEngineInspector"}); + } + } + HifiControls.Button { + text: "EnProfilergine" + // activeFocusOnPress: false + onClicked: { + sendToScript({method: "openEngineProfiler"}); + } } } } diff --git a/scripts/developer/utilities/render/engineInspector.js b/scripts/developer/utilities/render/engineInspector.js index e6be7f1c3c..868a421c8d 100644 --- a/scripts/developer/utilities/render/engineInspector.js +++ b/scripts/developer/utilities/render/engineInspector.js @@ -47,7 +47,7 @@ function createWindow() { var qml = Script.resolvePath(QMLAPP_URL); window = new OverlayWindow({ - title: 'Render Engine', + title: 'Render Engine Inspector', source: qml, width: 500, height: 100 diff --git a/scripts/developer/utilities/render/engineInspector.qml b/scripts/developer/utilities/render/engineInspector.qml index 7a2dfcc9e2..52a9879038 100644 --- a/scripts/developer/utilities/render/engineInspector.qml +++ b/scripts/developer/utilities/render/engineInspector.qml @@ -1,7 +1,7 @@ // -// deferredLighting.qml +// EngineInspector.qml // -// Created by Sam Gateau on 6/6/2016 +// Created by Sam Gateau on 06/07/2018 // Copyright 2016 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. @@ -18,19 +18,13 @@ import "../lib/jet/qml" as Jet Item { HifiConstants { id: hifi;} - id: render; + id: root; anchors.fill: parent - property var mainViewTask: Render.getConfig("RenderMainView") + property var rootConfig: Render.getConfig("RenderMainView") - - /* Jet.TaskTimeFrameView { - rootConfig: Render - anchors.fill: render - }*/ Jet.TaskListView { - rootConfig: Render - anchors.fill: render - } - + rootConfig: root.rootConfig + anchors.fill: root + } } \ No newline at end of file diff --git a/scripts/developer/utilities/render/engineProfiler.js b/scripts/developer/utilities/render/engineProfiler.js new file mode 100644 index 0000000000..b9443da1e9 --- /dev/null +++ b/scripts/developer/utilities/render/engineProfiler.js @@ -0,0 +1,59 @@ + + + (function() { + var TABLET_BUTTON_NAME = "Render Engine Profiler"; + var QMLAPP_URL = Script.resolvePath("./engineProfiler.qml"); + var ICON_URL = Script.resolvePath("../../../system/assets/images/lod-i.svg"); + var ACTIVE_ICON_URL = Script.resolvePath("../../../system/assets/images/lod-a.svg"); + + var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + var button = tablet.addButton({ + text: TABLET_BUTTON_NAME, + icon: ICON_URL, + activeIcon: ACTIVE_ICON_URL + }); + + Script.scriptEnding.connect(function () { + killWindow() + button.clicked.disconnect(onClicked); + tablet.removeButton(button); + }); + + button.clicked.connect(onClicked); + + var onScreen = false; + var window; + + function onClicked() { + if (onScreen) { + killWindow() + } else { + createWindow() + } + } + + function createWindow() { + var qml = Script.resolvePath(QMLAPP_URL); + window = new OverlayWindow({ + title: 'Render Engine Profiler', + source: qml, + width: 500, + height: 100 + }); + window.setPosition(200, 50); + window.closed.connect(killWindow); + onScreen = true + button.editProperties({isActive: true}); + } + + function killWindow() { + if (window !== undefined) { + window.closed.disconnect(killWindow); + window.close() + window = undefined + } + onScreen = false + button.editProperties({isActive: false}) + } + }()); + \ No newline at end of file diff --git a/scripts/developer/utilities/render/engineProfiler.qml b/scripts/developer/utilities/render/engineProfiler.qml new file mode 100644 index 0000000000..bfa049d089 --- /dev/null +++ b/scripts/developer/utilities/render/engineProfiler.qml @@ -0,0 +1,31 @@ +// +// EngineProfiler.qml +// +// Created by Sam Gateau on 06/07/2018 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html +// +import QtQuick 2.7 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.3 + +import "qrc:///qml/styles-uit" +import "qrc:///qml/controls-uit" as HifiControls + +import "../lib/jet/qml" as Jet + +Item { + HifiConstants { id: hifi;} + id: root; + anchors.fill: parent + + property var rootConfig: Render.getConfig("") + + + Jet.TaskTimeFrameView { + rootConfig: root.rootConfig + anchors.fill: root + } +} \ No newline at end of file diff --git a/scripts/developer/utilities/render/luci.js b/scripts/developer/utilities/render/luci.js index 005d96780a..9f0f32ee41 100644 --- a/scripts/developer/utilities/render/luci.js +++ b/scripts/developer/utilities/render/luci.js @@ -90,19 +90,22 @@ function fromQml(message) { switch (message.method) { - case "openEngineView": - openEngineTaskView(); + case "openEngineInspector": + openEngineInspector(); + break; + case "openEngineProfiler": + openEngineProfiler(); break; } } var engineInspectorView = null - function openEngineTaskView() { + function openEngineInspector() { if (engineInspectorView == null) { var qml = Script.resolvePath('engineInspector.qml'); var window = new OverlayWindow({ - title: 'Render Engine', + title: 'Render Engine Inspector', source: qml, width: 300, height: 400 @@ -115,7 +118,23 @@ } } - + var engineProfilerView = null + function openEngineProfiler() { + if (engineProfilerView == null) { + var qml = Script.resolvePath('engineProfiler.qml'); + var window = new OverlayWindow({ + title: 'Render Engine Profiler', + source: qml, + width: 300, + height: 400 + }); + window.setPosition(200, 50); + engineProfilerView = window + window.closed.connect(function() { engineProfilerView = null; }); + } else { + engineProfilerView.setPosition(200, 50); + } + } Script.scriptEnding.connect(function () { if (onLuciScreen) { @@ -128,5 +147,8 @@ if (engineInspectorView !== null) { engineInspectorView.close() } + if (engineProfilerView !== null) { + engineProfilerView.close() + } }); }()); \ No newline at end of file