From c4e65732befdfb675111387c3c7edb616bf2f976 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 4 Jan 2016 10:18:15 +0100 Subject: OPENGL: Introduce abstraction for framebuffer. This allows us to use various framebuffer settings easily. Now the GPU accelerated CLUT8 surface implementation does not need to query former framebuffer state anymore. --- backends/graphics/opengl/framebuffer.h | 157 +++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 backends/graphics/opengl/framebuffer.h (limited to 'backends/graphics/opengl/framebuffer.h') diff --git a/backends/graphics/opengl/framebuffer.h b/backends/graphics/opengl/framebuffer.h new file mode 100644 index 0000000000..be829de3d2 --- /dev/null +++ b/backends/graphics/opengl/framebuffer.h @@ -0,0 +1,157 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef BACKENDS_GRAPHICS_OPENGL_FRAMEBUFFER_H +#define BACKENDS_GRAPHICS_OPENGL_FRAMEBUFFER_H + +#include "backends/graphics/opengl/opengl-sys.h" + +namespace OpenGL { + +/** + * Object describing a framebuffer OpenGL can render to. + */ +class Framebuffer { +public: + Framebuffer(); + virtual ~Framebuffer() {}; + + /** + * Activate framebuffer. + * + * This is supposed to set all state associated with the framebuffer. + */ + virtual void activate() = 0; + + /** + * Deactivate framebuffer. + * + * This is supposed to make any cleanup required when unbinding the + * framebuffer. + */ + virtual void deactivate(); + + /** + * Set the clear color of the framebuffer. + */ + void setClearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a); + + /** + * Enable/disable GL_BLEND. + */ + void enableBlend(bool enable); + + /** + * Enable/disable GL_SCISSOR_TEST. + */ + void enableScissorTest(bool enable); + + /** + * Set scissor box dimensions. + */ + void setScissorBox(GLint x, GLint y, GLsizei w, GLsizei h); + + /** + * Obtain projection matrix of the framebuffer. + */ + const GLfloat *getProjectionMatrix() const { return _projectionMatrix; } +protected: + bool isActive() const { return _isActive; } + + GLint _viewport[4]; + void applyViewport(); + + GLfloat _projectionMatrix[4*4]; +private: + bool _isActive; + + GLfloat _clearColor[4]; + void applyClearColor(); + + bool _blendState; + void applyBlendState(); + + bool _scissorTestState; + void applyScissorTestState(); + + GLint _scissorBox[4]; + void applyScissorBox(); +}; + +/** + * Default back buffer implementation. + */ +class Backbuffer : public Framebuffer { +public: + virtual void activate(); + + /** + * Set the dimensions (a.k.a. size) of the back buffer. + */ + void setDimensions(uint width, uint height); +}; + +#if !USE_FORCED_GLES +class GLTexture; + +/** + * Render to texture framebuffer implementation. + * + * This target allows to render to a texture, which can then be used for + * further rendering. + */ +class TextureTarget : public Framebuffer { +public: + TextureTarget(); + virtual ~TextureTarget(); + + virtual void activate(); + + /** + * Notify that the GL context is about to be destroyed. + */ + void destroy(); + + /** + * Notify that the GL context has been created. + */ + void create(); + + /** + * Set size of the texture target. + */ + void setSize(uint width, uint height); + + /** + * Query pointer to underlying GL texture. + */ + GLTexture *getTexture() const { return _texture; } +private: + GLTexture *_texture; + GLuint _glFBO; + bool _needUpdate; +}; +#endif + +} // End of namespace OpenGL + +#endif -- cgit v1.2.3 From 0fe580d10c6fb73a90eccb046c8dcbf84b062b16 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 4 Jan 2016 11:38:21 +0100 Subject: OPENGL: Make shader/framebuffer part of pipeline state. --- backends/graphics/opengl/framebuffer.h | 1 + 1 file changed, 1 insertion(+) (limited to 'backends/graphics/opengl/framebuffer.h') diff --git a/backends/graphics/opengl/framebuffer.h b/backends/graphics/opengl/framebuffer.h index be829de3d2..467c00e5da 100644 --- a/backends/graphics/opengl/framebuffer.h +++ b/backends/graphics/opengl/framebuffer.h @@ -81,6 +81,7 @@ protected: void applyViewport(); GLfloat _projectionMatrix[4*4]; + void applyProjectionMatrix(); private: bool _isActive; -- cgit v1.2.3 From bec2088d6c312d15e4c3377b5afbcb5a6fb0a84e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 28 Feb 2016 17:10:02 +0100 Subject: OPENGL: Only allow Pipeline to switch active Framebuffers. --- backends/graphics/opengl/framebuffer.h | 55 ++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 19 deletions(-) (limited to 'backends/graphics/opengl/framebuffer.h') diff --git a/backends/graphics/opengl/framebuffer.h b/backends/graphics/opengl/framebuffer.h index 467c00e5da..c44c98ddc4 100644 --- a/backends/graphics/opengl/framebuffer.h +++ b/backends/graphics/opengl/framebuffer.h @@ -31,25 +31,12 @@ namespace OpenGL { * Object describing a framebuffer OpenGL can render to. */ class Framebuffer { + friend class Pipeline; public: Framebuffer(); virtual ~Framebuffer() {}; - /** - * Activate framebuffer. - * - * This is supposed to set all state associated with the framebuffer. - */ - virtual void activate() = 0; - - /** - * Deactivate framebuffer. - * - * This is supposed to make any cleanup required when unbinding the - * framebuffer. - */ - virtual void deactivate(); - +public: /** * Set the clear color of the framebuffer. */ @@ -82,6 +69,33 @@ protected: GLfloat _projectionMatrix[4*4]; void applyProjectionMatrix(); + + /** + * Activate framebuffer. + * + * This is supposed to set all state associated with the framebuffer. + */ + virtual void activateInternal() = 0; + + /** + * Deactivate framebuffer. + * + * This is supposed to make any cleanup required when unbinding the + * framebuffer. + */ + virtual void deactivateInternal() {} + +private: + /** + * Accessor to activate framebuffer for pipeline. + */ + void activate(); + + /** + * Accessor to deactivate framebuffer from pipeline. + */ + void deactivate(); + private: bool _isActive; @@ -103,12 +117,13 @@ private: */ class Backbuffer : public Framebuffer { public: - virtual void activate(); - /** * Set the dimensions (a.k.a. size) of the back buffer. */ void setDimensions(uint width, uint height); + +protected: + virtual void activateInternal(); }; #if !USE_FORCED_GLES @@ -125,8 +140,6 @@ public: TextureTarget(); virtual ~TextureTarget(); - virtual void activate(); - /** * Notify that the GL context is about to be destroyed. */ @@ -146,6 +159,10 @@ public: * Query pointer to underlying GL texture. */ GLTexture *getTexture() const { return _texture; } + +protected: + virtual void activateInternal(); + private: GLTexture *_texture; GLuint _glFBO; -- cgit v1.2.3