OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(uint desktopWidth, uint desktopHeight, SdlEventSource *eventSource, SdlWindow *window) : SdlGraphicsManager(eventSource, window), _lastRequestedHeight(0), #if SDL_VERSION_ATLEAST(2, 0, 0) _glContext(), #else _lastVideoModeLoad(0), _hwScreen(nullptr), #endif _graphicsScale(2), _ignoreLoadVideoMode(false), _gotResize(false), _wantsFullScreen(false), _ignoreResizeEvents(0), _desiredFullscreenWidth(0), _desiredFullscreenHeight(0) { // Setup OpenGL attributes for SDL SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // Setup proper SDL OpenGL context creation. #if SDL_VERSION_ATLEAST(2, 0, 0) OpenGL::ContextType glContextType; // Context version 1.4 is choosen arbitrarily based on what most shader // extensions were written against. #define DEFAULT_GL_MAJOR 1 #define DEFAULT_GL_MINOR 4 #define DEFAULT_GLES_MAJOR 1 #define DEFAULT_GLES_MINOR 1 #define DEFAULT_GLES2_MAJOR 2 #define DEFAULT_GLES2_MINOR 0 #if USE_FORCED_GL glContextType = OpenGL::kContextGL; _glContextProfileMask = 0; _glContextMajor = DEFAULT_GL_MAJOR; _glContextMinor = DEFAULT_GL_MINOR; #elif USE_FORCED_GLES glContextType = OpenGL::kContextGLES; _glContextProfileMask = SDL_GL_CONTEXT_PROFILE_ES; _glContextMajor = DEFAULT_GLES_MAJOR; _glContextMinor = DEFAULT_GLES_MINOR; #elif USE_FORCED_GLES2 glContextType = OpenGL::kContextGLES2; _glContextProfileMask = SDL_GL_CONTEXT_PROFILE_ES; _glContextMajor = DEFAULT_GLES2_MAJOR; _glContextMinor = DEFAULT_GLES2_MINOR; #else bool noDefaults = false; // Obtain the default GL(ES) context SDL2 tries to setup. // // Please note this might not actually be SDL2's defaults when multiple // instances of this object have been created. But that is no issue // because then we already set up what we want to use. // // In case no defaults are given we prefer OpenGL over OpenGL ES. if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &_glContextProfileMask) != 0) { _glContextProfileMask = 0; noDefaults = true; } if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &_glContextMajor) != 0) { noDefaults = true; } if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &_glContextMinor) != 0) { noDefaults = true; } if (noDefaults) { if (_glContextProfileMask == SDL_GL_CONTEXT_PROFILE_ES) { _glContextMajor = DEFAULT_GLES_MAJOR; _glContextMinor = DEFAULT_GLES_MINOR; } else { _glContextProfileMask = 0; _glContextMajor = DEFAULT_GL_MAJOR; _glContextMinor = DEFAULT_GL_MINOR; } } if (_glContextProfileMask == SDL_GL_CONTEXT_PROFILE_ES) { if (_glContextMajor >= 2) { glContextType = OpenGL::kContextGLES2; } else { glContextType = OpenGL::kContextGLES; } } else if (_glContextProfileMask == SDL_GL_CONTEXT_PROFILE_CORE) { glContextType = OpenGL::kContextGL; // Core profile does not allow legacy functionality, which we use. // Thus we request a standard OpenGL context. _glContextProfileMask = 0; _glContextMajor = DEFAULT_GL_MAJOR; _glContextMinor = DEFAULT_GL_MINOR; } else { glContextType = OpenGL::kContextGL; } #undef DEFAULT_GL_MAJOR #undef DEFAULT_GL_MINOR #undef DEFAULT_GLES_MAJOR #undef DEFAULT_GLES_MINOR #undef DEFAULT_GLES2_MAJOR #undef DEFAULT_GLES2_MINOR #endif setContextType(glContextType); #else setContextType(OpenGL::kContextGL); #endif // Retrieve a list of working fullscreen modes #if SDL_VERSION_ATLEAST(2, 0, 0) const int numModes = SDL_GetNumDisplayModes(0); for (int i = 0; i < numModes; ++i) { SDL_DisplayMode mode; if (SDL_GetDisplayMode(0, i, &mode)) { continue; } _fullscreenVideoModes.push_back(VideoMode(mode.w, mode.h)); } #else const SDL_Rect *const *availableModes = SDL_ListModes(NULL, SDL_OPENGL | SDL_FULLSCREEN); // TODO: NULL means that there are no fullscreen modes supported. We // should probably use this information and disable any fullscreen support // in this case. if (availableModes != NULL && availableModes != (void *)-1) { for (;*availableModes; ++availableModes) { const SDL_Rect *mode = *availableModes; _fullscreenVideoModes.push_back(VideoMode(mode->w, mode->h)); } } #endif // Sort the modes in ascending order. Common::sort(_fullscreenVideoModes.begin(), _fullscreenVideoModes.end()); // Strip duplicates in video modes. for (uint i = 0; i + 1 < _fullscreenVideoModes.size();) { if (_fullscreenVideoModes[i] == _fullscreenVideoModes[i + 1]) { _fullscreenVideoModes.remove_at(i); } else { ++i; } } // In case SDL is fine with every mode we will force the desktop mode. // TODO? We could also try to add some default resolutions here. if (_fullscreenVideoModes.empty() && desktopWidth && desktopHeight) { _fullscreenVideoModes.push_back(VideoMode(desktopWidth, desktopHeight)); } // Get information about display sizes from the previous runs. if (ConfMan.hasKey("last_fullscreen_mode_width", Common::ConfigManager::kApplicationDomain) && ConfMan.hasKey("last_fullscreen_mode_height", Common::ConfigManager::kApplicationDomain)) { _desiredFullscreenWidth = ConfMan.getInt("last_fullscreen_mode_width", Common::ConfigManager::kApplicationDomain); _desiredFullscreenHeight = ConfMan.getInt("last_fullscreen_mode_height", Common::ConfigManager::kApplicationDomain); } else { // Use the desktop resolutions when no previous default has been setup. _desiredFullscreenWidth = desktopWidth; _desiredFullscreenHeight = desktopHeight; } }
void HsQMLContextControl::unsetContextType() { setContextType(TypeUnset); }