diff options
-rw-r--r-- | backends/graphics/opengl/context.cpp | 13 | ||||
-rw-r--r-- | backends/graphics/opengl/opengl-func.h | 5 | ||||
-rw-r--r-- | backends/graphics/opengl/opengl-graphics.cpp | 24 | ||||
-rw-r--r-- | backends/graphics/opengl/opengl-graphics.h | 17 | ||||
-rw-r--r-- | backends/graphics/opengl/opengl-sys.h | 19 | ||||
-rw-r--r-- | backends/graphics/openglsdl/openglsdl-graphics.cpp | 32 | ||||
-rw-r--r-- | backends/platform/tizen/graphics.cpp | 2 | ||||
-rwxr-xr-x | configure | 100 |
8 files changed, 162 insertions, 50 deletions
diff --git a/backends/graphics/opengl/context.cpp b/backends/graphics/opengl/context.cpp index c4869c2ae6..d1776f851d 100644 --- a/backends/graphics/opengl/context.cpp +++ b/backends/graphics/opengl/context.cpp @@ -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 diff --git a/backends/graphics/opengl/opengl-func.h b/backends/graphics/opengl/opengl-func.h index 75bc0b4e81..0ff39c845a 100644 --- a/backends/graphics/opengl/opengl-func.h +++ b/backends/graphics/opengl/opengl-func.h @@ -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)); diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index 1024ee546e..78ae27d8a6 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -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; } diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h index 3d5f74b387..5f0436c0b5 100644 --- a/backends/graphics/opengl/opengl-graphics.h +++ b/backends/graphics/opengl/opengl-graphics.h @@ -117,6 +117,16 @@ public: 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: /** diff --git a/backends/graphics/opengl/opengl-sys.h b/backends/graphics/opengl/opengl-sys.h index f78b3377b3..550dbb44c5 100644 --- a/backends/graphics/opengl/opengl-sys.h +++ b/backends/graphics/opengl/opengl-sys.h @@ -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. * diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp index 1992925998..a945138578 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.cpp +++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp @@ -210,16 +210,22 @@ Common::List<Graphics::PixelFormat> OpenGLSdlGraphicsManager::getSupportedFormat // RGBA4444 formats.push_back(Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0)); -#ifndef USE_GLES +#if !USE_FORCED_GLES +#if !USE_FORCED_GL + if (isInitialized() && !isGLESContext()) { +#endif #ifdef SCUMM_LITTLE_ENDIAN - // RGBA8888 - formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0)); + // RGBA8888 + formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0)); #else - // ABGR8888 - formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24)); + // ABGR8888 + formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24)); +#endif + // RGB555, this is used by SCUMM HE 16 bit games. + formats.push_back(Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)); +#if !USE_FORCED_GL + } #endif - // RGB555, this is used by SCUMM HE 16 bit games. - formats.push_back(Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)); #endif formats.push_back(Graphics::PixelFormat::createFormatCLUT8()); @@ -391,7 +397,7 @@ bool OpenGLSdlGraphicsManager::setupMode(uint width, uint height) { } } -#ifdef USE_GLES +#if USE_FORCED_GLES // SDL2 will create a GLES2 context by default, so this is needed for GLES1-profile // functions to work. SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); @@ -403,7 +409,13 @@ bool OpenGLSdlGraphicsManager::setupMode(uint width, uint height) { return false; } - notifyContextCreate(rgba8888, rgba8888); + notifyContextCreate(rgba8888, rgba8888, +#if USE_FORCED_GLES + OpenGL::kContextGLES +#else + OpenGL::kContextGL +#endif + ); int actualWidth, actualHeight; getWindowDimensions(&actualWidth, &actualHeight); setActualScreenSize(actualWidth, actualHeight); @@ -451,7 +463,7 @@ bool OpenGLSdlGraphicsManager::setupMode(uint width, uint height) { _lastVideoModeLoad = SDL_GetTicks(); if (_hwScreen) { - notifyContextCreate(rgba8888, rgba8888); + notifyContextCreate(rgba8888, rgba8888, OpenGL::kContextGL); setActualScreenSize(_hwScreen->w, _hwScreen->h); _eventSource->resetKeyboadEmulation(_hwScreen->w - 1, _hwScreen->h - 1); } diff --git a/backends/platform/tizen/graphics.cpp b/backends/platform/tizen/graphics.cpp index 971be460d8..caa18c556f 100644 --- a/backends/platform/tizen/graphics.cpp +++ b/backends/platform/tizen/graphics.cpp @@ -59,7 +59,7 @@ result TizenGraphicsManager::Construct() { // We default to RGB565 and RGBA5551 which is closest to the actual output // mode we setup. - notifyContextCreate(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)); + notifyContextCreate(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0), OpenGL::kContextGLES); // Tell our size. int x, y, width, height; @@ -133,8 +133,7 @@ _png=auto _theoradec=auto _faad=auto _fluidsynth=auto -_opengl=auto -_opengles=no +_opengl_mode=auto _readline=auto _freetype2=auto _taskbar=auto @@ -940,6 +939,14 @@ Optional Features: --enable-verbose-build enable regular echoing of commands during build process --disable-bink don't build with Bink video support + --opengl-mode=MODE OpenGL (ES) mode to use for OpenGL output [auto] + available modes: auto for autodetection + none for disabling any OpenGL usage + any for runtime detection + gl for forcing OpenGL + gles for forcing OpenGL ES + WARNING: only specify this manually if you know what + you are doing! Optional Libraries: --with-alsa-prefix=DIR Prefix where alsa is installed (optional) @@ -964,9 +971,6 @@ Optional Libraries: --with-mpeg2-prefix=DIR Prefix where libmpeg2 is installed (optional) --enable-mpeg2 enable mpeg2 codec for cutscenes [autodetect] - --disable-opengl disable OpenGL (ES) support [autodetect] - --enable-opengles enable forced OpenGL ES mode [disabled] - --with-jpeg-prefix=DIR Prefix where libjpeg is installed (optional) --disable-jpeg disable JPEG decoder [autodetect] @@ -1071,12 +1075,11 @@ for ac_option in $@; do --disable-updates) _updates=no ;; --enable-libunity) _libunity=yes ;; --disable-libunity) _libunity=no ;; - --enable-opengl) _opengl=yes ;; - --disable-opengl) _opengl=no ;; - --enable-opengles) _opengles=yes ;; - --disable-opengles) _opengles=no ;; --enable-bink) _bink=yes ;; --disable-bink) _bink=no ;; + --opengl-mode=*) + _opengl_mode=`echo $ac_option | cut -d '=' -f 2` + ;; --enable-verbose-build) _verbose_build=yes ;; --enable-plugins) _dynamic_modules=yes ;; --default-dynamic) _plugins_default=dynamic ;; @@ -2658,8 +2661,7 @@ if test -n "$_host"; then _sdlconfig=sdl2-config # OpenGL(ES) support is mature enough as to be the best option on # the Raspberry Pi, so it's enabled by default. - _opengl=yes - _opengles=yes + _opengl_mode=gles ;; dreamcast) append_var DEFINES "-DDISABLE_DEFAULT_SAVEFILEMANAGER" @@ -2988,8 +2990,7 @@ if test -n "$_host"; then _timidity=no _vkeybd=yes # Tizen relies on the OpenGL ES output thus we always enable it. - _opengl=yes - _opengles=yes + _opengl_mode=gles ;; webos) _backend="webos" @@ -4150,35 +4151,82 @@ echocheck "OpenGL" case $_backend in openpandora) - # Only enable OpenGL ES on the OpanPandora if --enable-opengl is passed in explicitly. - if test "$_opengl" = yes ; then - _opengl=yes - _opengles=yes + # Only enable OpenGL ES on the OpanPandora if --opengl-mode=gles is passed in explicitly. + if test "$_opengl_mode" = "gles" ; then append_var LIBS "-lGLES_CM -lEGL -lX11" + else + _opengl_mode=none fi ;; esac -if test "$_opengl" = auto ; then +if test "$_opengl_mode" = auto ; then case $_backend in sdl) - _opengl=yes + case $_sdlversion in + 1.2.*) + # Stock SDL 1.2 only supports OpenGL contexts. + _opengl_mode=gl + ;; + + 2.0.*) + # SDL2 supports both OpenGL + OpenGL ES contexts. + # However, Mac OS X only allows OpenGL context creation at + # this time, thus we limit us to OpenGL on that platform. + case $_host_os in + darwin*) + _opengl_mode=gl + ;; + + *) + _opengl_mode=any + ;; + esac + ;; + esac + ;; + + tizen) + # Tizen always runs in GLES mode + _opengl_mode=gles ;; *) - _opengl=no + _opengl_mode=none ;; esac fi -if test "$_opengles" = "yes" ; then - echo "yes (OpenGL ES)" -else - echo "$_opengl" -fi +_opengl=yes +case $_opengl_mode in + auto) + # This case should never occur but better safe than sorry. + echo "no" + _opengl=no + ;; + + none) + echo "no" + _opengl=no + ;; + + any) + echo "yes (runtime detection)" + add_line_to_config_h "#undef USE_GLES_MODE" + ;; + + gl) + echo "yes (OpenGL)" + add_line_to_config_h "#define USE_GLES_MODE 0" + ;; + + gles) + echo "yes (OpenGL ES)" + add_line_to_config_h "#define USE_GLES_MODE 1" + ;; +esac define_in_config_if_yes "$_opengl" "USE_OPENGL" -define_in_config_if_yes "$_opengles" "USE_GLES" # # Check for nasm |