From c540e5e2ccb543329af77a3b03d70a1949da5f71 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Wed, 26 Feb 2025 10:17:10 -0600 Subject: [PATCH] nak/qmd: Add a nak_get_qmd_cbuf_desc_layout() helper Fixes: 976f22a5da30 ("nvk: Implement CmdProcess/ExecuteGeneratedCommandsEXT") Part-of: --- src/nouveau/compiler/nak.h | 8 ++++++++ src/nouveau/compiler/nak/qmd.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/nouveau/compiler/nak.h b/src/nouveau/compiler/nak.h index 851d1bf2fb5..aee83e4b710 100644 --- a/src/nouveau/compiler/nak.h +++ b/src/nouveau/compiler/nak.h @@ -263,6 +263,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 43886935666..1ee8d91ae36 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"); + } +}