Added OpenGL::GetGLSLVersion and ImageLoadStore shader extension

Former-commit-id: 97afadc93465132e6a698c5bf88e4ec070aff3db
This commit is contained in:
Lynix 2013-07-13 17:07:16 +02:00
parent afbd002234
commit 405e14d9ae
2 changed files with 53 additions and 4 deletions

View File

@ -36,6 +36,7 @@ enum nzOpenGLExtension
nzOpenGLExtension_PixelBufferObject,
nzOpenGLExtension_SamplerObjects,
nzOpenGLExtension_SeparateShaderObjects,
nzOpenGLExtension_Shader_ImageLoadStore,
nzOpenGLExtension_TextureArray,
nzOpenGLExtension_TextureCompression_s3tc,
nzOpenGLExtension_TextureStorage,
@ -84,6 +85,7 @@ class NAZARA_API NzOpenGL
static GLuint GetCurrentProgram();
static GLuint GetCurrentTexture();
static NzOpenGLFunc GetEntry(const NzString& entryPoint);
static unsigned int GetGLSLVersion();
static NzString GetRendererName();
static unsigned int GetTextureUnit();
static NzString GetVendorName();

View File

@ -76,6 +76,7 @@ namespace
const char* s_vendorName = nullptr;
bool s_initialized = false;
bool s_openGLextensions[nzOpenGLExtension_Max+1] = {false};
unsigned int s_glslVersion = 0;
unsigned int s_openglVersion = 0;
bool LoadExtensionsString(const NzString& extensionString)
@ -427,6 +428,11 @@ NzOpenGLFunc NzOpenGL::GetEntry(const NzString& entryPoint)
return LoadEntry(entryPoint.GetConstBuffer(), false);
}
unsigned int NzOpenGL::GetGLSLVersion()
{
return s_glslVersion;
}
NzString NzOpenGL::GetRendererName()
{
return s_rendererName;
@ -502,7 +508,7 @@ bool NzOpenGL::Initialize()
glXCreateContextAttribs = reinterpret_cast<PFNGLXCREATECONTEXTATTRIBSARBPROC>(LoadEntry("glXCreateContextAttribsARB", false));
#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 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));
@ -514,7 +520,11 @@ bool NzOpenGL::Initialize()
return false;
}
const GLubyte* version = glGetString(GL_VERSION);
const GLubyte* version;
unsigned int major;
unsigned int minor;
version = glGetString(GL_VERSION);
if (!version)
{
NazaraError("Unable to retrieve OpenGL version");
@ -523,8 +533,8 @@ bool NzOpenGL::Initialize()
return false;
}
unsigned int major = version[0] - '0';
unsigned int minor = version[2] - '0';
major = version[0] - '0';
minor = version[2] - '0';
if (major == 0 || major > 9)
{
@ -547,6 +557,39 @@ bool NzOpenGL::Initialize()
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.majorVersion = NzContextParameters::defaultMajorVersion = major;
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
s_openGLextensions[nzOpenGLExtension_TextureArray] = (s_openglVersion >= 300 || IsSupported("GL_EXT_texture_array"));
@ -1133,6 +1179,7 @@ void NzOpenGL::Uninitialize()
for (bool& ext : s_openGLextensions)
ext = false;
s_glslVersion = 0;
s_initialized = false;
s_openGLextensionSet.clear();
s_openglVersion = 0;