blob: 82543a14456eb1a1b1bba3dc10ff90173c721a54 [file] [log] [blame]
#include "CL/cl.h"
#include "nir.h"
#include "nir_builder.h"
#include "rusticl_nir.h"
static bool
rusticl_lower_intrinsics_filter(const nir_instr* instr, const void* state)
{
return instr->type == nir_instr_type_intrinsic;
}
static nir_ssa_def*
rusticl_lower_intrinsics_instr(
nir_builder *b,
nir_instr *instr,
void* _state
) {
nir_intrinsic_instr *intrins = nir_instr_as_intrinsic(instr);
struct rusticl_lower_state *state = _state;
switch (intrins->intrinsic) {
case nir_intrinsic_image_deref_format:
case nir_intrinsic_image_deref_order: {
assert(intrins->src[0].is_ssa);
int32_t offset;
nir_deref_instr *deref;
nir_ssa_def *val;
nir_variable *var;
if (intrins->intrinsic == nir_intrinsic_image_deref_format) {
offset = CL_SNORM_INT8;
var = state->format_arr;
} else {
offset = CL_R;
var = state->order_arr;
}
val = intrins->src[0].ssa;
// we put write images after read images
if (nir_intrinsic_access(intrins) & ACCESS_NON_WRITEABLE) {
val = nir_iadd_imm(b, val, b->shader->info.num_textures);
}
deref = nir_build_deref_var(b, var);
deref = nir_build_deref_array(b, deref, val);
val = nir_u2u(b, nir_load_deref(b, deref), 32);
// we have to fix up the value base
val = nir_iadd_imm(b, val, -offset);
return val;
}
case nir_intrinsic_load_base_global_invocation_id:
return nir_load_var(b, state->base_global_invoc_id);
case nir_intrinsic_load_constant_base_ptr:
return nir_load_var(b, state->const_buf);
case nir_intrinsic_load_printf_buffer_address:
return nir_load_var(b, state->printf_buf);
case nir_intrinsic_load_work_dim:
assert(state->work_dim);
return nir_u2u(b, nir_load_var(b, state->work_dim), nir_dest_bit_size(intrins->dest));
default:
return NULL;
}
}
bool
rusticl_lower_intrinsics(nir_shader *nir, struct rusticl_lower_state* state)
{
return nir_shader_lower_instructions(
nir,
rusticl_lower_intrinsics_filter,
rusticl_lower_intrinsics_instr,
state
);
}