From 65803e134d62fdafc823b45dd89807aefa304b6e Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Tue, 12 Jan 2021 04:28:49 -0500 Subject: [PATCH] Issue/1447 (#1451) * Fixed missing calls to OpenGL cache system. --- ext/ghoul | 2 +- .../rendering/renderableplanescloud.cpp | 2 +- modules/galaxy/rendering/renderablegalaxy.cpp | 30 ++------- modules/globebrowsing/src/shadowcomponent.cpp | 61 ++++--------------- modules/globebrowsing/src/shadowcomponent.h | 2 +- modules/globebrowsing/src/tileprovider.cpp | 2 +- modules/space/rendering/renderablestars.cpp | 28 +-------- src/rendering/framebufferrenderer.cpp | 33 ++-------- 8 files changed, 27 insertions(+), 133 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index 1f97e924b3..4ee9c60ede 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 1f97e924b36bedcf95a7e4e562e23319338ee238 +Subproject commit 4ee9c60ededc5b71ffaaab45bba86ae7bcbc1150 diff --git a/modules/digitaluniverse/rendering/renderableplanescloud.cpp b/modules/digitaluniverse/rendering/renderableplanescloud.cpp index 4d77511e6c..71d7dc33bf 100644 --- a/modules/digitaluniverse/rendering/renderableplanescloud.cpp +++ b/modules/digitaluniverse/rendering/renderableplanescloud.cpp @@ -569,7 +569,7 @@ void RenderablePlanesCloud::renderPlanes(const RenderData&, glDisable(GL_CULL_FACE); GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); + global::renderEngine->openglStateCache().viewport(viewport); ghoul::opengl::TextureUnit unit; unit.activate(); diff --git a/modules/galaxy/rendering/renderablegalaxy.cpp b/modules/galaxy/rendering/renderablegalaxy.cpp index 100f72fafb..5964eff426 100644 --- a/modules/galaxy/rendering/renderablegalaxy.cpp +++ b/modules/galaxy/rendering/renderablegalaxy.cpp @@ -695,24 +695,7 @@ void RenderableGalaxy::renderBillboards(const RenderData& data) { 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); - + // Change OpenGL Blending and Depth states glBlendFunc(GL_SRC_ALPHA, GL_ONE); glDepthMask(false); glDisable(GL_DEPTH_TEST); @@ -764,14 +747,9 @@ void RenderableGalaxy::renderBillboards(const RenderData& data) { _billboardsProgram->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().resetBlendState(); + global::renderEngine->openglStateCache().resetDepthState(); } float RenderableGalaxy::safeLength(const glm::vec3& vector) const { diff --git a/modules/globebrowsing/src/shadowcomponent.cpp b/modules/globebrowsing/src/shadowcomponent.cpp index 891a2603c6..ab237291c4 100644 --- a/modules/globebrowsing/src/shadowcomponent.cpp +++ b/modules/globebrowsing/src/shadowcomponent.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -320,20 +321,9 @@ RenderData ShadowComponent::begin(const RenderData& data) { // Saves current state - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); - glGetIntegerv(GL_VIEWPORT, _mViewport); - _faceCulling = glIsEnabled(GL_CULL_FACE); - glGetIntegerv(GL_CULL_FACE_MODE, &_faceToCull); - _polygonOffSet = glIsEnabled(GL_POLYGON_OFFSET_FILL); - glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &_polygonOffSetFactor); - glGetFloatv(GL_POLYGON_OFFSET_UNITS, &_polygonOffSetUnits); - glGetFloatv(GL_COLOR_CLEAR_VALUE, _colorClearValue); - glGetFloatv(GL_DEPTH_CLEAR_VALUE, &_depthClearValue); - _depthIsEnabled = glIsEnabled(GL_DEPTH_TEST); - glGetIntegerv(GL_DEPTH_FUNC, &_depthFunction); - _blendIsEnabled = glIsEnabled(GL_BLEND); - - + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_currentFBO); + global::renderEngine->openglStateCache().viewport(_mViewport); + glBindFramebuffer(GL_FRAMEBUFFER, _shadowFBO); GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_NONE, GL_NONE }; glDrawBuffers(3, drawBuffers); @@ -370,45 +360,18 @@ void ShadowComponent::end() { } // Restores system state - glBindFramebuffer(GL_FRAMEBUFFER, _defaultFBO); + glBindFramebuffer(GL_FRAMEBUFFER, _currentFBO); GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; glDrawBuffers(3, drawBuffers); glViewport(_mViewport[0], _mViewport[1], _mViewport[2], _mViewport[3]); - if (_faceCulling) { - glEnable(GL_CULL_FACE); - glCullFace(_faceToCull); - } - else { - glDisable(GL_CULL_FACE); - } - - if (_depthIsEnabled) { - glEnable(GL_DEPTH_TEST); - } - else { - glDisable(GL_DEPTH_TEST); - } - - glDepthFunc(_depthFunction); - - if (_polygonOffSet) { - glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(_polygonOffSetFactor, _polygonOffSetUnits); - } - else { - glDisable(GL_POLYGON_OFFSET_FILL); - } - - glClearColor( - _colorClearValue[0], - _colorClearValue[1], - _colorClearValue[2], - _colorClearValue[3] - ); - glClearDepth(_depthClearValue); + // Restores OpenGL Rendering State + global::renderEngine->openglStateCache().resetColorState(); + global::renderEngine->openglStateCache().resetBlendState(); + global::renderEngine->openglStateCache().resetDepthState(); + global::renderEngine->openglStateCache().resetPolygonAndClippingState(); if (_blendIsEnabled) { glEnable(GL_BLEND); @@ -467,7 +430,7 @@ void ShadowComponent::createDepthTexture() { void ShadowComponent::createShadowFBO() { // Saves current FBO first - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_currentFBO); glGenFramebuffers(1, &_shadowFBO); glBindFramebuffer(GL_FRAMEBUFFER, _shadowFBO); @@ -492,7 +455,7 @@ void ShadowComponent::createShadowFBO() { checkFrameBufferState("createShadowFBO()"); // Restores system state - glBindFramebuffer(GL_FRAMEBUFFER, _defaultFBO); + glBindFramebuffer(GL_FRAMEBUFFER, _currentFBO); } void ShadowComponent::updateDepthTexture() { diff --git a/modules/globebrowsing/src/shadowcomponent.h b/modules/globebrowsing/src/shadowcomponent.h index 38a40cdee4..30aabbe057 100644 --- a/modules/globebrowsing/src/shadowcomponent.h +++ b/modules/globebrowsing/src/shadowcomponent.h @@ -117,7 +117,7 @@ private: GLuint _dDepthTexture = 0; GLuint _positionInLightSpaceTexture = 0; GLuint _shadowFBO = 0; - GLint _defaultFBO = 0; + GLint _currentFBO = 0; GLint _mViewport[4]; GLboolean _faceCulling; diff --git a/modules/globebrowsing/src/tileprovider.cpp b/modules/globebrowsing/src/tileprovider.cpp index c53928cd81..379857325d 100644 --- a/modules/globebrowsing/src/tileprovider.cpp +++ b/modules/globebrowsing/src/tileprovider.cpp @@ -213,7 +213,7 @@ 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]; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); + defaultFBO = global::renderEngine->openglStateCache().defaultFramebuffer(); //glGetIntegerv(GL_VIEWPORT, viewport); // Render to texture diff --git a/modules/space/rendering/renderablestars.cpp b/modules/space/rendering/renderablestars.cpp index 55bccde601..8233058ea5 100644 --- a/modules/space/rendering/renderablestars.cpp +++ b/modules/space/rendering/renderablestars.cpp @@ -860,7 +860,7 @@ void RenderableStars::loadPSFTexture() { void RenderableStars::renderPSFToTexture() { // Saves current FBO first GLint defaultFBO; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); + defaultFBO = global::renderEngine->openglStateCache().defaultFramebuffer(); // GLint m_viewport[4]; // global::renderEngine.openglStateCache().viewPort(m_viewport); @@ -973,24 +973,6 @@ void RenderableStars::render(const RenderData& data, RendererTasks&) { 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); @@ -1093,13 +1075,9 @@ void RenderableStars::render(const RenderData& data, RendererTasks&) { glBindVertexArray(0); _program->deactivate(); - 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); + global::renderEngine->openglStateCache().resetBlendState(); + global::renderEngine->openglStateCache().resetDepthState(); } void RenderableStars::update(const UpdateData&) { diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index 39d2d9a9cf..70c9b8bc07 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -556,27 +556,6 @@ void FramebufferRenderer::updateDownscaleTextures() { } void FramebufferRenderer::writeDownscaledVolume() { - // 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); @@ -620,14 +599,9 @@ void FramebufferRenderer::writeDownscaledVolume() { _downscaledVolumeProgram->deactivate(); - // Restores blending state - glBlendEquationSeparate(blendEquationRGB, blendEquationAlpha); - glBlendFuncSeparate(blendSrcRGB, blendDestRGB, blendSrcAlpha, blendDestAlpha); - - if (!blendEnabled) { - glDisablei(GL_BLEND, 0); - } - + // Restores OpenGL Rendering State + global::renderEngine->openglStateCache().resetBlendState(); + global::renderEngine->openglStateCache().resetDepthState(); } void FramebufferRenderer::update() { @@ -1125,6 +1099,7 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac TracyGpuZone("FramebufferRenderer") glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); + global::renderEngine->openglStateCache().setDefaultFramebuffer(_defaultFBO); GLint viewport[4] = { 0 }; global::renderEngine->openglStateCache().viewport(viewport);