OpenGL3: new version format

This commit is contained in:
numzero 2023-04-15 16:52:15 +03:00 committed by sfan5
parent c4ab49201b
commit 1d782702e1
7 changed files with 65 additions and 4 deletions

@ -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 cant 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;
}; };
} }