From 826be8bafee7d356e8f73dbe0faf39e0e878179c Mon Sep 17 00:00:00 2001 From: Friedrich Vock Date: Sun, 6 Nov 2022 17:36:39 +0100 Subject: [PATCH] mesa: Report GL_SHADER_BINARY_FORMAT_SPIR_V as supported MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Part-of: (cherry picked from commit c0c911d9ba3b8c2f3d9a4ad2646b392a7bdb3f9a) --- .pick_status.json | 2 +- 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 +- 8 files changed, 33 insertions(+), 7 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index fe66bf79331..c5640ee1c40 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -6799,7 +6799,7 @@ "description": "mesa: Report GL_SHADER_BINARY_FORMAT_SPIR_V as supported", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "5bc03d250861df6836f9c9fe37e0609c1777a87b" }, diff --git a/src/mesa/main/consts_exts.h b/src/mesa/main/consts_exts.h index 11221ca58ad..105c762e1e9 100644 --- a/src/mesa/main/consts_exts.h +++ b/src/mesa/main/consts_exts.h @@ -936,6 +936,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 bcd18d0549f..bcbaa825867 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -584,6 +584,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), @@ -1303,6 +1310,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 e1ee26e0847..540150082d9 100644 --- a/src/mesa/main/get_hash_params.py +++ b/src/mesa/main/get_hash_params.py @@ -343,8 +343,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 9573b5f8679..1ead4f588f8 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -663,7 +663,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 9b1844c6ba4..e4ca16d9eb9 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 575b72937c7..7ed51fc4b16 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -1431,7 +1431,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);