From 4a21c51e2183c41079342a20239cb8d10f8f2e0c Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 10 Jul 2014 21:15:55 +0300 Subject: In OpenGL context creation add support for compatability context. --- src/utils/sdl2helper.cpp | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) (limited to 'src/utils/sdl2helper.cpp') diff --git a/src/utils/sdl2helper.cpp b/src/utils/sdl2helper.cpp index 07f8d965c..6de5ef357 100644 --- a/src/utils/sdl2helper.cpp +++ b/src/utils/sdl2helper.cpp @@ -96,33 +96,48 @@ SDL_Thread *SDL::createThread(SDL_ThreadFunction fn, void *SDL::createGLContext(SDL_Window *const window, const int major, - const int minor) + const int minor, + const int profile) { SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, - SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); SDL_ClearError(); void *context = SDL_GL_CreateContext(window); - if (SDL_GetError()) + if (SDL_GetError() && (major > 3 || (major == 3 && minor > 3))) { - if (!context && (major > 3 || (major == 3 && minor > 3))) + logger->log("Try fallback to OpenGL 3.3 core context"); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); + SDL_ClearError(); + context = SDL_GL_CreateContext(window); + if (SDL_GetError() && profile == 0x01) { - logger->log("Try fallback to OpenGL 3.3 context"); + logger->log("Try fallback to OpenGL 3.3 compatibility context"); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0x02); SDL_ClearError(); context = SDL_GL_CreateContext(window); - if (SDL_GetError()) - { - logger->log("Try fallback to OpenGL 3.0 context"); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); - context = SDL_GL_CreateContext(window); - } } } + if (SDL_GetError() && (major > 3 || (major == 3 && minor > 0))) + { + logger->log("Try fallback to OpenGL 3.0 core context"); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile); + context = SDL_GL_CreateContext(window); + } + if (SDL_GetError() && (major > 2 || (major == 2 && minor > 1))) + { + logger->log("Try fallback to OpenGL 2.1 compatibility context"); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0x02); + context = SDL_GL_CreateContext(window); + } return context; } -- cgit v1.2.3-70-g09d2