Mesa (main): mesa/st: delay nir spirv link
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Oct 13 05:12:05 UTC 2021
Module: Mesa
Branch: main
Commit: 3127282944e5458ab2eeb82ba53b39bbb045ebbd
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3127282944e5458ab2eeb82ba53b39bbb045ebbd
Author: Qiang Yu <yuq825 at gmail.com>
Date: Wed Sep 8 14:44:11 2021 +0800
mesa/st: delay nir spirv link
Following commit for st_nir_link_shaders->nir_link_opt_varyings
may copy uniform variable from one shader to another, so delay
the nir_spirv link which contains mesa uniform information
update (gl_nir_link_uniforms) after it and align with glsl link.
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
Signed-off-by: Qiang Yu <yuq825 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12613>
---
src/mesa/state_tracker/st_glsl_to_nir.cpp | 48 +++++++++++--------------------
1 file changed, 17 insertions(+), 31 deletions(-)
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 79c3d8d8359..deface8ad4b 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -766,9 +766,10 @@ st_link_nir(struct gl_context *ctx,
}
prog->nir = glsl_to_nir(st->ctx, shader_program, shader->Stage, options);
- st_nir_preprocess(st, prog, shader_program, shader->Stage);
}
+ st_nir_preprocess(st, prog, shader_program, shader->Stage);
+
if (options->lower_to_scalar) {
NIR_PASS_V(shader->Program->nir, nir_lower_load_const_to_scalar);
}
@@ -776,28 +777,6 @@ st_link_nir(struct gl_context *ctx,
st_lower_patch_vertices_in(shader_program);
- /* For SPIR-V, we have to perform the NIR linking before applying
- * st_nir_preprocess.
- */
- if (shader_program->data->spirv) {
- static const gl_nir_linker_options opts = {
- true /*fill_parameters */
- };
- if (!gl_nir_link_spirv(ctx, shader_program, &opts))
- return GL_FALSE;
-
- nir_build_program_resource_list(ctx, shader_program, true);
-
- for (unsigned i = 0; i < num_shaders; i++) {
- struct gl_linked_shader *shader = linked_shader[i];
- struct gl_program *prog = shader->Program;
-
- prog->ExternalSamplersUsed = gl_external_samplers(prog);
- _mesa_update_shader_textures_used(shader_program, prog);
- st_nir_preprocess(st, prog, shader_program, shader->Stage);
- }
- }
-
/* Linking the stages in the opposite order (from fragment to vertex)
* ensures that inter-shader outputs written to in an earlier stage
* are eliminated if they are (transitively) not used in a later
@@ -814,19 +793,26 @@ st_link_nir(struct gl_context *ctx,
if (num_shaders == 1)
st_nir_opts(linked_shader[0]->Program->nir);
- if (!shader_program->data->spirv) {
+ if (shader_program->data->spirv) {
+ static const gl_nir_linker_options opts = {
+ true /*fill_parameters */
+ };
+ if (!gl_nir_link_spirv(ctx, shader_program, &opts))
+ return GL_FALSE;
+ } else {
if (!gl_nir_link_glsl(ctx, shader_program))
return GL_FALSE;
+ }
- for (unsigned i = 0; i < num_shaders; i++) {
- struct gl_program *prog = linked_shader[i]->Program;
- prog->ExternalSamplersUsed = gl_external_samplers(prog);
- _mesa_update_shader_textures_used(shader_program, prog);
- }
-
- nir_build_program_resource_list(ctx, shader_program, false);
+ for (unsigned i = 0; i < num_shaders; i++) {
+ struct gl_program *prog = linked_shader[i]->Program;
+ prog->ExternalSamplersUsed = gl_external_samplers(prog);
+ _mesa_update_shader_textures_used(shader_program, prog);
}
+ nir_build_program_resource_list(ctx, shader_program,
+ shader_program->data->spirv);
+
for (unsigned i = 0; i < num_shaders; i++) {
struct gl_linked_shader *shader = linked_shader[i];
nir_shader *nir = shader->Program->nir;
More information about the mesa-commit
mailing list