From 1631ebbc5a993b1a24edcfd9ac6bf6ddc147bdeb Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Wed, 13 May 2026 14:15:10 -0400 Subject: [PATCH] kraid: Plumb through Model::encode_shader() Of course, we can't actually encode anything yet but this gives us the model hook and deals with the util_dynarray so that everything inside the model hook is safe code. Part-of: --- src/panfrost/compiler/kraid/compile.rs | 17 +++++++++++++++-- src/panfrost/compiler/kraid/model.rs | 7 +++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/panfrost/compiler/kraid/compile.rs b/src/panfrost/compiler/kraid/compile.rs index 2fda89b5f1a..b32cfc515d3 100644 --- a/src/panfrost/compiler/kraid/compile.rs +++ b/src/panfrost/compiler/kraid/compile.rs @@ -46,11 +46,23 @@ fn dump_shader(s: &Shader, suffix: &str) { eprintln!("Kraid shader {suffix}:{out}"); } +fn dynarray_append_vec(buf: &mut util_dynarray, vec: Vec) { + unsafe { + let p = util_dynarray_grow_bytes( + buf, + vec.len().try_into().unwrap(), + std::mem::size_of::(), + ); + assert!(!p.is_null(), "util_dynarray_grow_bytes() failed"); + std::ptr::copy_nonoverlapping(vec.as_ptr(), p as *mut T, vec.len()); + } +} + #[no_mangle] pub extern "C" fn kraid_compile_nir( nir: &mut nir_shader, inputs: &pan_compile_inputs, - _binary: &mut util_dynarray, + binary: &mut util_dynarray, _info: &mut pan_shader_info, ) { let model = model_for_gpu_id(inputs.gpu_id).unwrap(); @@ -65,5 +77,6 @@ pub extern "C" fn kraid_compile_nir( dump_shader(&s, "after register assignment"); s.validate(); - todo!("Compile to binaries"); + let bin = model.encode_shader(&s); + dynarray_append_vec(binary, bin); } diff --git a/src/panfrost/compiler/kraid/model.rs b/src/panfrost/compiler/kraid/model.rs index d67039f2e19..8595fced93c 100644 --- a/src/panfrost/compiler/kraid/model.rs +++ b/src/panfrost/compiler/kraid/model.rs @@ -1,10 +1,13 @@ // Copyright © 2026 Collabora, Ltd. // SPDX-License-Identifier: MIT +use crate::ir::*; use kraid_bindings::*; pub trait Model { fn arch(&self) -> u8; + + fn encode_shader(&self, s: &Shader<'_>) -> Vec; } struct ValhallModel { @@ -15,6 +18,10 @@ impl Model for ValhallModel { fn arch(&self) -> u8 { self.arch } + + fn encode_shader(&self, _s: &Shader<'_>) -> Vec { + todo!("Implement Valhall shader encoding"); + } } pub fn model_for_gpu_id(gpu_id: u64) -> Result, &'static str> {