Module: Mesa
Branch: main
Commit: c0c911d9ba3b8c2f3d9a4ad2646b392a7bdb3f9a
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=c0c911d9ba3b8c2f3d9a4ad2646b392a7bdb3f9a

Author: Friedrich Vock <[email protected]>
Date:   Sun Nov  6 17:36:39 2022 +0100

mesa: Report GL_SHADER_BINARY_FORMAT_SPIR_V as supported

GL_ARB_gl_spirv introduced it, but its corresponding format was never listed in 
GL_SHADER_BINARY_FORMATS.

Fixes: 5bc03d25 ("mesa: implement SPIR-V loading in glShaderBinary")
Closes: #7644
Reviewed-by: Marek Olšák <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19559>

---

 src/mesa/main/consts_exts.h            |  3 +++
 src/mesa/main/get.c                    | 15 +++++++++++++++
 src/mesa/main/get_hash_params.py       |  6 ++++--
 src/mesa/state_tracker/st_context.c    |  2 +-
 src/mesa/state_tracker/st_extensions.c |  7 ++++++-
 src/mesa/state_tracker/st_extensions.h |  3 ++-
 src/mesa/state_tracker/st_manager.c    |  2 +-
 7 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/src/mesa/main/consts_exts.h b/src/mesa/main/consts_exts.h
index 33e6d7ec9d9..0a71aa1332f 100644
--- a/src/mesa/main/consts_exts.h
+++ b/src/mesa/main/consts_exts.h
@@ -929,6 +929,9 @@ struct gl_constants
    /** GL_ARB_get_program_binary */
    GLuint NumProgramBinaryFormats;
 
+   /** GL_ARB_gl_spirv */
+   GLuint NumShaderBinaryFormats;
+
    /** GL_NV_conservative_raster */
    GLuint MaxSubpixelPrecisionBiasBits;
 
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 7c347001846..ad90c44987d 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -592,6 +592,13 @@ EXTRA_EXT(ARB_spirv_extensions);
 EXTRA_EXT(NV_viewport_swizzle);
 EXTRA_EXT(ARB_sparse_texture);
 
+static const int extra_ARB_gl_spirv_or_es2_compat[] = {
+   EXT(ARB_gl_spirv),
+   EXT(ARB_ES2_compatibility),
+   EXTRA_API_ES2,
+   EXTRA_END
+};
+
 static const int
 extra_ARB_color_buffer_float_or_glcore[] = {
    EXT(ARB_color_buffer_float),
@@ -1311,6 +1318,14 @@ find_custom_value(struct gl_context *ctx, const struct 
value_desc *d, union valu
          v->value_int_n.ints[0] = GL_PROGRAM_BINARY_FORMAT_MESA;
       }
       break;
+   /* GL_ARB_gl_spirv */
+   case GL_SHADER_BINARY_FORMATS:
+      assert(ctx->Const.NumShaderBinaryFormats <= 1);
+      v->value_int_n.n = MIN2(ctx->Const.NumShaderBinaryFormats, 1);
+      if (ctx->Const.NumShaderBinaryFormats > 0) {
+         v->value_int_n.ints[0] = GL_SHADER_BINARY_FORMAT_SPIR_V;
+      }
+      break;
    /* ARB_spirv_extensions */
    case GL_NUM_SPIR_V_EXTENSIONS:
       v->value_int = _mesa_get_spirv_extension_count(ctx);
diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
index f9b4f797d68..90d09c4a631 100644
--- a/src/mesa/main/get_hash_params.py
+++ b/src/mesa/main/get_hash_params.py
@@ -347,8 +347,10 @@ descriptor=[
   [ "MAX_VARYING_VECTORS", "CONTEXT_INT(Const.MaxVarying), 
extra_ARB_ES2_compatibility_api_es2" ],
   [ "MAX_VERTEX_UNIFORM_VECTORS", "LOC_CUSTOM, TYPE_INT, 0, 
extra_ARB_ES2_compatibility_api_es2" ],
   [ "MAX_FRAGMENT_UNIFORM_VECTORS", "LOC_CUSTOM, TYPE_INT, 0, 
extra_ARB_ES2_compatibility_api_es2" ],
-  [ "NUM_SHADER_BINARY_FORMATS", "CONST(0), 
extra_ARB_ES2_compatibility_api_es2" ],
-  [ "SHADER_BINARY_FORMATS", "LOC_CUSTOM, TYPE_INVALID, 0, 
extra_ARB_ES2_compatibility_api_es2" ],
+
+# GL_ARB_ES2_compatibility / GL_ARB_gl_spirv
+  [ "NUM_SHADER_BINARY_FORMATS", "CONTEXT_UINT(Const.NumShaderBinaryFormats), 
extra_ARB_gl_spirv_or_es2_compat" ],
+  [ "SHADER_BINARY_FORMATS", "LOC_CUSTOM, TYPE_INT_N, 0, 
extra_ARB_gl_spirv_or_es2_compat" ],
 
 # GL_ARB_get_program_binary / GL_OES_get_program_binary
   [ "NUM_PROGRAM_BINARY_FORMATS", 
"CONTEXT_UINT(Const.NumProgramBinaryFormats), NO_EXTRA" ],
diff --git a/src/mesa/state_tracker/st_context.c 
b/src/mesa/state_tracker/st_context.c
index 97442d386b8..37b809a49ea 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -656,7 +656,7 @@ st_create_context_priv(struct gl_context *ctx, struct 
pipe_context *pipe,
                                         
PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET));
 
    /* GL limits and extensions */
-   st_init_limits(screen, &ctx->Const, &ctx->Extensions);
+   st_init_limits(screen, &ctx->Const, &ctx->Extensions, ctx->API);
    st_init_extensions(screen, &ctx->Const,
                       &ctx->Extensions, &st->options, ctx->API);
 
diff --git a/src/mesa/state_tracker/st_extensions.c 
b/src/mesa/state_tracker/st_extensions.c
index 2a8b3700cbc..7691669154a 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -79,7 +79,8 @@ static int _clamp(int a, int min, int max)
  * Note that we have to limit/clamp against Mesa's internal limits too.
  */
 void st_init_limits(struct pipe_screen *screen,
-                    struct gl_constants *c, struct gl_extensions *extensions)
+                    struct gl_constants *c, struct gl_extensions *extensions,
+                    gl_api api)
 {
    int supported_irs;
    unsigned sh;
@@ -491,6 +492,10 @@ void st_init_limits(struct pipe_screen *screen,
    /* GL_ARB_get_program_binary */
    if (screen->get_disk_shader_cache && screen->get_disk_shader_cache(screen))
       c->NumProgramBinaryFormats = 1;
+   /* GL_ARB_gl_spirv */
+   if (screen->get_param(screen, PIPE_CAP_GL_SPIRV) &&
+       (api == API_OPENGL_CORE || api == API_OPENGL_COMPAT))
+      c->NumShaderBinaryFormats = 1;
 
    c->MaxAtomicBufferBindings =
       MAX2(c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers,
diff --git a/src/mesa/state_tracker/st_extensions.h 
b/src/mesa/state_tracker/st_extensions.h
index 7bf1aa8c8cb..fdfac7ece70 100644
--- a/src/mesa/state_tracker/st_extensions.h
+++ b/src/mesa/state_tracker/st_extensions.h
@@ -35,7 +35,8 @@ struct pipe_screen;
 
 extern void st_init_limits(struct pipe_screen *screen,
                            struct gl_constants *c,
-                           struct gl_extensions *extensions);
+                           struct gl_extensions *extensions,
+                           gl_api api);
 
 extern void st_init_extensions(struct pipe_screen *screen,
                                struct gl_constants *consts,
diff --git a/src/mesa/state_tracker/st_manager.c 
b/src/mesa/state_tracker/st_manager.c
index 90452737fdd..a878bad2586 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -1326,7 +1326,7 @@ get_version(struct pipe_screen *screen,
    _mesa_init_constants(&consts, api);
    _mesa_init_extensions(&extensions);
 
-   st_init_limits(screen, &consts, &extensions);
+   st_init_limits(screen, &consts, &extensions, api);
    st_init_extensions(screen, &consts, &extensions, options, api);
    version = _mesa_get_version(&extensions, &consts, api);
    free(consts.SpirVExtensions);

Reply via email to