Module: Mesa Branch: master Commit: 949f8572ec3959be0ac21aa8857515452c180500 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=949f8572ec3959be0ac21aa8857515452c180500
Author: Jesse Natalie <[email protected]> Date: Wed Nov 11 14:24:02 2020 -0800 vtn/opencl: Fix alignment for half vload/vstore Reviewed-by: Jason Ekstrand <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7565> --- src/compiler/spirv/vtn_opencl.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/compiler/spirv/vtn_opencl.c b/src/compiler/spirv/vtn_opencl.c index 127fc9e9a85..9a1b052cd92 100644 --- a/src/compiler/spirv/vtn_opencl.c +++ b/src/compiler/spirv/vtn_opencl.c @@ -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++) { _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
