<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jan 10, 2017 at 9:28 AM, Lionel Landwerlin <span dir="ltr"><<a href="mailto:lionel.g.landwerlin@intel.com" target="_blank">lionel.g.landwerlin@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">With shaders using a lot of inputs/outputs, like this (from Gtk+) :<br>
<br>
layout(location = 0) in vec2 inPos;<br>
layout(location = 1) in float inGradientPos;<br>
layout(location = 2) in flat int inRepeating;<br>
layout(location = 3) in flat int inStopCount;<br>
layout(location = 4) in flat vec4 inClipBounds;<br>
layout(location = 5) in flat vec4 inClipWidths;<br>
layout(location = 6) in flat ColorStop inStops[8];<br>
<br>
layout(location = 0) out vec4 outColor;<br>
<br>
we're missing the programming of the input_slots_valid field leading<br>
to an assert further down the backend code.<br>
<br>
Note that we need the shader to be translated from spirv before we can<br>
get the number of inputs/outputs so we set this in a post function and<br>
leave the field at 0 for hashing.<br>
<br>
v2: Use valid slots of the geometry or vertex stage (Jason)<br>
<br>
</span>v3: Use helper to find correct vue map (Jason)<br>
<br>
Signed-off-by: Lionel Landwerlin <<a href="mailto:lionel.g.landwerlin@intel.com">lionel.g.landwerlin@intel.com</a><wbr>><br>
---<br>
 src/intel/vulkan/anv_pipeline.<wbr>c | 17 +++++++++++++++--<br>
 1 file changed, 15 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_<wbr>pipeline.c b/src/intel/vulkan/anv_<wbr>pipeline.c<br>
index 2c46ef5bf9..b625b35267 100644<br>
<span class="">--- a/src/intel/vulkan/anv_<wbr>pipeline.c<br>
+++ b/src/intel/vulkan/anv_<wbr>pipeline.c<br>
@@ -266,8 +266,6 @@ populate_wm_prog_key(const struct gen_device_info *devinfo,<br>
<br>
    populate_sampler_prog_key(<wbr>devinfo, &key->tex);<br>
<br>
-   /* TODO: Fill out key->input_slots_valid */<br>
-<br>
    /* Vulkan doesn't specify a default */<br>
    key->high_quality_derivatives = false;<br>
<br>
</span>@@ -293,6 +291,19 @@ populate_wm_prog_key(const struct gen_device_info *devinfo,<br>
<span class=""> }<br>
<br>
 static void<br>
+post_populate_wm_prog_key(<wbr>const struct anv_pipeline *pipeline,<br>
+                          const nir_shader *nir,<br>
+                          struct brw_wm_prog_key *key)<br>
+{<br>
+   if (_mesa_bitcount_64(nir->info-><wbr>inputs_read &<br>
+                         BRW_FS_VARYING_INPUT_MASK) > 16) {<br>
</span>+      const struct brw_vue_map *vue_map =<br>
+         anv_pipeline_get_fs_input_map(<wbr>pipeline);<br>
+      key->input_slots_valid = vue_map->slots_valid;<br>
<span class="">+   }<br>
+}<br>
+<br>
+static void<br>
 populate_cs_prog_key(const struct gen_device_info *devinfo,<br>
                      struct brw_cs_prog_key *key)<br>
 {<br>
</span>@@ -616,6 +627,8 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline,<br>
<div class="HOEnZb"><div class="h5">       if (nir == NULL)<br>
          return vk_error(VK_ERROR_OUT_OF_HOST_<wbr>MEMORY);<br>
<br>
+      post_populate_wm_prog_key(<wbr>pipeline, nir, &key);<br></div></div></blockquote><div><br></div><div>Sorry to make you go into v4 but... we can't do this here.<br><br></div><div>The whole point of the key is to ensure that we recompile the shader whenever some important external bit of data changes.  The VUE map from some other stage is definitely "external" and important. :-)<br><br></div><div>The first and easiest option would be to get rid of the dependence on NIR and just set key->input_slots_valid to vue_map->slots_valid all the time regardless of what NIR says.  This does, of course, mean that we'll end up doing a lot more recompilation than maybe we wanted to.  Sadly, I'm not quickly coming up with a good way to do much better.<br><br></div><div>At some point, I'd like to make it possible to do SPIR-V -> NIR way earlier on in the compilation process.  At that point, this becomes a lot more tractable problem.  Short of doing that, however, I think we're probably stuck with more recompiles than needed.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
+<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>
--<br>
2.11.0<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>
</div></div></blockquote></div><br></div></div>