<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p><br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 09/07/2017 07:15 PM, Jason Ekstrand
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAOFGe96Pz594NK-S2uCVRFcgiAhbOEBroX5c+XLbXy6c-xV7Og@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">On Tue, Aug 29, 2017 at 3:04 AM,
            Samuel Iglesias Gonsálvez <span dir="ltr"><<a
                href="mailto:siglesias@igalia.com" target="_blank"
                moz-do-not-send="true">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">When
              creating a vtn_pointer for an OpVariable, the block_index
              and<br>
              offsets fields are null because there is not ssa to take
              the data<br>
              from.<br>
              <br>
              However, we can dereference that pointer when processing
              an<br>
              SpvOp*AccessChain opcodes through vtn_ssa_offset_pointer_<wbr>dereference()<br>
              when the OpVariable when the StorageClass is Uniform or
              StorageBuffer.<br>
              <br>
              Inside vtn_ssa_offset_pointer_<wbr>dereference() we have
              the code to<br>
              initialize block_index and offset if they are null, but it
              is called<br>
              after checking if the pointer has then non-null.<br>
            </blockquote>
            <div><br>
            </div>
            <div>This seems fishy.  The code you're moving only triggers
              for OpPtrAccessChain.  In order to run into an issue, they
              would have to be doing an OpPtrAccessChain an an array of
              resources.  This shouldn't be allowed by the spec.  I'll
              have to look at the actual SPIR-V to be sure, but I think
              this is probably a CTS bug.<br>
            </div>
            <div> </div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    For example, one of the tests failing is:
    dEQP-VK.spirv_assembly.instruction.compute.indexing.opptraccesschain_u32<br>
    <br>
    A snippet of its SPIR-V is:<br>
    <br>
    [...]<br>
    OpDecorate %_ptr_buffer_Input ArrayStride 65536<br>
    [...]<br>
    <div align="left"> %Input = OpTypeStruct
      %_arr__arr_mat4v4float_uint_32_uint_32<br>
      %_ptr_buffer_Input = OpTypePointer StorageBuffer %Input<br>
      %dataInput = OpVariable %_ptr_buffer_Input StorageBuffer<br>
      [...]<br>
      %54 = OpPtrAccessChain %_ptr_buffer_float %dataInput %idx_1 %idx_0
      %i0 %i1 %i2 %i3<br>
      <br>
    </div>
    %dataInput points to a struct of an AoA of matrices. However,
    according to SPV_KHR_variable_pointers [0]: <br>
    <ul>
      <li>
        <p>
          Each <strong>OpPtrAccessChain</strong> must have a <em>Base</em>
          whose type is decorated with <strong>ArrayStride</strong>.
        </p>
      </li>
    </ul>
    So I think this is fine, or am I understanding it wrongly?<br>
    <br>
    Sam<br>
    <br>
    [0] <a class="moz-txt-link-freetext"
href="https://www.khronos.org/registry/spir-v/specs/1.2/SPIRV.html#OpPtrAccessChain">https://www.khronos.org/registry/spir-v/extensions/KHR/SPV_KHR_variable_pointers.html</a><br>
    <br>
    <blockquote type="cite"
cite="mid:CAOFGe96Pz594NK-S2uCVRFcgiAhbOEBroX5c+XLbXy6c-xV7Og@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              Reordering that code fixes crashes in:<br>
              <br>
                 dEQP-VK.spirv_assembly.<wbr>instruction.*.indexing.*<br>
              <br>
              Signed-off-by: Samuel Iglesias Gonsálvez <<a
                href="mailto:siglesias@igalia.com"
                moz-do-not-send="true">siglesias@igalia.com</a>><br>
              ---<br>
               src/compiler/spirv/vtn_<wbr>variables.c | 29
              +++++++++++++++--------------<br>
               1 file changed, 15 insertions(+), 14 deletions(-)<br>
              <br>
              diff --git a/src/compiler/spirv/vtn_<wbr>variables.c
              b/src/compiler/spirv/vtn_<wbr>variables.c<br>
              index 4f6acd2e07..baf1edde4c 100644<br>
              --- a/src/compiler/spirv/vtn_<wbr>variables.c<br>
              +++ b/src/compiler/spirv/vtn_<wbr>variables.c<br>
              @@ -146,20 +146,6 @@ vtn_ssa_offset_pointer_<wbr>dereference(struct
              vtn_builder *b,<br>
                  struct vtn_type *type = base->type;<br>
              <br>
                  unsigned idx = 0;<br>
              -   if (deref_chain->ptr_as_array) {<br>
              -      /* We need ptr_type for the stride */<br>
              -      assert(base->ptr_type);<br>
              -      /* This must be a pointer to an actual element
              somewhere */<br>
              -      assert(block_index && offset);<br>
              -      /* We need at least one element in the chain */<br>
              -      assert(deref_chain->length >= 1);<br>
              -<br>
              -      nir_ssa_def *elem_offset =<br>
              -         vtn_access_link_as_ssa(b,
              deref_chain->link[idx],<br>
              -                               
              base->ptr_type->stride);<br>
              -      offset = nir_iadd(&b->nb, offset,
              elem_offset);<br>
              -      idx++;<br>
              -   }<br>
              <br>
                  if (!block_index) {<br>
                     assert(base->var);<br>
              @@ -182,6 +168,21 @@ vtn_ssa_offset_pointer_<wbr>dereference(struct
              vtn_builder *b,<br>
                  }<br>
                  assert(offset);<br>
              <br>
              +   if (deref_chain->ptr_as_array) {<br>
              +      /* We need ptr_type for the stride */<br>
              +      assert(base->ptr_type);<br>
              +      /* This must be a pointer to an actual element
              somewhere */<br>
              +      assert(block_index && offset);<br>
              +      /* We need at least one element in the chain */<br>
              +      assert(deref_chain->length >= 1);<br>
              +<br>
              +      nir_ssa_def *elem_offset =<br>
              +         vtn_access_link_as_ssa(b,
              deref_chain->link[idx],<br>
              +                               
              base->ptr_type->stride);<br>
              +      offset = nir_iadd(&b->nb, offset,
              elem_offset);<br>
              +      idx++;<br>
              +   }<br>
              +<br>
                  for (; idx < deref_chain->length; idx++) {<br>
                     switch (glsl_get_base_type(type-><wbr>type)) {<br>
                     case GLSL_TYPE_UINT:<br>
              <span class="HOEnZb"><font color="#888888">--<br>
                  2.14.1<br>
                  <br>
                  ______________________________<wbr>_________________<br>
                  mesa-dev mailing list<br>
                  <a href="mailto:mesa-dev@lists.freedesktop.org"
                    moz-do-not-send="true">mesa-dev@lists.freedesktop.org</a><br>
                  <a
                    href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev"
                    rel="noreferrer" target="_blank"
                    moz-do-not-send="true">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
                </font></span></blockquote>
          </div>
          <br>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>