]> git.lizzy.rs Git - irrlicht.git/commitdiff
Refactor SDL device to use the same abstraction as other devices
authorsfan5 <sfan5@live.de>
Sat, 21 May 2022 13:19:57 +0000 (15:19 +0200)
committersfan5 <sfan5@live.de>
Sat, 21 May 2022 13:26:38 +0000 (15:26 +0200)
In particular this makes the OpenGL procedure stuff work.
fixes https://github.com/minetest/minetest/issues/12265

source/Irrlicht/CIrrDeviceSDL.cpp
source/Irrlicht/CMakeLists.txt
source/Irrlicht/COpenGLDriver.cpp
source/Irrlicht/COpenGLDriver.h
source/Irrlicht/CSDLManager.cpp [new file with mode: 0644]
source/Irrlicht/CSDLManager.h [new file with mode: 0644]

index bf7da7fdaa4065083fac12936903ea52d0c731e3..c66cfda79744947101f8de8e9728f530ef7099b7 100644 (file)
 #include <emscripten.h>\r
 #endif\r
 \r
+#ifdef _IRR_COMPILE_WITH_OPENGL_\r
+#include "CSDLManager.h"\r
+#endif\r
+\r
 static int SDLDeviceInstances = 0;\r
 \r
 namespace irr\r
 {\r
        namespace video\r
        {\r
-               #ifdef _IRR_COMPILE_WITH_DIRECT3D_9_\r
-               IVideoDriver* createDirectX9Driver(const irr::SIrrlichtCreationParameters& params,\r
-                       io::IFileSystem* io, HWND window);\r
-               #endif\r
-\r
                #ifdef _IRR_COMPILE_WITH_OPENGL_\r
-               IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params,\r
-                               io::IFileSystem* io, CIrrDeviceSDL* device);\r
+               IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
                #endif\r
 \r
-               #if defined(_IRR_COMPILE_WITH_OGLES2_) && defined(_IRR_EMSCRIPTEN_PLATFORM_)\r
-               IVideoDriver* createOGLES2Driver(const irr::SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
+               #ifdef _IRR_COMPILE_WITH_OGLES2_\r
+               IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
                #endif\r
 \r
-               #if defined(_IRR_COMPILE_WITH_WEBGL1_) && defined(_IRR_EMSCRIPTEN_PLATFORM_)\r
-               IVideoDriver* createWebGL1Driver(const irr::SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
+               #ifdef _IRR_COMPILE_WITH_WEBGL1_\r
+               IVideoDriver* createWebGL1Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
                #endif\r
        } // end namespace video\r
 \r
@@ -461,7 +459,8 @@ void CIrrDeviceSDL::createDriver()
 \r
        case video::EDT_OPENGL:\r
                #ifdef _IRR_COMPILE_WITH_OPENGL_\r
-               VideoDriver = video::createOpenGLDriver(CreationParams, FileSystem, this);\r
+               ContextManager = new video::CSDLManager(this);\r
+               VideoDriver = video::createOpenGLDriver(CreationParams, FileSystem, ContextManager);\r
                #else\r
                os::Printer::log("No OpenGL support compiled in.", ELL_ERROR);\r
                #endif\r
index 21e997792f239978308b59c6b99134e12483aada..d63361d7edfdad4e902702b92cca2f13a72c2536 100644 (file)
@@ -188,6 +188,7 @@ set(IRRDRVROBJ
        CGLXManager.cpp
        CWGLManager.cpp
        CEGLManager.cpp
+       CSDLManager.cpp
        mt_opengl_loader.cpp
 )
 
index c03ac3424ab4d47654a05c55f0fb1ca8f120df6a..8883a3e48617b011c04a3a56b365ff756a72e6b7 100644 (file)
 \r
 #include "mt_opengl.h"\r
 \r
-#ifdef _IRR_COMPILE_WITH_SDL_DEVICE_\r
-#include "CIrrDeviceSDL.h"\r
-#endif\r
-\r
 namespace irr\r
 {\r
 namespace video\r
@@ -32,7 +28,6 @@ namespace video
 // Statics variables\r
 const u16 COpenGLDriver::Quad2DIndices[4] = { 0, 1, 2, 3 };\r
 \r
-#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_) || defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
 COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)\r
        : CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(), CacheHandler(0), CurrentRenderMode(ERM_NONE), ResetRenderStates(true),\r
        Transformation3DChanged(true), AntiAlias(params.AntiAlias), ColorFormat(ECF_R8G8B8), FixedPipelineState(EOFPS_ENABLE), Params(params),\r
@@ -42,23 +37,6 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFil
        setDebugName("COpenGLDriver");\r
 #endif\r
 }\r
-#endif\r
-\r
-#ifdef _IRR_COMPILE_WITH_SDL_DEVICE_\r
-COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceSDL* device)\r
-       : CNullDriver(io, params.WindowSize), COpenGLExtensionHandler(), CacheHandler(0),\r
-       CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true),\r
-       AntiAlias(params.AntiAlias), ColorFormat(ECF_R8G8B8), FixedPipelineState(EOFPS_ENABLE),\r
-       Params(params), SDLDevice(device), ContextManager(0)\r
-{\r
-#ifdef _DEBUG\r
-       setDebugName("COpenGLDriver");\r
-#endif\r
-\r
-       genericDriverInit();\r
-}\r
-\r
-#endif\r
 \r
 bool COpenGLDriver::initDriver()\r
 {\r
@@ -267,11 +245,6 @@ bool COpenGLDriver::beginScene(u16 clearFlag, SColor clearColor, f32 clearDepth,
        if (ContextManager)\r
                ContextManager->activateContext(videoData, true);\r
 \r
-#if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
-       if (SDLDevice)\r
-               glFrontFace(GL_CW);\r
-#endif\r
-\r
        clearBuffers(clearFlag, clearColor, clearDepth, clearStencil);\r
 \r
        return true;\r
@@ -288,14 +261,6 @@ bool COpenGLDriver::endScene()
        if (ContextManager)\r
                status = ContextManager->swapBuffers();\r
 \r
-#ifdef _IRR_COMPILE_WITH_SDL_DEVICE_\r
-       if (SDLDevice)\r
-       {\r
-               SDLDevice->SwapWindow();\r
-               status = true;\r
-       }\r
-#endif\r
-\r
        // todo: console device present\r
 \r
        return status;\r
@@ -4437,7 +4402,6 @@ namespace irr
 namespace video\r
 {\r
 \r
-#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_) || defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
        IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)\r
        {\r
 #ifdef _IRR_COMPILE_WITH_OPENGL_\r
@@ -4454,22 +4418,6 @@ namespace video
                return 0;\r
 #endif\r
        }\r
-#endif\r
-\r
-// -----------------------------------\r
-// SDL VERSION\r
-// -----------------------------------\r
-#ifdef _IRR_COMPILE_WITH_SDL_DEVICE_\r
-IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params,\r
-               io::IFileSystem* io, CIrrDeviceSDL* device)\r
-{\r
-#ifdef _IRR_COMPILE_WITH_OPENGL_\r
-       return new COpenGLDriver(params, io, device);\r
-#else\r
-       return 0;\r
-#endif //  _IRR_COMPILE_WITH_OPENGL_\r
-}\r
-#endif // _IRR_COMPILE_WITH_SDL_DEVICE_\r
 \r
 } // end namespace\r
 } // end namespace\r
index 281605fb9103145e475e56d907b1cf3ed9fa397e..a82f683750b04d70ac0892887eb9c7c195a6d312 100644 (file)
@@ -44,13 +44,7 @@ namespace video
                        EOFPS_DISABLE_TO_ENABLE // switch from programmable to fixed pipeline.\r
                };\r
 \r
-#if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) || defined(_IRR_COMPILE_WITH_X11_DEVICE_) || defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
                COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);\r
-#endif\r
-\r
-#ifdef _IRR_COMPILE_WITH_SDL_DEVICE_\r
-               COpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceSDL* device);\r
-#endif\r
 \r
                bool initDriver();\r
 \r
@@ -520,10 +514,6 @@ namespace video
                S3DVertex Quad2DVertices[4];\r
                static const u16 Quad2DIndices[4];\r
 \r
-               #ifdef _IRR_COMPILE_WITH_SDL_DEVICE_\r
-                       CIrrDeviceSDL *SDLDevice;\r
-               #endif\r
-\r
                IContextManager* ContextManager;\r
        };\r
 \r
diff --git a/source/Irrlicht/CSDLManager.cpp b/source/Irrlicht/CSDLManager.cpp
new file mode 100644 (file)
index 0000000..3132b60
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright (C) 2022 sfan5
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in Irrlicht.h
+
+#include "CSDLManager.h"
+
+#if defined(_IRR_COMPILE_WITH_SDL_DEVICE_) && defined(_IRR_COMPILE_WITH_OPENGL_)
+
+#include "CIrrDeviceSDL.h"
+#include "COpenGLCommon.h"
+
+namespace irr
+{
+namespace video
+{
+
+CSDLManager::CSDLManager(CIrrDeviceSDL* device) : IContextManager(), SDLDevice(device)
+{
+       #ifdef _DEBUG
+       setDebugName("CSDLManager");
+       #endif
+}
+
+bool CSDLManager::initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data)
+{
+       Data = data;
+       return true;
+}
+
+const SExposedVideoData& CSDLManager::getContext() const
+{
+       return Data;
+}
+
+bool CSDLManager::activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero)
+{
+       // unclear if this is still needed:
+       glFrontFace(GL_CW);
+       return true;
+}
+
+void* CSDLManager::getProcAddress(const std::string &procName)
+{
+       return SDL_GL_GetProcAddress(procName.c_str());
+}
+
+bool CSDLManager::swapBuffers()
+{
+       SDLDevice->SwapWindow();
+       return true;
+}
+
+}
+}
+
+#endif
diff --git a/source/Irrlicht/CSDLManager.h b/source/Irrlicht/CSDLManager.h
new file mode 100644 (file)
index 0000000..e3ca3d0
--- /dev/null
@@ -0,0 +1,53 @@
+// Copyright (C) 2022 sfan5
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in Irrlicht.h
+
+#ifndef __C_SDL_MANAGER_H_INCLUDED__
+#define __C_SDL_MANAGER_H_INCLUDED__
+
+#include "IrrCompileConfig.h"
+
+#if defined(_IRR_COMPILE_WITH_SDL_DEVICE_) && defined(_IRR_COMPILE_WITH_OPENGL_)
+
+#include "IContextManager.h"
+
+namespace irr
+{
+       class CIrrDeviceSDL;
+
+namespace video
+{
+
+       // Manager for SDL with OpenGL
+       class CSDLManager : public IContextManager
+       {
+       public:
+               CSDLManager(CIrrDeviceSDL* device);
+
+               virtual ~CSDLManager() {}
+
+               virtual bool initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& data) _IRR_OVERRIDE_;
+
+               virtual void terminate() _IRR_OVERRIDE_ {};
+               virtual bool generateSurface() _IRR_OVERRIDE_ { return true; };
+               virtual void destroySurface() _IRR_OVERRIDE_ {};
+               virtual bool generateContext() _IRR_OVERRIDE_ { return true; };
+               virtual void destroyContext() _IRR_OVERRIDE_ {};
+
+               virtual const SExposedVideoData& getContext() const _IRR_OVERRIDE_;
+
+               virtual bool activateContext(const SExposedVideoData& videoData, bool restorePrimaryOnZero=false) _IRR_OVERRIDE_;
+
+               virtual void* getProcAddress(const std::string &procName) _IRR_OVERRIDE_;
+
+               virtual bool swapBuffers() _IRR_OVERRIDE_;
+
+       private:
+               SExposedVideoData Data;
+               CIrrDeviceSDL *SDLDevice;
+       };
+}
+}
+
+#endif
+#endif