diff --git a/src/compiler/glsl/gl_nir_linker.c b/src/compiler/glsl/gl_nir_linker.c index 0d2acfdb524..41099593adb 100644 --- a/src/compiler/glsl/gl_nir_linker.c +++ b/src/compiler/glsl/gl_nir_linker.c @@ -35,6 +35,7 @@ #include "main/shaderobj.h" #include "util/glheader.h" #include "util/perf/cpu_trace.h" +#include "pipe/p_screen.h" /** * This file included general link methods, using NIR. @@ -1275,7 +1276,8 @@ lower_patch_vertices_in(struct gl_shader_program *shader_prog) } static void -preprocess_shader(const struct gl_constants *consts, +preprocess_shader(const struct pipe_screen *screen, + const struct gl_constants *consts, const struct gl_extensions *exts, struct gl_program *prog, struct gl_shader_program *shader_program, @@ -1283,7 +1285,7 @@ preprocess_shader(const struct gl_constants *consts, { const struct gl_shader_compiler_options *gl_options = &consts->ShaderCompilerOptions[prog->info.stage]; - const nir_shader_compiler_options *options = gl_options->NirOptions; + const nir_shader_compiler_options *options = screen->nir_options[prog->info.stage]; assert(options); nir_shader *nir = prog->nir; @@ -1358,15 +1360,15 @@ preprocess_shader(const struct gl_constants *consts, } static bool -prelink_lowering(const struct gl_constants *consts, +prelink_lowering(const struct pipe_screen *screen, + const struct gl_constants *consts, const struct gl_extensions *exts, struct gl_shader_program *shader_program, struct gl_linked_shader **linked_shader, unsigned num_shaders) { for (unsigned i = 0; i < num_shaders; i++) { struct gl_linked_shader *shader = linked_shader[i]; - const nir_shader_compiler_options *options = - consts->ShaderCompilerOptions[shader->Stage].NirOptions; + const nir_shader_compiler_options *options = screen->nir_options[shader->Stage]; struct gl_program *prog = shader->Program; /* NIR drivers that support tess shaders and compact arrays need to use @@ -1384,7 +1386,7 @@ prelink_lowering(const struct gl_constants *consts, i == MESA_SHADER_VERTEX) remove_dead_varyings_pre_linking(prog->nir); - preprocess_shader(consts, exts, prog, shader_program, shader->Stage); + preprocess_shader(screen, consts, exts, prog, shader_program, shader->Stage); if (prog->nir->info.shared_size > consts->MaxComputeSharedMemorySize) { linker_error(shader_program, "Too much shared memory used (%u/%u)\n", @@ -1587,7 +1589,8 @@ gl_nir_lower_optimize_varyings(const struct gl_constants *consts, } bool -gl_nir_link_spirv(const struct gl_constants *consts, +gl_nir_link_spirv(const struct pipe_screen *screen, + const struct gl_constants *consts, const struct gl_extensions *exts, struct gl_shader_program *prog, const struct gl_nir_linker_options *options) @@ -1607,7 +1610,7 @@ gl_nir_link_spirv(const struct gl_constants *consts, gl_nir_link_assign_xfb_resources(consts, prog); - if (!prelink_lowering(consts, exts, prog, linked_shader, num_shaders)) + if (!prelink_lowering(screen, consts, exts, prog, linked_shader, num_shaders)) return false; gl_nir_lower_optimize_varyings(consts, prog, true); @@ -3228,7 +3231,8 @@ is_sampler_array_accessed_indirectly(nir_deref_instr *deref) * that includes loop induction variable). */ static bool -validate_sampler_array_indexing(const struct gl_constants *consts, +validate_sampler_array_indexing(const struct pipe_screen *screen, + const struct gl_constants *consts, struct gl_shader_program *prog) { for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { @@ -3236,7 +3240,7 @@ validate_sampler_array_indexing(const struct gl_constants *consts, continue; bool no_dynamic_indexing = - consts->ShaderCompilerOptions[i].NirOptions->force_indirect_unrolling_sampler; + screen->nir_options[i]->force_indirect_unrolling_sampler; bool uses_indirect_sampler_array_indexing = false; nir_foreach_function_impl(impl, prog->_LinkedShaders[i]->Program->nir) { @@ -3958,7 +3962,8 @@ gl_nir_link_glsl(struct gl_context *ctx, struct gl_shader_program *prog) if (!gl_assign_attribute_or_color_locations(consts, prog)) goto done; - if (!prelink_lowering(consts, exts, prog, linked_shader, num_linked_shaders)) + if (!prelink_lowering(ctx->screen, consts, exts, prog, linked_shader, + num_linked_shaders)) goto done; if (!gl_nir_link_varyings(consts, exts, api, prog)) @@ -3970,7 +3975,7 @@ gl_nir_link_glsl(struct gl_context *ctx, struct gl_shader_program *prog) */ if ((!prog->IsES && prog->GLSL_Version < 130) || (prog->IsES && prog->GLSL_Version < 300)) { - if (!validate_sampler_array_indexing(consts, prog)) + if (!validate_sampler_array_indexing(ctx->screen, consts, prog)) goto done; } diff --git a/src/compiler/glsl/gl_nir_linker.h b/src/compiler/glsl/gl_nir_linker.h index f9a83580d73..42081aad39d 100644 --- a/src/compiler/glsl/gl_nir_linker.h +++ b/src/compiler/glsl/gl_nir_linker.h @@ -46,6 +46,7 @@ struct gl_program; struct gl_transform_feedback_info; struct xfb_decl; struct nir_xfb_info; +struct pipe_screen; struct gl_nir_linker_options { bool fill_parameters; @@ -62,7 +63,8 @@ void gl_nir_opts(nir_shader *nir); void gl_nir_detect_recursion_linked(struct gl_shader_program *prog, nir_shader *shader); -bool gl_nir_link_spirv(const struct gl_constants *consts, +bool gl_nir_link_spirv(const struct pipe_screen *screen, + const struct gl_constants *consts, const struct gl_extensions *exts, struct gl_shader_program *prog, const struct gl_nir_linker_options *options); diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 4062d428b8d..e7e39150083 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -41,6 +41,7 @@ #include "glsl_to_nir.h" #include "ir_optimization.h" #include "builtin_functions.h" +#include "pipe/p_screen.h" /** * Format a short human-readable description of the given GLSL version. @@ -2449,7 +2450,8 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, if (shader->CompileStatus == COMPILE_SUCCESS) { memcpy(shader->compiled_source_blake3, source_blake3, BLAKE3_OUT_LEN); - shader->nir = glsl_to_nir(shader, options->NirOptions, source_blake3); + shader->nir = glsl_to_nir(shader, ctx->screen->nir_options[shader->Stage], + source_blake3); } if (ctx->Cache && shader->CompileStatus == COMPILE_SUCCESS) { diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp index f96fd97f8ba..f9cbcdc9299 100644 --- a/src/compiler/glsl/standalone.cpp +++ b/src/compiler/glsl/standalone.cpp @@ -42,6 +42,7 @@ #include "main/mtypes.h" #include "program/program.h" #include "nir_shader_compiler_options.h" +#include "pipe/p_screen.h" static const struct standalone_options *options; @@ -55,10 +56,10 @@ initialize_context(struct gl_context *ctx, gl_api api) _mesa_glsl_builtin_functions_init_or_ref(); ctx->Version = 450; - ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].NirOptions = - &nir_fs_options; - ctx->Const.ShaderCompilerOptions[MESA_SHADER_FRAGMENT].NirOptions = - &nir_vs_options; + + ctx->screen->nir_options[MESA_SHADER_VERTEX] = &nir_vs_options; + ctx->screen->nir_options[MESA_SHADER_FRAGMENT] = &nir_fs_options; + /* The standalone compiler needs to claim support for almost * everything in order to compile the built-in functions. diff --git a/src/compiler/glsl/standalone_scaffolding.cpp b/src/compiler/glsl/standalone_scaffolding.cpp index 13f24ff8e2d..f1218348d59 100644 --- a/src/compiler/glsl/standalone_scaffolding.cpp +++ b/src/compiler/glsl/standalone_scaffolding.cpp @@ -36,6 +36,7 @@ #include "util/strtod.h" #include "main/mtypes.h" #include "string_to_uint_map.h" +#include "pipe/p_screen.h" void _mesa_warning(struct gl_context *ctx, const char *fmt, ...) @@ -201,6 +202,8 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api) { memset(ctx, 0, sizeof(*ctx)); + ctx->screen = (struct pipe_screen*)calloc(1, sizeof(struct pipe_screen)); + ctx->API = api; ctx->Extensions.dummy_true = true; diff --git a/src/compiler/glsl/tests/test_gl_lower_mediump.cpp b/src/compiler/glsl/tests/test_gl_lower_mediump.cpp index cd49092b66f..78d34daa487 100644 --- a/src/compiler/glsl/tests/test_gl_lower_mediump.cpp +++ b/src/compiler/glsl/tests/test_gl_lower_mediump.cpp @@ -37,6 +37,7 @@ #include "glsl_to_nir.h" #include "linker_util.h" #include "nir_builder.h" +#include "pipe/p_screen.h" /* The printed-GLSL-IR tests use fmemopen so we can do stdio to memory (or you'd * need equivalent tempfiles that you manage). Just disable this test on those @@ -174,7 +175,7 @@ namespace for (int i = 0; i < MESA_SHADER_STAGES; i++) { ctx->Const.ShaderCompilerOptions[i].LowerPrecisionFloat16 = true; ctx->Const.ShaderCompilerOptions[i].LowerPrecisionInt16 = true; - ctx->Const.ShaderCompilerOptions[i].NirOptions = &compiler_options; + ctx->screen->nir_options[i] = &compiler_options; } /* GL_ARB_explicit_uniform_location, GL_MAX_UNIFORM_LOCATIONS */ diff --git a/src/mesa/main/consts_exts.h b/src/mesa/main/consts_exts.h index 06af0af02b1..89fada4a25d 100644 --- a/src/mesa/main/consts_exts.h +++ b/src/mesa/main/consts_exts.h @@ -362,8 +362,6 @@ struct gl_shader_compiler_options /** (driconf) Force gl_Position to be considered precise */ GLboolean PositionAlwaysPrecise; - - const struct nir_shader_compiler_options *NirOptions; }; /** diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 9fcafeb3c2f..a55a9a5e061 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -209,8 +209,6 @@ void st_init_limits(struct pipe_screen *screen, (sh == PIPE_SHADER_COMPUTE && !screen->caps.compute)) continue; - options->NirOptions = screen->nir_options[stage]; - pc->MaxTextureImageUnits = _min(screen->shader_caps[sh].max_texture_samplers, MAX_TEXTURE_IMAGE_UNITS); diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 620b3c36283..70f2a85eac7 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -449,8 +449,8 @@ st_link_glsl_to_nir(struct gl_context *ctx, static const gl_nir_linker_options opts = { true /*fill_parameters */ }; - if (!gl_nir_link_spirv(&ctx->Const, &ctx->Extensions, shader_program, - &opts)) + if (!gl_nir_link_spirv(ctx->screen, &ctx->Const, &ctx->Extensions, + shader_program, &opts)) return GL_FALSE; }