rusticl/mesa/screen: do not derefence the entire pipe_screen struct

Apparently the dereferences made tsan report data races on the pipe_screen
object.

Cc: mesa-stable
Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25944>
This commit is contained in:
Karol Herbst
2023-10-27 23:27:15 +02:00
committed by Marge Bot
parent 71064879d1
commit f7830240ac
@@ -234,9 +234,13 @@ impl PipeScreen {
}
fn compute_param_wrapped(&self, cap: pipe_compute_cap, ptr: *mut c_void) -> i32 {
let s = &mut unsafe { *self.screen };
unsafe {
s.get_compute_param.unwrap()(self.screen, pipe_shader_ir::PIPE_SHADER_IR_NIR, cap, ptr)
(*self.screen).get_compute_param.unwrap()(
self.screen,
pipe_shader_ir::PIPE_SHADER_IR_NIR,
cap,
ptr,
)
}
}
@@ -245,10 +249,7 @@ impl PipeScreen {
}
pub fn name(&self) -> String {
unsafe {
let s = *self.screen;
c_string_to_string(s.get_name.unwrap()(self.screen))
}
unsafe { c_string_to_string((*self.screen).get_name.unwrap()(self.screen)) }
}
pub fn device_node_mask(&self) -> Option<u32> {
@@ -274,10 +275,7 @@ impl PipeScreen {
}
pub fn device_vendor(&self) -> String {
unsafe {
let s = *self.screen;
c_string_to_string(s.get_device_vendor.unwrap()(self.screen))
}
unsafe { c_string_to_string((*self.screen).get_device_vendor.unwrap()(self.screen)) }
}
pub fn device_type(&self) -> pipe_loader_device_type {
@@ -296,9 +294,7 @@ impl PipeScreen {
pub fn cl_cts_version(&self) -> &CStr {
unsafe {
let s = *self.screen;
let ptr = s
let ptr = (*self.screen)
.get_cl_cts_version
.map_or(ptr::null(), |get_cl_cts_version| {
get_cl_cts_version(self.screen)
@@ -318,8 +314,9 @@ impl PipeScreen {
target: pipe_texture_target,
bindings: u32,
) -> bool {
let s = &mut unsafe { *self.screen };
unsafe { s.is_format_supported.unwrap()(self.screen, format, target, 0, 0, bindings) }
unsafe {
(*self.screen).is_format_supported.unwrap()(self.screen, format, target, 0, 0, bindings)
}
}
pub fn get_timestamp(&self) -> u64 {
@@ -346,9 +343,7 @@ impl PipeScreen {
}
pub fn shader_cache(&self) -> Option<DiskCacheBorrowed> {
let s = &mut unsafe { *self.screen };
let ptr = if let Some(func) = s.get_disk_shader_cache {
let ptr = if let Some(func) = unsafe { *self.screen }.get_disk_shader_cache {
unsafe { func(self.screen) }
} else {
ptr::null_mut()
@@ -358,8 +353,7 @@ impl PipeScreen {
}
pub fn finalize_nir(&self, nir: &NirShader) {
let s = &mut unsafe { *self.screen };
if let Some(func) = s.finalize_nir {
if let Some(func) = unsafe { *self.screen }.finalize_nir {
unsafe {
func(self.screen, nir.get_nir().cast());
}
@@ -368,15 +362,18 @@ impl PipeScreen {
pub(super) fn unref_fence(&self, mut fence: *mut pipe_fence_handle) {
unsafe {
let s = &mut *self.screen;
s.fence_reference.unwrap()(s, &mut fence, ptr::null_mut());
(*self.screen).fence_reference.unwrap()(self.screen, &mut fence, ptr::null_mut());
}
}
pub(super) fn fence_finish(&self, fence: *mut pipe_fence_handle) {
unsafe {
let s = &mut *self.screen;
s.fence_finish.unwrap()(s, ptr::null_mut(), fence, OS_TIMEOUT_INFINITE as u64);
(*self.screen).fence_finish.unwrap()(
self.screen,
ptr::null_mut(),
fence,
OS_TIMEOUT_INFINITE as u64,
);
}
}
}