Changed: #1275 Create an OpenGL ES driver

This commit is contained in:
kervala 2012-05-13 17:43:46 +02:00
parent 72b4500c84
commit e9408a8a0f
6 changed files with 125 additions and 80 deletions

View file

@ -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();
// @}

View file

@ -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);

View file

@ -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

View file

@ -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] =
{

View file

@ -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);

View file

@ -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 EDruOpenglDriverOldVersion();
// else 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 EDruOpenglDriverOldVersion();
else 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