From 3127282944e5458ab2eeb82ba53b39bbb045ebbd Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Wed, 8 Sep 2021 14:44:11 +0800 Subject: [PATCH] mesa/st: delay nir spirv link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Timothy Arceri Signed-off-by: Qiang Yu Part-of: --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 50 ++++++++--------------- 1 file changed, 18 insertions(+), 32 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;