On 02/13/2018 05:07 AM, Vadym Shovkoplias wrote:
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.khu...@globallogic.com>
Signed-off-by: Vadym Shovkoplias <vadym.shovkopl...@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,

I think you should instead add a EXTRA_VERSION_43 enum earlier in the list and simplify the version checking below. I'm attaching a suggested patch.

-Brian

  };
#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 */


diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 9663387..6fb418b 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,
@@ -165,7 +166,6 @@ 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
@@ -523,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,
@@ -590,11 +591,6 @@ 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
  * understood by all GL APIs (OpenGL, GLES and GLES2), enums shared
@@ -1233,6 +1229,11 @@ check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d
          if (version >= 32)
             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);
@@ -1351,11 +1352,6 @@ 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 e314965..5d2afed 100644
--- a/src/mesa/main/get_hash_params.py
+++ b/src/mesa/main/get_hash_params.py
@@ -545,7 +545,7 @@ descriptor=[
   [ "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" ],
+  [ "NUM_SHADING_LANGUAGE_VERSIONS", "LOC_CUSTOM, TYPE_INT, 0, extra_version_43" ],
 ]},
 
 # Enums in OpenGL Core profile and ES 3.0
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to