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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user