Added OpenGL::GetGLSLVersion and ImageLoadStore shader extension
Former-commit-id: 97afadc93465132e6a698c5bf88e4ec070aff3db
This commit is contained in:
parent
afbd002234
commit
405e14d9ae
|
|
@ -36,6 +36,7 @@ enum nzOpenGLExtension
|
||||||
nzOpenGLExtension_PixelBufferObject,
|
nzOpenGLExtension_PixelBufferObject,
|
||||||
nzOpenGLExtension_SamplerObjects,
|
nzOpenGLExtension_SamplerObjects,
|
||||||
nzOpenGLExtension_SeparateShaderObjects,
|
nzOpenGLExtension_SeparateShaderObjects,
|
||||||
|
nzOpenGLExtension_Shader_ImageLoadStore,
|
||||||
nzOpenGLExtension_TextureArray,
|
nzOpenGLExtension_TextureArray,
|
||||||
nzOpenGLExtension_TextureCompression_s3tc,
|
nzOpenGLExtension_TextureCompression_s3tc,
|
||||||
nzOpenGLExtension_TextureStorage,
|
nzOpenGLExtension_TextureStorage,
|
||||||
|
|
@ -84,6 +85,7 @@ class NAZARA_API NzOpenGL
|
||||||
static GLuint GetCurrentProgram();
|
static GLuint GetCurrentProgram();
|
||||||
static GLuint GetCurrentTexture();
|
static GLuint GetCurrentTexture();
|
||||||
static NzOpenGLFunc GetEntry(const NzString& entryPoint);
|
static NzOpenGLFunc GetEntry(const NzString& entryPoint);
|
||||||
|
static unsigned int GetGLSLVersion();
|
||||||
static NzString GetRendererName();
|
static NzString GetRendererName();
|
||||||
static unsigned int GetTextureUnit();
|
static unsigned int GetTextureUnit();
|
||||||
static NzString GetVendorName();
|
static NzString GetVendorName();
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,7 @@ namespace
|
||||||
const char* s_vendorName = nullptr;
|
const char* s_vendorName = nullptr;
|
||||||
bool s_initialized = false;
|
bool s_initialized = false;
|
||||||
bool s_openGLextensions[nzOpenGLExtension_Max+1] = {false};
|
bool s_openGLextensions[nzOpenGLExtension_Max+1] = {false};
|
||||||
|
unsigned int s_glslVersion = 0;
|
||||||
unsigned int s_openglVersion = 0;
|
unsigned int s_openglVersion = 0;
|
||||||
|
|
||||||
bool LoadExtensionsString(const NzString& extensionString)
|
bool LoadExtensionsString(const NzString& extensionString)
|
||||||
|
|
@ -427,6 +428,11 @@ NzOpenGLFunc NzOpenGL::GetEntry(const NzString& entryPoint)
|
||||||
return LoadEntry(entryPoint.GetConstBuffer(), false);
|
return LoadEntry(entryPoint.GetConstBuffer(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int NzOpenGL::GetGLSLVersion()
|
||||||
|
{
|
||||||
|
return s_glslVersion;
|
||||||
|
}
|
||||||
|
|
||||||
NzString NzOpenGL::GetRendererName()
|
NzString NzOpenGL::GetRendererName()
|
||||||
{
|
{
|
||||||
return s_rendererName;
|
return s_rendererName;
|
||||||
|
|
@ -502,7 +508,7 @@ bool NzOpenGL::Initialize()
|
||||||
glXCreateContextAttribs = reinterpret_cast<PFNGLXCREATECONTEXTATTRIBSARBPROC>(LoadEntry("glXCreateContextAttribsARB", false));
|
glXCreateContextAttribs = reinterpret_cast<PFNGLXCREATECONTEXTATTRIBSARBPROC>(LoadEntry("glXCreateContextAttribsARB", false));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Récupération de la version d'OpenGL
|
// Récupération de la version d'OpenGL et du GLSL
|
||||||
// Ce code se base sur le fait que la carte graphique renverra un contexte de compatibilité avec la plus haute version supportée
|
// Ce code se base sur le fait que la carte graphique renverra un contexte de compatibilité avec la plus haute version supportée
|
||||||
// Ce qui semble vrai au moins chez ATI/AMD et NVidia, mais si quelqu'un à une meilleure idée ...
|
// Ce qui semble vrai au moins chez ATI/AMD et NVidia, mais si quelqu'un à une meilleure idée ...
|
||||||
glGetString = reinterpret_cast<PFNGLGETSTRINGPROC>(LoadEntry("glGetString", false));
|
glGetString = reinterpret_cast<PFNGLGETSTRINGPROC>(LoadEntry("glGetString", false));
|
||||||
|
|
@ -514,7 +520,11 @@ bool NzOpenGL::Initialize()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const GLubyte* version = glGetString(GL_VERSION);
|
const GLubyte* version;
|
||||||
|
unsigned int major;
|
||||||
|
unsigned int minor;
|
||||||
|
|
||||||
|
version = glGetString(GL_VERSION);
|
||||||
if (!version)
|
if (!version)
|
||||||
{
|
{
|
||||||
NazaraError("Unable to retrieve OpenGL version");
|
NazaraError("Unable to retrieve OpenGL version");
|
||||||
|
|
@ -523,8 +533,8 @@ bool NzOpenGL::Initialize()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int major = version[0] - '0';
|
major = version[0] - '0';
|
||||||
unsigned int minor = version[2] - '0';
|
minor = version[2] - '0';
|
||||||
|
|
||||||
if (major == 0 || major > 9)
|
if (major == 0 || major > 9)
|
||||||
{
|
{
|
||||||
|
|
@ -547,6 +557,39 @@ bool NzOpenGL::Initialize()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
version = glGetString(GL_SHADING_LANGUAGE_VERSION);
|
||||||
|
if (!version)
|
||||||
|
{
|
||||||
|
NazaraError("Unable to retrieve GLSL version");
|
||||||
|
Uninitialize();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
major = version[0] - '0';
|
||||||
|
minor = version[2] - '0';
|
||||||
|
|
||||||
|
if (major == 0 || major > 9)
|
||||||
|
{
|
||||||
|
NazaraError("Unable to retrieve GLSL major version");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minor > 9)
|
||||||
|
{
|
||||||
|
NazaraWarning("Unable to retrieve GLSL minor version (using 0)");
|
||||||
|
minor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
s_glslVersion = major*100 + minor*10;
|
||||||
|
if (s_glslVersion < 110)
|
||||||
|
{
|
||||||
|
NazaraError("GLSL version is too low, please upgrade your drivers or your video card");
|
||||||
|
Uninitialize();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
parameters.debugMode = true; // Certaines extensions n'apparaissent qu'avec un contexte de debug (e.g. ARB_debug_output)
|
parameters.debugMode = true; // Certaines extensions n'apparaissent qu'avec un contexte de debug (e.g. ARB_debug_output)
|
||||||
parameters.majorVersion = NzContextParameters::defaultMajorVersion = major;
|
parameters.majorVersion = NzContextParameters::defaultMajorVersion = major;
|
||||||
parameters.minorVersion = NzContextParameters::defaultMinorVersion = minor;
|
parameters.minorVersion = NzContextParameters::defaultMinorVersion = minor;
|
||||||
|
|
@ -900,6 +943,9 @@ bool NzOpenGL::Initialize()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shader_ImageLoadStore
|
||||||
|
s_openGLextensions[nzOpenGLExtension_Shader_ImageLoadStore] = (s_openglVersion >= 420 || IsSupported("GL_ARB_shader_image_load_store"));
|
||||||
|
|
||||||
// TextureArray
|
// TextureArray
|
||||||
s_openGLextensions[nzOpenGLExtension_TextureArray] = (s_openglVersion >= 300 || IsSupported("GL_EXT_texture_array"));
|
s_openGLextensions[nzOpenGLExtension_TextureArray] = (s_openglVersion >= 300 || IsSupported("GL_EXT_texture_array"));
|
||||||
|
|
||||||
|
|
@ -1133,6 +1179,7 @@ void NzOpenGL::Uninitialize()
|
||||||
for (bool& ext : s_openGLextensions)
|
for (bool& ext : s_openGLextensions)
|
||||||
ext = false;
|
ext = false;
|
||||||
|
|
||||||
|
s_glslVersion = 0;
|
||||||
s_initialized = false;
|
s_initialized = false;
|
||||||
s_openGLextensionSet.clear();
|
s_openGLextensionSet.clear();
|
||||||
s_openglVersion = 0;
|
s_openglVersion = 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue