<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">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><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">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">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>