From a553c54abf92533daf442073dd3408c35f57d8ba Mon Sep 17 00:00:00 2001 From: Vadym Shovkoplias Date: Tue, 13 Feb 2018 11:38:22 -0700 Subject: [PATCH] mesa: add glsl version query (v4) Add support for GL_NUM_SHADING_LANGUAGE_VERSIONS and glGetStringi for GL_SHADING_LANGUAGE_VERSION v2: - Combine similar functionality into _mesa_get_shading_language_version() function. - Change GLSL version return mechanism. v3: - Add return of empty string for GLSL ver 1.10. - Move _mesa_get_shading_language_version() function to src/mesa/main/version.c. v4: - Add OpenGL version check. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104915 Signed-off-by: Andriy Khulap Signed-off-by: Vadym Shovkoplias Reviewed-by: Brian Paul --- src/mapi/glapi/gen/GL4x.xml | 1 + src/mesa/main/get.c | 11 +++++++ src/mesa/main/get_hash_params.py | 3 ++ src/mesa/main/getstring.c | 20 +++++++++++++ src/mesa/main/version.c | 64 ++++++++++++++++++++++++++++++++++++++++ src/mesa/main/version.h | 5 ++++ 6 files changed, 104 insertions(+) diff --git a/src/mapi/glapi/gen/GL4x.xml b/src/mapi/glapi/gen/GL4x.xml index cd2e3b8..2116286 100644 --- a/src/mapi/glapi/gen/GL4x.xml +++ b/src/mapi/glapi/gen/GL4x.xml @@ -42,6 +42,7 @@ + diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index 57a2118..13d5e85 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -143,6 +143,7 @@ enum value_extra { EXTRA_VERSION_31, EXTRA_VERSION_32, EXTRA_VERSION_40, + EXTRA_VERSION_43, EXTRA_API_GL, EXTRA_API_GL_CORE, EXTRA_API_ES2, @@ -522,6 +523,7 @@ extra_NV_primitive_restart[] = { static const int extra_version_30[] = { EXTRA_VERSION_30, EXTRA_END }; static const int extra_version_31[] = { EXTRA_VERSION_31, EXTRA_END }; static const int extra_version_32[] = { EXTRA_VERSION_32, EXTRA_END }; +static const int extra_version_43[] = { EXTRA_VERSION_43, EXTRA_END }; static const int extra_gl30_es3[] = { EXTRA_VERSION_30, @@ -1084,6 +1086,10 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu v->value_int = 0; } break; + /* GL 4.3 */ + case GL_NUM_SHADING_LANGUAGE_VERSIONS: + v->value_int = _mesa_get_shading_language_version(ctx, -1, NULL); + break; /* GL_ARB_draw_indirect */ case GL_DRAW_INDIRECT_BUFFER_BINDING: v->value_int = ctx->DrawIndirectBuffer->Name; @@ -1229,6 +1235,11 @@ check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d if (version >= 40) api_found = GL_TRUE; break; + case EXTRA_VERSION_43: + api_check = TRUE; + if (_mesa_is_desktop_gl(ctx) && version >= 43) + api_found = GL_TRUE; + break; case EXTRA_NEW_FRAG_CLAMP: if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP)) _mesa_update_state(ctx); diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py index e127b6b..5d2afed 100644 --- a/src/mesa/main/get_hash_params.py +++ b/src/mesa/main/get_hash_params.py @@ -543,6 +543,9 @@ descriptor=[ # GL_ARB_texture_cube_map_array [ "TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB", "LOC_CUSTOM, TYPE_INT, TEXTURE_CUBE_ARRAY_INDEX, extra_ARB_texture_cube_map_array_OES_texture_cube_map_array" ], + + # GL_NUM_SHADING_LANGUAGE_VERSIONS + [ "NUM_SHADING_LANGUAGE_VERSIONS", "LOC_CUSTOM, TYPE_INT, 0, extra_version_43" ], ]}, # Enums in OpenGL Core profile and ES 3.0 diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c index 931f6a4..3d5ae0b 100644 --- a/src/mesa/main/getstring.c +++ b/src/mesa/main/getstring.c @@ -32,6 +32,7 @@ #include "extensions.h" #include "mtypes.h" #include "macros.h" +#include "version.h" /** * Return the string for a glGetString(GL_SHADING_LANGUAGE_VERSION) query. @@ -186,6 +187,25 @@ _mesa_GetStringi(GLenum name, GLuint index) return (const GLubyte *) 0; } return _mesa_get_enabled_extension(ctx, index); + case GL_SHADING_LANGUAGE_VERSION: + { + char *version; + int num; + if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 43) { + _mesa_error(ctx, GL_INVALID_ENUM, + "glGetStringi(GL_SHADING_LANGUAGE_VERSION): " + "supported only in GL4.3 and later"); + return (const GLubyte *) 0; + } + num = _mesa_get_shading_language_version(ctx, index, &version); + if (index >= num) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glGetStringi(GL_SHADING_LANGUAGE_VERSION, index=%d)", + index); + return (const GLubyte *) 0; + } + return (const GLubyte *) version; + } default: _mesa_error(ctx, GL_INVALID_ENUM, "glGetStringi"); return (const GLubyte *) 0; diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c index 1fce8fe..d26baab 100644 --- a/src/mesa/main/version.c +++ b/src/mesa/main/version.c @@ -665,3 +665,67 @@ _mesa_get_device_uuid(struct gl_context *ctx, GLint *uuid) { ctx->Driver.GetDeviceUuid(ctx, (char*) uuid); } + +/** + * Get the i-th GLSL version string. If index=0, return the most recent + * supported version. + * \param ctx context to query + * \param index which version string to return, or -1 if none + * \param versionOut returns the vesrion string + * \return total number of shading language versions. + */ +int +_mesa_get_shading_language_version(const struct gl_context *ctx, + int index, + char **versionOut) +{ + int n = 0; + +#define GLSL_VERSION(S) \ + if (n++ == index) \ + *versionOut = S + + /* GLSL core */ + if (ctx->Const.GLSLVersion >= 460) + GLSL_VERSION("460"); + if (ctx->Const.GLSLVersion >= 450) + GLSL_VERSION("450"); + if (ctx->Const.GLSLVersion >= 440) + GLSL_VERSION("440"); + if (ctx->Const.GLSLVersion >= 430) + GLSL_VERSION("430"); + if (ctx->Const.GLSLVersion >= 420) + GLSL_VERSION("420"); + if (ctx->Const.GLSLVersion >= 410) + GLSL_VERSION("410"); + if (ctx->Const.GLSLVersion >= 400) + GLSL_VERSION("400"); + if (ctx->Const.GLSLVersion >= 330) + GLSL_VERSION("330"); + if (ctx->Const.GLSLVersion >= 150) + GLSL_VERSION("150"); + if (ctx->Const.GLSLVersion >= 140) + GLSL_VERSION("140"); + if (ctx->Const.GLSLVersion >= 130) + GLSL_VERSION("130"); + if (ctx->Const.GLSLVersion >= 120) + GLSL_VERSION("120"); + /* The GL spec says to return the empty string for GLSL 1.10 */ + if (ctx->Const.GLSLVersion >= 110) + GLSL_VERSION(""); + + /* GLSL es */ + if ((ctx->API == API_OPENGLES2 && ctx->Version >= 32) || + ctx->Extensions.ARB_ES3_2_compatibility) + GLSL_VERSION("320 es"); + if (_mesa_is_gles31(ctx) || ctx->Extensions.ARB_ES3_1_compatibility) + GLSL_VERSION("310 es"); + if (_mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility) + GLSL_VERSION("300 es"); + if (ctx->API == API_OPENGLES2 || ctx->Extensions.ARB_ES2_compatibility) + GLSL_VERSION("100"); + +#undef GLSL_VERSION + + return n; +} diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h index 4cb5e5f..adfec6f 100644 --- a/src/mesa/main/version.h +++ b/src/mesa/main/version.h @@ -53,4 +53,9 @@ _mesa_get_driver_uuid(struct gl_context *ctx, GLint *uuid); extern void _mesa_get_device_uuid(struct gl_context *ctx, GLint *uuid); +extern int +_mesa_get_shading_language_version(const struct gl_context *ctx, + int index, + char **versionOut); + #endif /* VERSION_H */ -- 2.7.4