From 54d1705f06a3b95b93ebe0470e021d92faab05ca Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 31 May 2019 18:42:26 -0700 Subject: [PATCH] Testing a different approach --- interface/src/Application.cpp | 22 ++--------- interface/src/PerformanceManager.cpp | 26 ++++++++++++- interface/src/PerformanceManager.h | 6 ++- .../scripting/RenderScriptingInterface.cpp | 37 ++++++++++--------- .../src/scripting/RenderScriptingInterface.h | 17 ++++++--- 5 files changed, 64 insertions(+), 44 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ae226598d1..b8a9df72d6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5361,25 +5361,9 @@ void Application::loadSettings() { } } - if (_firstRun.get()) { - // If this is our first run, evalute the Platform Tier and assign the matching Performance profile by default. - // A bunch of Performance, Simulation and Render settings will be set to a matching default value from this - - // Here is the mapping between pelatformTIer and performance profile - const std::array platformToPerformancePresetMap = {{ - PerformanceManager::PerformancePreset::MID, // platform::Profiler::UNKNOWN - PerformanceManager::PerformancePreset::LOW, // platform::Profiler::LOW - PerformanceManager::PerformancePreset::MID, // platform::Profiler::MID - PerformanceManager::PerformancePreset::HIGH // platform::Profiler::HIGH - }}; - - // What is our profile? - auto platformTier = platform::Profiler::profilePlatform(); - - // Then let's assign the performance preset setting from it - getPerformanceManager().setPerformancePreset(platformToPerformancePresetMap[platformTier]); - - } + // Setup the PerformanceManager which will enforce the several settings to match the Preset + // On the first run, the Preset is evaluated from the + getPerformanceManager().setupPerformancePresetSettings(_firstRun.get()); // finish initializing the camera, based on everything we checked above. Third person camera will be used if no settings // dictated that we should be in first person diff --git a/interface/src/PerformanceManager.cpp b/interface/src/PerformanceManager.cpp index fc601fdf8a..19bfcd41c7 100644 --- a/interface/src/PerformanceManager.cpp +++ b/interface/src/PerformanceManager.cpp @@ -10,10 +10,34 @@ // #include "PerformanceManager.h" +#include + #include "scripting/RenderScriptingInterface.h" PerformanceManager::PerformanceManager() { + setPerformancePreset((PerformancePreset) _performancePresetSetting.get()); +} + +void PerformanceManager::setupPerformancePresetSettings(bool evaluatePlatformTier) { + if (evaluatePlatformTier || (getPerformancePreset() == UNKNOWN)) { + // If evaluatePlatformTier, evalute the Platform Tier and assign the matching Performance profile by default. + // A bunch of Performance, Simulation and Render settings will be set to a matching default value from this + + // Here is the mapping between pelatformTIer and performance profile + const std::array platformToPerformancePresetMap = { { + PerformanceManager::PerformancePreset::MID, // platform::Profiler::UNKNOWN + PerformanceManager::PerformancePreset::LOW, // platform::Profiler::LOW + PerformanceManager::PerformancePreset::MID, // platform::Profiler::MID + PerformanceManager::PerformancePreset::HIGH // platform::Profiler::HIGH + } }; + + // What is our profile? + auto platformTier = platform::Profiler::profilePlatform(); + + // Then let's assign the performance preset setting from it + setPerformancePreset(platformToPerformancePresetMap[platformTier]); + } } void PerformanceManager::setPerformancePreset(PerformanceManager::PerformancePreset preset) { @@ -27,7 +51,7 @@ void PerformanceManager::setPerformancePreset(PerformanceManager::PerformancePre } PerformanceManager::PerformancePreset PerformanceManager::getPerformancePreset() const { - PerformancePreset preset = PerformancePreset::MID; + PerformancePreset preset = PerformancePreset::UNKNOWN; preset = (PerformancePreset) _performancePresetSettingLock.resultWithReadLock([&] { return _performancePresetSetting.get(); diff --git a/interface/src/PerformanceManager.h b/interface/src/PerformanceManager.h index adbc5804b1..2931d1f17b 100644 --- a/interface/src/PerformanceManager.h +++ b/interface/src/PerformanceManager.h @@ -30,12 +30,16 @@ public: PerformanceManager(); ~PerformanceManager() = default; + // Setup the PerformanceManager which will enforce the several settings to match the Preset + // If evaluatePlatformTier is true, the Preset is evaluated from the Platform::Profiler::profilePlatform() + void setupPerformancePresetSettings(bool evaluatePlatformTier); + void setPerformancePreset(PerformancePreset performancePreset); PerformancePreset getPerformancePreset() const; private: mutable ReadWriteLockable _performancePresetSettingLock; - Setting::Handle _performancePresetSetting { "performancePreset", PerformanceManager::PerformancePreset::MID }; + Setting::Handle _performancePresetSetting { "performancePreset", PerformanceManager::PerformancePreset::UNKNOWN }; // The concrete performance preset changes void applyPerformancePreset(PerformanceManager::PerformancePreset performancePreset); diff --git a/interface/src/scripting/RenderScriptingInterface.cpp b/interface/src/scripting/RenderScriptingInterface.cpp index 3d761a2bb7..af8af131a0 100644 --- a/interface/src/scripting/RenderScriptingInterface.cpp +++ b/interface/src/scripting/RenderScriptingInterface.cpp @@ -10,6 +10,7 @@ #include "LightingModel.h" #include "AntialiasingEffect.h" +std::once_flag RenderScriptingInterface::registry_flag; RenderScriptingInterface* RenderScriptingInterface::getInstance() { static RenderScriptingInterface sharedInstance; @@ -17,32 +18,34 @@ RenderScriptingInterface* RenderScriptingInterface::getInstance() { } RenderScriptingInterface::RenderScriptingInterface() { - setRenderMethod((RenderMethod)_renderMethodSetting.get() == RenderMethod::DEFERRED ? RenderMethod::DEFERRED : RenderMethod::FORWARD); + std::call_once(registry_flag, [] { + qmlRegisterType("RenderEnums", 1, 0, "RenderEnums"); + }); + + setRenderMethod((RenderMethod)_renderMethodSettingLock.resultWithReadLock([&] { + return _renderMethodSetting.get(); + })); setShadowsEnabled(_shadowsEnabledSetting.get()); setAmbientOcclusionEnabled(_ambientOcclusionEnabledSetting.get()); setAntialiasingEnabled(_antialiasingEnabledSetting.get()); } RenderScriptingInterface::RenderMethod RenderScriptingInterface::getRenderMethod() { - return (RenderMethod)_renderMethodSetting.get() == RenderMethod::DEFERRED ? RenderMethod::DEFERRED : RenderMethod::FORWARD; + return (RenderMethod) _renderMethod; } -void RenderScriptingInterface::setRenderMethod(RenderScriptingInterface::RenderMethod renderMethod) { - RenderMethod newMethod = renderMethod == RenderMethod::FORWARD ? RenderMethod::FORWARD : RenderMethod::DEFERRED; - if (_renderMethodSetting.get() == newMethod) { - return; - } +void RenderScriptingInterface::setRenderMethod(RenderMethod renderMethod) { + if (_renderMethod != (int) renderMethod) { + _renderMethodSettingLock.withWriteLock([&] { + _renderMethod = (int)renderMethod; + _renderMethodSetting.set((int)renderMethod); - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "setRenderMethod", Q_ARG(RenderScriptingInterface::RenderMethod, renderMethod)); - return; - } - - auto config = dynamic_cast(qApp->getRenderEngine()->getConfiguration()->getConfig("RenderMainView.DeferredForwardSwitch")); - if (config) { - _renderMethodSetting.set(newMethod); - config->setBranch(newMethod); - emit config->dirtyEnabled(); + auto config = dynamic_cast(qApp->getRenderEngine()->getConfiguration()->getConfig("RenderMainView.DeferredForwardSwitch")); + if (config) { + _renderMethodSetting.set((int)renderMethod); + config->setBranch((int)renderMethod); + } + }); emit settingsChanged(); } } diff --git a/interface/src/scripting/RenderScriptingInterface.h b/interface/src/scripting/RenderScriptingInterface.h index e2ae8bbff5..3a7d2169b4 100644 --- a/interface/src/scripting/RenderScriptingInterface.h +++ b/interface/src/scripting/RenderScriptingInterface.h @@ -25,10 +25,10 @@ */ class RenderScriptingInterface : public QObject { Q_OBJECT - Q_PROPERTY(RenderMethod renderMethod READ getRenderMethod WRITE setRenderMethod NOTIFY settingsChanged) - Q_PROPERTY(bool shadowsEnabled READ getShadowsEnabled WRITE setShadowsEnabled NOTIFY settingsChanged) - Q_PROPERTY(bool ambientOcclusionEnabled READ getAmbientOcclusionEnabled WRITE setAmbientOcclusionEnabled NOTIFY settingsChanged) - Q_PROPERTY(bool antialiasingEnabled READ getAntialiasingEnabled WRITE setAntialiasingEnabled NOTIFY settingsChanged) + // Q_PROPERTY(RenderMethod renderMethod READ getRenderMethod WRITE setRenderMethod NOTIFY settingsChanged) + // Q_PROPERTY(bool shadowsEnabled READ getShadowsEnabled WRITE setShadowsEnabled NOTIFY settingsChanged) + // Q_PROPERTY(bool ambientOcclusionEnabled READ getAmbientOcclusionEnabled WRITE setAmbientOcclusionEnabled NOTIFY settingsChanged) + // Q_PROPERTY(bool antialiasingEnabled READ getAntialiasingEnabled WRITE setAntialiasingEnabled NOTIFY settingsChanged) public: RenderScriptingInterface(); @@ -36,11 +36,11 @@ public: static RenderScriptingInterface* getInstance(); // RenderMethod enum type - enum RenderMethod { + enum class RenderMethod { DEFERRED = render::Args::RenderMethod::DEFERRED, FORWARD = render::Args::RenderMethod::FORWARD, }; - Q_ENUM(RenderMethod); + Q_ENUM(RenderMethod) public slots: /**jsdoc @@ -136,11 +136,16 @@ signals: void settingsChanged(); private: + int _renderMethod { -1 }; + mutable ReadWriteLockable _renderMethodSettingLock; Setting::Handle _renderMethodSetting { "renderMethod", RENDER_FORWARD ? render::Args::RenderMethod::FORWARD : render::Args::RenderMethod::DEFERRED }; + Setting::Handle _shadowsEnabledSetting { "shadowsEnabled", true }; Setting::Handle _ambientOcclusionEnabledSetting { "ambientOcclusionEnabled", false }; Setting::Handle _antialiasingEnabledSetting { "antialiasingEnabled", true }; Setting::Handle _viewportResolutionScaleSetting{ "viewportResolutionScale", 1.0f }; + + static std::once_flag registry_flag; }; #endif // hifi_RenderScriptingInterface_h