]> git.lizzy.rs Git - irrlicht.git/commitdiff
Support both OpenGL3 and GLES2 on SDL2
authornumzero <numzer0@yandex.ru>
Wed, 1 Mar 2023 23:42:29 +0000 (02:42 +0300)
committernumzero <numzer0@yandex.ru>
Wed, 1 Mar 2023 23:44:52 +0000 (02:44 +0300)
include/EDriverTypes.h
source/Irrlicht/CIrrDeviceSDL.cpp

index 1c2353640488566241c613e1f8c88d962c67c5e3..040975739de17a1ee71981cd46227dd248f9e7a5 100644 (file)
@@ -35,6 +35,8 @@ namespace video
                //! WebGL1 friendly subset of OpenGL-ES 2.x driver for Emscripten\r
                EDT_WEBGL1,\r
 \r
+               EDT_OPENGL3,\r
+\r
                //! No driver, just for counting the elements\r
                EDT_COUNT\r
        };\r
index a5ba6f690904d3210f446a59ab45c4ecee4e4099..48c586169d9f8b8cf9c162639118fe2a2a22ba8c 100644 (file)
@@ -38,18 +38,37 @@ namespace irr
        {\r
                #ifdef _IRR_COMPILE_WITH_OPENGL_\r
                IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
+               #else\r
+               static IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)\r
+               {\r
+                       os::Printer::log("No OpenGL support compiled in.", ELL_ERROR);\r
+                       return nullptr;\r
+               }\r
                #endif\r
 \r
-               #ifdef _IRR_COMPILE_WITH_OGLES2_\r
-               IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
+               #ifdef ENABLE_OPENGL3\r
+               IVideoDriver* createOpenGL3Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
+               #else\r
+               static IVideoDriver* createOpenGL3Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)\r
+               {\r
+                       os::Printer::log("No OpenGL 3 support compiled in.", ELL_ERROR);\r
+                       return nullptr;\r
+               }\r
                #endif\r
 \r
+               static IVideoDriver* createOpenGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)\r
+               {\r
+                       return createOpenGL3Driver(params, io, contextManager);\r
+               }\r
+\r
                #ifdef _IRR_COMPILE_WITH_WEBGL1_\r
                IVideoDriver* createWebGL1Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
-               #endif\r
-\r
-               #ifdef ENABLE_OPENGL3\r
-               IVideoDriver* createOpenGL3Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
+               #else\r
+               static IVideoDriver* createWebGL1Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)\r
+               {\r
+                       os::Printer::log("No WebGL 1 support compiled in.", ELL_ERROR);\r
+                       return nullptr;\r
+               }\r
                #endif\r
        } // end namespace video\r
 \r
@@ -236,24 +255,6 @@ CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters& param)
        // create keymap\r
        createKeyMap();\r
 \r
-       if (CreationParams.Fullscreen) {\r
-               SDL_Flags |= SDL_WINDOW_FULLSCREEN;\r
-       } else  {\r
-               if (Resizable)\r
-                       SDL_Flags |= SDL_WINDOW_RESIZABLE;\r
-               if (CreationParams.WindowMaximized)\r
-                       SDL_Flags |= SDL_WINDOW_MAXIMIZED;\r
-       }\r
-       if (CreationParams.DriverType == video::EDT_OPENGL)\r
-       {\r
-               SDL_Flags |= SDL_WINDOW_OPENGL;\r
-               if (!CreationParams.Doublebuffer)\r
-                       SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0);\r
-       }\r
-#ifdef _IRR_EMSCRIPTEN_PLATFORM_\r
-       SDL_Flags |= SDL_WINDOW_OPENGL;\r
-#endif //_IRR_EMSCRIPTEN_PLATFORM_\r
-\r
        // create window\r
        if (CreationParams.DriverType != video::EDT_NULL)\r
        {\r
@@ -343,6 +344,16 @@ void CIrrDeviceSDL::logAttributes()
 \r
 bool CIrrDeviceSDL::createWindow()\r
 {\r
+       if (CreationParams.Fullscreen) {\r
+               SDL_Flags |= SDL_WINDOW_FULLSCREEN;\r
+       } else  {\r
+               if (Resizable)\r
+                       SDL_Flags |= SDL_WINDOW_RESIZABLE;\r
+               if (CreationParams.WindowMaximized)\r
+                       SDL_Flags |= SDL_WINDOW_MAXIMIZED;\r
+       }\r
+       SDL_Flags |= SDL_WINDOW_OPENGL;\r
+\r
 #ifdef _IRR_EMSCRIPTEN_PLATFORM_\r
        if ( Width != 0 || Height != 0 )\r
                emscripten_set_canvas_size( Width, Height);\r
@@ -389,58 +400,73 @@ bool CIrrDeviceSDL::createWindow()
        if ( Close )\r
                return false;\r
 \r
-       if (CreationParams.DriverType == video::EDT_OPENGL) {\r
-               SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);\r
-               SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);\r
-               SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);\r
-               SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG | SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG);\r
-               if (CreationParams.Bits == 16) {\r
-                       SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 4);\r
-                       SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 4);\r
-                       SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 4);\r
-                       SDL_GL_SetAttribute(\r
-                                       SDL_GL_ALPHA_SIZE, CreationParams.WithAlphaChannel ? 1 : 0);\r
-               } else {\r
-                       SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);\r
-                       SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);\r
-                       SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);\r
-                       SDL_GL_SetAttribute(\r
-                                       SDL_GL_ALPHA_SIZE, CreationParams.WithAlphaChannel ? 8 : 0);\r
-               }\r
-               SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, CreationParams.ZBufferBits);\r
-               if (CreationParams.Doublebuffer)\r
-                       SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);\r
-               SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, CreationParams.Stencilbuffer ? 8 : 0);\r
-               if (CreationParams.Stereobuffer)\r
-                       SDL_GL_SetAttribute(SDL_GL_STEREO, 1);\r
-               if (CreationParams.AntiAlias > 1) {\r
-                       SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);\r
+       switch (CreationParams.DriverType) {\r
+               case video::EDT_OPENGL:\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);\r
+                       break;\r
+               case video::EDT_OPENGL3:\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);\r
+                       break;\r
+               case video::EDT_OGLES1:\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);\r
+                       break;\r
+               case video::EDT_OGLES2:\r
+               case video::EDT_WEBGL1:\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);\r
+                       SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);\r
+                       break;\r
+               default:;\r
+       }\r
+\r
+#ifdef _DEBUG\r
+       SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG | SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG);\r
+#endif\r
+\r
+       if (CreationParams.Bits == 16) {\r
+               SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);\r
+               SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);\r
+               SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);\r
+               SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, CreationParams.WithAlphaChannel ? 1 : 0);\r
+       } else {\r
+               SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);\r
+               SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);\r
+               SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);\r
+               SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, CreationParams.WithAlphaChannel ? 8 : 0);\r
+       }\r
+       SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, CreationParams.ZBufferBits);\r
+       SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, CreationParams.Doublebuffer);\r
+       SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, CreationParams.Stencilbuffer ? 8 : 0);\r
+       SDL_GL_SetAttribute(SDL_GL_STEREO, CreationParams.Stereobuffer);\r
+       if (CreationParams.AntiAlias > 1) {\r
+               SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);\r
+               SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, CreationParams.AntiAlias);\r
+       }\r
+       if (!Window)\r
+               Window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Width, Height, SDL_Flags);\r
+       if (!Window) {\r
+               os::Printer::log("Could not create window...", SDL_GetError(), ELL_WARNING);\r
+       }\r
+       if (!Window && CreationParams.AntiAlias > 1) {\r
+               while (--CreationParams.AntiAlias > 1) {\r
                        SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, CreationParams.AntiAlias);\r
-               }\r
-               if (!Window)\r
                        Window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Width, Height, SDL_Flags);\r
-               if (!Window && CreationParams.AntiAlias > 1) {\r
-                       while (--CreationParams.AntiAlias > 1) {\r
-                               SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, CreationParams.AntiAlias);\r
-                               Window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Width, Height, SDL_Flags);\r
-                               if (Window)\r
-                                       break;\r
-                       }\r
-                       if (!Window) {\r
-                               SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);\r
-                               SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);\r
-                               Window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Width, Height, SDL_Flags);\r
-                               if (Window)\r
-                                       os::Printer::log("AntiAliasing disabled due to lack of support!");\r
-                       }\r
+                       if (Window)\r
+                               break;\r
                }\r
-\r
-               if (Window)\r
-               {\r
-                       Context = SDL_GL_CreateContext(Window);\r
+               if (!Window) {\r
+                       SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);\r
+                       SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);\r
+                       Window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Width, Height, SDL_Flags);\r
+                       if (Window)\r
+                               os::Printer::log("AntiAliasing disabled due to lack of support!", ELL_WARNING);\r
                }\r
-       } else if (!Window)\r
-               Window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Width, Height, SDL_Flags);\r
+       }\r
 \r
        if ( !Window && CreationParams.Doublebuffer)\r
        {\r
@@ -451,7 +477,14 @@ bool CIrrDeviceSDL::createWindow()
        }\r
        if ( !Window )\r
        {\r
-               os::Printer::log( "Could not initialize display!" );\r
+               os::Printer::log("Could not initialize display", SDL_GetError(), ELL_ERROR);\r
+               return false;\r
+       }\r
+\r
+       Context = SDL_GL_CreateContext(Window);\r
+       if (!Context) {\r
+               os::Printer::log("Could not initialize context", SDL_GetError(), ELL_ERROR);\r
+               SDL_DestroyWindow(Window);\r
                return false;\r
        }\r
 \r
@@ -463,66 +496,22 @@ bool CIrrDeviceSDL::createWindow()
 //! create the driver\r
 void CIrrDeviceSDL::createDriver()\r
 {\r
-       switch(CreationParams.DriverType)\r
-       {\r
-       case video::EDT_OPENGL:\r
-               #ifdef _IRR_COMPILE_WITH_OPENGL_\r
-               ContextManager = new video::CSDLManager(this);\r
-               VideoDriver = video::createOpenGL3Driver(CreationParams, FileSystem, ContextManager);\r
-               #else\r
-               os::Printer::log("No OpenGL support compiled in.", ELL_ERROR);\r
-               #endif\r
-               break;\r
-\r
-       case video::EDT_OGLES2:\r
-#if defined(_IRR_COMPILE_WITH_OGLES2_) && defined(_IRR_EMSCRIPTEN_PLATFORM_)\r
-               {\r
-                       video::SExposedVideoData data;\r
-\r
-                       ContextManager = new video::CEGLManager();\r
-                       ContextManager->initialize(CreationParams, data);\r
-\r
-                       VideoDriver = video::createOGLES2Driver(CreationParams, FileSystem, ContextManager);\r
-               }\r
-#else\r
-               os::Printer::log("No OpenGL-ES2 support compiled in.", ELL_ERROR);\r
-#endif\r
-               break;\r
-\r
-       case video::EDT_WEBGL1:\r
-#if defined(_IRR_COMPILE_WITH_WEBGL1_) && defined(_IRR_EMSCRIPTEN_PLATFORM_)\r
-               {\r
-                       video::SExposedVideoData data;\r
-\r
-                       ContextManager = new video::CEGLManager();\r
-                       ContextManager->initialize(CreationParams, data);\r
-\r
-                       VideoDriver = video::createWebGL1Driver(CreationParams, FileSystem, ContextManager);\r
-               }\r
-#else\r
-               os::Printer::log("No WebGL1 support compiled in.", ELL_ERROR);\r
-#endif\r
-               break;\r
-\r
-       case video::EDT_NULL:\r
+       if (CreationParams.DriverType == video::EDT_NULL) {\r
                VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize);\r
-               break;\r
-\r
-       default:\r
-               os::Printer::log("Unable to create video driver of unknown type.", ELL_ERROR);\r
-               break;\r
+               return;\r
        }\r
 \r
-       // In case we got the size from the canvas\r
-       if ( VideoDriver && CreationParams.WindowSize.Width == 0 && CreationParams.WindowSize.Height == 0 && Width > 0 && Height > 0 )\r
+       ContextManager = new video::CSDLManager(this);\r
+       switch(CreationParams.DriverType)\r
        {\r
-#ifdef _IRR_EMSCRIPTEN_PLATFORM_\r
-               SDL_CreateWindowAndRenderer(Width, Height, SDL_Flags, &Window, &Renderer);\r
-#else //_IRR_EMSCRIPTEN_PLATFORM_\r
-               Window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Width, Height, SDL_Flags);\r
-#endif //_IRR_EMSCRIPTEN_PLATFOR\r
-               VideoDriver->OnResize(core::dimension2d<u32>(Width, Height));\r
+       case video::EDT_OPENGL: VideoDriver = video::createOpenGLDriver(CreationParams, FileSystem, ContextManager); break;\r
+       case video::EDT_OPENGL3: VideoDriver = video::createOpenGL3Driver(CreationParams, FileSystem, ContextManager); break;\r
+       case video::EDT_OGLES2: VideoDriver = video::createOpenGLES2Driver(CreationParams, FileSystem, ContextManager); break;\r
+       case video::EDT_WEBGL1: VideoDriver = video::createWebGL1Driver(CreationParams, FileSystem, ContextManager); break;\r
+       default:;\r
        }\r
+       if (!VideoDriver)\r
+               os::Printer::log("Could not create video driver", ELL_ERROR);\r
 }\r
 \r
 \r