From e9408a8a0fe6a35c9fbb8dc8ad978e7021bf85c5 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 13 May 2012 17:43:46 +0200 Subject: [PATCH] Changed: #1275 Create an OpenGL ES driver --- code/nel/include/nel/3d/driver_user.h | 2 +- code/nel/include/nel/3d/dru.h | 33 +++++ code/nel/include/nel/3d/u_driver.h | 4 + .../src/3d/driver/opengl/driver_opengl.cpp | 32 +++-- code/nel/src/3d/driver_user.cpp | 20 +-- code/nel/src/3d/dru.cpp | 114 +++++++++--------- 6 files changed, 125 insertions(+), 80 deletions(-) diff --git a/code/nel/include/nel/3d/driver_user.h b/code/nel/include/nel/3d/driver_user.h index 81016186f..cc23ccf78 100644 --- a/code/nel/include/nel/3d/driver_user.h +++ b/code/nel/include/nel/3d/driver_user.h @@ -123,7 +123,7 @@ public: /// \name Object // @{ - CDriverUser (uint windowIcon = 0, bool direct3d = false, emptyProc exitFunc = 0); + CDriverUser (uint windowIcon, UDriver::TDriver driver, emptyProc exitFunc = 0); virtual ~CDriverUser(); // @} diff --git a/code/nel/include/nel/3d/dru.h b/code/nel/include/nel/3d/dru.h index d0012deaf..463d6b5db 100644 --- a/code/nel/include/nel/3d/dru.h +++ b/code/nel/include/nel/3d/dru.h @@ -27,9 +27,11 @@ #ifdef NL_OS_WINDOWS # define NL3D_GL_DLL_NAME "nel_drv_opengl_win" +# define NL3D_GLES_DLL_NAME "nel_drv_opengles_win" # define NL3D_D3D_DLL_NAME "nel_drv_direct3d_win" #elif defined (NL_OS_UNIX) # define NL3D_GL_DLL_NAME "nel_drv_opengl" +# define NL3D_GLES_DLL_NAME "nel_drv_opengles" #else # error "Unknown system" #endif @@ -43,6 +45,7 @@ struct EDru : public NLMISC::Exception EDru(const std::string &reason) : Exception(reason) {} }; +// OpenGL struct EDruOpenglDriverNotFound : public EDru { EDruOpenglDriverNotFound() : EDru( NL3D_GL_DLL_NAME " not found" ) {} @@ -68,7 +71,34 @@ struct EDruOpenglDriverCantCreateDriver : public EDru EDruOpenglDriverCantCreateDriver() : EDru( NL3D_GL_DLL_NAME " can't create driver" ) {} }; +// OpenGL ES +struct EDruOpenglEsDriverNotFound : public EDru +{ + EDruOpenglEsDriverNotFound() : EDru( NL3D_GLES_DLL_NAME " not found" ) {} +}; + +struct EDruOpenglEsDriverCorrupted : public EDru +{ + EDruOpenglEsDriverCorrupted() : EDru( "Can't get NL3D_createIDriverInstance from " NL3D_GLES_DLL_NAME " (Bad dll?)" ) {} +}; + +struct EDruOpenglEsDriverOldVersion : public EDru +{ + EDruOpenglEsDriverOldVersion() : EDru( NL3D_GLES_DLL_NAME " is a too old version. Ask for a more recent file" ) {} +}; + +struct EDruOpenglEsDriverUnknownVersion : public EDru +{ + EDruOpenglEsDriverUnknownVersion() : EDru( NL3D_GLES_DLL_NAME " is more recent than the application" ) {} +}; + +struct EDruOpenglEsDriverCantCreateDriver : public EDru +{ + EDruOpenglEsDriverCantCreateDriver() : EDru( NL3D_GLES_DLL_NAME " can't create driver" ) {} +}; + #ifdef NL_OS_WINDOWS +// Direct3D struct EDruDirect3dDriverNotFound : public EDru { EDruDirect3dDriverNotFound() : EDru( NL3D_D3D_DLL_NAME " not found" ) {} @@ -103,6 +133,9 @@ public: /// Portable Function which create a GL Driver (using gl dll...). static IDriver *createGlDriver() throw(EDru); + /// Portable Function which create a GL ES Driver (using gl dll...). + static IDriver *createGlEsDriver() throw(EDru); + #ifdef NL_OS_WINDOWS /// Windows Function which create a Direct3d Driver. static IDriver *createD3DDriver() throw(EDru); diff --git a/code/nel/include/nel/3d/u_driver.h b/code/nel/include/nel/3d/u_driver.h index 3c120737d..025c134ed 100644 --- a/code/nel/include/nel/3d/u_driver.h +++ b/code/nel/include/nel/3d/u_driver.h @@ -139,6 +139,9 @@ public: enum TStencilOp { keep = 0, zero, replace, incr, decr, invert }; enum TStencilFunc { never = 0, less, lessequal, equal, notequal, greaterequal, greater, always}; + // Existing drivers + enum TDriver { Direct3d = 0, OpenGl, OpenGlEs }; + public: /// The EventServer of this driver. Init after setDisplay()!! NLMISC::CEventServer EventServer; @@ -844,6 +847,7 @@ public: * This is the static function which build a UDriver, the root for all 3D functions. */ static UDriver *createDriver(uint windowIcon = 0, bool direct3d = false, emptyProc exitFunc = 0); + static UDriver *createDriver(uint windowIcon, TDriver driver, emptyProc exitFunc = 0); /** * Purge static memory diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp index f8af1a217..ddbd25a6c 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp @@ -90,21 +90,28 @@ const uint32 CDriverGL::ReleaseVersion = 0x11; // Number of register to allocate for the EXTVertexShader extension const uint CDriverGL::_EVSNumConstant = 97; -#ifdef NL_OS_WINDOWS - #ifdef NL_STATIC -# pragma comment(lib, "opengl32") -# pragma comment(lib, "dinput8") -# pragma comment(lib, "dxguid") +#ifdef USE_OPENGLES + +IDriver* createGlEsDriverInstance () +{ + return new CDriverGL; +} + +#else IDriver* createGlDriverInstance () { return new CDriverGL; } +#endif + #else +#ifdef NL_OS_WINDOWS + __declspec(dllexport) IDriver* NL3D_createIDriverInstance () { return new CDriverGL; @@ -115,19 +122,8 @@ __declspec(dllexport) uint32 NL3D_interfaceVersion () return IDriver::InterfaceVersion; } -#endif - #elif defined (NL_OS_UNIX) -#ifdef NL_STATIC - -IDriver* createGlDriverInstance () -{ - return new CDriverGL; -} - -#else - extern "C" { IDriver* NL3D_createIDriverInstance () @@ -141,9 +137,9 @@ extern "C" } } -#endif +#endif // NL_OS_WINDOWS -#endif // NL_OS_UNIX +#endif // NL_STATIC GLenum CDriverGL::NLCubeFaceToGLCubeFace[6] = { diff --git a/code/nel/src/3d/driver_user.cpp b/code/nel/src/3d/driver_user.cpp index 118e02141..102065bb1 100644 --- a/code/nel/src/3d/driver_user.cpp +++ b/code/nel/src/3d/driver_user.cpp @@ -69,25 +69,29 @@ UDriver::~UDriver() purgeMemory(); } - // *************************************************************************** void UDriver::setMatrixMode2D11() { setMatrixMode2D(CFrustum(0.0f,1.0f,0.0f,1.0f,-1.0f,1.0f,false)); } + // *************************************************************************** void UDriver::setMatrixMode2D43() { setMatrixMode2D(CFrustum(0.0f,4.0f/3.0f,0.0f,1.0f,-1.0f,1.0f,false)); } - // *************************************************************************** UDriver *UDriver::createDriver(uint windowIcon, bool direct3d, emptyProc exitFunc) { - return new CDriverUser (windowIcon, direct3d, exitFunc); + return new CDriverUser (windowIcon, direct3d ? CDriverUser::Direct3d:CDriverUser::OpenGl, exitFunc); } +// *************************************************************************** +UDriver *UDriver::createDriver(uint windowIcon, TDriver driver, emptyProc exitFunc) +{ + return new CDriverUser (windowIcon, (CDriverUser::TDriver)driver, exitFunc); +} // *************************************************************************** void UDriver::purgeMemory() @@ -110,9 +114,8 @@ bool CDriverUser::_StaticInit= false; // *************************************************************************** -CDriverUser::CDriverUser (uint windowIcon, bool direct3d, emptyProc exitFunc) +CDriverUser::CDriverUser (uint windowIcon, TDriver driver, emptyProc exitFunc) { - // The enum of IDriver and UDriver MUST be the same!!! nlassert((uint)IDriver::idCount == (uint)UDriver::idCount); nlassert((uint)IDriver::typeCount == (uint)UDriver::typeCount); @@ -134,13 +137,16 @@ CDriverUser::CDriverUser (uint windowIcon, bool direct3d, emptyProc exitFunc) // Create/Init Driver. #if defined(NL_OS_WINDOWS) - if (direct3d) + if (driver == Direct3d) _Driver= CDRU::createD3DDriver(); #endif - if (!_Driver) + if (!_Driver && driver == OpenGl) _Driver= CDRU::createGlDriver(); + if (!_Driver && driver == OpenGlEs) + _Driver= CDRU::createGlEsDriver(); + nlassert(_Driver); _Driver->init (windowIcon, exitFunc); diff --git a/code/nel/src/3d/dru.cpp b/code/nel/src/3d/dru.cpp index 6300dd698..4fd61d75d 100644 --- a/code/nel/src/3d/dru.cpp +++ b/code/nel/src/3d/dru.cpp @@ -64,6 +64,10 @@ extern IDriver* createGlDriverInstance (); extern IDriver* createD3DDriverInstance (); #endif +#ifdef NL_OPENGLES_AVAILABLE +extern IDriver* createGlEsDriverInstance (); +#endif + #endif // *************************************************************************** @@ -82,36 +86,25 @@ IDriver *CDRU::createGlDriver() throw (EDru) IDRV_CREATE_PROC createDriver = NULL; IDRV_VERSION_PROC versionDriver = NULL; -//#ifdef NL_OS_WINDOWS - - // WINDOWS code. -// HINSTANCE hInst; - -// hInst=LoadLibrary(NL3D_GL_DLL_NAME); CLibrary driverLib; #if defined(NL_OS_UNIX) && defined(NL_DRIVER_PREFIX) driverLib.addLibPath(NL_DRIVER_PREFIX); #endif -// if (!hInst) if (!driverLib.loadLibrary(NL3D_GL_DLL_NAME, true, true, false)) { throw EDruOpenglDriverNotFound(); } -// char buffer[1024], *ptr; -// SearchPath (NULL, NL3D_GL_DLL_NAME, NULL, 1023, buffer, &ptr); nlinfo ("Using the library '"NL3D_GL_DLL_NAME"' that is in the directory: '%s'", driverLib.getLibFileName().c_str()); -// createDriver = (IDRV_CREATE_PROC) GetProcAddress (hInst, IDRV_CREATE_PROC_NAME); createDriver = (IDRV_CREATE_PROC) driverLib.getSymbolAddress(IDRV_CREATE_PROC_NAME); if (createDriver == NULL) { throw EDruOpenglDriverCorrupted(); } -// versionDriver = (IDRV_VERSION_PROC) GetProcAddress (hInst, IDRV_VERSION_PROC_NAME); versionDriver = (IDRV_VERSION_PROC) driverLib.getSymbolAddress(IDRV_VERSION_PROC_NAME); if (versionDriver != NULL) { @@ -121,44 +114,67 @@ IDriver *CDRU::createGlDriver() throw (EDru) throw EDruOpenglDriverUnknownVersion(); } -//#elif defined (NL_OS_UNIX) -// -// void *handle = dlopen(NL3D_GL_DLL_NAME, RTLD_NOW); -// -// if (handle == NULL) -// { -// nlwarning ("when loading dynamic library '%s': %s", NL3D_GL_DLL_NAME, dlerror()); -// throw EDruOpenglDriverNotFound(); -// } -// -// /* Not ANSI. Might produce a warning */ -// createDriver = (IDRV_CREATE_PROC) dlsym (handle, IDRV_CREATE_PROC_NAME); -// if (createDriver == NULL) -// { -// nlwarning ("when getting function in dynamic library '%s': %s", NL3D_GL_DLL_NAME, dlerror()); -// throw EDruOpenglDriverCorrupted(); -// } -// -// versionDriver = (IDRV_VERSION_PROC) dlsym (handle, IDRV_VERSION_PROC_NAME); -// if (versionDriver != NULL) -// { -// if (versionDriver()IDriver::InterfaceVersion) -// throw EDruOpenglDriverUnknownVersion(); -// } -// -//#else // NL_OS_UNIX -//#error "Dynamic DLL loading not implemented!" -//#endif // NL_OS_UNIX - IDriver *ret= createDriver(); if (ret == NULL) { throw EDruOpenglDriverCantCreateDriver(); } - return ret; + return ret; +#endif +} + +// *************************************************************************** +IDriver *CDRU::createGlEsDriver() throw (EDru) +{ +#ifdef NL_STATIC + +#ifdef NL_OPENGLES_AVAILABLE + return createGlEsDriverInstance (); +#else + return NULL; +#endif // NL_OPENGLES_AVAILABLE + +#else + + IDRV_CREATE_PROC createDriver = NULL; + IDRV_VERSION_PROC versionDriver = NULL; + + CLibrary driverLib; + +#if defined(NL_OS_UNIX) && defined(NL_DRIVER_PREFIX) + driverLib.addLibPath(NL_DRIVER_PREFIX); +#endif + + if (!driverLib.loadLibrary(NL3D_GLES_DLL_NAME, true, true, false)) + { + throw EDruOpenglEsDriverNotFound(); + } + + nlinfo ("Using the library '"NL3D_GLES_DLL_NAME"' that is in the directory: '%s'", driverLib.getLibFileName().c_str()); + + createDriver = (IDRV_CREATE_PROC) driverLib.getSymbolAddress(IDRV_CREATE_PROC_NAME); + if (createDriver == NULL) + { + throw EDruOpenglDriverCorrupted(); + } + + versionDriver = (IDRV_VERSION_PROC) driverLib.getSymbolAddress(IDRV_VERSION_PROC_NAME); + if (versionDriver != NULL) + { + if (versionDriver()IDriver::InterfaceVersion) + throw EDruOpenglDriverUnknownVersion(); + } + + IDriver *ret= createDriver(); + if (ret == NULL) + { + throw EDruOpenglEsDriverCantCreateDriver(); + } + + return ret; #endif } @@ -181,31 +197,21 @@ IDriver *CDRU::createD3DDriver() throw (EDru) IDRV_CREATE_PROC createDriver = NULL; IDRV_VERSION_PROC versionDriver = NULL; - // WINDOWS code. -// HINSTANCE hInst; - -// hInst=LoadLibrary(NL3D_D3D_DLL_NAME); - CLibrary driverLib; -// if (!hInst) if (!driverLib.loadLibrary(NL3D_D3D_DLL_NAME, true, true, false)) { throw EDruDirect3dDriverNotFound(); } -// char buffer[1024], *ptr; -// SearchPath (NULL, NL3D_D3D_DLL_NAME, NULL, 1023, buffer, &ptr); nlinfo ("Using the library '"NL3D_D3D_DLL_NAME"' that is in the directory: '%s'", driverLib.getLibFileName().c_str()); -// createDriver = (IDRV_CREATE_PROC) GetProcAddress (hInst, IDRV_CREATE_PROC_NAME); createDriver = (IDRV_CREATE_PROC) driverLib.getSymbolAddress(IDRV_CREATE_PROC_NAME); if (createDriver == NULL) { throw EDruDirect3dDriverCorrupted(); } -// versionDriver = (IDRV_VERSION_PROC) GetProcAddress (hInst, IDRV_VERSION_PROC_NAME); versionDriver = (IDRV_VERSION_PROC) driverLib.getSymbolAddress(IDRV_VERSION_PROC_NAME); if (versionDriver != NULL) { @@ -220,8 +226,8 @@ IDriver *CDRU::createD3DDriver() throw (EDru) { throw EDruDirect3dDriverCantCreateDriver(); } - return ret; + return ret; #endif } #endif // NL_OS_WINDOWS