<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Nov 2, 2017 at 12:28 AM, Samuel Iglesias Gonsálvez <span dir="ltr"><<a href="mailto:siglesias@igalia.com" target="_blank">siglesias@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We can write to the same output but in different components, like<br>
in this example:<br>
<br>
layout(location = 0, component = 0) out ivec2 dEQP_FragColor_0;<br>
layout(location = 0, component = 2) out ivec2 dEQP_FragColor_1;<br>
<br>
Therefore, they are not two different outputs but only one.<br>
<br>
Fixes:<br>
<br>
dEQP-VK.glsl.440.linkage.<wbr>varying.component.frag_out.*<br>
<br>
Signed-off-by: Samuel Iglesias Gonsálvez <<a href="mailto:siglesias@igalia.com">siglesias@igalia.com</a>><br>
---<br>
 src/compiler/shader_enums.h     |  1 +<br>
 src/intel/vulkan/anv_pipeline.<wbr>c | 10 +++++++++-<br>
 2 files changed, 10 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h<br>
index 9d229d4199e..90729dbfd96 100644<br>
--- a/src/compiler/shader_enums.h<br>
+++ b/src/compiler/shader_enums.h<br>
@@ -603,6 +603,7 @@ typedef enum<br>
    FRAG_RESULT_DATA5,<br>
    FRAG_RESULT_DATA6,<br>
    FRAG_RESULT_DATA7,<br>
+   FRAG_RESULT_MAX, /**< Number of fragment program results */<br>
 } gl_frag_result;<br>
<br>
 const char *gl_frag_result_name(gl_frag_<wbr>result result);<br>
diff --git a/src/intel/vulkan/anv_<wbr>pipeline.c b/src/intel/vulkan/anv_<wbr>pipeline.c<br>
index 907b24a758d..be007f24e3f 100644<br>
--- a/src/intel/vulkan/anv_<wbr>pipeline.c<br>
+++ b/src/intel/vulkan/anv_<wbr>pipeline.c<br>
@@ -872,6 +872,8 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,<br>
       unsigned num_rts = 0;<br>
       struct anv_pipeline_binding rt_bindings[8];<br>
       nir_function_impl *impl = nir_shader_get_entrypoint(nir)<wbr>;<br>
+      int map_old_to_new_loc[FRAG_<wbr>RESULT_MAX];<br>
+      memset(map_old_to_new_loc, -1, sizeof(int) * FRAG_RESULT_MAX);<br>
       nir_foreach_variable_safe(var, &nir->outputs) {<br>
          if (var->data.location < FRAG_RESULT_DATA0)<br>
             continue;<br>
@@ -886,7 +888,13 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,<br>
          }<br>
<br>
          /* Give it a new, compacted, location */<br>
-         var->data.location = FRAG_RESULT_DATA0 + num_rts;<br>
+         if (var->data.location != -1) {<br></blockquote><div><br></div><div>How is this even possible?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+            if (map_old_to_new_loc[var->data.<wbr>location] == -1)<br>
+               map_old_to_new_loc[var->data.<wbr>location] = FRAG_RESULT_DATA0 + num_rts;<br>
+            var->data.location = map_old_to_new_loc[var->data.<wbr>location];<br>
+         } else {<br>
+            var->data.location = FRAG_RESULT_DATA0 + num_rts;<br>
+         }<br></blockquote><div><br></div><div>I see what you are trying to fix.  However, if we're going to get composite types right, I think we need to do it in three passes:</div><div><br></div><div> 1) Define a `bool rt_used[MAX_RTS]` map and walk over everything and flag the given RT as used.</div><div> 2) Walk over rt_used and generated a `int rt_to_binding[MAX_RTS]` map as well as set up the `rt_bindings` map (which is really just a map going in the other direction).</div><div> 3) Walk the variables again and re-assign locations using `rt_to_binding`<br></div><div><br></div><div>I don't see how any more direct method will actually yield the correct result in all of the crazy cases such as where you have an array of vec2s at component 0 and then a bunch of stray floats at components 2 and 3.</div><div><br></div><div>Sorry for not responding earlier,</div><div>--Jason<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
          unsigned array_len =<br>
             glsl_type_is_array(var->type) ? glsl_get_length(var->type) : 1;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.14.2<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>