mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-10 09:58:18 +02:00
rusticl/program: store log as a CString
Reviewed-by: @LingMan Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41905>
This commit is contained in:
parent
d7674245e2
commit
01de0ff26f
3 changed files with 34 additions and 26 deletions
|
|
@ -100,7 +100,7 @@ unsafe impl CLInfoObj<cl_program_build_info, cl_device_id> for cl_program {
|
||||||
match q {
|
match q {
|
||||||
CL_PROGRAM_BINARY_TYPE => v.write::<cl_program_binary_type>(prog.bin_type(dev)),
|
CL_PROGRAM_BINARY_TYPE => v.write::<cl_program_binary_type>(prog.bin_type(dev)),
|
||||||
CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE => v.write::<usize>(0),
|
CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE => v.write::<usize>(0),
|
||||||
CL_PROGRAM_BUILD_LOG => v.write::<&str>(&prog.log(dev)),
|
CL_PROGRAM_BUILD_LOG => v.write::<&CStr>(&prog.log(dev)),
|
||||||
CL_PROGRAM_BUILD_OPTIONS => v.write::<&str>(&prog.options(dev)),
|
CL_PROGRAM_BUILD_OPTIONS => v.write::<&str>(&prog.options(dev)),
|
||||||
CL_PROGRAM_BUILD_STATUS => v.write::<cl_build_status>(prog.status(dev)),
|
CL_PROGRAM_BUILD_STATUS => v.write::<cl_build_status>(prog.status(dev)),
|
||||||
// CL_INVALID_VALUE if param_name is not one of the supported values
|
// CL_INVALID_VALUE if param_name is not one of the supported values
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@ use mesa_rust::compiler::clc::*;
|
||||||
use mesa_rust::compiler::nir::*;
|
use mesa_rust::compiler::nir::*;
|
||||||
use mesa_rust::util::disk_cache::*;
|
use mesa_rust::util::disk_cache::*;
|
||||||
use mesa_rust_gen::*;
|
use mesa_rust_gen::*;
|
||||||
|
use mesa_rust_util::string::CStringExt;
|
||||||
|
use mesa_rust_util::string::Join;
|
||||||
use rusticl_llvm_gen::*;
|
use rusticl_llvm_gen::*;
|
||||||
use rusticl_opencl_gen::*;
|
use rusticl_opencl_gen::*;
|
||||||
|
|
||||||
|
|
@ -142,7 +144,7 @@ impl ProgramBuild {
|
||||||
convert_spirv_to_nir(build, kernel_name, &args, &mut self.spec_constants, dev)
|
convert_spirv_to_nir(build, kernel_name, &args, &mut self.spec_constants, dev)
|
||||||
else {
|
else {
|
||||||
build.status = CL_BUILD_ERROR;
|
build.status = CL_BUILD_ERROR;
|
||||||
build.log = "Internal compilation error".to_owned();
|
build.log = c"Internal compilation error".to_owned();
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
kernel_info_set.insert(build_result.kernel_info);
|
kernel_info_set.insert(build_result.kernel_info);
|
||||||
|
|
@ -195,7 +197,7 @@ pub struct DeviceProgramBuild {
|
||||||
spirv: Option<spirv::SPIRVBin>,
|
spirv: Option<spirv::SPIRVBin>,
|
||||||
status: cl_build_status,
|
status: cl_build_status,
|
||||||
options: String,
|
options: String,
|
||||||
log: String,
|
log: CString,
|
||||||
bin_type: cl_program_binary_type,
|
bin_type: cl_program_binary_type,
|
||||||
pub kernels: HashMap<CString, Arc<NirKernelBuilds>>,
|
pub kernels: HashMap<CString, Arc<NirKernelBuilds>>,
|
||||||
}
|
}
|
||||||
|
|
@ -266,7 +268,7 @@ impl DeviceProgramBuild {
|
||||||
|
|
||||||
if let Some(log) = log {
|
if let Some(log) = log {
|
||||||
for line in log {
|
for line in log {
|
||||||
eprintln!("{}", line);
|
eprintln!("{line:?}");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -504,7 +506,7 @@ impl Program {
|
||||||
self.build_info().dev_build(dev).status
|
self.build_info().dev_build(dev).status
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn log(&self, dev: &Device) -> String {
|
pub fn log(&self, dev: &Device) -> CString {
|
||||||
self.build_info().dev_build(dev).log.clone()
|
self.build_info().dev_build(dev).log.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -646,7 +648,7 @@ impl Program {
|
||||||
let (spirv, log) = match &self.src {
|
let (spirv, log) = match &self.src {
|
||||||
ProgramSourceType::Il(spirv) => {
|
ProgramSourceType::Il(spirv) => {
|
||||||
if Platform::dbg().allow_invalid_spirv {
|
if Platform::dbg().allow_invalid_spirv {
|
||||||
(Some(spirv.clone()), String::new())
|
(Some(spirv.clone()), CString::default())
|
||||||
} else {
|
} else {
|
||||||
spirv.clone_on_validate(&val_options)
|
spirv.clone_on_validate(&val_options)
|
||||||
}
|
}
|
||||||
|
|
@ -692,7 +694,7 @@ impl Program {
|
||||||
if Platform::dbg().validate_spirv {
|
if Platform::dbg().validate_spirv {
|
||||||
if let Some(spirv) = spirv {
|
if let Some(spirv) = spirv {
|
||||||
let (res, spirv_msgs) = spirv.validate(&val_options);
|
let (res, spirv_msgs) = spirv.validate(&val_options);
|
||||||
(res.then_some(spirv), format!("{}\n{}", msgs, spirv_msgs))
|
(res.then_some(spirv), [msgs, spirv_msgs].join(c"\n"))
|
||||||
} else {
|
} else {
|
||||||
(None, msgs)
|
(None, msgs)
|
||||||
}
|
}
|
||||||
|
|
@ -854,7 +856,7 @@ impl Program {
|
||||||
if let Some(spirv) = spirv {
|
if let Some(spirv) = spirv {
|
||||||
let val_options = clc_validator_options(device);
|
let val_options = clc_validator_options(device);
|
||||||
let (res, spirv_msgs) = spirv.validate(&val_options);
|
let (res, spirv_msgs) = spirv.validate(&val_options);
|
||||||
(res.then_some(spirv), format!("{}\n{}", log, spirv_msgs))
|
(res.then_some(spirv), [log, spirv_msgs].join(c"\n"))
|
||||||
} else {
|
} else {
|
||||||
(None, log)
|
(None, log)
|
||||||
}
|
}
|
||||||
|
|
@ -863,7 +865,7 @@ impl Program {
|
||||||
};
|
};
|
||||||
|
|
||||||
build.spirv = spirv;
|
build.spirv = spirv;
|
||||||
build.log.push_str(&log);
|
build.log.push_cstr(&log);
|
||||||
|
|
||||||
if build.spirv.is_some() {
|
if build.spirv.is_some() {
|
||||||
build.status = CL_BUILD_SUCCESS as cl_build_status;
|
build.status = CL_BUILD_SUCCESS as cl_build_status;
|
||||||
|
|
@ -942,7 +944,7 @@ fn debug_logging(p: &Program, devs: &[&Device]) {
|
||||||
for dev in devs {
|
for dev in devs {
|
||||||
let msg = p.log(dev);
|
let msg = p.log(dev);
|
||||||
if !msg.is_empty() {
|
if !msg.is_empty() {
|
||||||
eprintln!("{}", msg);
|
eprintln!("{msg:?}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,9 +58,15 @@ impl Debug for CLCHeader<'_> {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn callback_impl(data: *mut c_void, msg: *const c_char) {
|
unsafe fn callback_impl(data: *mut c_void, msg: *const c_char) {
|
||||||
let data = data as *mut Vec<String>;
|
if msg.is_null() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let data = data as *mut Vec<CString>;
|
||||||
let msgs = unsafe { data.as_mut() }.unwrap();
|
let msgs = unsafe { data.as_mut() }.unwrap();
|
||||||
msgs.push(c_string_to_string(msg));
|
|
||||||
|
// SAFETY: msg is a valid C string.
|
||||||
|
msgs.push(unsafe { CStr::from_ptr(msg) }.to_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe extern "C" fn spirv_msg_callback(data: *mut c_void, msg: *const c_char) {
|
unsafe extern "C" fn spirv_msg_callback(data: *mut c_void, msg: *const c_char) {
|
||||||
|
|
@ -82,7 +88,7 @@ unsafe extern "C" fn spirv_to_nir_msg_callback(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_clc_logger(msgs: &mut Vec<String>) -> clc_logger {
|
fn create_clc_logger(msgs: &mut Vec<CString>) -> clc_logger {
|
||||||
clc_logger {
|
clc_logger {
|
||||||
priv_: ptr::from_mut(msgs).cast(),
|
priv_: ptr::from_mut(msgs).cast(),
|
||||||
error: Some(spirv_msg_callback),
|
error: Some(spirv_msg_callback),
|
||||||
|
|
@ -105,7 +111,7 @@ impl SPIRVBin {
|
||||||
features: clc_optional_features,
|
features: clc_optional_features,
|
||||||
spirv_extensions: &[&CStr],
|
spirv_extensions: &[&CStr],
|
||||||
address_bits: u32,
|
address_bits: u32,
|
||||||
) -> (Option<Self>, String) {
|
) -> (Option<Self>, CString) {
|
||||||
let mut hash_key = None;
|
let mut hash_key = None;
|
||||||
let has_includes = args.iter().any(|a| a.as_bytes()[0..2] == *b"-I");
|
let has_includes = args.iter().any(|a| a.as_bytes()[0..2] == *b"-I");
|
||||||
|
|
||||||
|
|
@ -130,7 +136,7 @@ impl SPIRVBin {
|
||||||
|
|
||||||
let mut key = cache.gen_key(&key);
|
let mut key = cache.gen_key(&key);
|
||||||
if let Some(data) = cache.get(&mut key) {
|
if let Some(data) = cache.get(&mut key) {
|
||||||
return (Some(Self::from_bin(&data)), String::from(""));
|
return (Some(Self::from_bin(&data)), CString::default());
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_key = Some(key);
|
hash_key = Some(key);
|
||||||
|
|
@ -163,7 +169,7 @@ impl SPIRVBin {
|
||||||
c_compatible: false,
|
c_compatible: false,
|
||||||
address_bits: address_bits,
|
address_bits: address_bits,
|
||||||
};
|
};
|
||||||
let mut msgs: Vec<String> = Vec::new();
|
let mut msgs = Vec::new();
|
||||||
let logger = create_clc_logger(&mut msgs);
|
let logger = create_clc_logger(&mut msgs);
|
||||||
let mut out = clc_binary::default();
|
let mut out = clc_binary::default();
|
||||||
|
|
||||||
|
|
@ -187,11 +193,11 @@ impl SPIRVBin {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
(res, msgs.join(""))
|
(res, msgs.join(c""))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO cache linking, parsing is around 25% of link time
|
// TODO cache linking, parsing is around 25% of link time
|
||||||
pub fn link(spirvs: &[&SPIRVBin], library: bool) -> (Option<Self>, String) {
|
pub fn link(spirvs: &[&SPIRVBin], library: bool) -> (Option<Self>, CString) {
|
||||||
let bins: Vec<_> = spirvs.iter().map(|s| ptr::from_ref(&s.spirv)).collect();
|
let bins: Vec<_> = spirvs.iter().map(|s| ptr::from_ref(&s.spirv)).collect();
|
||||||
|
|
||||||
let linker_args = clc_linker_args {
|
let linker_args = clc_linker_args {
|
||||||
|
|
@ -200,7 +206,7 @@ impl SPIRVBin {
|
||||||
create_library: library as u32,
|
create_library: library as u32,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut msgs: Vec<String> = Vec::new();
|
let mut msgs = Vec::new();
|
||||||
let logger = create_clc_logger(&mut msgs);
|
let logger = create_clc_logger(&mut msgs);
|
||||||
|
|
||||||
let mut out = clc_binary::default();
|
let mut out = clc_binary::default();
|
||||||
|
|
@ -218,18 +224,18 @@ impl SPIRVBin {
|
||||||
spirv: out,
|
spirv: out,
|
||||||
info: info,
|
info: info,
|
||||||
});
|
});
|
||||||
(res, msgs.join(""))
|
(res, msgs.join(c""))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn validate(&self, options: &clc_validator_options) -> (bool, String) {
|
pub fn validate(&self, options: &clc_validator_options) -> (bool, CString) {
|
||||||
let mut msgs: Vec<String> = Vec::new();
|
let mut msgs = Vec::new();
|
||||||
let logger = create_clc_logger(&mut msgs);
|
let logger = create_clc_logger(&mut msgs);
|
||||||
let res = unsafe { clc_validate_spirv(&self.spirv, &logger, options) };
|
let res = unsafe { clc_validate_spirv(&self.spirv, &logger, options) };
|
||||||
|
|
||||||
(res, msgs.join(""))
|
(res, msgs.join(c""))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clone_on_validate(&self, options: &clc_validator_options) -> (Option<Self>, String) {
|
pub fn clone_on_validate(&self, options: &clc_validator_options) -> (Option<Self>, CString) {
|
||||||
let (res, msgs) = self.validate(options);
|
let (res, msgs) = self.validate(options);
|
||||||
(res.then(|| self.clone()), msgs)
|
(res.then(|| self.clone()), msgs)
|
||||||
}
|
}
|
||||||
|
|
@ -289,7 +295,7 @@ impl SPIRVBin {
|
||||||
library: bool,
|
library: bool,
|
||||||
clc_shader: *const nir_shader,
|
clc_shader: *const nir_shader,
|
||||||
options: SPIRVToNirOptions,
|
options: SPIRVToNirOptions,
|
||||||
log: Option<&mut Vec<String>>,
|
log: Option<&mut Vec<CString>>,
|
||||||
) -> spirv_to_nir_options {
|
) -> spirv_to_nir_options {
|
||||||
let global_addr_format;
|
let global_addr_format;
|
||||||
let offset_addr_format;
|
let offset_addr_format;
|
||||||
|
|
@ -331,7 +337,7 @@ impl SPIRVBin {
|
||||||
spirv_to_nir_options: SPIRVToNirOptions,
|
spirv_to_nir_options: SPIRVToNirOptions,
|
||||||
libclc: &NirShader,
|
libclc: &NirShader,
|
||||||
spec_constants: &mut nir_spirv_specialization,
|
spec_constants: &mut nir_spirv_specialization,
|
||||||
log: Option<&mut Vec<String>>,
|
log: Option<&mut Vec<CString>>,
|
||||||
) -> Option<NirShader> {
|
) -> Option<NirShader> {
|
||||||
let spirv_options =
|
let spirv_options =
|
||||||
Self::get_spirv_options(false, libclc.get_nir(), spirv_to_nir_options, log);
|
Self::get_spirv_options(false, libclc.get_nir(), spirv_to_nir_options, log);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue