<div dir="ltr">This is fine.  For Intel hardware, the component mask is actually what we need and I figured ffs(component_mask) - 1 and bitcount(component_mask) wasn't all that onerous.  I don't care all that much though.  Of we're going this direction, maybe just do size+offset and we can compute the mask in anv?  I don't know what the radv people are doing; this may be easier for them.<br></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Nov 8, 2018 at 7:22 AM Alejandro Piñeiro <<a href="mailto:apinheiro@igalia.com">apinheiro@igalia.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Where component_offset here is the offset when accessing components of<br>
a packed variable. Or in other words, location_frac on<br>
nir.h. Different places of mesa use different names for it.<br>
<br>
Technically nir_xfb_info consumer can get the same from the<br>
component_mask, it seems somewhat forced to make it to compute it,<br>
instead of providing it.<br>
---<br>
 src/compiler/nir/nir_gather_xfb_info.c | 3 +++<br>
 src/compiler/nir/nir_xfb_info.h        | 1 +<br>
 2 files changed, 4 insertions(+)<br>
<br>
diff --git a/src/compiler/nir/nir_gather_xfb_info.c b/src/compiler/nir/nir_gather_xfb_info.c<br>
index 01fc2b26624..cd3afa32661 100644<br>
--- a/src/compiler/nir/nir_gather_xfb_info.c<br>
+++ b/src/compiler/nir/nir_gather_xfb_info.c<br>
@@ -70,6 +70,7 @@ add_var_xfb_outputs(nir_xfb_info *xfb,<br>
<br>
       assert(var->data.location_frac + comp_slots <= 8);<br>
       uint8_t comp_mask = ((1 << comp_slots) - 1) << var->data.location_frac;<br>
+      unsigned location_frac = var->data.location_frac;<br>
<br>
       assert(attrib_slots <= 2);<br>
       for (unsigned s = 0; s < attrib_slots; s++) {<br>
@@ -79,6 +80,7 @@ add_var_xfb_outputs(nir_xfb_info *xfb,<br>
          output->offset = *offset;<br>
          output->location = *location;<br>
          output->component_mask = (comp_mask >> (s * 4)) & 0xf;<br>
+         output->component_offset = location_frac;<br>
<br>
          (*location)++;<br>
          /* attrib_slots would be only > 1 for doubles. On that case<br>
@@ -86,6 +88,7 @@ add_var_xfb_outputs(nir_xfb_info *xfb,<br>
           * to use DIV_ROUND_UP or similar<br>
           */<br>
          *offset += comp_slots / attrib_slots * 4;<br>
+         location_frac = 0;<br>
       }<br>
    }<br>
 }<br>
diff --git a/src/compiler/nir/nir_xfb_info.h b/src/compiler/nir/nir_xfb_info.h<br>
index 9b543df5f47..fef52ba96d8 100644<br>
--- a/src/compiler/nir/nir_xfb_info.h<br>
+++ b/src/compiler/nir/nir_xfb_info.h<br>
@@ -34,6 +34,7 @@ typedef struct {<br>
    uint16_t offset;<br>
    uint8_t location;<br>
    uint8_t component_mask;<br>
+   uint8_t component_offset;<br>
 } nir_xfb_output_info;<br>
<br>
 typedef struct {<br>
-- <br>
2.14.1<br>
<br>
</blockquote></div>