[Scummvm-git-logs] scummvm master -> df0cf4bf44540c2f95d02873b8e9a891eab28f31

aquadran noreply at scummvm.org
Sun Dec 5 09:33:13 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
df0cf4bf44 GFX: Properly save/restore states for viewport, blending, depth, alpha


Commit: df0cf4bf44540c2f95d02873b8e9a891eab28f31
    https://github.com/scummvm/scummvm/commit/df0cf4bf44540c2f95d02873b8e9a891eab28f31
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2021-12-05T10:33:06+01:00

Commit Message:
GFX: Properly save/restore states for viewport, blending, depth, alpha

Changed paths:
    graphics/opengl/framebuffer.cpp
    graphics/opengl/framebuffer.h
    graphics/opengl/surfacerenderer.cpp
    graphics/opengl/surfacerenderer.h


diff --git a/graphics/opengl/framebuffer.cpp b/graphics/opengl/framebuffer.cpp
index 871e5f65a7..090e4266d9 100644
--- a/graphics/opengl/framebuffer.cpp
+++ b/graphics/opengl/framebuffer.cpp
@@ -184,7 +184,7 @@ void FrameBuffer::init() {
 	}
 
 	glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
-	GLenum status=glCheckFramebufferStatus(GL_FRAMEBUFFER);
+	GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
 	if (status != GL_FRAMEBUFFER_COMPLETE)
 		error("Framebuffer is not complete! status: %d", status);
 
@@ -194,11 +194,13 @@ void FrameBuffer::init() {
 
 void FrameBuffer::attach() {
 	glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
-	glViewport(0,0, _width, _height);
+	glGetIntegerv(GL_VIEWPORT, _prevStateViewport);
+	glViewport(0, 0, _width, _height);
 }
 
 void FrameBuffer::detach() {
 	glBindFramebuffer(GL_FRAMEBUFFER, 0);
+	glViewport(_prevStateViewport[0], _prevStateViewport[1], _prevStateViewport[2], _prevStateViewport[3]);
 }
 
 #if !defined(USE_GLES2) && !defined(AMIGAOS) && !defined(__MORPHOS__)
@@ -251,7 +253,8 @@ void MultiSampleFrameBuffer::init() {
 void MultiSampleFrameBuffer::attach() {
 	glBindFramebuffer(GL_READ_FRAMEBUFFER, getFrameBufferName());
 	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _msFrameBufferId);
-	glViewport(0,0, getWidth(), getHeight());
+	glGetIntegerv(GL_VIEWPORT, _prevStateViewport);
+	glViewport(0, 0, getWidth(), getHeight());
 }
 
 void MultiSampleFrameBuffer::detach() {
@@ -259,6 +262,7 @@ void MultiSampleFrameBuffer::detach() {
 	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, getFrameBufferName());
 	glBlitFramebuffer(0, 0, getWidth(), getHeight(), 0, 0, getWidth(), getHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
 	glBindFramebuffer(GL_FRAMEBUFFER, 0);
+	glViewport(_prevStateViewport[0], _prevStateViewport[1], _prevStateViewport[2], _prevStateViewport[3]);
 }
 
 #endif // !defined(USE_GLES2) && !defined(AMIGAOS) && !defined(__MORPHOS__)
diff --git a/graphics/opengl/framebuffer.h b/graphics/opengl/framebuffer.h
index 41a6ee7774..5667b2e76e 100644
--- a/graphics/opengl/framebuffer.h
+++ b/graphics/opengl/framebuffer.h
@@ -53,6 +53,7 @@ private:
 	void init();
 	GLuint _renderBuffers[2];
 	GLuint _frameBuffer;
+	GLint _prevStateViewport[4];
 };
 
 #if !defined(USE_GLES2) && !defined(AMIGAOS) && !defined(__MORPHOS__)
@@ -70,6 +71,7 @@ private:
 	GLuint _msColorId;
 	GLuint _msDepthId;
 	GLuint _msSamples;
+	GLint _prevStateViewport[4];
 };
 #endif
 
diff --git a/graphics/opengl/surfacerenderer.cpp b/graphics/opengl/surfacerenderer.cpp
index 6e6a464d02..46539f2f4c 100644
--- a/graphics/opengl/surfacerenderer.cpp
+++ b/graphics/opengl/surfacerenderer.cpp
@@ -78,7 +78,7 @@ FixedSurfaceRenderer::~FixedSurfaceRenderer() {
 
 void FixedSurfaceRenderer::prepareState() {
 	// Save current state
-	glPushAttrib(GL_TRANSFORM_BIT | GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_SCISSOR_BIT);
+	glPushAttrib(GL_TRANSFORM_BIT | GL_VIEWPORT_BIT | GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_SCISSOR_BIT | GL_PIXEL_MODE_BIT | GL_TEXTURE_BIT);
 
 	// prepare view
 	glMatrixMode(GL_PROJECTION);
@@ -166,8 +166,13 @@ ShaderSurfaceRenderer::ShaderSurfaceRenderer() {
 void ShaderSurfaceRenderer::prepareState() {
 	_boxShader->use();
 
+	_prevStateDepthTest = glIsEnabled(GL_DEPTH_TEST);
 	glDisable(GL_DEPTH_TEST);
+	glGetBooleanv(GL_DEPTH_WRITEMASK, &_prevStateDepthWriteMask);
 	glDepthMask(GL_FALSE);
+	_prevStateBlend = glIsEnabled(GL_BLEND);
+	glGetIntegerv(GL_BLEND_SRC_ALPHA, &_prevStateBlendFunc);
+	glGetIntegerv(GL_VIEWPORT, _prevStateViewport);
 }
 
 void ShaderSurfaceRenderer::render(const TextureGL *tex, const Math::Rect2d &dest) {
@@ -186,13 +191,14 @@ void ShaderSurfaceRenderer::render(const TextureGL *tex, const Math::Rect2d &des
 }
 
 void ShaderSurfaceRenderer::restorePreviousState() {
-	glEnable(GL_DEPTH_TEST);
-	glDepthMask(GL_TRUE);
+	_prevStateDepthTest ? glEnable(GL_DEPTH_TEST) : glDisable(GL_DEPTH_TEST);
+	glDepthMask(_prevStateDepthWriteMask);
+	_prevStateBlend ? glEnable(GL_BLEND) : glDisable(GL_BLEND);
+	glBlendFunc(GL_BLEND_SRC_ALPHA, _prevStateBlendFunc);
+	glViewport(_prevStateViewport[0], _prevStateViewport[1], _prevStateViewport[2], _prevStateViewport[3]);
 
 	_flipY = false;
-	if (_alphaBlending) {
-		enableAlphaBlending(false);
-	}
+	_alphaBlending = false;
 
 	_boxShader->unbind();
 }
diff --git a/graphics/opengl/surfacerenderer.h b/graphics/opengl/surfacerenderer.h
index 122cf3ca9a..db93414994 100644
--- a/graphics/opengl/surfacerenderer.h
+++ b/graphics/opengl/surfacerenderer.h
@@ -106,6 +106,11 @@ public:
 private:
 	ShaderGL *_boxShader;
 	GLuint _boxVerticesVBO;
+	GLboolean _prevStateDepthTest;
+	GLboolean _prevStateDepthWriteMask;
+	GLboolean _prevStateBlend;
+	GLint _prevStateBlendFunc;
+	GLint _prevStateViewport[4];
 };
 
 #endif




More information about the Scummvm-git-logs mailing list