rusticl/program: validate the SPIR-V when created from IL

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8771
Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22280>
This commit is contained in:
Karol Herbst 2023-04-04 04:35:41 +02:00 committed by Marge Bot
parent 8fcfc51dad
commit d7e9b4ef5b
2 changed files with 23 additions and 16 deletions

View file

@ -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,

View file

@ -55,6 +55,14 @@ unsafe extern "C" fn spirv_to_nir_msg_callback(
callback_impl(data, msg);
}
fn create_clc_logger(msgs: &mut Vec<String>) -> clc_logger {
clc_logger {
priv_: msgs as *mut Vec<String> 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<String> = Vec::new();
let logger = clc_logger {
priv_: &mut msgs as *mut Vec<String> 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<String> = Vec::new();
let logger = clc_logger {
priv_: &mut msgs as *mut Vec<String> 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<Self>, String) {
let mut msgs: Vec<String> = 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 => &[],