diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 1df4a1e9a6..3a0aec7534 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -46,6 +46,7 @@ #include "avatar/AvatarManager.h" #include "avatar/AvatarPackager.h" #include "AvatarBookmarks.h" +#include #include "DomainAccountManager.h" #include "MainWindow.h" #include "render/DrawStatus.h" @@ -549,6 +550,13 @@ Menu::Menu() { drawStatusConfig, SLOT(setShowFade(bool))); } + { + action = addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::ExtraLinearTosRGBConversion, 0, OpenGLDisplayPlugin::getExtraLinearToSRGBConversion()); + connect(action, &QAction::triggered, [action] { + OpenGLDisplayPlugin::setExtraLinearToSRGBConversion(action->isChecked()); + }); + } + // Developer > Assets >>> // Menu item is not currently needed but code should be kept in case it proves useful again at some stage. //#define WANT_ASSET_MIGRATION diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 4eb985cf8c..61b028269e 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -237,7 +237,8 @@ namespace MenuOption { const QString ComputeBlendshapes = "Compute Blendshapes"; const QString HighlightTransitions = "Highlight Transitions"; const QString MaterialProceduralShaders = "Enable Procedural Materials"; -} + const QString ExtraLinearTosRGBConversion = "Extra Linear to sRGB Conversion"; + } #endif // hifi_Menu_h diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 024d9a0ab6..97c73603e1 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -112,14 +112,6 @@ bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() { return Parent::internalActivate(); } -gpu::PipelinePointer Basic2DWindowOpenGLDisplayPlugin::getRenderTexturePipeline() { -#if defined(Q_OS_ANDROID) - return _linearToSRGBPipeline; -#else - return _drawTexturePipeline; -#endif -} - void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { #if defined(Q_OS_ANDROID) auto& virtualPadManager = VirtualPad::Manager::instance(); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index 68301ff8b4..cc304c19c2 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -37,8 +37,6 @@ public: virtual void pluginUpdate() override {}; - virtual gpu::PipelinePointer getRenderTexturePipeline() override; - protected: mutable bool _isThrottled = false; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 03a463c82a..6ea10f6327 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,8 @@ using namespace shader::gpu::program; extern QThread* RENDER_THREAD; +Setting::Handle OpenGLDisplayPlugin::_extraLinearToSRGBConversionSetting("extraLinearToSRGBConversion", false); + class PresentThread : public QThread, public Dependency { using Mutex = std::mutex; using Condition = std::condition_variable; @@ -956,5 +959,16 @@ void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(NetworkTexturePointer ne } gpu::PipelinePointer OpenGLDisplayPlugin::getRenderTexturePipeline() { - return _drawTexturePipeline; +#ifdef USE_GLES + if (!_extraLinearToSRGBConversionSetting.isSet()) { + const gl::ContextInfo &contextInfo = gl::ContextInfo::get(); + _extraLinearToSRGBConversionSetting.set(std::find(contextInfo.extensions.cbegin(), contextInfo.extensions.cend(), "GL_EXT_framebuffer_sRGB") == contextInfo.extensions.cend()); + } +#endif + + if (getExtraLinearToSRGBConversion()) { + return _linearToSRGBPipeline; + } else { + return _drawTexturePipeline; + } } diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 15cebf7e3a..0df0d9ac3e 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -86,6 +87,9 @@ public: QOpenGLFramebufferObject* target, GLsync* fenceSync) override; + static void setExtraLinearToSRGBConversion(bool value) { _extraLinearToSRGBConversionSetting.set(value); } + static bool getExtraLinearToSRGBConversion() { return _extraLinearToSRGBConversionSetting.get(); }; + protected: friend class PresentThread; @@ -201,4 +205,7 @@ protected: QImage getScreenshot(float aspectRatio); QImage getSecondaryCameraScreenshot(); + +private: + static Setting::Handle _extraLinearToSRGBConversionSetting; };