diff --git a/docs/envvars.rst b/docs/envvars.rst index 57ea5aedeec..a7b44ef1827 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -945,6 +945,7 @@ Rusticl environment variables a comma-separated list of debug channels to enable. + - ``clc`` dumps all OpenCL C source being compiled - ``program`` dumps compilation logs to stderr .. _clc-env-var: diff --git a/src/gallium/frontends/rusticl/core/platform.rs b/src/gallium/frontends/rusticl/core/platform.rs index 719c4b0b6da..93ae650d849 100644 --- a/src/gallium/frontends/rusticl/core/platform.rs +++ b/src/gallium/frontends/rusticl/core/platform.rs @@ -17,6 +17,7 @@ pub struct Platform { } pub struct PlatformDebug { + pub clc: bool, pub program: bool, } @@ -55,7 +56,10 @@ static mut PLATFORM: Platform = Platform { dispatch: &DISPATCH, devs: Vec::new(), }; -static mut PLATFORM_DBG: PlatformDebug = PlatformDebug { program: false }; +static mut PLATFORM_DBG: PlatformDebug = PlatformDebug { + clc: false, + program: false, +}; static mut PLATFORM_FEATURES: PlatformFeatures = PlatformFeatures { fp16: false, fp64: false, @@ -66,6 +70,7 @@ fn load_env() { if let Ok(debug_flags) = env::var("RUSTICL_DEBUG") { for flag in debug_flags.split(',') { match flag { + "clc" => debug.clc = true, "program" => debug.program = true, _ => eprintln!("Unknown RUSTICL_DEBUG flag found: {}", flag), } diff --git a/src/gallium/frontends/rusticl/core/program.rs b/src/gallium/frontends/rusticl/core/program.rs index 214fa30e4b5..b75b510b996 100644 --- a/src/gallium/frontends/rusticl/core/program.rs +++ b/src/gallium/frontends/rusticl/core/program.rs @@ -563,6 +563,17 @@ impl Program { } ProgramSourceType::Src(src) => { let args = prepare_options(&options, dev); + + if Platform::dbg().clc { + let src = src.to_string_lossy(); + eprintln!("dumping compilation inputs:"); + eprintln!("compilation arguments: {args:?}"); + if !headers.is_empty() { + eprintln!("headers: {headers:#?}"); + } + eprintln!("source code:\n{src}"); + } + spirv::SPIRVBin::from_clc( src, &args, diff --git a/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs b/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs index 43656dcd692..3df685a0312 100644 --- a/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs +++ b/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs @@ -7,6 +7,7 @@ use mesa_rust_util::serialize::*; use mesa_rust_util::string::*; use std::ffi::CString; +use std::fmt::Debug; use std::os::raw::c_char; use std::os::raw::c_void; use std::ptr; @@ -37,6 +38,15 @@ pub struct CLCHeader<'a> { pub source: &'a CString, } +impl<'a> Debug for CLCHeader<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let name = self.name.to_string_lossy(); + let source = self.source.to_string_lossy(); + + f.write_fmt(format_args!("[{name}]:\n{source}")) + } +} + unsafe fn callback_impl(data: *mut c_void, msg: *const c_char) { let data = data as *mut Vec; let msgs = unsafe { data.as_mut() }.unwrap();