virtio/devices/virtio_gpu/messages/
resource_create_2d.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2025.
4
5use 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        // Write out fields to iterator.
45        //
46        // This struct doesn't need any padding bytes.
47        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}