forked from Mirrorlandia_minetest/irrlicht
OpenGL3: new version format
This commit is contained in:
parent
c4ab49201b
commit
1d782702e1
@ -32,5 +32,19 @@ namespace video
|
|||||||
typedef COpenGLCoreRenderTarget<COpenGL3DriverBase, COpenGL3Texture> COpenGL3RenderTarget;
|
typedef COpenGLCoreRenderTarget<COpenGL3DriverBase, COpenGL3Texture> COpenGL3RenderTarget;
|
||||||
typedef COpenGLCoreCacheHandler<COpenGL3DriverBase, COpenGL3Texture> COpenGL3CacheHandler;
|
typedef COpenGLCoreCacheHandler<COpenGL3DriverBase, COpenGL3Texture> COpenGL3CacheHandler;
|
||||||
|
|
||||||
|
enum class OpenGLSpec: u8 {
|
||||||
|
Core,
|
||||||
|
Compat,
|
||||||
|
ES,
|
||||||
|
// WebGL, // TODO
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OpenGLVersion {
|
||||||
|
OpenGLSpec Spec;
|
||||||
|
u8 Major;
|
||||||
|
u8 Minor;
|
||||||
|
u8 Release;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -203,8 +203,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
QuadIndexCount = QuadsIndices.size();
|
QuadIndexCount = QuadsIndices.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool COpenGL3DriverBase::genericDriverInit(const core::dimension2d<u32>& screenSize, bool stencilBuffer)
|
void COpenGL3DriverBase::initVersion() {
|
||||||
{
|
|
||||||
Name = glGetString(GL_VERSION);
|
Name = glGetString(GL_VERSION);
|
||||||
printVersion();
|
printVersion();
|
||||||
|
|
||||||
@ -212,7 +211,12 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
VendorName = glGetString(GL_VENDOR);
|
VendorName = glGetString(GL_VENDOR);
|
||||||
os::Printer::log(VendorName.c_str(), ELL_INFORMATION);
|
os::Printer::log(VendorName.c_str(), ELL_INFORMATION);
|
||||||
|
|
||||||
// load extensions
|
Version = getVersionFromOpenGL();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool COpenGL3DriverBase::genericDriverInit(const core::dimension2d<u32>& screenSize, bool stencilBuffer)
|
||||||
|
{
|
||||||
|
initVersion();
|
||||||
initExtensions();
|
initExtensions();
|
||||||
|
|
||||||
// reset cache handler
|
// reset cache handler
|
||||||
@ -231,7 +235,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
|||||||
DriverAttributes->setAttribute("MaxIndices", (s32)MaxIndices);
|
DriverAttributes->setAttribute("MaxIndices", (s32)MaxIndices);
|
||||||
DriverAttributes->setAttribute("MaxTextureSize", (s32)MaxTextureSize);
|
DriverAttributes->setAttribute("MaxTextureSize", (s32)MaxTextureSize);
|
||||||
DriverAttributes->setAttribute("MaxTextureLODBias", MaxTextureLODBias);
|
DriverAttributes->setAttribute("MaxTextureLODBias", MaxTextureLODBias);
|
||||||
DriverAttributes->setAttribute("Version", Version);
|
DriverAttributes->setAttribute("Version", 100 * Version.Major + Version.Minor);
|
||||||
DriverAttributes->setAttribute("AntiAlias", AntiAlias);
|
DriverAttributes->setAttribute("AntiAlias", AntiAlias);
|
||||||
|
|
||||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||||
|
@ -285,6 +285,9 @@ namespace video
|
|||||||
//! inits the opengl-es driver
|
//! inits the opengl-es driver
|
||||||
virtual bool genericDriverInit(const core::dimension2d<u32>& screenSize, bool stencilBuffer);
|
virtual bool genericDriverInit(const core::dimension2d<u32>& screenSize, bool stencilBuffer);
|
||||||
|
|
||||||
|
void initVersion();
|
||||||
|
virtual OpenGLVersion getVersionFromOpenGL() const = 0;
|
||||||
|
|
||||||
void chooseMaterial2D();
|
void chooseMaterial2D();
|
||||||
|
|
||||||
ITexture* createDeviceDependentTexture(const io::path& name, IImage* image) override;
|
ITexture* createDeviceDependentTexture(const io::path& name, IImage* image) override;
|
||||||
@ -341,6 +344,7 @@ namespace video
|
|||||||
core::stringw Name;
|
core::stringw Name;
|
||||||
core::stringc VendorName;
|
core::stringc VendorName;
|
||||||
SIrrlichtCreationParameters Params;
|
SIrrlichtCreationParameters Params;
|
||||||
|
OpenGLVersion Version;
|
||||||
|
|
||||||
//! bool to make all renderstates reset if set to true.
|
//! bool to make all renderstates reset if set to true.
|
||||||
bool ResetRenderStates;
|
bool ResetRenderStates;
|
||||||
|
@ -11,8 +11,24 @@ namespace video {
|
|||||||
return EDT_OPENGL3;
|
return EDT_OPENGL3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OpenGLVersion COpenGL3Driver::getVersionFromOpenGL() const {
|
||||||
|
GLint major, minor, profile;
|
||||||
|
glGetIntegerv(GL_MAJOR_VERSION, &major);
|
||||||
|
glGetIntegerv(GL_MINOR_VERSION, &minor);
|
||||||
|
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
|
||||||
|
// The spec is clear a context can’t be both core and compatibility at the same time.
|
||||||
|
// However, the returned value is a mask. Ask Khronos why. -- numzero
|
||||||
|
if (profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)
|
||||||
|
return {OpenGLSpec::Compat, (u8)major, (u8)minor, 0};
|
||||||
|
if (profile & GL_CONTEXT_CORE_PROFILE_BIT)
|
||||||
|
return {OpenGLSpec::Core, (u8)major, (u8)minor, 0};
|
||||||
|
os::Printer::log("Got unrecognized OpenGL profile", ELL_ERROR);
|
||||||
|
return {OpenGLSpec::Core, (u8)major, (u8)minor, 0};
|
||||||
|
}
|
||||||
|
|
||||||
IVideoDriver* createOpenGL3Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)
|
IVideoDriver* createOpenGL3Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)
|
||||||
{
|
{
|
||||||
|
os::Printer::log("Using COpenGL3Driver", ELL_INFORMATION);
|
||||||
COpenGL3Driver* driver = new COpenGL3Driver(params, io, contextManager);
|
COpenGL3Driver* driver = new COpenGL3Driver(params, io, contextManager);
|
||||||
driver->genericDriverInit(params.WindowSize, params.Stencilbuffer); // don't call in constructor, it uses virtual function calls of driver
|
driver->genericDriverInit(params.WindowSize, params.Stencilbuffer); // don't call in constructor, it uses virtual function calls of driver
|
||||||
return driver;
|
return driver;
|
||||||
|
@ -8,11 +8,17 @@
|
|||||||
namespace irr {
|
namespace irr {
|
||||||
namespace video {
|
namespace video {
|
||||||
|
|
||||||
|
/// OpenGL 3+ driver
|
||||||
|
///
|
||||||
|
/// For OpenGL 3.2 and higher. Compatibility profile is required currently.
|
||||||
class COpenGL3Driver : public COpenGL3DriverBase {
|
class COpenGL3Driver : public COpenGL3DriverBase {
|
||||||
friend IVideoDriver* createOpenGL3Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
friend IVideoDriver* createOpenGL3Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||||
public:
|
public:
|
||||||
using COpenGL3DriverBase::COpenGL3DriverBase;
|
using COpenGL3DriverBase::COpenGL3DriverBase;
|
||||||
E_DRIVER_TYPE getDriverType() const override;
|
E_DRIVER_TYPE getDriverType() const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
OpenGLVersion getVersionFromOpenGL() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,8 +11,19 @@ namespace video {
|
|||||||
return EDT_OGLES2;
|
return EDT_OGLES2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OpenGLVersion COpenGLES2Driver::getVersionFromOpenGL() const {
|
||||||
|
auto version_string = reinterpret_cast<const char *>(glGetString(GL_VERSION));
|
||||||
|
int major, minor;
|
||||||
|
if (sscanf(version_string, "OpenGL ES %d.%d", &major, &minor) != 2) {
|
||||||
|
os::Printer::log("Failed to parse OpenGL ES version string", version_string, ELL_ERROR);
|
||||||
|
return {OpenGLSpec::ES, 0, 0, 0};
|
||||||
|
}
|
||||||
|
return {OpenGLSpec::ES, (u8)major, (u8)minor, 0};
|
||||||
|
}
|
||||||
|
|
||||||
IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)
|
IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager)
|
||||||
{
|
{
|
||||||
|
os::Printer::log("Using COpenGLES2Driver", ELL_INFORMATION);
|
||||||
COpenGLES2Driver* driver = new COpenGLES2Driver(params, io, contextManager);
|
COpenGLES2Driver* driver = new COpenGLES2Driver(params, io, contextManager);
|
||||||
driver->genericDriverInit(params.WindowSize, params.Stencilbuffer); // don't call in constructor, it uses virtual function calls of driver
|
driver->genericDriverInit(params.WindowSize, params.Stencilbuffer); // don't call in constructor, it uses virtual function calls of driver
|
||||||
return driver;
|
return driver;
|
||||||
|
@ -8,11 +8,17 @@
|
|||||||
namespace irr {
|
namespace irr {
|
||||||
namespace video {
|
namespace video {
|
||||||
|
|
||||||
|
/// OpenGL ES 2+ driver
|
||||||
|
///
|
||||||
|
/// For OpenGL ES 2.0 and higher.
|
||||||
class COpenGLES2Driver : public COpenGL3DriverBase {
|
class COpenGLES2Driver : public COpenGL3DriverBase {
|
||||||
friend IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
friend IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager);
|
||||||
public:
|
public:
|
||||||
using COpenGL3DriverBase::COpenGL3DriverBase;
|
using COpenGL3DriverBase::COpenGL3DriverBase;
|
||||||
E_DRIVER_TYPE getDriverType() const override;
|
E_DRIVER_TYPE getDriverType() const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
OpenGLVersion getVersionFromOpenGL() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user