diff --git a/src/gallium/frontends/rusticl/core/program.rs b/src/gallium/frontends/rusticl/core/program.rs index f18e6f38f81..cd5c0403c2f 100644 --- a/src/gallium/frontends/rusticl/core/program.rs +++ b/src/gallium/frontends/rusticl/core/program.rs @@ -359,11 +359,11 @@ impl Program { let mut info = self.build_info(); let d = Self::dev_build_info(&mut info, dev); let lib = options.contains("-create-library"); - let args = prepare_options(&options, dev); - let (spirv, log) = if self.il.is_some() { - (self.il.clone(), String::new()) + let (spirv, log) = if let Some(il) = self.il.as_ref() { + il.clone_on_validate() } else { + let args = prepare_options(&options, dev); spirv::SPIRVBin::from_clc( &self.src, &args, @@ -416,11 +416,10 @@ impl Program { let mut info = self.build_info(); let d = Self::dev_build_info(&mut info, dev); - let (spirv, log) = if self.il.is_some() { - (self.il.clone(), String::new()) + let (spirv, log) = if let Some(il) = self.il.as_ref() { + il.clone_on_validate() } else { let args = prepare_options(&options, dev); - spirv::SPIRVBin::from_clc( &self.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 854518a0ae8..8aadb26a8f6 100644 --- a/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs +++ b/src/gallium/frontends/rusticl/mesa/compiler/clc/spirv.rs @@ -55,6 +55,14 @@ unsafe extern "C" fn spirv_to_nir_msg_callback( callback_impl(data, msg); } +fn create_clc_logger(msgs: &mut Vec) -> clc_logger { + clc_logger { + priv_: msgs as *mut Vec as *mut c_void, + error: Some(spirv_msg_callback), + warning: Some(spirv_msg_callback), + } +} + impl SPIRVBin { pub fn from_clc( source: &CString, @@ -113,11 +121,7 @@ impl SPIRVBin { address_bits: address_bits, }; let mut msgs: Vec = Vec::new(); - let logger = clc_logger { - priv_: &mut msgs as *mut Vec as *mut c_void, - error: Some(spirv_msg_callback), - warning: Some(spirv_msg_callback), - }; + let logger = create_clc_logger(&mut msgs); let mut out = clc_binary::default(); let res = unsafe { clc_compile_c_to_spirv(&args, &logger, &mut out) }; @@ -154,11 +158,7 @@ impl SPIRVBin { }; let mut msgs: Vec = Vec::new(); - let logger = clc_logger { - priv_: &mut msgs as *mut Vec as *mut c_void, - error: Some(spirv_msg_callback), - warning: Some(spirv_msg_callback), - }; + let logger = create_clc_logger(&mut msgs); let mut out = clc_binary::default(); let res = unsafe { clc_link_spirv(&linker_args, &logger, &mut out) }; @@ -188,6 +188,14 @@ impl SPIRVBin { (res, msgs.join("\n")) } + pub fn clone_on_validate(&self) -> (Option, String) { + let mut msgs: Vec = Vec::new(); + let logger = create_clc_logger(&mut msgs); + let res = unsafe { clc_validate_spirv(&self.spirv, &logger) }; + + (res.then(|| self.clone()), msgs.join("\n")) + } + fn kernel_infos(&self) -> &[clc_kernel_info] { match self.info { None => &[],