cogl/gl: Check GLSL version and unify GL context version checks
This adds a check which makes sure that the required GLSL/GLSL ES versions are supported. It also splits out the GLES version check into its own function, just like GL does. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3907>
This commit is contained in:
parent
74917e1b07
commit
e122943bcd
2 changed files with 138 additions and 38 deletions
|
@ -374,8 +374,8 @@ _cogl_driver_get_read_pixels_format (CoglContext *context,
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_cogl_get_gl_version (CoglContext *ctx,
|
_cogl_get_gl_version (CoglContext *ctx,
|
||||||
int *major_out,
|
int *major_out,
|
||||||
int *minor_out)
|
int *minor_out)
|
||||||
{
|
{
|
||||||
const char *version_string;
|
const char *version_string;
|
||||||
|
|
||||||
|
@ -387,9 +387,8 @@ _cogl_get_gl_version (CoglContext *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
check_gl_version (CoglContext *ctx,
|
check_gl_version (CoglContext *ctx,
|
||||||
char **gl_extensions,
|
GError **error)
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
int major, minor;
|
int major, minor;
|
||||||
|
|
||||||
|
@ -415,13 +414,51 @@ check_gl_version (CoglContext *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_cogl_driver_update_features (CoglContext *ctx,
|
_cogl_get_glsl_version (CoglContext *ctx,
|
||||||
GError **error)
|
int *major_out,
|
||||||
|
int *minor_out)
|
||||||
|
{
|
||||||
|
const char *version_string;
|
||||||
|
|
||||||
|
version_string = (char *)ctx->glGetString (GL_SHADING_LANGUAGE_VERSION);
|
||||||
|
return _cogl_gl_util_parse_gl_version (version_string, major_out, minor_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
check_glsl_version (CoglContext *ctx,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
int major, minor;
|
||||||
|
|
||||||
|
if (!_cogl_get_glsl_version (ctx, &major, &minor))
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
COGL_DRIVER_ERROR,
|
||||||
|
COGL_DRIVER_ERROR_UNKNOWN_VERSION,
|
||||||
|
"The supported GLSL version could not be determined");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!COGL_CHECK_GL_VERSION (major, minor, ctx->glsl_major, ctx->glsl_minor))
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
COGL_DRIVER_ERROR,
|
||||||
|
COGL_DRIVER_ERROR_INVALID_VERSION,
|
||||||
|
"GLSL %d%d0 or better is required",
|
||||||
|
ctx->glsl_major, ctx->glsl_minor);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_cogl_driver_update_features (CoglContext *ctx,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
unsigned long private_features
|
unsigned long private_features
|
||||||
[COGL_FLAGS_N_LONGS_FOR_SIZE (COGL_N_PRIVATE_FEATURES)] = { 0 };
|
[COGL_FLAGS_N_LONGS_FOR_SIZE (COGL_N_PRIVATE_FEATURES)] = { 0 };
|
||||||
g_auto (GStrv) gl_extensions = 0;
|
g_auto (GStrv) gl_extensions = 0;
|
||||||
const char *glsl_version;
|
|
||||||
int gl_major = 0, gl_minor = 0;
|
int gl_major = 0, gl_minor = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -440,7 +477,14 @@ _cogl_driver_update_features (CoglContext *ctx,
|
||||||
|
|
||||||
gl_extensions = _cogl_context_get_gl_extensions (ctx);
|
gl_extensions = _cogl_context_get_gl_extensions (ctx);
|
||||||
|
|
||||||
if (!check_gl_version (ctx, gl_extensions, error))
|
if (!check_gl_version (ctx, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
ctx->glsl_major = 1;
|
||||||
|
ctx->glsl_minor = 40;
|
||||||
|
ctx->glsl_version_to_use = 140;
|
||||||
|
|
||||||
|
if (!check_glsl_version (ctx, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_WINSYS)))
|
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_WINSYS)))
|
||||||
|
@ -461,15 +505,6 @@ _cogl_driver_update_features (CoglContext *ctx,
|
||||||
|
|
||||||
_cogl_get_gl_version (ctx, &gl_major, &gl_minor);
|
_cogl_get_gl_version (ctx, &gl_major, &gl_minor);
|
||||||
|
|
||||||
ctx->glsl_major = 1;
|
|
||||||
ctx->glsl_minor = 2;
|
|
||||||
ctx->glsl_version_to_use = 140;
|
|
||||||
|
|
||||||
glsl_version = (char *)ctx->glGetString (GL_SHADING_LANGUAGE_VERSION);
|
|
||||||
_cogl_gl_util_parse_gl_version (glsl_version,
|
|
||||||
&ctx->glsl_major,
|
|
||||||
&ctx->glsl_minor);
|
|
||||||
|
|
||||||
COGL_FLAGS_SET (ctx->features,
|
COGL_FLAGS_SET (ctx->features,
|
||||||
COGL_FEATURE_ID_UNSIGNED_INT_INDICES, TRUE);
|
COGL_FEATURE_ID_UNSIGNED_INT_INDICES, TRUE);
|
||||||
|
|
||||||
|
|
|
@ -565,8 +565,80 @@ _cogl_get_gl_version (CoglContext *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_cogl_driver_update_features (CoglContext *context,
|
check_gl_version (CoglContext *ctx,
|
||||||
GError **error)
|
GError **error)
|
||||||
|
{
|
||||||
|
int major, minor;
|
||||||
|
|
||||||
|
if (!_cogl_get_gl_version (ctx, &major, &minor))
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
COGL_DRIVER_ERROR,
|
||||||
|
COGL_DRIVER_ERROR_UNKNOWN_VERSION,
|
||||||
|
"The GLES version could not be determined");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!COGL_CHECK_GL_VERSION (major, minor, 2, 0))
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
COGL_DRIVER_ERROR,
|
||||||
|
COGL_DRIVER_ERROR_INVALID_VERSION,
|
||||||
|
"OpenGL ES 2.0 or better is required");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_cogl_get_glsl_version (CoglContext *ctx,
|
||||||
|
int *major_out,
|
||||||
|
int *minor_out)
|
||||||
|
{
|
||||||
|
const char *version_string;
|
||||||
|
|
||||||
|
version_string = (char *)ctx->glGetString (GL_SHADING_LANGUAGE_VERSION);
|
||||||
|
|
||||||
|
if (!g_str_has_prefix (version_string, "OpenGL ES GLSL ES "))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return _cogl_gl_util_parse_gl_version (version_string + 18,
|
||||||
|
major_out,
|
||||||
|
minor_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
check_glsl_version (CoglContext *ctx,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
int major, minor;
|
||||||
|
|
||||||
|
if (!_cogl_get_glsl_version (ctx, &major, &minor))
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
COGL_DRIVER_ERROR,
|
||||||
|
COGL_DRIVER_ERROR_UNKNOWN_VERSION,
|
||||||
|
"The supported GLSL version could not be determined");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!COGL_CHECK_GL_VERSION (major, minor, ctx->glsl_major, ctx->glsl_minor))
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
COGL_DRIVER_ERROR,
|
||||||
|
COGL_DRIVER_ERROR_INVALID_VERSION,
|
||||||
|
"GLSL ES %d%d0 or better is required",
|
||||||
|
ctx->glsl_major, ctx->glsl_minor);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_cogl_driver_update_features (CoglContext *context,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
unsigned long private_features
|
unsigned long private_features
|
||||||
[COGL_FLAGS_N_LONGS_FOR_SIZE (COGL_N_PRIVATE_FEATURES)] = { 0 };
|
[COGL_FLAGS_N_LONGS_FOR_SIZE (COGL_N_PRIVATE_FEATURES)] = { 0 };
|
||||||
|
@ -586,6 +658,16 @@ _cogl_driver_update_features (CoglContext *context,
|
||||||
|
|
||||||
gl_extensions = _cogl_context_get_gl_extensions (context);
|
gl_extensions = _cogl_context_get_gl_extensions (context);
|
||||||
|
|
||||||
|
if (!check_gl_version (context, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
context->glsl_major = 1;
|
||||||
|
context->glsl_minor = 0;
|
||||||
|
context->glsl_version_to_use = 100;
|
||||||
|
|
||||||
|
if (!check_glsl_version (context, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_WINSYS)))
|
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_WINSYS)))
|
||||||
{
|
{
|
||||||
g_autofree char *all_extensions = g_strjoinv (" ", gl_extensions);
|
g_autofree char *all_extensions = g_strjoinv (" ", gl_extensions);
|
||||||
|
@ -602,24 +684,7 @@ _cogl_driver_update_features (CoglContext *context,
|
||||||
all_extensions);
|
all_extensions);
|
||||||
}
|
}
|
||||||
|
|
||||||
context->glsl_major = 1;
|
_cogl_get_gl_version (context, &gl_major, &gl_minor);
|
||||||
context->glsl_minor = 0;
|
|
||||||
context->glsl_version_to_use = 100;
|
|
||||||
|
|
||||||
if (!_cogl_get_gl_version (context, &gl_major, &gl_minor))
|
|
||||||
{
|
|
||||||
gl_major = 1;
|
|
||||||
gl_minor = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!COGL_CHECK_GL_VERSION (gl_major, gl_minor, 2, 0))
|
|
||||||
{
|
|
||||||
g_set_error (error,
|
|
||||||
COGL_DRIVER_ERROR,
|
|
||||||
COGL_DRIVER_ERROR_INVALID_VERSION,
|
|
||||||
"OpenGL ES 2.0 or better is required");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
_cogl_feature_check_ext_functions (context,
|
_cogl_feature_check_ext_functions (context,
|
||||||
gl_major,
|
gl_major,
|
||||||
|
|
Loading…
Reference in a new issue