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:
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user