vtn/opencl: Fix alignment for half vload/vstore
authorJesse Natalie <jenatali@microsoft.com>
Wed, 11 Nov 2020 22:24:02 +0000 (14:24 -0800)
committerMarge Bot <eric+marge@anholt.net>
Wed, 18 Nov 2020 04:05:37 +0000 (04:05 +0000)
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7565>

src/compiler/spirv/vtn_opencl.c

index 127fc9e..9a1b052 100644 (file)
@@ -632,6 +632,15 @@ _handle_v_load_store(struct vtn_builder *b, enum OpenCLstd_Entrypoints opcode,
    nir_ssa_def *offset = vtn_get_nir_ssa(b, w[5 + a]);
    struct vtn_value *p = vtn_value(b, w[6 + a], vtn_value_type_pointer);
 
+   struct vtn_ssa_value *comps[NIR_MAX_VEC_COMPONENTS];
+   nir_ssa_def *ncomps[NIR_MAX_VEC_COMPONENTS];
+
+   nir_ssa_def *moffset = nir_imul_imm(&b->nb, offset,
+      (vec_aligned && components == 3) ? 4 : components);
+   nir_deref_instr *deref = vtn_pointer_to_deref(b, p->pointer);
+
+   unsigned alignment = vec_aligned ? glsl_get_cl_alignment(type->type) :
+                                      glsl_get_bit_size(type->type) / 8;
    enum glsl_base_type ptr_base_type =
       glsl_get_base_type(p->pointer->type->type);
    if (base_type != ptr_base_type) {
@@ -641,17 +650,11 @@ _handle_v_load_store(struct vtn_builder *b, enum OpenCLstd_Entrypoints opcode,
                   "vload/vstore cannot do type conversion. "
                   "vload/vstore_half can only convert from half to other "
                   "floating-point types.");
-   }
 
-   struct vtn_ssa_value *comps[NIR_MAX_VEC_COMPONENTS];
-   nir_ssa_def *ncomps[NIR_MAX_VEC_COMPONENTS];
-
-   nir_ssa_def *moffset = nir_imul_imm(&b->nb, offset,
-      (vec_aligned && components == 3) ? 4 : components);
-   nir_deref_instr *deref = vtn_pointer_to_deref(b, p->pointer);
+      /* Above-computed alignment was for floats/doubles, not halves */
+      alignment /= glsl_get_bit_size(type->type) / glsl_base_type_get_bit_size(ptr_base_type);
+   }
 
-   unsigned alignment = vec_aligned ? glsl_get_cl_alignment(type->type) :
-                                      glsl_get_bit_size(type->type) / 8;
    deref = nir_alignment_deref_cast(&b->nb, deref, alignment, 0);
 
    for (int i = 0; i < components; i++) {