virtio/devices/virtio_gpu/messages/
resource_create_2d.rs1use kernel::ErrorCode;
6
7use super::super::helpers::copy_to_iter;
8use super::ctrl_header::{CtrlHeader, CtrlType};
9use super::{VirtIOGPUReq, VirtIOGPUResp};
10
11#[derive(Debug, Copy, Clone)]
12#[repr(u32)]
13#[allow(dead_code)]
14pub enum VideoFormat {
15 B8G8R8A8Unorm = 1,
16 B8G8R8X8Unorm = 2,
17 A8R8G8B8Unorm = 3,
18 X8R8G8B8Unorm = 4,
19 R8G8B8A8Unorm = 67,
20 X8B8G8R8Unorm = 68,
21 A8B8G8R8Unorm = 121,
22 R8G8B8X8Unorm = 134,
23}
24
25#[derive(Debug, Copy, Clone)]
26#[repr(C)]
27pub struct ResourceCreate2DReq {
28 pub ctrl_header: CtrlHeader,
29 pub resource_id: u32,
30 pub format: VideoFormat,
31 pub width: u32,
32 pub height: u32,
33}
34
35impl VirtIOGPUReq for ResourceCreate2DReq {
36 const ENCODED_SIZE: usize = core::mem::size_of::<Self>();
37 const CTRL_TYPE: CtrlType = CtrlType::CmdResourceCreate2d;
38 type ExpectedResponse = ResourceCreate2DResp;
39
40 fn write_to_byte_iter<'a>(
41 &self,
42 dst: &mut impl Iterator<Item = &'a mut u8>,
43 ) -> Result<(), ErrorCode> {
44 self.ctrl_header.write_to_byte_iter(dst)?;
48 copy_to_iter(dst, u32::to_le_bytes(self.resource_id).into_iter())?;
49 copy_to_iter(dst, u32::to_le_bytes(self.format as u32).into_iter())?;
50 copy_to_iter(dst, u32::to_le_bytes(self.width).into_iter())?;
51 copy_to_iter(dst, u32::to_le_bytes(self.height).into_iter())?;
52
53 Ok(())
54 }
55}
56
57#[derive(Debug, Copy, Clone)]
58#[repr(C)]
59pub struct ResourceCreate2DResp {
60 pub ctrl_header: CtrlHeader,
61}
62
63impl VirtIOGPUResp for ResourceCreate2DResp {
64 const ENCODED_SIZE: usize = core::mem::size_of::<Self>();
65 const EXPECTED_CTRL_TYPE: CtrlType = CtrlType::RespOkNoData;
66
67 fn from_byte_iter_post_checked_ctrl_header(
68 ctrl_header: CtrlHeader,
69 _src: &mut impl Iterator<Item = u8>,
70 ) -> Result<Self, ErrorCode> {
71 Ok(ResourceCreate2DResp { ctrl_header })
72 }
73}