anv/pipeline: Delete out-of-bounds fragment shader outputs
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 17 Feb 2016 21:46:44 +0000 (13:46 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 18 Feb 2016 02:04:39 +0000 (18:04 -0800)
src/vulkan/anv_pipeline.c

index e6cc8faf4fc909c50f824a90501c0c9ce820aab2..4be2bfc625b8ee245f262db1a81da1889eec0ea8 100644 (file)
@@ -616,6 +616,19 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,
       if (nir == NULL)
          return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
 
+      nir_function_impl *impl = nir_shader_get_entrypoint(nir)->impl;
+      nir_foreach_variable_safe(var, &nir->outputs) {
+         if (var->data.location < FRAG_RESULT_DATA0)
+            continue;
+
+         unsigned rt = var->data.location - FRAG_RESULT_DATA0;
+         if (rt >= key.nr_color_regions) {
+            var->data.mode = nir_var_local;
+            exec_node_remove(&var->node);
+            exec_list_push_tail(&impl->locals, &var->node);
+         }
+      }
+
       void *mem_ctx = ralloc_context(NULL);
 
       if (module->nir == NULL)