rusticl/kernel: use binding for filling image channel data and order

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19381>
This commit is contained in:
Karol Herbst
2022-10-29 19:26:08 +02:00
committed by Marge Bot
parent b44bf80ee6
commit eae281e788

View File

@@ -68,7 +68,10 @@ pub struct KernelArg {
spirv: spirv::SPIRVKernelArg, spirv: spirv::SPIRVKernelArg,
pub kind: KernelArgType, pub kind: KernelArgType,
pub size: usize, pub size: usize,
/// The offset into the input buffer
pub offset: usize, pub offset: usize,
/// The actual binding slot
pub binding: u32,
pub dead: bool, pub dead: bool,
} }
@@ -127,6 +130,7 @@ impl KernelArg {
// we'll update it later in the 2nd pass // we'll update it later in the 2nd pass
kind: kind, kind: kind,
offset: 0, offset: 0,
binding: 0,
dead: true, dead: true,
}); });
} }
@@ -143,6 +147,7 @@ impl KernelArg {
) { ) {
if let Some(arg) = args.get_mut(var.data.location as usize) { if let Some(arg) = args.get_mut(var.data.location as usize) {
arg.offset = var.data.driver_location as usize; arg.offset = var.data.driver_location as usize;
arg.binding = var.data.binding;
arg.dead = false; arg.dead = false;
} else { } else {
internal_args internal_args
@@ -159,6 +164,7 @@ impl KernelArg {
bin.append(&mut self.spirv.serialize()); bin.append(&mut self.spirv.serialize());
bin.extend_from_slice(&self.size.to_ne_bytes()); bin.extend_from_slice(&self.size.to_ne_bytes());
bin.extend_from_slice(&self.offset.to_ne_bytes()); bin.extend_from_slice(&self.offset.to_ne_bytes());
bin.extend_from_slice(&self.binding.to_ne_bytes());
bin.extend_from_slice(&(self.dead as u8).to_ne_bytes()); bin.extend_from_slice(&(self.dead as u8).to_ne_bytes());
bin.extend_from_slice(&(self.kind as u8).to_ne_bytes()); bin.extend_from_slice(&(self.kind as u8).to_ne_bytes());
@@ -169,6 +175,7 @@ impl KernelArg {
let spirv = spirv::SPIRVKernelArg::deserialize(bin)?; let spirv = spirv::SPIRVKernelArg::deserialize(bin)?;
let size = read_ne_usize(bin); let size = read_ne_usize(bin);
let offset = read_ne_usize(bin); let offset = read_ne_usize(bin);
let binding = read_ne_u32(bin);
let dead = read_ne_u8(bin) == 1; let dead = read_ne_u8(bin) == 1;
let kind = match read_ne_u8(bin) { let kind = match read_ne_u8(bin) {
@@ -188,6 +195,7 @@ impl KernelArg {
kind: kind, kind: kind,
size: size, size: size,
offset: offset, offset: offset,
binding: binding,
dead: dead, dead: dead,
}) })
} }
@@ -941,10 +949,11 @@ impl Kernel {
(&mut tex_formats, &mut tex_orders) (&mut tex_formats, &mut tex_orders)
}; };
assert!(arg.offset >= formats.len()); let binding = arg.binding as usize;
assert!(binding >= formats.len());
formats.resize(arg.offset, 0); formats.resize(binding, 0);
orders.resize(arg.offset, 0); orders.resize(binding, 0);
formats.push(mem.image_format.image_channel_data_type as u16); formats.push(mem.image_format.image_channel_data_type as u16);
orders.push(mem.image_format.image_channel_order as u16); orders.push(mem.image_format.image_channel_order as u16);