[Mesa-dev] [PATCH] mesa: add glsl version query (v4)

Vadym Shovkoplias vadim.shovkoplias at gmail.com
Tue Feb 13 12:07:18 UTC 2018


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 <andriy.khulap at globallogic.com>
Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com>
---
 src/mapi/glapi/gen/GL4x.xml      |  1 +
 src/mesa/main/get.c              | 14 +++++++++
 src/mesa/main/get_hash_params.py |  3 ++
 src/mesa/main/getstring.c        | 18 +++++++++++
 src/mesa/main/version.c          | 64 ++++++++++++++++++++++++++++++++++++++++
 src/mesa/main/version.h          |  5 ++++
 6 files changed, 105 insertions(+)

diff --git a/src/mapi/glapi/gen/GL4x.xml b/src/mapi/glapi/gen/GL4x.xml
index cd2e3b831e..2116286b35 100644
--- a/src/mapi/glapi/gen/GL4x.xml
+++ b/src/mapi/glapi/gen/GL4x.xml
@@ -42,6 +42,7 @@
 
 <category name="4.3">
   <enum name="SHADER_STORAGE_BARRIER_BIT"                value="0x2000" />
+  <enum name="NUM_SHADING_LANGUAGE_VERSIONS"             value="0x82E9" />
   <enum name="MAX_COMBINED_SHADER_OUTPUT_RESOURCES"      value="0x8F39" />
   <enum name="SHADER_STORAGE_BUFFER"                     value="0x90D2"/>
   <enum name="SHADER_STORAGE_BUFFER_BINDING"             value="0x90D3"/>
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 218801791e..9663387be7 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -165,6 +165,7 @@ enum value_extra {
    EXTRA_EXT_FB_NO_ATTACH_GS,
    EXTRA_EXT_ES_GS,
    EXTRA_EXT_PROVOKING_VERTEX_32,
+   EXTRA_EXT_GL43_NUM_SHADING_LANG_VERSIONS,
 };
 
 #define NO_EXTRA NULL
@@ -589,6 +590,10 @@ static const int extra_EXT_disjoint_timer_query[] = {
    EXTRA_END
 };
 
+static const int extra_EXT_gl43_num_shading_lang_versions[] = {
+   EXTRA_EXT_GL43_NUM_SHADING_LANG_VERSIONS,
+   EXTRA_END
+};
 
 /* This is the big table describing all the enums we accept in
  * glGet*v().  The table is partitioned into six parts: enums
@@ -1084,6 +1089,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;
@@ -1342,6 +1351,11 @@ check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d
          if (ctx->API == API_OPENGL_COMPAT || version == 32)
             api_found = ctx->Extensions.EXT_provoking_vertex;
          break;
+      case EXTRA_EXT_GL43_NUM_SHADING_LANG_VERSIONS:
+         api_check = TRUE;
+         if (_mesa_is_desktop_gl(ctx) && version >= 43)
+            api_found = GL_TRUE;
+         break;
       case EXTRA_END:
          break;
       default: /* *e is a offset into the extension struct */
diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
index e127b6bdb2..e31496579e 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_EXT_gl43_num_shading_lang_versions" ],
 ]},
 
 # Enums in OpenGL Core profile and ES 3.0
diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c
index 931f6a476c..5431b4e31e 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,23 @@ _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 1fce8fe7ca..d26baab820 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 4cb5e5f0fa..adfec6f828 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.14.1



More information about the mesa-dev mailing list