use std::cell::RefCell;
use std::rc::Rc;
use drmkit_core::Device;
use drmkit_scene::{AcquiredBuffer, BindingModel, LayerBufferSource, SourceError, SourceFormat};
use drmkit_sync::SyncFence;
pub(crate) struct SharedSource(pub(crate) Rc<RefCell<dyn LayerBufferSource>>);
impl LayerBufferSource for SharedSource {
fn acquire(&mut self) -> Result<AcquiredBuffer, SourceError> {
self.0.borrow_mut().acquire()
}
fn release(&mut self, acquired: AcquiredBuffer) {
self.0.borrow_mut().release(acquired);
}
fn release_with_fence(&mut self, acquired: AcquiredBuffer, release_fence: Option<SyncFence>) {
self.0
.borrow_mut()
.release_with_fence(acquired, release_fence);
}
fn wants_release_fence(&self) -> bool {
self.0.borrow().wants_release_fence()
}
fn has_fresh_content(&self) -> bool {
self.0.borrow().has_fresh_content()
}
fn with_mapping(
&mut self,
access: drmkit_dumb::MapAccess,
f: &mut dyn FnMut(&mut drmkit_dumb::Mapping<'_>),
) -> Result<(), SourceError> {
self.0.borrow_mut().with_mapping(access, f)
}
fn on_retired(&mut self) {}
fn binding_model(&self) -> BindingModel {
self.0.borrow().binding_model()
}
fn format(&self) -> SourceFormat {
LayerBufferSource::format(&*self.0.borrow())
}
fn bind_to_plane(&mut self, plane_id: u32) -> Result<(), SourceError> {
self.0.borrow_mut().bind_to_plane(plane_id)
}
fn unbind_from_plane(&mut self, plane_id: u32) {
self.0.borrow_mut().unbind_from_plane(plane_id);
}
fn on_session_paused(&mut self) {
self.0.borrow_mut().on_session_paused();
}
fn on_session_resumed(&mut self, device: &Device) -> Result<(), SourceError> {
self.0.borrow_mut().on_session_resumed(device)
}
}