rusticl/kernel: add work_dim lowering

No driver implements this in hardware, so let's implement it once in the
frontend.

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19362>
This commit is contained in:
Karol Herbst
2022-10-28 01:45:46 +02:00
committed by Marge Bot
parent ff24eeee20
commit 43c5a7a6b4
3 changed files with 24 additions and 0 deletions
@@ -59,6 +59,7 @@ pub enum InternalKernelArgType {
InlineSampler((cl_addressing_mode, cl_filter_mode, bool)),
FormatArray,
OrderArray,
WorkDim,
}
#[derive(Hash, PartialEq, Eq, Clone)]
@@ -210,6 +211,7 @@ impl InternalKernelArg {
}
InternalKernelArgType::FormatArray => bin.push(4),
InternalKernelArgType::OrderArray => bin.push(5),
InternalKernelArgType::WorkDim => bin.push(6),
}
bin
@@ -231,6 +233,7 @@ impl InternalKernelArg {
}
4 => InternalKernelArgType::FormatArray,
5 => InternalKernelArgType::OrderArray,
6 => InternalKernelArgType::WorkDim,
_ => return None,
};
@@ -521,6 +524,20 @@ fn lower_and_optimize_nir_late(
);
}
if nir.reads_sysval(gl_system_value::SYSTEM_VALUE_WORK_DIM) {
res.push(InternalKernelArg {
kind: InternalKernelArgType::WorkDim,
size: 1,
offset: 0,
});
lower_state.work_dim = nir.add_var(
nir_variable_mode::nir_var_uniform,
unsafe { glsl_uint8_t_type() },
args.len() + res.len() - 1,
"work_dim",
);
}
nir.pass2(
nir_lower_vars_to_explicit_types,
nir_variable_mode::nir_var_mem_shared
@@ -901,6 +918,9 @@ impl Kernel {
input.extend_from_slice(&cl_prop::<&Vec<u16>>(&tex_orders));
input.extend_from_slice(&cl_prop::<&Vec<u16>>(&img_orders));
}
InternalKernelArgType::WorkDim => {
input.extend_from_slice(&[work_dim as u8; 1]);
}
}
}
@@ -59,6 +59,9 @@ rusticl_lower_intrinsics_instr(
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;
}
@@ -4,6 +4,7 @@ struct rusticl_lower_state {
nir_variable *printf_buf;
nir_variable *format_arr;
nir_variable *order_arr;
nir_variable *work_dim;
};
bool rusticl_lower_intrinsics(nir_shader *nir, struct rusticl_lower_state *state);