nak/qmd: Add a nak_get_qmd_cbuf_desc_layout() helper

Fixes: 976f22a5da ("nvk: Implement CmdProcess/ExecuteGeneratedCommandsEXT")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33771>
(cherry picked from commit c540e5e2cc)
This commit is contained in:
Faith Ekstrand 2025-02-26 10:17:10 -06:00 committed by Eric Engestrom
parent bac3b56d51
commit 95d0ecd6e5
3 changed files with 41 additions and 1 deletions

View file

@ -334,7 +334,7 @@
"description": "nak/qmd: Add a nak_get_qmd_cbuf_desc_layout() helper",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "976f22a5da30c503b05e2873e4d265fb0d4ecb07",
"notes": null

View file

@ -246,6 +246,14 @@ struct nak_qmd_dispatch_size_layout {
struct nak_qmd_dispatch_size_layout
nak_get_qmd_dispatch_size_layout(const struct nv_device_info *dev);
struct nak_qmd_cbuf_desc_layout {
uint16_t addr_lo_start, addr_lo_end;
uint16_t addr_hi_start, addr_hi_end;
};
struct nak_qmd_cbuf_desc_layout
nak_get_qmd_cbuf_desc_layout(const struct nv_device_info *dev, uint8_t idx);
#ifdef __cplusplus
}
#endif

View file

@ -18,6 +18,7 @@ trait QMD {
fn new() -> Self;
fn set_barrier_count(&mut self, barrier_count: u8);
fn set_cbuf(&mut self, idx: u8, addr: u64, size: u32);
fn cbuf_desc_layout(idx: u8) -> nak_qmd_cbuf_desc_layout;
fn set_global_size(&mut self, width: u32, height: u32, depth: u32);
fn set_local_size(&mut self, width: u16, height: u16, depth: u16);
fn set_prog_addr(&mut self, addr: u64);
@ -135,6 +136,19 @@ macro_rules! qmd_impl_set_cbuf {
set_array!(bv, $c, $s, CONSTANT_BUFFER_VALID, idx, true);
}
fn cbuf_desc_layout(idx: u8) -> nak_qmd_cbuf_desc_layout {
let lo =
paste! {$c::[<$s _CONSTANT_BUFFER_ADDR_LOWER>]}(idx.into());
let hi =
paste! {$c::[<$s _CONSTANT_BUFFER_ADDR_UPPER>]}(idx.into());
nak_qmd_cbuf_desc_layout {
addr_lo_start: lo.start as u16,
addr_lo_end: lo.end as u16,
addr_hi_start: hi.start as u16,
addr_hi_end: hi.end as u16,
}
}
};
}
@ -436,3 +450,21 @@ pub extern "C" fn nak_get_qmd_dispatch_size_layout(
panic!("Unsupported shader model");
}
}
#[no_mangle]
pub extern "C" fn nak_get_qmd_cbuf_desc_layout(
dev: &nv_device_info,
idx: u8,
) -> nak_qmd_cbuf_desc_layout {
if dev.cls_compute >= clc6c0::AMPERE_COMPUTE_A {
Qmd3_0::cbuf_desc_layout(idx.into())
} else if dev.cls_compute >= clc3c0::VOLTA_COMPUTE_A {
Qmd2_2::cbuf_desc_layout(idx.into())
} else if dev.cls_compute >= clc0c0::PASCAL_COMPUTE_A {
Qmd2_1::cbuf_desc_layout(idx.into())
} else if dev.cls_compute >= cla0c0::KEPLER_COMPUTE_A {
Qmd0_6::cbuf_desc_layout(idx.into())
} else {
panic!("Unsupported shader model");
}
}