Skip to content

Commit 7c099d0

Browse files
committed
wip
1 parent 99cd250 commit 7c099d0

File tree

5 files changed

+347
-126
lines changed

5 files changed

+347
-126
lines changed

src/backend/allocator/dumb.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ impl DumbBuffer {
9999
pub fn handle(&self) -> &Handle {
100100
&self.handle
101101
}
102+
103+
/// Map the dumb buffer for read/write access
104+
pub fn map(&mut self) -> std::io::Result<drm::control::dumbbuffer::DumbMapping<'_>> {
105+
self.fd.map_dumb_buffer(&mut self.handle)
106+
}
102107
}
103108

104109
impl AsDmabuf for DumbBuffer {

src/backend/allocator/swapchain.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::{
2+
cell::UnsafeCell,
23
fmt,
3-
ops::Deref,
4+
ops::{Deref, DerefMut},
45
sync::{
56
atomic::{AtomicBool, AtomicU8, Ordering},
67
Arc,
@@ -75,12 +76,14 @@ pub struct Slot<B: Buffer>(Arc<InternalSlot<B>>);
7576

7677
#[derive(Debug)]
7778
struct InternalSlot<B: Buffer> {
78-
buffer: Option<B>,
79+
buffer: Option<UnsafeCell<B>>,
7980
acquired: AtomicBool,
8081
age: AtomicU8,
8182
userdata: UserDataMap,
8283
}
8384

85+
unsafe impl<B: Buffer> Sync for InternalSlot<B> where B: Sync {}
86+
8487
impl<B: Buffer> Slot<B> {
8588
/// Retrieve userdata for this slot.
8689
pub fn userdata(&self) -> &UserDataMap {
@@ -107,7 +110,13 @@ impl<B: Buffer> Default for InternalSlot<B> {
107110
impl<B: Buffer> Deref for Slot<B> {
108111
type Target = B;
109112
fn deref(&self) -> &B {
110-
Option::as_ref(&self.0.buffer).unwrap()
113+
unsafe { &*Option::as_ref(&self.0.buffer).unwrap().get() }
114+
}
115+
}
116+
117+
impl<B: Buffer> DerefMut for Slot<B> {
118+
fn deref_mut(&mut self) -> &mut Self::Target {
119+
unsafe { &mut *Option::as_ref(&self.0.buffer).unwrap().get() }
111120
}
112121
}
113122

@@ -171,7 +180,7 @@ where
171180
.allocator
172181
.create_buffer(self.width, self.height, self.fourcc, &self.modifiers)
173182
{
174-
Ok(buffer) => free_slot.buffer = Some(buffer),
183+
Ok(buffer) => free_slot.buffer = Some(UnsafeCell::new(buffer)),
175184
Err(err) => {
176185
free_slot.acquired.store(false, Ordering::SeqCst);
177186
return Err(err);

0 commit comments

Comments
 (0)