Module: Mesa
Branch: master
Commit: 3adc4c41e10bd9327ade23a55ee0b7a6e1a7dc43
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=3adc4c41e10bd9327ade23a55ee0b7a6e1a7dc43

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Mar 19 18:50:22 2021 -0400

zink: fix spirv image operand ordering

image operands are ordered by their operand's spirv value, meaning that
the availability operands need to go last here

Fixes: 882ab6afb77 ("zink: add spirv builder functions for image ops")

Reviewed-by: Adam Jackson <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9724>

---

 .../drivers/zink/nir_to_spirv/spirv_builder.c      | 67 +++++++++-------------
 1 file changed, 28 insertions(+), 39 deletions(-)

diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c 
b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
index 1b74472e6fe..8c73c8f56e8 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
@@ -744,33 +744,30 @@ spirv_builder_emit_image_sample(struct spirv_builder *b,
 
    SpvImageOperandsMask operand_mask = SpvImageOperandsMaskNone;
    SpvId extra_operands[5];
-   int num_extra_operands = 0;
+   int num_extra_operands = 1;
    if (bias) {
-      extra_operands[++num_extra_operands] = bias;
+      extra_operands[num_extra_operands++] = bias;
       operand_mask |= SpvImageOperandsBiasMask;
    }
    if (lod) {
-      extra_operands[++num_extra_operands] = lod;
+      extra_operands[num_extra_operands++] = lod;
       operand_mask |= SpvImageOperandsLodMask;
    } else if (dx && dy) {
-      extra_operands[++num_extra_operands] = dx;
-      extra_operands[++num_extra_operands] = dy;
+      extra_operands[num_extra_operands++] = dx;
+      extra_operands[num_extra_operands++] = dy;
       operand_mask |= SpvImageOperandsGradMask;
    }
    assert(!(const_offset && offset));
    if (const_offset) {
-      extra_operands[++num_extra_operands] = const_offset;
+      extra_operands[num_extra_operands++] = const_offset;
       operand_mask |= SpvImageOperandsConstOffsetMask;
    } else if (offset) {
-      extra_operands[++num_extra_operands] = offset;
+      extra_operands[num_extra_operands++] = offset;
       operand_mask |= SpvImageOperandsOffsetMask;
    }
 
    /* finalize num_extra_operands / extra_operands */
-   if (num_extra_operands > 0) {
-      extra_operands[0] = operand_mask;
-      num_extra_operands++;
-   }
+   extra_operands[0] = operand_mask;
 
    spirv_buffer_prepare(&b->instructions, b->mem_ctx, operands + 
num_extra_operands);
    spirv_buffer_emit_word(&b->instructions, opcode | ((operands + 
num_extra_operands) << 16));
@@ -825,22 +822,21 @@ spirv_builder_emit_image_read(struct spirv_builder *b,
    SpvImageOperandsMask operand_mask = SpvImageOperandsMakeTexelVisibleMask | 
SpvImageOperandsNonPrivateTexelMask;
    SpvId extra_operands[5];
    int num_extra_operands = 1;
-   extra_operands[1] = spirv_builder_const_uint(b, 32, SpvScopeWorkgroup);
    if (lod) {
-      extra_operands[++num_extra_operands] = lod;
+      extra_operands[num_extra_operands++] = lod;
       operand_mask |= SpvImageOperandsLodMask;
    }
    if (sample) {
-      extra_operands[++num_extra_operands] = sample;
+      extra_operands[num_extra_operands++] = sample;
       operand_mask |= SpvImageOperandsSampleMask;
    }
    if (offset) {
-      extra_operands[++num_extra_operands] = offset;
+      extra_operands[num_extra_operands++] = offset;
       operand_mask |= SpvImageOperandsOffsetMask;
    }
    /* finalize num_extra_operands / extra_operands */
    extra_operands[0] = operand_mask;
-   num_extra_operands++;
+   extra_operands[num_extra_operands++] = spirv_builder_const_uint(b, 32, 
SpvScopeWorkgroup);
 
    spirv_buffer_prepare(&b->instructions, b->mem_ctx, 5 + num_extra_operands);
    spirv_buffer_emit_word(&b->instructions, SpvOpImageRead |
@@ -866,22 +862,21 @@ spirv_builder_emit_image_write(struct spirv_builder *b,
    SpvImageOperandsMask operand_mask = SpvImageOperandsMakeTexelAvailableMask 
| SpvImageOperandsNonPrivateTexelMask;
    SpvId extra_operands[5];
    int num_extra_operands = 1;
-   extra_operands[1] = spirv_builder_const_uint(b, 32, SpvScopeWorkgroup);
    if (lod) {
-      extra_operands[++num_extra_operands] = lod;
+      extra_operands[num_extra_operands++] = lod;
       operand_mask |= SpvImageOperandsLodMask;
    }
    if (sample) {
-      extra_operands[++num_extra_operands] = sample;
+      extra_operands[num_extra_operands++] = sample;
       operand_mask |= SpvImageOperandsSampleMask;
    }
    if (offset) {
-      extra_operands[++num_extra_operands] = offset;
+      extra_operands[num_extra_operands++] = offset;
       operand_mask |= SpvImageOperandsOffsetMask;
    }
    /* finalize num_extra_operands / extra_operands */
    extra_operands[0] = operand_mask;
-   num_extra_operands++;
+   extra_operands[num_extra_operands++] = spirv_builder_const_uint(b, 32, 
SpvScopeWorkgroup);
 
    spirv_buffer_prepare(&b->instructions, b->mem_ctx, 4 + num_extra_operands);
    spirv_buffer_emit_word(&b->instructions, SpvOpImageWrite |
@@ -910,30 +905,27 @@ spirv_builder_emit_image_gather(struct spirv_builder *b,
 
    SpvImageOperandsMask operand_mask = SpvImageOperandsMaskNone;
    SpvId extra_operands[4];
-   int num_extra_operands = 0;
+   int num_extra_operands = 1;
    if (lod) {
-      extra_operands[++num_extra_operands] = lod;
+      extra_operands[num_extra_operands++] = lod;
       operand_mask |= SpvImageOperandsLodMask;
    }
    if (sample) {
-      extra_operands[++num_extra_operands] = sample;
+      extra_operands[num_extra_operands++] = sample;
       operand_mask |= SpvImageOperandsSampleMask;
    }
    assert(!(const_offset && offset));
    if (const_offset) {
-      extra_operands[++num_extra_operands] = const_offset;
+      extra_operands[num_extra_operands++] = const_offset;
       operand_mask |= SpvImageOperandsConstOffsetMask;
    } else if (offset) {
-      extra_operands[++num_extra_operands] = offset;
+      extra_operands[num_extra_operands++] = offset;
       operand_mask |= SpvImageOperandsOffsetMask;
    }
    if (dref)
       op = SpvOpImageDrefGather;
    /* finalize num_extra_operands / extra_operands */
-   if (num_extra_operands > 0) {
-      extra_operands[0] = operand_mask;
-      num_extra_operands++;
-   }
+   extra_operands[0] = operand_mask;
 
    spirv_buffer_prepare(&b->instructions, b->mem_ctx, 6 + num_extra_operands);
    spirv_buffer_emit_word(&b->instructions, op |
@@ -965,29 +957,26 @@ spirv_builder_emit_image_fetch(struct spirv_builder *b,
 
    SpvImageOperandsMask operand_mask = SpvImageOperandsMaskNone;
    SpvId extra_operands[4];
-   int num_extra_operands = 0;
+   int num_extra_operands = 1;
    if (lod) {
-      extra_operands[++num_extra_operands] = lod;
+      extra_operands[num_extra_operands++] = lod;
       operand_mask |= SpvImageOperandsLodMask;
    }
    if (sample) {
-      extra_operands[++num_extra_operands] = sample;
+      extra_operands[num_extra_operands++] = sample;
       operand_mask |= SpvImageOperandsSampleMask;
    }
    assert(!(const_offset && offset));
    if (const_offset) {
-      extra_operands[++num_extra_operands] = const_offset;
+      extra_operands[num_extra_operands++] = const_offset;
       operand_mask |= SpvImageOperandsConstOffsetMask;
    } else if (offset) {
-      extra_operands[++num_extra_operands] = offset;
+      extra_operands[num_extra_operands++] = offset;
       operand_mask |= SpvImageOperandsOffsetMask;
    }
 
    /* finalize num_extra_operands / extra_operands */
-   if (num_extra_operands > 0) {
-      extra_operands[0] = operand_mask;
-      num_extra_operands++;
-   }
+   extra_operands[0] = operand_mask;
 
    spirv_buffer_prepare(&b->instructions, b->mem_ctx, 5 + num_extra_operands);
    spirv_buffer_emit_word(&b->instructions, SpvOpImageFetch |

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to