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 <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19559>
(cherry picked from commit c0c911d9ba)
This commit is contained in:
Friedrich Vock 2022-11-06 17:36:39 +01:00 committed by Eric Engestrom
parent e65d574613
commit 826be8bafe
8 changed files with 33 additions and 7 deletions

View file

@ -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"
},

View file

@ -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;

View file

@ -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);

View file

@ -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" ],

View file

@ -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);

View file

@ -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,

View file

@ -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,

View file

@ -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);