[Mesa-dev] [PATCH 1/2] spirv: Fix image writes with less than 4 components.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Sat Jul 14 23:24:55 UTC 2018


nir_validate complains in case less than 4 components are
provided.

CC: 18.1 <mesa-stable at lists.freedesktop.org>
---
 src/compiler/spirv/spirv_to_nir.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 48154303ff2..b082af57b10 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -2450,10 +2450,20 @@ vtn_handle_image(struct vtn_builder *b, SpvOp opcode,
    case SpvOpAtomicStore:
       intrin->src[3] = nir_src_for_ssa(vtn_ssa_value(b, w[4])->def);
       break;
-   case SpvOpImageWrite:
-      intrin->src[3] = nir_src_for_ssa(vtn_ssa_value(b, w[3])->def);
-      break;
+   case SpvOpImageWrite: {
+      nir_ssa_def *value = vtn_ssa_value(b, w[3])->def;
 
+      if (value->num_components < 4) {
+         unsigned swiz[4];
+         for (unsigned i = 0; i < 4; i++)
+            swiz[i] = i < value->num_components ? i : 0;
+
+         value = nir_swizzle(&b->nb, value, swiz, 4, false);
+      }
+
+      intrin->src[3] = nir_src_for_ssa(value);
+      break;
+   }
    case SpvOpAtomicCompareExchange:
    case SpvOpAtomicIIncrement:
    case SpvOpAtomicIDecrement:
-- 
2.18.0



More information about the mesa-dev mailing list