mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
spirv/cl: support vload/vstore
Signed-off-by: Karol Herbst <kherbst@redhat.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
d11b807da5
commit
7f85283103
1 changed files with 55 additions and 0 deletions
|
|
@ -182,6 +182,55 @@ handle_special(struct vtn_builder *b, enum OpenCLstd opcode, unsigned num_srcs,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_handle_v_load_store(struct vtn_builder *b, enum OpenCLstd opcode,
|
||||
const uint32_t *w, unsigned count, bool load)
|
||||
{
|
||||
struct vtn_type *type;
|
||||
if (load)
|
||||
type = vtn_value(b, w[1], vtn_value_type_type)->type;
|
||||
else
|
||||
type = vtn_untyped_value(b, w[5])->type;
|
||||
unsigned a = load ? 0 : 1;
|
||||
|
||||
const struct glsl_type *dest_type = type->type;
|
||||
unsigned components = glsl_get_vector_elements(dest_type);
|
||||
unsigned stride = components * glsl_get_bit_size(dest_type) / 8;
|
||||
|
||||
nir_ssa_def *offset = vtn_ssa_value(b, w[5 + a])->def;
|
||||
struct vtn_value *p = vtn_value(b, w[6 + a], vtn_value_type_pointer);
|
||||
|
||||
nir_deref_instr *deref = vtn_pointer_to_deref(b, p->pointer);
|
||||
|
||||
/* 1. cast to vec type with adjusted stride */
|
||||
deref = nir_build_deref_cast(&b->nb, &deref->dest.ssa, deref->mode,
|
||||
dest_type, stride);
|
||||
/* 2. deref ptr_as_array */
|
||||
deref = nir_build_deref_ptr_as_array(&b->nb, deref, offset);
|
||||
|
||||
if (load) {
|
||||
struct vtn_ssa_value *val = vtn_local_load(b, deref, p->type->access);
|
||||
vtn_push_ssa(b, w[2], type, val);
|
||||
} else {
|
||||
struct vtn_ssa_value *val = vtn_ssa_value(b, w[5]);
|
||||
vtn_local_store(b, val, deref, p->type->access);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
vtn_handle_opencl_vload(struct vtn_builder *b, enum OpenCLstd opcode,
|
||||
const uint32_t *w, unsigned count)
|
||||
{
|
||||
_handle_v_load_store(b, opcode, w, count, true);
|
||||
}
|
||||
|
||||
static void
|
||||
vtn_handle_opencl_vstore(struct vtn_builder *b, enum OpenCLstd opcode,
|
||||
const uint32_t *w, unsigned count)
|
||||
{
|
||||
_handle_v_load_store(b, opcode, w, count, false);
|
||||
}
|
||||
|
||||
static nir_ssa_def *
|
||||
handle_printf(struct vtn_builder *b, enum OpenCLstd opcode, unsigned num_srcs,
|
||||
nir_ssa_def **srcs, const struct glsl_type *dest_type)
|
||||
|
|
@ -262,6 +311,12 @@ vtn_handle_opencl_instruction(struct vtn_builder *b, uint32_t ext_opcode,
|
|||
case U_Upsample:
|
||||
handle_instr(b, ext_opcode, w, count, handle_special);
|
||||
return true;
|
||||
case Vloadn:
|
||||
vtn_handle_opencl_vload(b, ext_opcode, w, count);
|
||||
return true;
|
||||
case Vstoren:
|
||||
vtn_handle_opencl_vstore(b, ext_opcode, w, count);
|
||||
return true;
|
||||
case Printf:
|
||||
handle_instr(b, ext_opcode, w, count, handle_printf);
|
||||
return true;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue