1#![forbid(unsafe_code)]
7
8use inspect::Inspect;
9use mesh::MeshPayload;
10use mesh::payload::Protobuf;
11use vm_resource::CanResolveTo;
12use vm_resource::ResourceId;
13use vm_resource::kind::FramebufferHandleKind;
14
15impl CanResolveTo<ResolvedFramebuffer> for FramebufferHandleKind {
16 type Input<'a> = ();
17}
18
19pub struct ResolvedFramebuffer(pub Box<dyn FramebufferControl>);
21
22impl<T: 'static + FramebufferControl> From<T> for ResolvedFramebuffer {
23 fn from(value: T) -> Self {
24 Self(Box::new(value))
25 }
26}
27
28#[derive(MeshPayload)]
30pub struct SharedFramebufferHandle;
31
32impl ResourceId<FramebufferHandleKind> for SharedFramebufferHandle {
33 const ID: &'static str = "shared";
34}
35
36#[derive(Debug, Copy, Clone, Protobuf, PartialEq, Eq, Inspect)]
38#[mesh(package = "framebuffer")]
39pub struct FramebufferFormat {
40 #[mesh(1)]
42 pub width: usize,
43 #[mesh(2)]
45 pub height: usize,
46 #[mesh(3)]
48 pub bytes_per_line: usize,
49 #[mesh(4)]
51 pub offset: usize,
52}
53
54#[async_trait::async_trait]
61pub trait FramebufferControl: Send {
62 async fn map(&mut self, gpa: u64);
64 async fn unmap(&mut self);
66 async fn set_format(&mut self, format: FramebufferFormat);
68}