diff options
Diffstat (limited to 'backends/graphics/opengl/pipelines')
| -rw-r--r-- | backends/graphics/opengl/pipelines/clut8.cpp | 46 | ||||
| -rw-r--r-- | backends/graphics/opengl/pipelines/clut8.h | 46 | ||||
| -rw-r--r-- | backends/graphics/opengl/pipelines/fixed.cpp | 70 | ||||
| -rw-r--r-- | backends/graphics/opengl/pipelines/fixed.h | 46 | ||||
| -rw-r--r-- | backends/graphics/opengl/pipelines/pipeline.cpp | 66 | ||||
| -rw-r--r-- | backends/graphics/opengl/pipelines/pipeline.h | 126 | ||||
| -rw-r--r-- | backends/graphics/opengl/pipelines/shader.cpp | 94 | ||||
| -rw-r--r-- | backends/graphics/opengl/pipelines/shader.h | 59 | 
8 files changed, 553 insertions, 0 deletions
diff --git a/backends/graphics/opengl/pipelines/clut8.cpp b/backends/graphics/opengl/pipelines/clut8.cpp new file mode 100644 index 0000000000..fca40074f0 --- /dev/null +++ b/backends/graphics/opengl/pipelines/clut8.cpp @@ -0,0 +1,46 @@ +/* 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. + * + */ + +#include "backends/graphics/opengl/pipelines/clut8.h" +#include "backends/graphics/opengl/shader.h" +#include "backends/graphics/opengl/framebuffer.h" + +namespace OpenGL { + +#if !USE_FORCED_GLES +CLUT8LookUpPipeline::CLUT8LookUpPipeline() +    : ShaderPipeline(ShaderMan.query(ShaderManager::kCLUT8LookUp)), _paletteTexture(nullptr) { +} + +void CLUT8LookUpPipeline::drawTexture(const GLTexture &texture, const GLfloat *coordinates) { +	// Set the palette texture. +	GL_CALL(glActiveTexture(GL_TEXTURE1)); +	if (_paletteTexture) { +		_paletteTexture->bind(); +	} + +	GL_CALL(glActiveTexture(GL_TEXTURE0)); +	ShaderPipeline::drawTexture(texture, coordinates); +} +#endif // !USE_FORCED_GLES + +} // End of namespace OpenGL diff --git a/backends/graphics/opengl/pipelines/clut8.h b/backends/graphics/opengl/pipelines/clut8.h new file mode 100644 index 0000000000..16724e4652 --- /dev/null +++ b/backends/graphics/opengl/pipelines/clut8.h @@ -0,0 +1,46 @@ +/* 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_PIPELINES_CLUT8_H +#define BACKENDS_GRAPHICS_OPENGL_PIPELINES_CLUT8_H + +#include "backends/graphics/opengl/pipelines/shader.h" + +namespace OpenGL { + +#if !USE_FORCED_GLES +class CLUT8LookUpPipeline : public ShaderPipeline { +public: +	CLUT8LookUpPipeline(); + +	void setPaletteTexture(const GLTexture *paletteTexture) { _paletteTexture = paletteTexture; } + +	virtual void drawTexture(const GLTexture &texture, const GLfloat *coordinates); + +private: +	const GLTexture *_paletteTexture; +}; +#endif // !USE_FORCED_GLES + +} // End of namespace OpenGL + +#endif diff --git a/backends/graphics/opengl/pipelines/fixed.cpp b/backends/graphics/opengl/pipelines/fixed.cpp new file mode 100644 index 0000000000..8e3bd7eaee --- /dev/null +++ b/backends/graphics/opengl/pipelines/fixed.cpp @@ -0,0 +1,70 @@ +/* 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. + * + */ + +#include "backends/graphics/opengl/pipelines/fixed.h" + +namespace OpenGL { + +#if !USE_FORCED_GLES2 +void FixedPipeline::activateInternal() { +	GL_CALL(glDisable(GL_LIGHTING)); +	GL_CALL(glDisable(GL_FOG)); +	GL_CALL(glShadeModel(GL_FLAT)); +	GL_CALL(glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST)); + +	GL_CALL(glEnableClientState(GL_VERTEX_ARRAY)); +	GL_CALL(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); + +#if !USE_FORCED_GLES +	if (g_context.multitextureSupported) { +		GL_CALL(glActiveTexture(GL_TEXTURE0)); +	} +#endif +	GL_CALL(glEnable(GL_TEXTURE_2D)); +} + +void FixedPipeline::setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { +	GL_CALL(glColor4f(r, g, b, a)); +} + +void FixedPipeline::drawTexture(const GLTexture &texture, const GLfloat *coordinates) { +	texture.bind(); + +	GL_CALL(glTexCoordPointer(2, GL_FLOAT, 0, texture.getTexCoords())); +	GL_CALL(glVertexPointer(2, GL_FLOAT, 0, coordinates)); +	GL_CALL(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); +} + +void FixedPipeline::setProjectionMatrix(const GLfloat *projectionMatrix) { +	if (!isActive()) { +		return; +	} + +	GL_CALL(glMatrixMode(GL_PROJECTION)); +	GL_CALL(glLoadMatrixf(projectionMatrix)); + +	GL_CALL(glMatrixMode(GL_MODELVIEW)); +	GL_CALL(glLoadIdentity()); +} +#endif // !USE_FORCED_GLES2 + +} // End of namespace OpenGL diff --git a/backends/graphics/opengl/pipelines/fixed.h b/backends/graphics/opengl/pipelines/fixed.h new file mode 100644 index 0000000000..6bfe140c19 --- /dev/null +++ b/backends/graphics/opengl/pipelines/fixed.h @@ -0,0 +1,46 @@ +/* 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_PIPELINES_FIXED_H +#define BACKENDS_GRAPHICS_OPENGL_PIPELINES_FIXED_H + +#include "backends/graphics/opengl/pipelines/pipeline.h" + +namespace OpenGL { + +#if !USE_FORCED_GLES2 +class FixedPipeline : public Pipeline { +public: +	virtual void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a); + +	virtual void drawTexture(const GLTexture &texture, const GLfloat *coordinates); + +	virtual void setProjectionMatrix(const GLfloat *projectionMatrix); + +protected: +	virtual void activateInternal(); +}; +#endif // !USE_FORCED_GLES2 + +} // End of namespace OpenGL + +#endif diff --git a/backends/graphics/opengl/pipelines/pipeline.cpp b/backends/graphics/opengl/pipelines/pipeline.cpp new file mode 100644 index 0000000000..6a59cd28e7 --- /dev/null +++ b/backends/graphics/opengl/pipelines/pipeline.cpp @@ -0,0 +1,66 @@ +/* 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. + * + */ + +#include "backends/graphics/opengl/pipelines/pipeline.h" +#include "backends/graphics/opengl/framebuffer.h" + +namespace OpenGL { + +Pipeline::Pipeline() +    : _activeFramebuffer(nullptr), _isActive(false) { +} + +void Pipeline::activate() { +	_isActive = true; + +	if (_activeFramebuffer) { +		_activeFramebuffer->activate(); +	} + +	activateInternal(); +} + +void Pipeline::deactivate() { +	deactivateInternal(); + +	if (_activeFramebuffer) { +		_activeFramebuffer->deactivate(); +	} + +	_isActive = false; +} + +Framebuffer *Pipeline::setFramebuffer(Framebuffer *framebuffer) { +	Framebuffer *oldFramebuffer = _activeFramebuffer; +	if (_isActive && oldFramebuffer) { +		oldFramebuffer->deactivate(); +	} + +	_activeFramebuffer = framebuffer; +	if (_isActive && _activeFramebuffer) { +		_activeFramebuffer->activate(); +	} + +	return oldFramebuffer; +} + +} // End of namespace OpenGL diff --git a/backends/graphics/opengl/pipelines/pipeline.h b/backends/graphics/opengl/pipelines/pipeline.h new file mode 100644 index 0000000000..9f32d33b95 --- /dev/null +++ b/backends/graphics/opengl/pipelines/pipeline.h @@ -0,0 +1,126 @@ +/* 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_PIPELINES_PIPELINE_H +#define BACKENDS_GRAPHICS_OPENGL_PIPELINES_PIPELINE_H + +#include "backends/graphics/opengl/opengl-sys.h" +#include "backends/graphics/opengl/texture.h" + +namespace OpenGL { + +class Framebuffer; + +/** + * Interface for OpenGL pipeline functionality. + * + * This encapsulates differences in various rendering pipelines used for + * OpenGL, OpenGL ES 1, and OpenGL ES 2. + */ +class Pipeline { +public: +	Pipeline(); +	virtual ~Pipeline() {} + +	/** +	 * Activate the pipeline. +	 * +	 * This sets the OpenGL state to make use of drawing with the given +	 * OpenGL pipeline. +	 */ +	void activate(); + +	/** +	 * Deactivate the pipeline. +	 */ +	void deactivate(); + +	/** +	 * Set framebuffer to render to. +	 * +	 * Client is responsible for any memory management related to framebuffer. +	 * +	 * @param framebuffer Framebuffer to activate. +	 * @return Formerly active framebuffer. +	 */ +	Framebuffer *setFramebuffer(Framebuffer *framebuffer); + +	/** +	 * Set modulation color. +	 * +	 * @param r Red component in [0,1]. +	 * @param g Green component in [0,1]. +	 * @param b Blue component in [0,1]. +	 * @param a Alpha component in [0,1]. +	 */ +	virtual void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a) = 0; + +	/** +	 * Draw a texture rectangle to the currently active framebuffer. +	 * +	 * @param texture     Texture to use for drawing. +	 * @param coordinates x1, y1, x2, y2 coordinates where to draw the texture. +	 */ +	virtual void drawTexture(const GLTexture &texture, const GLfloat *coordinates) = 0; + +	void drawTexture(const GLTexture &texture, GLfloat x, GLfloat y, GLfloat w, GLfloat h) { +		const GLfloat coordinates[4*2] = { +			x,     y, +			x + w, y, +			x,     y + h, +			x + w, y + h +		}; +		drawTexture(texture, coordinates); +	} + +	/** +	 * Set the projection matrix. +	 * +	 * This is intended to be only ever be used by Framebuffer subclasses. +	 */ +	virtual void setProjectionMatrix(const GLfloat *projectionMatrix) = 0; + +protected: +	/** +	 * Activate the pipeline. +	 * +	 * This sets the OpenGL state to make use of drawing with the given +	 * OpenGL pipeline. +	 */ +	virtual void activateInternal() = 0; + +	/** +	 * Deactivate the pipeline. +	 */ +	virtual void deactivateInternal() {} + +	bool isActive() const { return _isActive; } + +	Framebuffer *_activeFramebuffer; + +private: +	bool _isActive; +}; + +} // End of namespace OpenGL + +#endif diff --git a/backends/graphics/opengl/pipelines/shader.cpp b/backends/graphics/opengl/pipelines/shader.cpp new file mode 100644 index 0000000000..a2dabb7c22 --- /dev/null +++ b/backends/graphics/opengl/pipelines/shader.cpp @@ -0,0 +1,94 @@ +/* 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. + * + */ + +#include "backends/graphics/opengl/pipelines/shader.h" +#include "backends/graphics/opengl/shader.h" +#include "backends/graphics/opengl/framebuffer.h" + +namespace OpenGL { + +#if !USE_FORCED_GLES +ShaderPipeline::ShaderPipeline(Shader *shader) +    : _activeShader(shader), _colorAttributes() { +	_vertexAttribLocation = shader->getAttributeLocation("position"); +	_texCoordAttribLocation = shader->getAttributeLocation("texCoordIn"); +	_colorAttribLocation = shader->getAttributeLocation("blendColorIn"); + +	assert(_vertexAttribLocation   != -1); +	assert(_texCoordAttribLocation != -1); +	assert(_colorAttribLocation    != -1); + +	// One of the attributes needs to be passed through location 0, otherwise +	// we get no output for GL contexts due to GL compatibility reasons. Let's +	// check whether this ever happens. If this ever gets hit, we need to +	// enable location 0 and pass some dummy values through it to fix output. +	assert(   _vertexAttribLocation == 0 +	       || _texCoordAttribLocation == 0 +	       || _colorAttribLocation == 0); +} + +void ShaderPipeline::activateInternal() { +	GL_CALL(glEnableVertexAttribArray(_vertexAttribLocation)); +	GL_CALL(glEnableVertexAttribArray(_texCoordAttribLocation)); +	GL_CALL(glEnableVertexAttribArray(_colorAttribLocation)); + +	if (g_context.multitextureSupported) { +		GL_CALL(glActiveTexture(GL_TEXTURE0)); +	} + +	_activeShader->activate(); + +	GL_CALL(glVertexAttribPointer(_colorAttribLocation, 4, GL_FLOAT, GL_FALSE, 0, _colorAttributes)); +} + +void ShaderPipeline::deactivateInternal() { +	GL_CALL(glDisableVertexAttribArray(_vertexAttribLocation)); +	GL_CALL(glDisableVertexAttribArray(_texCoordAttribLocation)); +	GL_CALL(glDisableVertexAttribArray(_colorAttribLocation)); + +	_activeShader->deactivate(); +} + +void ShaderPipeline::setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { +	GLfloat *dst = _colorAttributes; +	for (uint i = 0; i < 4; ++i) { +		*dst++ = r; +		*dst++ = g; +		*dst++ = b; +		*dst++ = a; +	} +} + +void ShaderPipeline::drawTexture(const GLTexture &texture, const GLfloat *coordinates) { +	texture.bind(); + +	GL_CALL(glVertexAttribPointer(_texCoordAttribLocation, 2, GL_FLOAT, GL_FALSE, 0, texture.getTexCoords())); +	GL_CALL(glVertexAttribPointer(_vertexAttribLocation, 2, GL_FLOAT, GL_FALSE, 0, coordinates)); +	GL_CALL(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); +} + +void ShaderPipeline::setProjectionMatrix(const GLfloat *projectionMatrix) { +	_activeShader->setUniform("projection", new ShaderUniformMatrix44(projectionMatrix)); +} +#endif // !USE_FORCED_GLES + +} // End of namespace OpenGL diff --git a/backends/graphics/opengl/pipelines/shader.h b/backends/graphics/opengl/pipelines/shader.h new file mode 100644 index 0000000000..6159607099 --- /dev/null +++ b/backends/graphics/opengl/pipelines/shader.h @@ -0,0 +1,59 @@ +/* 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_PIPELINES_SHADER_H +#define BACKENDS_GRAPHICS_OPENGL_PIPELINES_SHADER_H + +#include "backends/graphics/opengl/pipelines/pipeline.h" + +namespace OpenGL { + +#if !USE_FORCED_GLES +class Shader; + +class ShaderPipeline : public Pipeline { +public: +	ShaderPipeline(Shader *shader); + +	virtual void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a); + +	virtual void drawTexture(const GLTexture &texture, const GLfloat *coordinates); + +	virtual void setProjectionMatrix(const GLfloat *projectionMatrix); + +protected: +	virtual void activateInternal(); +	virtual void deactivateInternal(); + +	GLint _vertexAttribLocation; +	GLint _texCoordAttribLocation; +	GLint _colorAttribLocation; + +	GLfloat _colorAttributes[4*4]; + +	Shader *const _activeShader; +}; +#endif // !USE_FORCED_GLES + +} // End of namespace OpenGL + +#endif  | 
