From 393fbdca3ded65992f37e6cbcf06f48161dd7079 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Fri, 31 Jul 2020 15:59:28 -0400 Subject: [PATCH] OpenGL State Caching. --- data/assets/customization/globebrowsing.asset | 2 +- data/assets/scene/solarsystem/planets.asset | 2 + ext/ghoul | 2 +- include/openspace/rendering/renderengine.h | 6 ++- .../rendering/atmospheredeferredcaster.cpp | 38 +++--------------- .../rendering/grids/renderableboxgrid.cpp | 33 ++-------------- .../base/rendering/grids/renderablegrid.cpp | 33 ++-------------- .../rendering/grids/renderableradialgrid.cpp | 33 ++-------------- .../grids/renderablesphericalgrid.cpp | 35 ++--------------- .../rendering/renderablecartesianaxes.cpp | 27 ++----------- modules/base/rendering/renderablenodeline.cpp | 31 ++------------- .../base/rendering/screenspaceframebuffer.cpp | 6 ++- .../rendering/renderablebillboardscloud.cpp | 34 ++-------------- .../rendering/renderabledumeshes.cpp | 39 +++---------------- .../rendering/renderableplanescloud.cpp | 34 ++-------------- modules/galaxy/rendering/renderablegalaxy.cpp | 29 ++------------ modules/globebrowsing/src/tileprovider.cpp | 9 +++-- modules/space/rendering/renderablestars.cpp | 23 ++--------- src/rendering/framebufferrenderer.cpp | 36 ++++++++++------- src/rendering/renderengine.cpp | 8 ++++ 20 files changed, 95 insertions(+), 365 deletions(-) diff --git a/data/assets/customization/globebrowsing.asset b/data/assets/customization/globebrowsing.asset index bc72ae17b3..883a90d373 100644 --- a/data/assets/customization/globebrowsing.asset +++ b/data/assets/customization/globebrowsing.asset @@ -31,7 +31,7 @@ local vrt_folders = { -- We recommend using this folder for HiRISE openspace.absPath('${BASE}/../OpenSpaceData/Mars/HiRISE'), -- if not and you have a custom path for HiRISE layers, enter it below - '', + '/media/jccosta/Big SSD Data/Pessoal/Work/OpenSpaceData/Mars-Gale-Crater/CTX', }, Moon = { -- Add folders here whose contents will be automatically added to the Moon globe diff --git a/data/assets/scene/solarsystem/planets.asset b/data/assets/scene/solarsystem/planets.asset index f2ebb05379..0783d64e0d 100644 --- a/data/assets/scene/solarsystem/planets.asset +++ b/data/assets/scene/solarsystem/planets.asset @@ -6,6 +6,8 @@ asset.request('./planets/venus/atmosphere') asset.request('./planets/earth/earth') asset.request('./planets/earth/atmosphere') asset.request('./planets/earth/markers') +asset.request('./planets/earth/nycmodel/upperMan.asset') +asset.request('./planets/earth/nycmodel/lowerMan.asset') asset.request('./planets/earth/moon/moon') asset.request('./planets/mars/mars') diff --git a/ext/ghoul b/ext/ghoul index d35be27b61..bb94e276d7 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit d35be27b61140e76d8283999d9faee16977b1bfc +Subproject commit bb94e276d70aa0179889ba6ad2b8f9190b248463 diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index f850018ea2..1fd08bc8a8 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -39,7 +39,7 @@ namespace ghoul { class SharedMemory; } // ghoul namespace ghoul::fontrendering { class Font; } -namespace ghoul::opengl { class ProgramObject; } +namespace ghoul::opengl { class ProgramObject; class OpenGLStateCache; } namespace openspace { @@ -77,6 +77,8 @@ public: const Renderer& renderer() const; RendererImplementation rendererImplementation() const; + ghoul::opengl::OpenGLStateCache& openglStateCache(); + void updateShaderPrograms(); void updateRenderer(); void updateScreenSpaceRenderables(); @@ -187,6 +189,8 @@ private: ghoul::Dictionary _resolveData; ScreenLog* _log = nullptr; + ghoul::opengl::OpenGLStateCache* _openglStateCache; + properties::BoolProperty _showOverlayOnSlaves; properties::BoolProperty _showLog; properties::FloatProperty _verticalLogOffset; diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 2191b59433..c94bc2d923 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -72,6 +72,7 @@ #include #include #include +#include #include #include #include @@ -836,24 +837,7 @@ void AtmosphereDeferredcaster::executeCalculations(GLuint quadCalcVAO, ghoul::opengl::TextureUnit deltaSMieTableTextureUnit; ghoul::opengl::TextureUnit deltaJTableTextureUnit; - // Saving current OpenGL state - GLboolean blendEnabled = glIsEnabled(GL_BLEND); - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - - if (blendEnabled) { - glDisable(GL_BLEND); - } - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); + glDisable(GL_BLEND); // =========================================================== // See Precomputed Atmosphere Scattering from Bruneton et al. paper, algorithm 4.1: @@ -1199,12 +1183,7 @@ void AtmosphereDeferredcaster::executeCalculations(GLuint quadCalcVAO, } // Restores OpenGL blending state - if (blendEnabled) { - glEnable(GL_BLEND); - } - - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); + global::renderEngine.openglStateCache().setBlendState(); } void AtmosphereDeferredcaster::preCalculateAtmosphereParam() { @@ -1223,9 +1202,9 @@ void AtmosphereDeferredcaster::preCalculateAtmosphereParam() { glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); GLint m_viewport[4]; - glGetIntegerv(GL_VIEWPORT, m_viewport); + global::renderEngine.openglStateCache().viewPort(m_viewport); - // Creates the FBO for the calculations + // Creates the FBO for the cFglGetalculations GLuint calcFBO; glGenFramebuffers(1, &calcFBO); glBindFramebuffer(GL_FRAMEBUFFER, calcFBO); @@ -1249,12 +1228,7 @@ void AtmosphereDeferredcaster::preCalculateAtmosphereParam() { // Restores system state glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO); - glViewport( - m_viewport[0], - m_viewport[1], - m_viewport[2], - m_viewport[3] - ); + global::renderEngine.openglStateCache().setViewPortState(m_viewport); glDeleteBuffers(1, &quadCalcVBO); glDeleteVertexArrays(1, &quadCalcVAO); glDeleteFramebuffers(1, &calcFBO); diff --git a/modules/base/rendering/grids/renderableboxgrid.cpp b/modules/base/rendering/grids/renderableboxgrid.cpp index 603621c877..6d8feec0c1 100644 --- a/modules/base/rendering/grids/renderableboxgrid.cpp +++ b/modules/base/rendering/grids/renderableboxgrid.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -189,25 +190,6 @@ void RenderableBoxGrid::render(const RenderData& data, RendererTasks&){ _gridProgram->setUniform("gridColor", _gridColor); - // Saves current state: - GLboolean isBlendEnabled = glIsEnabledi(GL_BLEND, 0); - GLfloat currentLineWidth; - glGetFloatv(GL_LINE_WIDTH, ¤tLineWidth); - GLboolean isLineSmoothEnabled = glIsEnabled(GL_LINE_SMOOTH); - - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - // Changes GL state: glLineWidth(_lineWidth); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -221,17 +203,8 @@ void RenderableBoxGrid::render(const RenderData& data, RendererTasks&){ _gridProgram->deactivate(); // Restores GL State - glLineWidth(currentLineWidth); - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - - if (!isBlendEnabled) { - glDisablei(GL_BLEND, 0); - } - - if (!isLineSmoothEnabled) { - glDisable(GL_LINE_SMOOTH); - } + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setLineState(); } void RenderableBoxGrid::update(const UpdateData&) { diff --git a/modules/base/rendering/grids/renderablegrid.cpp b/modules/base/rendering/grids/renderablegrid.cpp index ab6b8f06e1..ca2a9246e1 100644 --- a/modules/base/rendering/grids/renderablegrid.cpp +++ b/modules/base/rendering/grids/renderablegrid.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include namespace { @@ -205,25 +206,6 @@ void RenderableGrid::render(const RenderData& data, RendererTasks&){ _gridProgram->setUniform("gridColor", _gridColor); - // Saves current state: - GLboolean isBlendEnabled = glIsEnabledi(GL_BLEND, 0); - GLfloat currentLineWidth; - glGetFloatv(GL_LINE_WIDTH, ¤tLineWidth); - GLboolean isLineSmoothEnabled = glIsEnabled(GL_LINE_SMOOTH); - - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - // Changes GL state: glLineWidth(_lineWidth); glEnablei(GL_BLEND, 0); @@ -237,17 +219,8 @@ void RenderableGrid::render(const RenderData& data, RendererTasks&){ _gridProgram->deactivate(); // Restores GL State - glLineWidth(currentLineWidth); - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - - if (!isBlendEnabled) { - glDisablei(GL_BLEND, 0); - } - - if (!isLineSmoothEnabled) { - glDisable(GL_LINE_SMOOTH); - } + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setLineState(); } void RenderableGrid::update(const UpdateData&) { diff --git a/modules/base/rendering/grids/renderableradialgrid.cpp b/modules/base/rendering/grids/renderableradialgrid.cpp index 0e2e5315d8..c0df853352 100644 --- a/modules/base/rendering/grids/renderableradialgrid.cpp +++ b/modules/base/rendering/grids/renderableradialgrid.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include namespace { @@ -266,25 +267,6 @@ void RenderableRadialGrid::render(const RenderData& data, RendererTasks&) { adjustedLineWidth = _lineWidth; #endif - // Saves current state: - GLboolean isBlendEnabled = glIsEnabledi(GL_BLEND, 0); - GLfloat currentLineWidth; - glGetFloatv(GL_LINE_WIDTH, ¤tLineWidth); - GLboolean isLineSmoothEnabled = glIsEnabled(GL_LINE_SMOOTH); - - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - // Changes GL state: glLineWidth(adjustedLineWidth); glEnablei(GL_BLEND, 0); @@ -300,17 +282,8 @@ void RenderableRadialGrid::render(const RenderData& data, RendererTasks&) { _gridProgram->deactivate(); // Restores GL State - glLineWidth(currentLineWidth); - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - - if (!isBlendEnabled) { - glDisablei(GL_BLEND, 0); - } - - if (!isLineSmoothEnabled) { - glDisable(GL_LINE_SMOOTH); - } + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setLineState(); } void RenderableRadialGrid::update(const UpdateData&) { diff --git a/modules/base/rendering/grids/renderablesphericalgrid.cpp b/modules/base/rendering/grids/renderablesphericalgrid.cpp index 90fa4619d5..532f77768c 100644 --- a/modules/base/rendering/grids/renderablesphericalgrid.cpp +++ b/modules/base/rendering/grids/renderablesphericalgrid.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include namespace { @@ -209,25 +210,6 @@ void RenderableSphericalGrid::render(const RenderData& data, RendererTasks&){ adjustedLineWidth = _lineWidth; #endif - // Saves current state: - GLboolean isBlendEnabled = glIsEnabledi(GL_BLEND, 0); - GLfloat currentLineWidth; - glGetFloatv(GL_LINE_WIDTH, ¤tLineWidth); - GLboolean isLineSmoothEnabled = glIsEnabled(GL_LINE_SMOOTH); - - GLenum currentDepthFunction; - glGetIntegerv(GL_DEPTH_FUNC, ¤tDepthFunction); - glDepthFunc(GL_LEQUAL); - - GLenum blendEquationRGB, blendEquationAlpha, blendDestAlpha, - blendDestRGB, blendSrcAlpha, blendSrcRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - // Changes GL state: glLineWidth(adjustedLineWidth); glEnablei(GL_BLEND, 0); @@ -242,19 +224,8 @@ void RenderableSphericalGrid::render(const RenderData& data, RendererTasks&){ _gridProgram->deactivate(); // Restores GL State - glLineWidth(currentLineWidth); - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - - if (!isBlendEnabled) { - glDisablei(GL_BLEND, 0); - } - - if (!isLineSmoothEnabled) { - glDisable(GL_LINE_SMOOTH); - } - - glDepthFunc(currentDepthFunction); + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setLineState(); } void RenderableSphericalGrid::update(const UpdateData&) { diff --git a/modules/base/rendering/renderablecartesianaxes.cpp b/modules/base/rendering/renderablecartesianaxes.cpp index ced04ad50e..bfc3928956 100644 --- a/modules/base/rendering/renderablecartesianaxes.cpp +++ b/modules/base/rendering/renderablecartesianaxes.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include namespace { @@ -233,21 +234,6 @@ void RenderableCartesianAxes::render(const RenderData& data, RendererTasks&){ _program->setUniform("yColor", _yColor); _program->setUniform("zColor", _zColor); - // Saves current state: - GLboolean isBlendEnabled = glIsEnabledi(GL_BLEND, 0); - GLboolean isLineSmoothEnabled = glIsEnabled(GL_LINE_SMOOTH); - GLfloat currentLineWidth; - glGetFloatv(GL_LINE_WIDTH, ¤tLineWidth); - - GLenum blendEquationRGB, blendEquationAlpha, blendDestAlpha, - blendDestRGB, blendSrcAlpha, blendSrcRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - // Changes GL state: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnablei(GL_BLEND, 0); @@ -261,15 +247,8 @@ void RenderableCartesianAxes::render(const RenderData& data, RendererTasks&){ _program->deactivate(); // Restores GL State - glLineWidth(currentLineWidth); - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - if (!isBlendEnabled) { - glDisablei(GL_BLEND, 0); - } - if (!isLineSmoothEnabled) { - glDisable(GL_LINE_SMOOTH); - } + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setLineState(); } } // namespace openspace diff --git a/modules/base/rendering/renderablenodeline.cpp b/modules/base/rendering/renderablenodeline.cpp index 7fc1f26068..a1de634a64 100644 --- a/modules/base/rendering/renderablenodeline.cpp +++ b/modules/base/rendering/renderablenodeline.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include namespace { @@ -290,25 +291,6 @@ void RenderableNodeLine::render(const RenderData& data, RendererTasks&) { _program->setUniform("projectionTransform", data.camera.projectionMatrix()); _program->setUniform("color", glm::vec4(_lineColor.value(), _opacity)); - // Save current state: - GLboolean isBlendEnabled = glIsEnabledi(GL_BLEND, 0); - GLboolean isLineSmoothEnabled = glIsEnabled(GL_LINE_SMOOTH); - GLfloat currentLineWidth; - glGetFloatv(GL_LINE_WIDTH, ¤tLineWidth); - - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - // Change GL state: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnablei(GL_BLEND, 0); @@ -322,15 +304,8 @@ void RenderableNodeLine::render(const RenderData& data, RendererTasks&) { // Restore GL State unbindGL(); _program->deactivate(); - glLineWidth(currentLineWidth); - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - if (!isBlendEnabled) { - glDisablei(GL_BLEND, 0); - } - if (!isLineSmoothEnabled) { - glDisable(GL_LINE_SMOOTH); - } + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setLineState(); } void RenderableNodeLine::validateNodes() { diff --git a/modules/base/rendering/screenspaceframebuffer.cpp b/modules/base/rendering/screenspaceframebuffer.cpp index dab0c44e2b..7c01bdf16c 100644 --- a/modules/base/rendering/screenspaceframebuffer.cpp +++ b/modules/base/rendering/screenspaceframebuffer.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include namespace { @@ -111,13 +112,16 @@ void ScreenSpaceFramebuffer::render() { if (!_renderFunctions.empty()) { GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); + //glGetIntegerv(GL_VIEWPORT, viewport); + global::renderEngine.openglStateCache().viewPort(viewport); glViewport( static_cast(-size.x * xratio), static_cast(-size.y * yratio), static_cast(resolution.x * xratio), static_cast(resolution.y * yratio) ); + global::renderEngine.openglStateCache().setViewPortState(viewport); + GLint defaultFBO = _framebuffer->getActiveObject(); _framebuffer->activate(); diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp index caa8c1d84f..17896e43fd 100644 --- a/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp +++ b/modules/digitaluniverse/rendering/renderablebillboardscloud.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -779,28 +780,6 @@ void RenderableBillboardsCloud::renderBillboards(const RenderData& data, float fadeInVariable) { glDepthMask(false); - glEnable(GL_DEPTH_TEST); - - // Saving current OpenGL state - GLboolean blendEnabled = glIsEnabledi(GL_BLEND, 0); - - GLenum blendEquationRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - - GLenum blendEquationAlpha; - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - - GLenum blendDestAlpha; - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - - GLenum blendDestRGB; - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - - GLenum blendSrcAlpha; - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - - GLenum blendSrcRGB; - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); glEnablei(GL_BLEND, 0); glBlendFunc(GL_SRC_ALPHA, GL_ONE); @@ -868,15 +847,8 @@ void RenderableBillboardsCloud::renderBillboards(const RenderData& data, glBindVertexArray(0); _program->deactivate(); - // Restores blending state - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - - if (!blendEnabled) { - glDisablei(GL_BLEND, 0); - } - - glDepthMask(true); + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setDepthState(); } diff --git a/modules/digitaluniverse/rendering/renderabledumeshes.cpp b/modules/digitaluniverse/rendering/renderabledumeshes.cpp index a9ce646b08..c9d286d840 100644 --- a/modules/digitaluniverse/rendering/renderabledumeshes.cpp +++ b/modules/digitaluniverse/rendering/renderabledumeshes.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -448,30 +449,6 @@ void RenderableDUMeshes::renderMeshes(const RenderData&, const glm::dmat4& modelViewMatrix, const glm::dmat4& projectionMatrix) { - // Saving current OpenGL state - GLfloat lineWidth = 1.0f; - glGetFloatv(GL_LINE_WIDTH, &lineWidth); - - GLboolean blendEnabled = glIsEnabledi(GL_BLEND, 0); - - GLenum blendEquationRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - - GLenum blendEquationAlpha; - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - - GLenum blendDestAlpha; - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - - GLenum blendDestRGB; - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - - GLenum blendSrcAlpha; - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - - GLenum blendSrcRGB; - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - glEnablei(GL_BLEND, 0); glBlendFunc(GL_SRC_ALPHA, GL_ONE); //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -495,7 +472,7 @@ void RenderableDUMeshes::renderMeshes(const RenderData&, case Wire: glLineWidth(_lineWidth); glDrawArrays(GL_LINE_STRIP, 0, pair.second.numV); - glLineWidth(lineWidth); + global::renderEngine.openglStateCache().setLineState(); break; case Point: glDrawArrays(GL_POINTS, 0, pair.second.numV); @@ -509,15 +486,9 @@ void RenderableDUMeshes::renderMeshes(const RenderData&, glBindVertexArray(0); _program->deactivate(); - // Restores blending state - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - - glDepthMask(true); - - if (!blendEnabled) { - glDisablei(GL_BLEND, 0); - } + // Restores GL State + global::renderEngine.openglStateCache().setDepthState(); + global::renderEngine.openglStateCache().setBlendState(); } void RenderableDUMeshes::renderLabels(const RenderData& data, diff --git a/modules/digitaluniverse/rendering/renderableplanescloud.cpp b/modules/digitaluniverse/rendering/renderableplanescloud.cpp index befa6a125e..a4e0bfd356 100644 --- a/modules/digitaluniverse/rendering/renderableplanescloud.cpp +++ b/modules/digitaluniverse/rendering/renderableplanescloud.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -547,27 +548,6 @@ void RenderablePlanesCloud::renderPlanes(const RenderData&, const glm::dmat4& projectionMatrix, const float fadeInVariable) { - // Saving current OpenGL state - GLboolean blendEnabled = glIsEnabledi(GL_BLEND, 0); - - GLenum blendEquationRGB; - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - - GLenum blendEquationAlpha; - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - - GLenum blendDestAlpha; - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - - GLenum blendDestRGB; - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - - GLenum blendSrcAlpha; - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - - GLenum blendSrcRGB; - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - glEnablei(GL_BLEND, 0); glBlendFunc(GL_SRC_ALPHA, GL_ONE); //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -610,15 +590,9 @@ void RenderablePlanesCloud::renderPlanes(const RenderData&, glBindVertexArray(0); _program->deactivate(); - // Restores blending state - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - - glDepthMask(true); - - if (!blendEnabled) { - glDisablei(GL_BLEND, 0); - } + // Restores OpenGL Rendering State + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setDepthState(); } void RenderablePlanesCloud::renderLabels(const RenderData& data, diff --git a/modules/galaxy/rendering/renderablegalaxy.cpp b/modules/galaxy/rendering/renderablegalaxy.cpp index ba5a801649..fa9e4b6a51 100644 --- a/modules/galaxy/rendering/renderablegalaxy.cpp +++ b/modules/galaxy/rendering/renderablegalaxy.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -632,23 +633,6 @@ void RenderableGalaxy::renderPoints(const RenderData& data) { if (!_pointsProgram) { return; } - // Saving current OpenGL state - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - GLboolean depthMask; - - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); - - glGetBooleanv(GL_DEPTH_WRITEMASK, &depthMask); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glDepthMask(false); @@ -697,14 +681,9 @@ void RenderableGalaxy::renderPoints(const RenderData& data) { _pointsProgram->deactivate(); - glEnable(GL_DEPTH_TEST); - glDepthMask(true); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - // Restores OpenGL blending state - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - glDepthMask(depthMask); + // Restores OpenGL Rendering State + global::renderEngine.openglStateCache().setBlendState(); + global::renderEngine.openglStateCache().setDepthState(); } void RenderableGalaxy::renderBillboards(const RenderData& data) { diff --git a/modules/globebrowsing/src/tileprovider.cpp b/modules/globebrowsing/src/tileprovider.cpp index d79aaca8a4..fc64a5ebc3 100644 --- a/modules/globebrowsing/src/tileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -41,6 +42,7 @@ #include #include #include +#include #include #include "cpl_minixml.h" @@ -209,9 +211,9 @@ Tile tile(TextTileProvider& t, const TileIndex& tileIndex) { // Keep track of defaultFBO and viewport to be able to reset state when done GLint defaultFBO; - GLint viewport[4]; + //GLint viewport[4]; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); - glGetIntegerv(GL_VIEWPORT, viewport); + //glGetIntegerv(GL_VIEWPORT, viewport); // Render to texture glBindFramebuffer(GL_FRAMEBUFFER, t.fbo); @@ -232,7 +234,8 @@ Tile tile(TextTileProvider& t, const TileIndex& tileIndex) { t.fontRenderer->render(*t.font, t.textPosition, t.text, t.textColor); glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO); - glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + global::renderEngine.openglStateCache().setViewPortState(); + //glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); tile = Tile{ texture, std::nullopt, Tile::Status::OK }; t.tileCache->put(key, t.initData.hashKey, tile); diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index 2778673233..8f4cc221bb 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -823,23 +824,8 @@ void RenderableStars::renderPSFToTexture() { GLint defaultFBO; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); - GLint m_viewport[4]; - glGetIntegerv(GL_VIEWPORT, m_viewport); - - // Saving current OpenGL state - GLenum blendEquationRGB; - GLenum blendEquationAlpha; - GLenum blendDestAlpha; - GLenum blendDestRGB; - GLenum blendSrcAlpha; - GLenum blendSrcRGB; - - glGetIntegerv(GL_BLEND_EQUATION_RGB, &blendEquationRGB); - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blendEquationAlpha); - glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDestAlpha); - glGetIntegerv(GL_BLEND_DST_RGB, &blendDestRGB); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrcAlpha); - glGetIntegerv(GL_BLEND_SRC_RGB, &blendSrcRGB); +// GLint m_viewport[4]; +// global::renderEngine.openglStateCache().viewPort(m_viewport); // Creates the FBO for the calculations GLuint psfFBO; @@ -941,8 +927,7 @@ void RenderableStars::renderPSFToTexture() { //glDeleteFramebuffers(1, &convolveFBO); // Restores OpenGL blending state - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); + global::renderEngine.openglStateCache().setBlendState(); } void RenderableStars::render(const RenderData& data, RendererTasks&) { diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 2319b58ea5..ac4edcd0bd 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -474,8 +475,22 @@ void FramebufferRenderer::initialize() { global::raycasterManager.addListener(*this); global::deferredcasterManager.addListener(*this); + // Set Default Rendering OpenGL State + + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); + glEnablei(GL_BLEND, 0); + glDisablei(GL_BLEND, 1); + glDisablei(GL_BLEND, 2); + + glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); + + glEnable(GL_DEPTH_TEST); + // Default GL State for Blending glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // Save State in Cache + global::renderEngine.openglStateCache().loadCurrentGLState(); } void FramebufferRenderer::deinitialize() { @@ -1159,22 +1174,14 @@ void FramebufferRenderer::updateDownscaledVolume() { void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFactor) { ZoneScoped + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); + GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); + global::renderEngine.openglStateCache().viewPort(viewport); - { - // Set OpenGL default rendering state - ZoneScopedN("Setting OpenGL state") + // Set Render Pipeline State + global::renderEngine.openglStateCache().setCachedStates(); - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); - glEnablei(GL_BLEND, 0); - glDisablei(GL_BLEND, 1); - glDisablei(GL_BLEND, 2); - - glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE); - - glEnable(GL_DEPTH_TEST); - } _pingPongIndex = 0; // Measurements cache variable @@ -1531,6 +1538,9 @@ void FramebufferRenderer::performDeferredTasks( void FramebufferRenderer::setResolution(glm::ivec2 res) { _resolution = std::move(res); _dirtyResolution = true; + GLint newViewPortCoors[4]; + glGetIntegerv(GL_VIEWPORT, newViewPortCoors); + global::renderEngine.openglStateCache().setViewPortState(newViewPortCoors); } void FramebufferRenderer::setDisableHDR(bool disable) { diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index d429cd8d46..0edbfb1e0e 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -57,6 +57,7 @@ #include #include #include +#include #include #ifdef GHOUL_USE_DEVIL @@ -944,6 +945,13 @@ RenderEngine::RendererImplementation RenderEngine::rendererImplementation() cons return _rendererImplementation; } +ghoul::opengl::OpenGLStateCache& RenderEngine::openglStateCache() { + if (_openglStateCache == nullptr) { + _openglStateCache = ghoul::opengl::OpenGLStateCache::getInstance(); + } + return *_openglStateCache; +} + float RenderEngine::globalBlackOutFactor() { return _globalBlackOutFactor; }