st/glsl_to_nir: call some lowering passes earlier
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 14 Nov 2017 01:56:20 +0000 (12:56 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Sun, 3 Dec 2017 22:10:30 +0000 (09:10 +1100)
This is required so that we can enbale NIR linking optimisations.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/mesa/state_tracker/st_glsl_to_nir.cpp

index 1b4f07111cf187a9bb955eb5c60bff6b48d05013..5f92bcef0047402ed29becff8cb3bb698d2bc287 100644 (file)
@@ -300,7 +300,11 @@ st_glsl_to_nir(struct st_context *st, struct gl_program *prog,
    if (prog->nir)
       return prog->nir;
 
-   return glsl_to_nir(shader_program, stage, options);
+   nir_shader *nir = glsl_to_nir(shader_program, stage, options);
+
+   st_nir_opts(nir);
+
+   return nir;
 }
 
 /* Second third of converting glsl_to_nir. This creates uniforms, gathers
@@ -343,13 +347,6 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog,
     */
    _mesa_associate_uniform_storage(st->ctx, shader_program, prog, true);
 
-   NIR_PASS_V(nir, nir_lower_io_to_temporaries,
-         nir_shader_get_entrypoint(nir),
-         true, true);
-   NIR_PASS_V(nir, nir_lower_global_vars_to_local);
-   NIR_PASS_V(nir, nir_split_var_copies);
-   NIR_PASS_V(nir, nir_lower_var_copies);
-
    /* fragment shaders may need : */
    if (prog->info.stage == MESA_SHADER_FRAGMENT) {
       static const gl_state_index wposTransformState[STATE_LENGTH] = {
@@ -497,6 +494,13 @@ st_nir_get_mesa_program(struct gl_context *ctx,
 
    set_st_program(prog, shader_program, nir);
    prog->nir = nir;
+
+   NIR_PASS_V(nir, nir_lower_io_to_temporaries,
+              nir_shader_get_entrypoint(nir),
+              true, true);
+   NIR_PASS_V(nir, nir_lower_global_vars_to_local);
+   NIR_PASS_V(nir, nir_split_var_copies);
+   NIR_PASS_V(nir, nir_lower_var_copies);
 }
 
 extern "C" {