diff --git a/.pick_status.json b/.pick_status.json index fbaf8561a3c..c1153054049 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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 diff --git a/src/nouveau/compiler/nak.h b/src/nouveau/compiler/nak.h index 83f8571fb84..1687d60178a 100644 --- a/src/nouveau/compiler/nak.h +++ b/src/nouveau/compiler/nak.h @@ -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 diff --git a/src/nouveau/compiler/nak/qmd.rs b/src/nouveau/compiler/nak/qmd.rs index e4eab58104e..00e1bbb5847 100644 --- a/src/nouveau/compiler/nak/qmd.rs +++ b/src/nouveau/compiler/nak/qmd.rs @@ -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"); + } +}