mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
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:
parent
8fcfc51dad
commit
d7e9b4ef5b
2 changed files with 23 additions and 16 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 => &[],
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue