OPENGL: Allow runtime specification of OpenGL mode.

Formerly, we required that the OpenGL mode was fixed at compile time. Now we
allow the code to work with whatever it is given at runtime.

It is still possible to force a context type on compile time.
This commit is contained in:
Johannes Schickel 2015-12-12 22:08:33 +01:00
parent 9816e4f350
commit d6d3e17d53
8 changed files with 164 additions and 52 deletions

View file

@ -28,15 +28,23 @@
namespace OpenGL {
void Context::reset() {
ready = false;
type = kContextGL;
NPOTSupported = false;
}
Context g_context;
void OpenGLGraphicsManager::initializeGLContext() {
void OpenGLGraphicsManager::initializeGLContext(ContextType type) {
// Initialize default state.
g_context.reset();
#if USE_FORCED_GL
type = kContextGL;
#elif USE_FORCED_GLES
type = kContextGLES;
#endif
// Load all functions.
// We use horrible trickery to silence C++ compilers.
// See backends/plugins/sdl/sdl-provider.cpp for more information.
@ -64,6 +72,9 @@ void OpenGLGraphicsManager::initializeGLContext() {
g_context.NPOTSupported = true;
}
}
g_context.ready = true;
g_context.type = type;
}
} // End of namespace OpenGL

View file

@ -70,9 +70,10 @@ GL_FUNC_DEF(void, glColor4f, (GLfloat red, GLfloat green, GLfloat blue, GLfloat
GL_FUNC_DEF(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height));
GL_FUNC_DEF(void, glMatrixMode, (GLenum mode));
GL_FUNC_DEF(void, glLoadIdentity, ());
#ifdef USE_GLES
#if !USE_FORCED_GL
GL_FUNC_DEF(void, glOrthof, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar));
#else
#endif
#if !USE_FORCED_GLES
GL_FUNC_DEF(void, glOrtho, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val));
#endif
GL_FUNC_DEF(void, glShadeModel, (GLenum mode));

View file

@ -759,10 +759,16 @@ void OpenGLGraphicsManager::setActualScreenSize(uint width, uint height) {
GL_CALL(glMatrixMode(GL_PROJECTION));
GL_CALL(glLoadIdentity());
#ifdef USE_GLES
#if USE_FORCED_GLES
GL_CALL(glOrthof(0, _outputScreenWidth, _outputScreenHeight, 0, -1, 1));
#else
#elif USE_FORCED_GL
GL_CALL(glOrtho(0, _outputScreenWidth, _outputScreenHeight, 0, -1, 1));
#else
if (isGLESContext()) {
GL_CALL(glOrthof(0, _outputScreenWidth, _outputScreenHeight, 0, -1, 1));
} else {
GL_CALL(glOrtho(0, _outputScreenWidth, _outputScreenHeight, 0, -1, 1));
}
#endif
GL_CALL(glMatrixMode(GL_MODELVIEW));
GL_CALL(glLoadIdentity());
@ -834,9 +840,9 @@ void OpenGLGraphicsManager::setActualScreenSize(uint width, uint height) {
++_screenChangeID;
}
void OpenGLGraphicsManager::notifyContextCreate(const Graphics::PixelFormat &defaultFormat, const Graphics::PixelFormat &defaultFormatAlpha) {
void OpenGLGraphicsManager::notifyContextCreate(const Graphics::PixelFormat &defaultFormat, const Graphics::PixelFormat &defaultFormatAlpha, ContextType type) {
// Initialize context for use.
initializeGLContext();
initializeGLContext(type);
// Disable 3D properties.
GL_CALL(glDisable(GL_CULL_FACE));
@ -1014,7 +1020,11 @@ bool OpenGLGraphicsManager::getGLPixelFormat(const Graphics::PixelFormat &pixelF
glFormat = GL_RGBA;
glType = GL_UNSIGNED_SHORT_4_4_4_4;
return true;
#ifndef USE_GLES
#if !USE_FORCED_GLES
// The formats below are not supported by every GLES implementation.
// Thus, we do not mark them as supported when a GLES context is setup.
} else if (isGLESContext()) {
return false;
#ifdef SCUMM_LITTLE_ENDIAN
} else if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0)) { // RGBA8888
glIntFormat = GL_RGBA;
@ -1023,8 +1033,6 @@ bool OpenGLGraphicsManager::getGLPixelFormat(const Graphics::PixelFormat &pixelF
return true;
#endif
} else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)) { // RGB555
// GL_BGRA does not exist in every GLES implementation so should not be configured if
// USE_GLES is set.
glIntFormat = GL_RGB;
glFormat = GL_BGRA;
glType = GL_UNSIGNED_SHORT_1_5_5_5_REV;
@ -1066,7 +1074,7 @@ bool OpenGLGraphicsManager::getGLPixelFormat(const Graphics::PixelFormat &pixelF
glFormat = GL_BGRA;
glType = GL_UNSIGNED_SHORT_4_4_4_4;
return true;
#endif
#endif // !USE_FORCED_GLES
} else {
return false;
}

View file

@ -116,6 +116,16 @@ public:
virtual void grabPalette(byte *colors, uint start, uint num);
protected:
/**
* Whether an OpenGL (context) is active.
*/
bool isInitialized() const { return g_context.ready; }
/**
* Whether an GLES context is active.
*/
bool isGLESContext() const { return g_context.type == kContextGLES; }
/**
* Set up the actual screen size available for the OpenGL code to do any
* drawing.
@ -133,8 +143,9 @@ protected:
* (this is used for the CLUT8 game screens).
* @param defaultFormatAlpha The new default format with an alpha channel
* (this is used for the overlay and cursor).
* @param type Type of the created context.
*/
void notifyContextCreate(const Graphics::PixelFormat &defaultFormat, const Graphics::PixelFormat &defaultFormatAlpha);
void notifyContextCreate(const Graphics::PixelFormat &defaultFormat, const Graphics::PixelFormat &defaultFormatAlpha, ContextType type);
/**
* Notify the manager that the OpenGL context is about to be destroyed.
@ -282,8 +293,10 @@ private:
/**
* Initialize the active context for use.
*
* @param type Type of the context to initialize.
*/
void initializeGLContext();
void initializeGLContext(ContextType type);
protected:
/**

View file

@ -30,6 +30,14 @@
#include "backends/platform/sdl/sdl-sys.h"
#endif
// We allow to force GL or GLES modes on compile time.
// For this the USE_GLES_MODE define is used. The following values represent
// the given selection choices:
// 0 - Force OpenGL context
// 1 - Force OpenGL ES context
#define USE_FORCED_GL (defined(USE_GLES_MODE) && USE_GLES_MODE == 0)
#define USE_FORCED_GLES (defined(USE_GLES_MODE) && USE_GLES_MODE == 1)
// On Tizen we include the toolchain's OpenGL file. This is something we
// actually want to avoid. However, since Tizen uses eglGetProcAddress which
// is not required to return valid function pointers to non OpenGL extension
@ -59,10 +67,21 @@
namespace OpenGL {
enum ContextType {
kContextGL,
kContextGLES
};
/**
* Description structure of the OpenGL (ES) context.
*/
struct Context {
/** Whether the context is properly initalized or not. */
bool ready;
/** The type of the active context. */
ContextType type;
/**
* Reset context.
*