From dada0b9024c2ade743dd0128dde15c79b213d381 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 2 Apr 2018 01:09:35 -0700 Subject: [PATCH 1/4] Exploring better task job config api that work --- interface/src/workload/GameWorkload.cpp | 1 + libraries/task/src/task/Config.cpp | 2 + libraries/task/src/task/Config.h | 47 ++++-- .../developer/utilities/lib/jet/TaskList.qml | 150 ++++++++++++++++++ scripts/developer/utilities/lib/jet/jet.js | 119 ++++++++++++++ .../developer/utilities/lib/jet/jet_qml.js | 72 +++++++++ .../utilities/workload/inspectEngine.js | 40 +++++ .../developer/utilities/workload/workload.qml | 15 +- 8 files changed, 431 insertions(+), 15 deletions(-) create mode 100644 scripts/developer/utilities/lib/jet/TaskList.qml create mode 100644 scripts/developer/utilities/lib/jet/jet.js create mode 100644 scripts/developer/utilities/lib/jet/jet_qml.js create mode 100644 scripts/developer/utilities/workload/inspectEngine.js diff --git a/interface/src/workload/GameWorkload.cpp b/interface/src/workload/GameWorkload.cpp index 63fe440fcd..e71463d85a 100644 --- a/interface/src/workload/GameWorkload.cpp +++ b/interface/src/workload/GameWorkload.cpp @@ -19,6 +19,7 @@ GameWorkloadContext::~GameWorkloadContext() { GameWorkload::GameWorkload() { + } GameWorkload::~GameWorkload() { diff --git a/libraries/task/src/task/Config.cpp b/libraries/task/src/task/Config.cpp index b378237c9c..b63165adbe 100644 --- a/libraries/task/src/task/Config.cpp +++ b/libraries/task/src/task/Config.cpp @@ -18,6 +18,8 @@ using namespace task; +int nakedJobConfigPointerTypeId = qRegisterMetaType(); + void JobConfig::setPresetList(const QJsonObject& object) { for (auto it = object.begin(); it != object.end(); it++) { JobConfig* child = findChild(it.key(), Qt::FindDirectChildrenOnly); diff --git a/libraries/task/src/task/Config.h b/libraries/task/src/task/Config.h index d2cc1a8cd8..adb8a60c8e 100644 --- a/libraries/task/src/task/Config.h +++ b/libraries/task/src/task/Config.h @@ -86,17 +86,19 @@ protected: // A default Config is always on; to create an enableable Config, use the ctor JobConfig(bool enabled) class JobConfig : public QObject { Q_OBJECT - Q_PROPERTY(double cpuRunTime READ getCPURunTime NOTIFY newStats()) //ms - Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY dirtyEnabled()) + Q_PROPERTY(double cpuRunTime READ getCPURunTime NOTIFY newStats()) //ms + Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY dirtyEnabled()) - double _msCPURunTime{ 0.0 }; + double _msCPURunTime{ 0.0 }; public: using Persistent = PersistentConfig; + using QConfigList = QList; JobConfig() = default; + // JobConfig(const JobConfig& src) = default; JobConfig(bool enabled) : alwaysEnabled{ false }, enabled{ enabled } {} - bool isEnabled() const { return alwaysEnabled || enabled; } + bool isEnabled() { return alwaysEnabled || enabled; } void setEnabled(bool enable) { enabled = alwaysEnabled || enable; emit dirtyEnabled(); } bool alwaysEnabled{ true }; @@ -113,7 +115,12 @@ public: void setCPURunTime(double mstime) { _msCPURunTime = mstime; emit newStats(); } double getCPURunTime() const { return _msCPURunTime; } -public slots: + Q_INVOKABLE virtual bool isTask() const { return false; } + Q_INVOKABLE virtual QConfigList getSubConfigs() const { return QConfigList(); } + Q_INVOKABLE virtual int getNumSubs() const { return 0; } + Q_INVOKABLE virtual JobConfig* getSubConfig(int i) const { return nullptr; } + + public slots: void load(const QJsonObject& val) { qObjectFromJsonValue(val, *this); emit loaded(); } signals: @@ -122,6 +129,8 @@ signals: void dirtyEnabled(); }; +using QConfigPointer = std::shared_ptr; + class TConfigProxy { public: using Config = JobConfig; @@ -130,11 +139,12 @@ public: class TaskConfig : public JobConfig { Q_OBJECT public: - using QConfigPointer = std::shared_ptr; + using QConfigList = QList; using Persistent = PersistentConfig; - TaskConfig() = default ; + TaskConfig() = default; + // TaskConfig(const TaskConfig& src) = default; TaskConfig(bool enabled) : JobConfig(enabled) {} @@ -156,7 +166,8 @@ public: if (tokens.empty()) { tokens.push_back(QString()); - } else { + } + else { while (tokens.size() > 1) { auto name = tokens.front(); tokens.pop_front(); @@ -170,6 +181,22 @@ public: return root->findChild(tokens.front()); } + Q_INVOKABLE bool isTask() const override { return true; } + Q_INVOKABLE QConfigList getSubConfigs() const override { + auto list = findChildren(QRegExp(".*"), Qt::FindDirectChildrenOnly); + QConfigList returned; + for (int i = 0; i < list.size(); i++) { + returned.push_back(list[i]); + } + return returned; + } + + Q_INVOKABLE int getNumSubs() const override { return getSubConfigs().size(); } + Q_INVOKABLE JobConfig* getSubConfig(int i) const override { + auto subs = getSubConfigs(); + return ((i < 0 || i >= subs.size()) ? nullptr : subs[i] ); + } + void connectChildConfig(QConfigPointer childConfig, const std::string& name); void transferChildrenConfigs(QConfigPointer source); @@ -179,8 +206,8 @@ public slots: void refresh(); }; -using QConfigPointer = std::shared_ptr; - } +Q_DECLARE_METATYPE(task::JobConfig*); + #endif // hifi_task_Config_h diff --git a/scripts/developer/utilities/lib/jet/TaskList.qml b/scripts/developer/utilities/lib/jet/TaskList.qml new file mode 100644 index 0000000000..04e6184fc0 --- /dev/null +++ b/scripts/developer/utilities/lib/jet/TaskList.qml @@ -0,0 +1,150 @@ +// +// jet/TaskList.qml +// +// Created by Sam Gateau, 2018/03/28 +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +//import QtQuick 2.7 +//import QtQuick.Controls 1.4 as Original +//import QtQuick.Controls.Styles 1.4 + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +//import Hifi 1.0 as Hifi + +//import "qrc:///qml/styles-uit" +//import "qrc:///qml/controls-uit" as HifiControls + +import "jet_qml.js" as Jet + +Rectangle { + id: root + width: parent ? parent.width : 100 + height: parent ? parent.height : 100 + property var config + + property var renderConfig : Render + + TextArea { + id: textArea + width: parent.width + height: parent.height + text: "" + } + + Component.onCompleted: { + // Connect the signal from Selection when any selection content change and use it to refresh the current selection view + // Selection.selectedItemsListChanged.connect(resetSelectionView) + var message = "On Completed: \n" + var functor = Jet.job_print_functor(function (line) { message += line + "\n"; }); + // Jet.task_traverseTree(Render, functor); + var lroot = Workload; + functor(lroot,0,0) + // message += Workload["getSubConfigs"]() + '\n' + + //var subs = Workload; + message += " subs size = " + lroot.getNumSubs() + for (var i = 0; i < lroot.getNumSubs(); i++) { + if (functor(lroot.getSubConfig(i), depth, i)) { + // task_traverse(subs[i], functor, depth) + } + } + textArea.append(message); + } + function fromScript(mope) { + //print(message) + //var message = mope + '\n'; + var message ='\n'; + + // Jet.task_traverseTree(Render, Jet.job_print_functor(function (line) { message += line + "\n"; }) ); + /* + + Render.findChildren();*/ + + // message += (Render.getSubConfigs()) + // Render.getConfig("").findChildren(); +/**//* + var job = Render; + message +=(job.objectName + " " + (job.enabled ? "on" : "off")) + '\n'; + var keys = Jet.job_propKeys(job); + for (var p=0; p < keys.length;p++) { + var prop = job[keys[p]] + message += (typeof prop + " " + keys[p] + " " + prop) + '\n'; + }*/ +/* +function task_traverse(root, functor, depth) { + if (root.isTask()) { + var subs = root.getSubConfigs() + depth++; + for (var i = 0; i Date: Mon, 2 Apr 2018 17:59:28 -0700 Subject: [PATCH 2/4] GOing over the jet lib ui and the nightmare that is the js/qml family --- libraries/task/src/task/Config.cpp | 2 - libraries/task/src/task/Config.h | 19 +-- .../developer/utilities/lib/jet/TaskList.qml | 133 +++--------------- scripts/developer/utilities/lib/jet/jet.js | 105 ++++---------- .../developer/utilities/lib/jet/jet_qml.js | 72 ---------- .../utilities/workload/inspectEngine.js | 14 +- .../developer/utilities/workload/workload.js | 2 +- .../{workload.qml => workloadInspector.qml} | 13 +- 8 files changed, 69 insertions(+), 291 deletions(-) delete mode 100644 scripts/developer/utilities/lib/jet/jet_qml.js rename scripts/developer/utilities/workload/{workload.qml => workloadInspector.qml} (93%) diff --git a/libraries/task/src/task/Config.cpp b/libraries/task/src/task/Config.cpp index b63165adbe..b378237c9c 100644 --- a/libraries/task/src/task/Config.cpp +++ b/libraries/task/src/task/Config.cpp @@ -18,8 +18,6 @@ using namespace task; -int nakedJobConfigPointerTypeId = qRegisterMetaType(); - void JobConfig::setPresetList(const QJsonObject& object) { for (auto it = object.begin(); it != object.end(); it++) { JobConfig* child = findChild(it.key(), Qt::FindDirectChildrenOnly); diff --git a/libraries/task/src/task/Config.h b/libraries/task/src/task/Config.h index adb8a60c8e..8548812d65 100644 --- a/libraries/task/src/task/Config.h +++ b/libraries/task/src/task/Config.h @@ -92,10 +92,8 @@ class JobConfig : public QObject { double _msCPURunTime{ 0.0 }; public: using Persistent = PersistentConfig; - using QConfigList = QList; JobConfig() = default; - // JobConfig(const JobConfig& src) = default; JobConfig(bool enabled) : alwaysEnabled{ false }, enabled{ enabled } {} bool isEnabled() { return alwaysEnabled || enabled; } @@ -110,15 +108,17 @@ public: Q_INVOKABLE QString toJSON() { return QJsonDocument(toJsonValue(*this).toObject()).toJson(QJsonDocument::Compact); } Q_INVOKABLE void load(const QVariantMap& map) { qObjectFromJsonValue(QJsonObject::fromVariantMap(map), *this); emit loaded(); } + Q_INVOKABLE QObject* getConfig(const QString& name) { return nullptr; } + // Running Time measurement // The new stats signal is emitted once per run time of a job when stats (cpu runtime) are updated void setCPURunTime(double mstime) { _msCPURunTime = mstime; emit newStats(); } double getCPURunTime() const { return _msCPURunTime; } Q_INVOKABLE virtual bool isTask() const { return false; } - Q_INVOKABLE virtual QConfigList getSubConfigs() const { return QConfigList(); } + Q_INVOKABLE virtual QObjectList getSubConfigs() const { return QObjectList(); } Q_INVOKABLE virtual int getNumSubs() const { return 0; } - Q_INVOKABLE virtual JobConfig* getSubConfig(int i) const { return nullptr; } + Q_INVOKABLE virtual QObject* getSubConfig(int i) const { return nullptr; } public slots: void load(const QJsonObject& val) { qObjectFromJsonValue(val, *this); emit loaded(); } @@ -139,12 +139,9 @@ public: class TaskConfig : public JobConfig { Q_OBJECT public: - using QConfigList = QList; - using Persistent = PersistentConfig; TaskConfig() = default; - // TaskConfig(const TaskConfig& src) = default; TaskConfig(bool enabled) : JobConfig(enabled) {} @@ -182,9 +179,9 @@ public: } Q_INVOKABLE bool isTask() const override { return true; } - Q_INVOKABLE QConfigList getSubConfigs() const override { + Q_INVOKABLE QObjectList getSubConfigs() const override { auto list = findChildren(QRegExp(".*"), Qt::FindDirectChildrenOnly); - QConfigList returned; + QObjectList returned; for (int i = 0; i < list.size(); i++) { returned.push_back(list[i]); } @@ -192,7 +189,7 @@ public: } Q_INVOKABLE int getNumSubs() const override { return getSubConfigs().size(); } - Q_INVOKABLE JobConfig* getSubConfig(int i) const override { + Q_INVOKABLE QObject* getSubConfig(int i) const override { auto subs = getSubConfigs(); return ((i < 0 || i >= subs.size()) ? nullptr : subs[i] ); } @@ -208,6 +205,4 @@ public slots: } -Q_DECLARE_METATYPE(task::JobConfig*); - #endif // hifi_task_Config_h diff --git a/scripts/developer/utilities/lib/jet/TaskList.qml b/scripts/developer/utilities/lib/jet/TaskList.qml index 04e6184fc0..baa579b4a3 100644 --- a/scripts/developer/utilities/lib/jet/TaskList.qml +++ b/scripts/developer/utilities/lib/jet/TaskList.qml @@ -8,28 +8,33 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +import QtQuick 2.7 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "qrc:///qml/styles-uit" +import "qrc:///qml/controls-uit" as HifiControls + //import QtQuick 2.7 //import QtQuick.Controls 1.4 as Original //import QtQuick.Controls.Styles 1.4 -import QtQuick 2.5 -import QtQuick.Controls 1.4 +//import QtQuick 2.5 +//import QtQuick.Controls 1.4 //import Hifi 1.0 as Hifi //import "qrc:///qml/styles-uit" //import "qrc:///qml/controls-uit" as HifiControls -import "jet_qml.js" as Jet +import "jet.js" as Jet Rectangle { id: root - width: parent ? parent.width : 100 - height: parent ? parent.height : 100 - property var config + width: parent ? parent.width : 200 + height: parent ? parent.height : 400 + property var rootConfig - property var renderConfig : Render - - TextArea { + Original.TextArea { id: textArea width: parent.width height: parent.height @@ -37,114 +42,18 @@ Rectangle { } Component.onCompleted: { - // Connect the signal from Selection when any selection content change and use it to refresh the current selection view - // Selection.selectedItemsListChanged.connect(resetSelectionView) - var message = "On Completed: \n" - var functor = Jet.job_print_functor(function (line) { message += line + "\n"; }); - // Jet.task_traverseTree(Render, functor); - var lroot = Workload; - functor(lroot,0,0) - // message += Workload["getSubConfigs"]() + '\n' - - //var subs = Workload; - message += " subs size = " + lroot.getNumSubs() - for (var i = 0; i < lroot.getNumSubs(); i++) { - if (functor(lroot.getSubConfig(i), depth, i)) { - // task_traverse(subs[i], functor, depth) - } - } + var message = "" + var functor = Jet.job_print_functor(function (line) { message += line + "\n"; }); + Jet.task_traverseTree(Workload, functor); textArea.append(message); } function fromScript(mope) { - //print(message) - //var message = mope + '\n'; - var message ='\n'; - - // Jet.task_traverseTree(Render, Jet.job_print_functor(function (line) { message += line + "\n"; }) ); - /* - - Render.findChildren();*/ - - // message += (Render.getSubConfigs()) - // Render.getConfig("").findChildren(); -/**//* - var job = Render; - message +=(job.objectName + " " + (job.enabled ? "on" : "off")) + '\n'; - var keys = Jet.job_propKeys(job); - for (var p=0; p < keys.length;p++) { - var prop = job[keys[p]] - message += (typeof prop + " " + keys[p] + " " + prop) + '\n'; - }*/ -/* -function task_traverse(root, functor, depth) { - if (root.isTask()) { - var subs = root.getSubConfigs() - depth++; - for (var i = 0; i Date: Tue, 3 Apr 2018 17:21:37 -0700 Subject: [PATCH 3/4] Starting to buiuild on the jet component and adding the widget to luci and workload inspectors --- scripts/developer/utilities/lib/jet/jet.js | 5 +++-- .../utilities/lib/jet/{ => qml}/TaskList.qml | 21 +++++-------------- .../developer/utilities/lib/jet/qml/qmldir | 1 + .../utilities/render/deferredLighting.qml | 10 +++++++++ .../utilities/workload/inspectEngine.js | 19 ++--------------- .../utilities/workload/workloadInspector.qml | 16 +++++++++++--- 6 files changed, 34 insertions(+), 38 deletions(-) rename scripts/developer/utilities/lib/jet/{ => qml}/TaskList.qml (68%) create mode 100644 scripts/developer/utilities/lib/jet/qml/qmldir diff --git a/scripts/developer/utilities/lib/jet/jet.js b/scripts/developer/utilities/lib/jet/jet.js index dc50e5c653..39da9b6d90 100644 --- a/scripts/developer/utilities/lib/jet/jet.js +++ b/scripts/developer/utilities/lib/jet/jet.js @@ -65,8 +65,9 @@ function job_print_functor(printout, maxDepth) { } // Expose functions for regular js including this files through the 'Jet' object -Jet = {} +/*Jet = {} Jet.task_traverse = task_traverse Jet.task_traverseTree = task_traverseTree Jet.job_propKeys = job_propKeys -Jet.job_print_functor = job_print_functor \ No newline at end of file +Jet.job_print_functor = job_print_functor +*/ \ No newline at end of file diff --git a/scripts/developer/utilities/lib/jet/TaskList.qml b/scripts/developer/utilities/lib/jet/qml/TaskList.qml similarity index 68% rename from scripts/developer/utilities/lib/jet/TaskList.qml rename to scripts/developer/utilities/lib/jet/qml/TaskList.qml index baa579b4a3..fa004627a7 100644 --- a/scripts/developer/utilities/lib/jet/TaskList.qml +++ b/scripts/developer/utilities/lib/jet/qml/TaskList.qml @@ -15,24 +15,13 @@ import QtQuick.Controls.Styles 1.4 import "qrc:///qml/styles-uit" import "qrc:///qml/controls-uit" as HifiControls -//import QtQuick 2.7 -//import QtQuick.Controls 1.4 as Original -//import QtQuick.Controls.Styles 1.4 - -//import QtQuick 2.5 -//import QtQuick.Controls 1.4 -//import Hifi 1.0 as Hifi - -//import "qrc:///qml/styles-uit" -//import "qrc:///qml/controls-uit" as HifiControls - -import "jet.js" as Jet +import "../jet.js" as Jet Rectangle { id: root - width: parent ? parent.width : 200 - height: parent ? parent.height : 400 - property var rootConfig + // width: parent ? parent.width : 200 + // height: parent ? parent.height : 400 + property var rootConfig : Workload Original.TextArea { id: textArea @@ -44,7 +33,7 @@ Rectangle { Component.onCompleted: { var message = "" var functor = Jet.job_print_functor(function (line) { message += line + "\n"; }); - Jet.task_traverseTree(Workload, functor); + Jet.task_traverseTree(rootConfig, functor); textArea.append(message); } function fromScript(mope) { diff --git a/scripts/developer/utilities/lib/jet/qml/qmldir b/scripts/developer/utilities/lib/jet/qml/qmldir new file mode 100644 index 0000000000..f926d8cc67 --- /dev/null +++ b/scripts/developer/utilities/lib/jet/qml/qmldir @@ -0,0 +1 @@ +TaskList 1.0 TaskList.qml \ No newline at end of file diff --git a/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index 189d23c44f..160ec26be0 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -14,6 +14,7 @@ import QtQuick.Layouts 1.3 import "qrc:///qml/styles-uit" import "qrc:///qml/controls-uit" as HifiControls import "configSlider" +import "../lib/jet/qml" as Jet Rectangle { HifiConstants { id: hifi;} @@ -274,6 +275,15 @@ Rectangle { } } } + Separator {} + + Jet.TaskList { + rootConfig: Render + anchors.left: parent.left + anchors.right: parent.right + + height: 200 + } } //} } diff --git a/scripts/developer/utilities/workload/inspectEngine.js b/scripts/developer/utilities/workload/inspectEngine.js index 37280037da..6d79ba41a1 100644 --- a/scripts/developer/utilities/workload/inspectEngine.js +++ b/scripts/developer/utilities/workload/inspectEngine.js @@ -1,27 +1,12 @@ -Script.include('../lib/jet/jet.js'); - - - - (function() { // BEGIN LOCAL_SCOPE - //jet.task_traverseTree(Render, printJob); - var message = "test"; - var functor = Jet.job_print_functor(function (line) { message += line + "\n"; }); - - Jet.task_traverseTree(Render, functor); - - // print(message)*/ - -var qml = Script.resolvePath('../lib/jet/TaskList.qml'); +var qml = Script.resolvePath('./workloadInspector.qml'); var window = new OverlayWindow({ title: 'Inspect Engine', source: qml, width: 400, - height: 500 + height: 600 }); -window.sendToQml(message) - window.closed.connect(function () { Script.stop(); }); Script.scriptEnding.connect(function () { /* var geometry = JSON.stringify({ diff --git a/scripts/developer/utilities/workload/workloadInspector.qml b/scripts/developer/utilities/workload/workloadInspector.qml index 27b85b9a92..ca8f11355a 100644 --- a/scripts/developer/utilities/workload/workloadInspector.qml +++ b/scripts/developer/utilities/workload/workloadInspector.qml @@ -13,14 +13,16 @@ import QtQuick.Layouts 1.3 import "qrc:///qml/styles-uit" import "qrc:///qml/controls-uit" as HifiControls -import "../render/configSlider" - -//import "../lib/jet"; +import "../render/configSlider" +import "../lib/jet/qml" as Jet Rectangle { HifiConstants { id: hifi;} id: _workload; + + width: parent ? parent.width : 400 + height: parent ? parent.height : 600 anchors.margins: hifi.dimensions.contentMargin.x color: hifi.colors.baseGray; @@ -118,5 +120,13 @@ Rectangle { onCheckedChanged: { Workload.getConfig("SpaceToRender")["showViews"] = checked } } Separator {} + + Jet.TaskList { + rootConfig: Workload + anchors.left: parent.left + anchors.right: parent.right + + height: 300 + } } } From a7040854447105e9eb2582a76517783df0344910 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 4 Apr 2018 09:18:19 -0700 Subject: [PATCH 4/4] Fix typos --- libraries/task/src/task/Config.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/task/src/task/Config.h b/libraries/task/src/task/Config.h index 8548812d65..eaa87f53af 100644 --- a/libraries/task/src/task/Config.h +++ b/libraries/task/src/task/Config.h @@ -86,10 +86,10 @@ protected: // A default Config is always on; to create an enableable Config, use the ctor JobConfig(bool enabled) class JobConfig : public QObject { Q_OBJECT - Q_PROPERTY(double cpuRunTime READ getCPURunTime NOTIFY newStats()) //ms - Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY dirtyEnabled()) + Q_PROPERTY(double cpuRunTime READ getCPURunTime NOTIFY newStats()) //ms + Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY dirtyEnabled()) - double _msCPURunTime{ 0.0 }; + double _msCPURunTime{ 0.0 }; public: using Persistent = PersistentConfig; @@ -120,7 +120,7 @@ public: Q_INVOKABLE virtual int getNumSubs() const { return 0; } Q_INVOKABLE virtual QObject* getSubConfig(int i) const { return nullptr; } - public slots: +public slots: void load(const QJsonObject& val) { qObjectFromJsonValue(val, *this); emit loaded(); } signals: