nir: Report progress from nir_lower_system_values().
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 17 Sep 2015 20:00:58 +0000 (13:00 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 21 Sep 2015 20:47:00 +0000 (13:47 -0700)
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/glsl/nir/nir.h
src/glsl/nir/nir_lower_system_values.c

index bccaf58c03c72d4c586c4acfff79a65dbec81d58..99cfe9dfb279cd11b860bd9e2afcb0eec7c51e7c 100644 (file)
@@ -1835,7 +1835,7 @@ void nir_lower_phis_to_scalar(nir_shader *shader);
 void nir_lower_samplers(nir_shader *shader,
                         const struct gl_shader_program *shader_program);
 
-void nir_lower_system_values(nir_shader *shader);
+bool nir_lower_system_values(nir_shader *shader);
 
 typedef struct nir_lower_tex_options {
    /**
index 06ee3e68c8d46b5bd05894a0550cc216b305ca13..d77bb2f821304e871a924b5c4efc14dca4714e33 100644 (file)
 #include "nir.h"
 #include "main/mtypes.h"
 
-static void
+static bool
 convert_instr(nir_intrinsic_instr *instr)
 {
    if (instr->intrinsic != nir_intrinsic_load_var)
-      return;
+      return false;
 
    nir_variable *var = instr->variables[0]->var;
    if (var->data.mode != nir_var_system_value)
-      return;
+      return false;
 
    void *mem_ctx = ralloc_parent(instr);
 
@@ -54,36 +54,45 @@ convert_instr(nir_intrinsic_instr *instr)
 
    nir_instr_insert_before(&instr->instr, &new_instr->instr);
    nir_instr_remove(&instr->instr);
+
+   return true;
 }
 
 static bool
 convert_block(nir_block *block, void *state)
 {
-   (void) state;
+   bool *progress = state;
 
    nir_foreach_instr_safe(block, instr) {
       if (instr->type == nir_instr_type_intrinsic)
-         convert_instr(nir_instr_as_intrinsic(instr));
+         *progress = convert_instr(nir_instr_as_intrinsic(instr)) || *progress;
    }
 
    return true;
 }
 
-static void
+static bool
 convert_impl(nir_function_impl *impl)
 {
-   nir_foreach_block(impl, convert_block, NULL);
+   bool progress;
+
+   nir_foreach_block(impl, convert_block, &progress);
    nir_metadata_preserve(impl, nir_metadata_block_index |
                                nir_metadata_dominance);
+   return progress;
 }
 
-void
+bool
 nir_lower_system_values(nir_shader *shader)
 {
+   bool progress = false;
+
    nir_foreach_overload(shader, overload) {
       if (overload->impl)
-         convert_impl(overload->impl);
+         progress = convert_impl(overload->impl) || progress;
    }
 
    exec_list_make_empty(&shader->system_values);
+
+   return progress;
 }