[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