OPENGL: Allow engines to detect OpenGL info without switching

For now only OpenGL type and shaders support are available
This commit is contained in:
Le Philousophe 2022-04-02 18:10:06 +02:00
parent 06bc7a25fa
commit b978cd1caa
7 changed files with 52 additions and 9 deletions

View file

@ -509,6 +509,8 @@ bool OSystem_Android::hasFeature(Feature f) {
/* Even if we are using the 2D graphics manager, /* Even if we are using the 2D graphics manager,
* we are at one initGraphics3d call of supporting GLES2 */ * we are at one initGraphics3d call of supporting GLES2 */
if (f == kFeatureOpenGLForGame) return true; if (f == kFeatureOpenGLForGame) return true;
/* GLES2 always supports shaders */
if (f == kFeatureShadersForGame) return true;
return ModularGraphicsBackend::hasFeature(f); return ModularGraphicsBackend::hasFeature(f);
} }

View file

@ -192,6 +192,8 @@ public:
bool setGraphicsMode(int mode, uint flags) override; bool setGraphicsMode(int mode, uint flags) override;
int getGraphicsMode() const override; int getGraphicsMode() const override;
OpenGL::ContextOGLType getOpenGLType() const override { return OpenGL::kOGLContextGLES2; }
#ifdef ANDROID_DEBUG_GL_CALLS #ifdef ANDROID_DEBUG_GL_CALLS
bool isRunningInMainThread() { return pthread_self() == _main_thread; } bool isRunningInMainThread() { return pthread_self() == _main_thread; }
#endif #endif

View file

@ -184,6 +184,7 @@ bool OSystem_SDL::hasFeature(Feature f) {
/* Even if we are using the 2D graphics manager, /* Even if we are using the 2D graphics manager,
* we are at one initGraphics3d call of supporting OpenGL */ * we are at one initGraphics3d call of supporting OpenGL */
if (f == kFeatureOpenGLForGame) return true; if (f == kFeatureOpenGLForGame) return true;
if (f == kFeatureShadersForGame) return _supportsShaders;
#endif #endif
return ModularGraphicsBackend::hasFeature(f); return ModularGraphicsBackend::hasFeature(f);
} }
@ -221,7 +222,7 @@ void OSystem_SDL::initBackend() {
debug(1, "Using SDL Video Driver \"%s\"", sdlDriverName); debug(1, "Using SDL Video Driver \"%s\"", sdlDriverName);
#if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS) #if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS)
detectFramebufferSupport(); detectOpenGLFeaturesSupport();
detectAntiAliasingSupport(); detectAntiAliasingSupport();
#endif #endif
@ -318,11 +319,15 @@ void OSystem_SDL::initBackend() {
} }
#if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS) #if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS)
void OSystem_SDL::detectFramebufferSupport() { void OSystem_SDL::detectOpenGLFeaturesSupport() {
_oglType = OpenGL::kOGLContextNone;
_supportsFrameBuffer = false; _supportsFrameBuffer = false;
_supportsShaders = false;
#if USE_FORCED_GLES2 #if USE_FORCED_GLES2
// Framebuffers are always available with GLES2 // Framebuffers and shaders are always available with GLES2
_oglType = kOGLContextGLES2;
_supportsFrameBuffer = true; _supportsFrameBuffer = true;
_supportsShaders = true;
#elif !defined(AMIGAOS) && !defined(__MORPHOS__) #elif !defined(AMIGAOS) && !defined(__MORPHOS__)
// Spawn a 32x32 window off-screen with a GL context to test if framebuffers are supported // Spawn a 32x32 window off-screen with a GL context to test if framebuffers are supported
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
@ -332,7 +337,6 @@ void OSystem_SDL::detectFramebufferSupport() {
} }
int glContextProfileMask, glContextMajor; int glContextProfileMask, glContextMajor;
OpenGL::ContextOGLType glContextType;
if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &glContextProfileMask) != 0) { if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &glContextProfileMask) != 0) {
SDL_DestroyWindow(window); SDL_DestroyWindow(window);
return; return;
@ -343,13 +347,13 @@ void OSystem_SDL::detectFramebufferSupport() {
return; return;
} }
if (glContextMajor == 2) { if (glContextMajor == 2) {
glContextType = OpenGL::kOGLContextGLES2; _oglType = OpenGL::kOGLContextGLES2;
} else { } else {
SDL_DestroyWindow(window); SDL_DestroyWindow(window);
return; return;
} }
} else { } else {
glContextType = OpenGL::kOGLContextGL; _oglType = OpenGL::kOGLContextGL;
} }
SDL_GLContext glContext = SDL_GL_CreateContext(window); SDL_GLContext glContext = SDL_GL_CreateContext(window);
if (!glContext) { if (!glContext) {
@ -357,8 +361,9 @@ void OSystem_SDL::detectFramebufferSupport() {
return; return;
} }
OpenGLContext.initialize(glContextType); OpenGLContext.initialize(_oglType);
_supportsFrameBuffer = OpenGLContext.framebufferObjectSupported; _supportsFrameBuffer = OpenGLContext.framebufferObjectSupported;
_supportsShaders = OpenGLContext.shadersSupported;
OpenGLContext.reset(); OpenGLContext.reset();
SDL_GL_DeleteContext(glContext); SDL_GL_DeleteContext(glContext);
SDL_DestroyWindow(window); SDL_DestroyWindow(window);
@ -367,8 +372,10 @@ void OSystem_SDL::detectFramebufferSupport() {
SDL_SetVideoMode(32, 32, 0, SDL_OPENGL); SDL_SetVideoMode(32, 32, 0, SDL_OPENGL);
SDL_putenv(const_cast<char *>("SDL_VIDEO_WINDOW_POS=center")); SDL_putenv(const_cast<char *>("SDL_VIDEO_WINDOW_POS=center"));
// SDL 1.2 only supports OpenGL // SDL 1.2 only supports OpenGL
OpenGLContext.initialize(OpenGL::kOGLContextGL); _oglType = OpenGL::kOGLContextGL;
OpenGLContext.initialize(_oglType);
_supportsFrameBuffer = OpenGLContext.framebufferObjectSupported; _supportsFrameBuffer = OpenGLContext.framebufferObjectSupported;
_supportsShaders = OpenGLContext.shadersSupported;
OpenGLContext.reset(); OpenGLContext.reset();
#endif #endif
#endif #endif

View file

@ -95,6 +95,7 @@ public:
#if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS) #if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS)
Common::Array<uint> getSupportedAntiAliasingLevels() const override; Common::Array<uint> getSupportedAntiAliasingLevels() const override;
OpenGL::ContextOGLType getOpenGLType() const override { return _oglType; }
#endif #endif
protected: protected:
@ -139,10 +140,12 @@ protected:
#if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS) #if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS)
// Graphics capabilities // Graphics capabilities
void detectFramebufferSupport(); void detectOpenGLFeaturesSupport();
void detectAntiAliasingSupport(); void detectAntiAliasingSupport();
OpenGL::ContextOGLType _oglType;
bool _supportsFrameBuffer; bool _supportsFrameBuffer;
bool _supportsShaders;
Common::Array<uint> _antiAliasLevels; Common::Array<uint> _antiAliasLevels;
#endif #endif

View file

@ -29,6 +29,7 @@
#include "common/ustr.h" #include "common/ustr.h"
#include "graphics/pixelformat.h" #include "graphics/pixelformat.h"
#include "graphics/mode.h" #include "graphics/mode.h"
#include "graphics/opengl/context.h"
namespace Audio { namespace Audio {
class Mixer; class Mixer;
@ -406,6 +407,12 @@ public:
*/ */
kFeatureOpenGLForGame, kFeatureOpenGLForGame,
/**
* This feature flag can be used to check if shaders are supported
* and can be used for 3D game rendering.
*/
kFeatureShadersForGame,
/** /**
* If supported, this feature flag can be used to check if * If supported, this feature flag can be used to check if
* waiting for vertical sync before refreshing the screen to reduce * waiting for vertical sync before refreshing the screen to reduce
@ -728,6 +735,20 @@ public:
return Common::Array<uint>(); return Common::Array<uint>();
} }
/**
* Return the chosen OpenGL type.
*
* This function works even when a 2D graphical manager is active and
* let to select a proper renderer before changing mode.
* Implementation having feature kFeatureOpenGLForGame are expected to
* override this function.
*
* @return the OpenGL type of context which is supported.
*/
virtual OpenGL::ContextOGLType getOpenGLType() const {
return OpenGL::kOGLContextNone;
}
/** /**
* Retrieve a list of all hardware shaders supported by this backend. * Retrieve a list of all hardware shaders supported by this backend.
* *

View file

@ -71,6 +71,7 @@ ContextGL::ContextGL() {
} }
void ContextGL::reset() { void ContextGL::reset() {
type = kOGLContextNone;
maxTextureSize = 0; maxTextureSize = 0;
NPOTSupported = false; NPOTSupported = false;
@ -86,6 +87,9 @@ void ContextGL::reset() {
void ContextGL::initialize(ContextOGLType contextType) { void ContextGL::initialize(ContextOGLType contextType) {
// Initialize default state. // Initialize default state.
reset(); reset();
if (contextType == kOGLContextNone) {
return;
}
type = contextType; type = contextType;
@ -178,6 +182,9 @@ void ContextGL::initialize(ContextOGLType contextType) {
// Log context type. // Log context type.
switch (type) { switch (type) {
case kOGLContextNone:
/* Shouldn't happen */
break;
case kOGLContextGL: case kOGLContextGL:
debug(5, "OpenGL: GL context initialized"); debug(5, "OpenGL: GL context initialized");
break; break;

View file

@ -27,6 +27,7 @@
namespace OpenGL { namespace OpenGL {
enum ContextOGLType { enum ContextOGLType {
kOGLContextNone,
kOGLContextGL, kOGLContextGL,
kOGLContextGLES2 kOGLContextGLES2
}; };