[Mesa-dev] [PATCH 09/23] nir: Return progress from nir_lower_clip_cull_distance_arrays().
Matt Turner
mattst88 at gmail.com
Thu Mar 16 21:18:06 UTC 2017
---
src/compiler/nir/nir.h | 2 +-
.../nir/nir_lower_clip_cull_distance_arrays.c | 39 ++++++++++++++++------
2 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 1c792f1..a0c57f4 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -2498,7 +2498,7 @@ bool nir_lower_idiv(nir_shader *shader);
void nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables);
void nir_lower_clip_fs(nir_shader *shader, unsigned ucp_enables);
-void nir_lower_clip_cull_distance_arrays(nir_shader *nir);
+bool nir_lower_clip_cull_distance_arrays(nir_shader *nir);
void nir_lower_two_sided_color(nir_shader *shader);
diff --git a/src/compiler/nir/nir_lower_clip_cull_distance_arrays.c b/src/compiler/nir/nir_lower_clip_cull_distance_arrays.c
index 5a89edd..b255bc5 100644
--- a/src/compiler/nir/nir_lower_clip_cull_distance_arrays.c
+++ b/src/compiler/nir/nir_lower_clip_cull_distance_arrays.c
@@ -73,13 +73,13 @@ update_type(nir_variable *var, gl_shader_stage stage, unsigned length)
/**
* Rewrite any clip/cull distances to refer to the new combined array.
*/
-static void
+static bool
rewrite_references(nir_instr *instr,
nir_variable *combined,
unsigned cull_offset)
{
if (instr->type != nir_instr_type_intrinsic)
- return;
+ return false;
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
@@ -88,15 +88,15 @@ rewrite_references(nir_instr *instr,
if (intrin->intrinsic != nir_intrinsic_load_var &&
intrin->intrinsic != nir_intrinsic_store_var)
- return;
+ return false;
nir_deref_var *var_ref = intrin->variables[0];
if (var_ref->var->data.mode != combined->data.mode)
- return;
+ return false;
if (var_ref->var->data.location != VARYING_SLOT_CLIP_DIST0 &&
var_ref->var->data.location != VARYING_SLOT_CULL_DIST0)
- return;
+ return false;
/* Update types along the deref chain */
const struct glsl_type *type = combined->type;
@@ -119,15 +119,18 @@ rewrite_references(nir_instr *instr,
var_ref->var = combined;
/* There's no need to update writemasks; it's a scalar array. */
+
+ return true;
}
-static void
+static bool
combine_clip_cull(nir_shader *nir,
struct exec_list *vars,
bool store_info)
{
nir_variable *cull = NULL;
nir_variable *clip = NULL;
+ bool progress = false;
nir_foreach_variable(var, vars) {
if (var->data.location == VARYING_SLOT_CLIP_DIST0)
@@ -162,11 +165,21 @@ combine_clip_cull(nir_shader *nir,
/* Rewrite CullDistance to reference the combined array */
nir_foreach_function(function, nir) {
if (function->impl) {
+ bool this_progress = false;
+
nir_foreach_block(block, function->impl) {
nir_foreach_instr(instr, block) {
- rewrite_references(instr, clip, clip_array_size);
+ this_progress |= rewrite_references(instr, clip,
+ clip_array_size);
}
}
+
+ if (this_progress) {
+ nir_metadata_preserve(function->impl,
+ nir_metadata_block_index |
+ nir_metadata_dominance);
+ }
+ progress |= this_progress;
}
}
@@ -175,14 +188,20 @@ combine_clip_cull(nir_shader *nir,
ralloc_free(cull);
}
}
+
+ return progress;
}
-void
+bool
nir_lower_clip_cull_distance_arrays(nir_shader *nir)
{
+ bool progress = false;
+
if (nir->stage <= MESA_SHADER_GEOMETRY)
- combine_clip_cull(nir, &nir->outputs, true);
+ progress |= combine_clip_cull(nir, &nir->outputs, true);
if (nir->stage > MESA_SHADER_VERTEX)
- combine_clip_cull(nir, &nir->inputs, false);
+ progress |= combine_clip_cull(nir, &nir->inputs, false);
+
+ return progress;
}
--
2.10.2
More information about the mesa-dev
mailing list