anv/pipeline: Fix up deref modes if we delete a FS output
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 28 Jun 2018 01:25:17 +0000 (18:25 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 2 Aug 2018 01:02:28 +0000 (18:02 -0700)
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>
src/intel/vulkan/anv_pipeline.c

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