From e00995d09971712089e73f6238fa202e3f9585af Mon Sep 17 00:00:00 2001 From: Deve Date: Tue, 30 May 2017 00:30:00 +0200 Subject: [PATCH] Allow to use GLES renderer with Wayland device. It would be nice to simplify it a bit, i.e. decide if OpenGL context should be created on device side or driver side, use single constructor in GLES driver etc... But I'm not really sure how it will look like after Benau's space partitioning work, so some refactoring postponed till later. --- .../source/Irrlicht/CIrrDeviceWayland.cpp | 22 ++++++- .../source/Irrlicht/COGLES2Driver.cpp | 58 ++++++++++++++++--- lib/irrlicht/source/Irrlicht/COGLES2Driver.h | 10 ++++ .../source/Irrlicht/COpenGLDriver.cpp | 5 +- 4 files changed, 83 insertions(+), 12 deletions(-) diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.cpp b/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.cpp index 815572485..f18f6e65c 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.cpp +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.cpp @@ -64,6 +64,8 @@ namespace irr extern bool useCoreContext; IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceWayland* device); + IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, + io::IFileSystem* io, CIrrDeviceWayland* device); } } @@ -730,7 +732,11 @@ bool CIrrDeviceWayland::initEGL() m_egl_context = new ContextManagerEGL(); ContextEGLParams egl_params; +#ifdef _IRR_COMPILE_WITH_OGLES2_ + egl_params.opengl_api = CEGL_API_OPENGL_ES; +#else egl_params.opengl_api = CEGL_API_OPENGL; +#endif egl_params.surface_type = CEGL_SURFACE_WINDOW; egl_params.force_legacy_device = CreationParams.ForceLegacyDevice; egl_params.with_alpha_channel = CreationParams.WithAlphaChannel; @@ -819,9 +825,6 @@ void CIrrDeviceWayland::createDriver() { switch(CreationParams.DriverType) { - default: - os::Printer::log("Wayland driver only supports OpenGL.", ELL_ERROR); - break; case video::EDT_OPENGL: #ifdef _IRR_COMPILE_WITH_OPENGL_ VideoDriver = video::createOpenGLDriver(CreationParams, FileSystem, this); @@ -829,6 +832,19 @@ void CIrrDeviceWayland::createDriver() os::Printer::log("No OpenGL support compiled in.", ELL_ERROR); #endif break; + case video::EDT_OGLES2: + #ifdef _IRR_COMPILE_WITH_OGLES2_ + VideoDriver = video::createOGLES2Driver(CreationParams, FileSystem, this); + #else + os::Printer::log("No OpenGL ES 2.0 support compiled in.", ELL_ERROR); + #endif + break; + case video::EDT_NULL: + VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize); + break; + default: + os::Printer::log("Wayland driver only supports OpenGL.", ELL_ERROR); + break; } } diff --git a/lib/irrlicht/source/Irrlicht/COGLES2Driver.cpp b/lib/irrlicht/source/Irrlicht/COGLES2Driver.cpp index 16991fd95..68617f854 100644 --- a/lib/irrlicht/source/Irrlicht/COGLES2Driver.cpp +++ b/lib/irrlicht/source/Irrlicht/COGLES2Driver.cpp @@ -54,6 +54,9 @@ namespace video #endif #if defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_) , HDc(0) +#endif +#ifdef _IRR_COMPILE_WITH_WAYLAND_DEVICE_ + , wl_device(0) #endif , Params(params) { @@ -77,7 +80,7 @@ namespace video HDc = GetDC(data.OpenGLWin32.HWnd); egl_params.display = (NativeDisplayType)(HDc); #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_) - egl_params.window = data.OpenGLLinux.X11Window; + egl_params.window = (EGLNativeWindowType)(data.OpenGLLinux.X11Window); egl_params.display = (EGLNativeDisplayType)(data.OpenGLLinux.X11Display); #elif defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_) egl_params.window = ((struct android_app *)(params.PrivateData))->window; @@ -133,6 +136,21 @@ namespace video #endif } +#ifdef _IRR_COMPILE_WITH_WAYLAND_DEVICE_ + COGLES2Driver::COGLES2Driver(const SIrrlichtCreationParameters& params, + io::IFileSystem* io, CIrrDeviceWayland* device) + : CNullDriver(io, params.WindowSize), COGLES2ExtensionHandler(), + BridgeCalls(0), CurrentRenderMode(ERM_NONE), ResetRenderStates(true), + Transformation3DChanged(true), AntiAlias(params.AntiAlias), + RenderTargetTexture(0), CurrentRendertargetSize(0, 0), + ColorFormat(ECF_R8G8B8), EglContext(0), Params(params) + { + EglContext = device->getEGLContext(); + wl_device = device; + genericDriverInit(params.WindowSize, params.Stencilbuffer); + } +#endif + //! destructor COGLES2Driver::~COGLES2Driver() @@ -467,15 +485,23 @@ namespace video CNullDriver::endScene(); #if defined(_IRR_COMPILE_WITH_EGL_) - - bool res = EglContext->swapBuffers(); - - if (!res) +#ifdef _IRR_COMPILE_WITH_WAYLAND_DEVICE_ + if (wl_device != NULL) { - os::Printer::log("Could not swap buffers for OpenGL-ES2 driver."); - return false; + wl_device->swapBuffers(); + return true; + } + else +#endif + { + bool res = EglContext->swapBuffers(); + + if (!res) + { + os::Printer::log("Could not swap buffers for OpenGL-ES2 driver."); + return false; + } } - #elif defined(_IRR_COMPILE_WITH_IPHONE_DEVICE_) glFlush(); glBindRenderbuffer(GL_RENDERBUFFER, ViewRenderbuffer); @@ -2871,6 +2897,22 @@ namespace video } #endif +// ----------------------------------- +// WAYLAND VERSION +// ----------------------------------- +#ifdef _IRR_COMPILE_WITH_WAYLAND_DEVICE_ + IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, + io::IFileSystem* io, CIrrDeviceWayland* device) + { +#ifdef _IRR_COMPILE_WITH_OGLES2_ + return new COGLES2Driver(params, io, device); +#else + return 0; +#endif // _IRR_COMPILE_WITH_OGLES2_ + } + +#endif + // ----------------------------------- // MACOSX VERSION // ----------------------------------- diff --git a/lib/irrlicht/source/Irrlicht/COGLES2Driver.h b/lib/irrlicht/source/Irrlicht/COGLES2Driver.h index 007dc2dbc..5b685ba43 100644 --- a/lib/irrlicht/source/Irrlicht/COGLES2Driver.h +++ b/lib/irrlicht/source/Irrlicht/COGLES2Driver.h @@ -14,6 +14,8 @@ #include "MacOSX/CIrrDeviceMacOSX.h" #elif defined(_IRR_COMPILE_WITH_IPHONE_DEVICE_) #include "iOS/CIrrDeviceiOS.h" +#elif _IRR_COMPILE_WITH_WAYLAND_DEVICE_ +#include "CIrrDeviceWayland.h" #endif #include "SIrrCreationParameters.h" @@ -63,6 +65,11 @@ namespace video io::IFileSystem* io); #endif +#ifdef _IRR_COMPILE_WITH_WAYLAND_DEVICE_ + COGLES2Driver(const SIrrlichtCreationParameters& params, + io::IFileSystem* io, CIrrDeviceWayland* device); +#endif + #ifdef _IRR_COMPILE_WITH_OSX_DEVICE_ COGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceMacOSX *device); @@ -461,6 +468,9 @@ namespace video #if defined(_IRR_COMPILE_WITH_EGL_) ContextManagerEGL* EglContext; #endif +#ifdef _IRR_COMPILE_WITH_WAYLAND_DEVICE_ + CIrrDeviceWayland* wl_device; +#endif #if defined(_IRR_COMPILE_WITH_IPHONE_DEVICE_) CIrrDeviceIPhone* Device; GLuint ViewFramebuffer; diff --git a/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp b/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp index b46d39e1e..3d08ac836 100644 --- a/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp +++ b/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp @@ -4998,6 +4998,7 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, CIrrDeviceWayland* device) { +#ifdef _IRR_COMPILE_WITH_OPENGL_ COpenGLDriver* ogl = new COpenGLDriver(params, io, device); if (!ogl->initDriver(device)) { @@ -5005,7 +5006,9 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, ogl = 0; } return ogl; - +#else + return 0; +#endif // _IRR_COMPILE_WITH_OPENGL_ } #endif // _IRR_COMPILE_WITH_WAYLAND_DEVICE