anv/pipeline: Fix up deref modes if we delete a FS output

With the new deref instructions, we have to keep the modes consistent
between the derefs and the variables they reference.  Since we remove
outputs by changing them to local variables, we need to run the fixup
pass to fix the modes.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Jason Ekstrand
2018-06-27 18:25:17 -07:00
parent 7f75cf2a94
commit 4d57e543b8

View File

@@ -930,6 +930,7 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,
num_rts++; num_rts++;
} }
bool deleted_output = false;
nir_foreach_variable_safe(var, &nir->outputs) { nir_foreach_variable_safe(var, &nir->outputs) {
if (var->data.location < FRAG_RESULT_DATA0) if (var->data.location < FRAG_RESULT_DATA0)
continue; continue;
@@ -937,6 +938,7 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,
const unsigned rt = var->data.location - FRAG_RESULT_DATA0; const unsigned rt = var->data.location - FRAG_RESULT_DATA0;
if (rt >= key.nr_color_regions) { if (rt >= key.nr_color_regions) {
/* Out-of-bounds, throw it away */ /* Out-of-bounds, throw it away */
deleted_output = true;
var->data.mode = nir_var_local; var->data.mode = nir_var_local;
exec_node_remove(&var->node); exec_node_remove(&var->node);
exec_list_push_tail(&impl->locals, &var->node); exec_list_push_tail(&impl->locals, &var->node);
@@ -948,6 +950,9 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,
var->data.location = rt_to_bindings[rt] + FRAG_RESULT_DATA0; var->data.location = rt_to_bindings[rt] + FRAG_RESULT_DATA0;
} }
if (deleted_output)
nir_fixup_deref_modes(nir);
if (num_rts == 0) { if (num_rts == 0) {
/* If we have no render targets, we need a null render target */ /* If we have no render targets, we need a null render target */
rt_bindings[0] = (struct anv_pipeline_binding) { rt_bindings[0] = (struct anv_pipeline_binding) {