1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2019 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker #![allow(dead_code)]
6*bb4ee6a4SAndroid Build Coastguard Worker #![allow(non_camel_case_types)]
7*bb4ee6a4SAndroid Build Coastguard Worker
8*bb4ee6a4SAndroid Build Coastguard Worker use std::cmp::min;
9*bb4ee6a4SAndroid Build Coastguard Worker use std::convert::From;
10*bb4ee6a4SAndroid Build Coastguard Worker use std::fmt;
11*bb4ee6a4SAndroid Build Coastguard Worker use std::fmt::Display;
12*bb4ee6a4SAndroid Build Coastguard Worker use std::io;
13*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Write;
14*bb4ee6a4SAndroid Build Coastguard Worker use std::marker::PhantomData;
15*bb4ee6a4SAndroid Build Coastguard Worker use std::mem::size_of;
16*bb4ee6a4SAndroid Build Coastguard Worker use std::mem::size_of_val;
17*bb4ee6a4SAndroid Build Coastguard Worker use std::str::from_utf8;
18*bb4ee6a4SAndroid Build Coastguard Worker
19*bb4ee6a4SAndroid Build Coastguard Worker use base::Error as BaseError;
20*bb4ee6a4SAndroid Build Coastguard Worker use base::TubeError;
21*bb4ee6a4SAndroid Build Coastguard Worker use data_model::Le32;
22*bb4ee6a4SAndroid Build Coastguard Worker use data_model::Le64;
23*bb4ee6a4SAndroid Build Coastguard Worker use gpu_display::GpuDisplayError;
24*bb4ee6a4SAndroid Build Coastguard Worker use remain::sorted;
25*bb4ee6a4SAndroid Build Coastguard Worker use rutabaga_gfx::RutabagaError;
26*bb4ee6a4SAndroid Build Coastguard Worker use thiserror::Error;
27*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::udmabuf::UdmabufError;
28*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::AsBytes;
29*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::FromBytes;
30*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::FromZeroes;
31*bb4ee6a4SAndroid Build Coastguard Worker
32*bb4ee6a4SAndroid Build Coastguard Worker pub use super::super::device_constants::gpu::virtio_gpu_config;
33*bb4ee6a4SAndroid Build Coastguard Worker pub use super::super::device_constants::gpu::VIRTIO_GPU_F_CONTEXT_INIT;
34*bb4ee6a4SAndroid Build Coastguard Worker pub use super::super::device_constants::gpu::VIRTIO_GPU_F_CREATE_GUEST_HANDLE;
35*bb4ee6a4SAndroid Build Coastguard Worker pub use super::super::device_constants::gpu::VIRTIO_GPU_F_EDID;
36*bb4ee6a4SAndroid Build Coastguard Worker pub use super::super::device_constants::gpu::VIRTIO_GPU_F_FENCE_PASSING;
37*bb4ee6a4SAndroid Build Coastguard Worker pub use super::super::device_constants::gpu::VIRTIO_GPU_F_RESOURCE_BLOB;
38*bb4ee6a4SAndroid Build Coastguard Worker pub use super::super::device_constants::gpu::VIRTIO_GPU_F_RESOURCE_UUID;
39*bb4ee6a4SAndroid Build Coastguard Worker pub use super::super::device_constants::gpu::VIRTIO_GPU_F_VIRGL;
40*bb4ee6a4SAndroid Build Coastguard Worker use super::edid::EdidBytes;
41*bb4ee6a4SAndroid Build Coastguard Worker use super::Reader;
42*bb4ee6a4SAndroid Build Coastguard Worker use super::Writer;
43*bb4ee6a4SAndroid Build Coastguard Worker
44*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_UNDEFINED: u32 = 0x0;
45*bb4ee6a4SAndroid Build Coastguard Worker
46*bb4ee6a4SAndroid Build Coastguard Worker /* 2d commands */
47*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_GET_DISPLAY_INFO: u32 = 0x100;
48*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: u32 = 0x101;
49*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_UNREF: u32 = 0x102;
50*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_SET_SCANOUT: u32 = 0x103;
51*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_FLUSH: u32 = 0x104;
52*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: u32 = 0x105;
53*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING: u32 = 0x106;
54*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING: u32 = 0x107;
55*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_GET_CAPSET_INFO: u32 = 0x108;
56*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_GET_CAPSET: u32 = 0x109;
57*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_GET_EDID: u32 = 0x10a;
58*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID: u32 = 0x10b;
59*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB: u32 = 0x10c;
60*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_SET_SCANOUT_BLOB: u32 = 0x10d;
61*bb4ee6a4SAndroid Build Coastguard Worker
62*bb4ee6a4SAndroid Build Coastguard Worker /* 3d commands */
63*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_CTX_CREATE: u32 = 0x200;
64*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_CTX_DESTROY: u32 = 0x201;
65*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE: u32 = 0x202;
66*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE: u32 = 0x203;
67*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_CREATE_3D: u32 = 0x204;
68*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D: u32 = 0x205;
69*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D: u32 = 0x206;
70*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_SUBMIT_3D: u32 = 0x207;
71*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB: u32 = 0x208;
72*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB: u32 = 0x209;
73*bb4ee6a4SAndroid Build Coastguard Worker
74*bb4ee6a4SAndroid Build Coastguard Worker /* cursor commands */
75*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_UPDATE_CURSOR: u32 = 0x300;
76*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CMD_MOVE_CURSOR: u32 = 0x301;
77*bb4ee6a4SAndroid Build Coastguard Worker
78*bb4ee6a4SAndroid Build Coastguard Worker /* success responses */
79*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_OK_NODATA: u32 = 0x1100;
80*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_OK_DISPLAY_INFO: u32 = 0x1101;
81*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_OK_CAPSET_INFO: u32 = 0x1102;
82*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_OK_CAPSET: u32 = 0x1103;
83*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_OK_EDID: u32 = 0x1104;
84*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_OK_RESOURCE_UUID: u32 = 0x1105;
85*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_OK_MAP_INFO: u32 = 0x1106;
86*bb4ee6a4SAndroid Build Coastguard Worker
87*bb4ee6a4SAndroid Build Coastguard Worker /* CHROMIUM(b/277982577): success responses */
88*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_OK_RESOURCE_PLANE_INFO: u32 = 0x11FF;
89*bb4ee6a4SAndroid Build Coastguard Worker
90*bb4ee6a4SAndroid Build Coastguard Worker /* error responses */
91*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_ERR_UNSPEC: u32 = 0x1200;
92*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY: u32 = 0x1201;
93*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID: u32 = 0x1202;
94*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID: u32 = 0x1203;
95*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID: u32 = 0x1204;
96*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER: u32 = 0x1205;
97*bb4ee6a4SAndroid Build Coastguard Worker
98*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_BLOB_MEM_GUEST: u32 = 0x0001;
99*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_BLOB_MEM_HOST3D: u32 = 0x0002;
100*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST: u32 = 0x0003;
101*bb4ee6a4SAndroid Build Coastguard Worker
102*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE: u32 = 0x0001;
103*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE: u32 = 0x0002;
104*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE: u32 = 0x0004;
105*bb4ee6a4SAndroid Build Coastguard Worker /* Create a OS-specific handle from guest memory (not upstreamed). */
106*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_BLOB_FLAG_CREATE_GUEST_HANDLE: u32 = 0x0008;
107*bb4ee6a4SAndroid Build Coastguard Worker
108*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_SHM_ID_NONE: u8 = 0x0000;
109*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_SHM_ID_HOST_VISIBLE: u8 = 0x0001;
110*bb4ee6a4SAndroid Build Coastguard Worker
virtio_gpu_cmd_str(cmd: u32) -> &'static str111*bb4ee6a4SAndroid Build Coastguard Worker pub fn virtio_gpu_cmd_str(cmd: u32) -> &'static str {
112*bb4ee6a4SAndroid Build Coastguard Worker match cmd {
113*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_GET_DISPLAY_INFO => "VIRTIO_GPU_CMD_GET_DISPLAY_INFO",
114*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_CREATE_2D => "VIRTIO_GPU_CMD_RESOURCE_CREATE_2D",
115*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_UNREF => "VIRTIO_GPU_CMD_RESOURCE_UNREF",
116*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_SET_SCANOUT => "VIRTIO_GPU_CMD_SET_SCANOUT",
117*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_SET_SCANOUT_BLOB => "VIRTIO_GPU_CMD_SET_SCANOUT_BLOB",
118*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_FLUSH => "VIRTIO_GPU_CMD_RESOURCE_FLUSH",
119*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D => "VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D",
120*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING => "VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING",
121*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING => "VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING",
122*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_GET_CAPSET_INFO => "VIRTIO_GPU_CMD_GET_CAPSET_INFO",
123*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_GET_CAPSET => "VIRTIO_GPU_CMD_GET_CAPSET",
124*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_GET_EDID => "VIRTIO_GPU_CMD_GET_EDID",
125*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_CTX_CREATE => "VIRTIO_GPU_CMD_CTX_CREATE",
126*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_CTX_DESTROY => "VIRTIO_GPU_CMD_CTX_DESTROY",
127*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE => "VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE",
128*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE => "VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE",
129*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID => "VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID",
130*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB => "VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB",
131*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_CREATE_3D => "VIRTIO_GPU_CMD_RESOURCE_CREATE_3D",
132*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D => "VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D",
133*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D => "VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D",
134*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_SUBMIT_3D => "VIRTIO_GPU_CMD_SUBMIT_3D",
135*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB => "VIRTIO_GPU_RESOURCE_MAP_BLOB",
136*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB => "VIRTIO_GPU_RESOURCE_UNMAP_BLOB",
137*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_UPDATE_CURSOR => "VIRTIO_GPU_CMD_UPDATE_CURSOR",
138*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_MOVE_CURSOR => "VIRTIO_GPU_CMD_MOVE_CURSOR",
139*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_OK_NODATA => "VIRTIO_GPU_RESP_OK_NODATA",
140*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_OK_DISPLAY_INFO => "VIRTIO_GPU_RESP_OK_DISPLAY_INFO",
141*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_OK_CAPSET_INFO => "VIRTIO_GPU_RESP_OK_CAPSET_INFO",
142*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_OK_CAPSET => "VIRTIO_GPU_RESP_OK_CAPSET",
143*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_OK_RESOURCE_PLANE_INFO => "VIRTIO_GPU_RESP_OK_RESOURCE_PLANE_INFO",
144*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_OK_RESOURCE_UUID => "VIRTIO_GPU_RESP_OK_RESOURCE_UUID",
145*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_OK_MAP_INFO => "VIRTIO_GPU_RESP_OK_MAP_INFO",
146*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_ERR_UNSPEC => "VIRTIO_GPU_RESP_ERR_UNSPEC",
147*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY => "VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY",
148*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID => "VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID",
149*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID => "VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID",
150*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID => "VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID",
151*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER => "VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER",
152*bb4ee6a4SAndroid Build Coastguard Worker _ => "UNKNOWN",
153*bb4ee6a4SAndroid Build Coastguard Worker }
154*bb4ee6a4SAndroid Build Coastguard Worker }
155*bb4ee6a4SAndroid Build Coastguard Worker
156*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FLAG_FENCE: u32 = 1 << 0;
157*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FLAG_INFO_RING_IDX: u32 = 1 << 1;
158*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FLAG_FENCE_HOST_SHAREABLE: u32 = 1 << 2;
159*bb4ee6a4SAndroid Build Coastguard Worker
160*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, AsBytes, FromZeroes, FromBytes)]
161*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
162*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_ctrl_hdr {
163*bb4ee6a4SAndroid Build Coastguard Worker pub type_: Le32,
164*bb4ee6a4SAndroid Build Coastguard Worker pub flags: Le32,
165*bb4ee6a4SAndroid Build Coastguard Worker pub fence_id: Le64,
166*bb4ee6a4SAndroid Build Coastguard Worker pub ctx_id: Le32,
167*bb4ee6a4SAndroid Build Coastguard Worker pub ring_idx: u8,
168*bb4ee6a4SAndroid Build Coastguard Worker pub padding: [u8; 3],
169*bb4ee6a4SAndroid Build Coastguard Worker }
170*bb4ee6a4SAndroid Build Coastguard Worker
171*bb4ee6a4SAndroid Build Coastguard Worker /* data passed in the cursor vq */
172*bb4ee6a4SAndroid Build Coastguard Worker
173*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
174*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
175*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_cursor_pos {
176*bb4ee6a4SAndroid Build Coastguard Worker pub scanout_id: Le32,
177*bb4ee6a4SAndroid Build Coastguard Worker pub x: Le32,
178*bb4ee6a4SAndroid Build Coastguard Worker pub y: Le32,
179*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
180*bb4ee6a4SAndroid Build Coastguard Worker }
181*bb4ee6a4SAndroid Build Coastguard Worker
182*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */
183*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
184*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
185*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_update_cursor {
186*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
187*bb4ee6a4SAndroid Build Coastguard Worker pub pos: virtio_gpu_cursor_pos, /* update & move */
188*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32, /* update only */
189*bb4ee6a4SAndroid Build Coastguard Worker pub hot_x: Le32, /* update only */
190*bb4ee6a4SAndroid Build Coastguard Worker pub hot_y: Le32, /* update only */
191*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
192*bb4ee6a4SAndroid Build Coastguard Worker }
193*bb4ee6a4SAndroid Build Coastguard Worker
194*bb4ee6a4SAndroid Build Coastguard Worker /* data passed in the control vq, 2d related */
195*bb4ee6a4SAndroid Build Coastguard Worker
196*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
197*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
198*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_rect {
199*bb4ee6a4SAndroid Build Coastguard Worker pub x: Le32,
200*bb4ee6a4SAndroid Build Coastguard Worker pub y: Le32,
201*bb4ee6a4SAndroid Build Coastguard Worker pub width: Le32,
202*bb4ee6a4SAndroid Build Coastguard Worker pub height: Le32,
203*bb4ee6a4SAndroid Build Coastguard Worker }
204*bb4ee6a4SAndroid Build Coastguard Worker
205*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_RESOURCE_UNREF */
206*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
207*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
208*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_unref {
209*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
210*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
211*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
212*bb4ee6a4SAndroid Build Coastguard Worker }
213*bb4ee6a4SAndroid Build Coastguard Worker
214*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */
215*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
216*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
217*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_create_2d {
218*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
219*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
220*bb4ee6a4SAndroid Build Coastguard Worker pub format: Le32,
221*bb4ee6a4SAndroid Build Coastguard Worker pub width: Le32,
222*bb4ee6a4SAndroid Build Coastguard Worker pub height: Le32,
223*bb4ee6a4SAndroid Build Coastguard Worker }
224*bb4ee6a4SAndroid Build Coastguard Worker
225*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_SET_SCANOUT */
226*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
227*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
228*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_set_scanout {
229*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
230*bb4ee6a4SAndroid Build Coastguard Worker pub r: virtio_gpu_rect,
231*bb4ee6a4SAndroid Build Coastguard Worker pub scanout_id: Le32,
232*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
233*bb4ee6a4SAndroid Build Coastguard Worker }
234*bb4ee6a4SAndroid Build Coastguard Worker
235*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_RESOURCE_FLUSH */
236*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
237*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
238*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_flush {
239*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
240*bb4ee6a4SAndroid Build Coastguard Worker pub r: virtio_gpu_rect,
241*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
242*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
243*bb4ee6a4SAndroid Build Coastguard Worker }
244*bb4ee6a4SAndroid Build Coastguard Worker
245*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */
246*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
247*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
248*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_transfer_to_host_2d {
249*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
250*bb4ee6a4SAndroid Build Coastguard Worker pub r: virtio_gpu_rect,
251*bb4ee6a4SAndroid Build Coastguard Worker pub offset: Le64,
252*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
253*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
254*bb4ee6a4SAndroid Build Coastguard Worker }
255*bb4ee6a4SAndroid Build Coastguard Worker
256*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, AsBytes, FromZeroes, FromBytes)]
257*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
258*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_mem_entry {
259*bb4ee6a4SAndroid Build Coastguard Worker pub addr: Le64,
260*bb4ee6a4SAndroid Build Coastguard Worker pub length: Le32,
261*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
262*bb4ee6a4SAndroid Build Coastguard Worker }
263*bb4ee6a4SAndroid Build Coastguard Worker
264*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */
265*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
266*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
267*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_attach_backing {
268*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
269*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
270*bb4ee6a4SAndroid Build Coastguard Worker pub nr_entries: Le32,
271*bb4ee6a4SAndroid Build Coastguard Worker }
272*bb4ee6a4SAndroid Build Coastguard Worker
273*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */
274*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
275*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
276*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_detach_backing {
277*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
278*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
279*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
280*bb4ee6a4SAndroid Build Coastguard Worker }
281*bb4ee6a4SAndroid Build Coastguard Worker
282*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
283*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
284*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_display_one {
285*bb4ee6a4SAndroid Build Coastguard Worker pub r: virtio_gpu_rect,
286*bb4ee6a4SAndroid Build Coastguard Worker pub enabled: Le32,
287*bb4ee6a4SAndroid Build Coastguard Worker pub flags: Le32,
288*bb4ee6a4SAndroid Build Coastguard Worker }
289*bb4ee6a4SAndroid Build Coastguard Worker
290*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */
291*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_MAX_SCANOUTS: usize = 16;
292*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
293*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
294*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resp_display_info {
295*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
296*bb4ee6a4SAndroid Build Coastguard Worker pub pmodes: [virtio_gpu_display_one; VIRTIO_GPU_MAX_SCANOUTS],
297*bb4ee6a4SAndroid Build Coastguard Worker }
298*bb4ee6a4SAndroid Build Coastguard Worker
299*bb4ee6a4SAndroid Build Coastguard Worker /* data passed in the control vq, 3d related */
300*bb4ee6a4SAndroid Build Coastguard Worker
301*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
302*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
303*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_box {
304*bb4ee6a4SAndroid Build Coastguard Worker pub x: Le32,
305*bb4ee6a4SAndroid Build Coastguard Worker pub y: Le32,
306*bb4ee6a4SAndroid Build Coastguard Worker pub z: Le32,
307*bb4ee6a4SAndroid Build Coastguard Worker pub w: Le32,
308*bb4ee6a4SAndroid Build Coastguard Worker pub h: Le32,
309*bb4ee6a4SAndroid Build Coastguard Worker pub d: Le32,
310*bb4ee6a4SAndroid Build Coastguard Worker }
311*bb4ee6a4SAndroid Build Coastguard Worker
312*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D */
313*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
314*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
315*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_transfer_host_3d {
316*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
317*bb4ee6a4SAndroid Build Coastguard Worker pub box_: virtio_gpu_box,
318*bb4ee6a4SAndroid Build Coastguard Worker pub offset: Le64,
319*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
320*bb4ee6a4SAndroid Build Coastguard Worker pub level: Le32,
321*bb4ee6a4SAndroid Build Coastguard Worker pub stride: Le32,
322*bb4ee6a4SAndroid Build Coastguard Worker pub layer_stride: Le32,
323*bb4ee6a4SAndroid Build Coastguard Worker }
324*bb4ee6a4SAndroid Build Coastguard Worker
325*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_RESOURCE_CREATE_3D */
326*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP: u32 = 1 << 0;
327*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
328*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
329*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_create_3d {
330*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
331*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
332*bb4ee6a4SAndroid Build Coastguard Worker pub target: Le32,
333*bb4ee6a4SAndroid Build Coastguard Worker pub format: Le32,
334*bb4ee6a4SAndroid Build Coastguard Worker pub bind: Le32,
335*bb4ee6a4SAndroid Build Coastguard Worker pub width: Le32,
336*bb4ee6a4SAndroid Build Coastguard Worker pub height: Le32,
337*bb4ee6a4SAndroid Build Coastguard Worker pub depth: Le32,
338*bb4ee6a4SAndroid Build Coastguard Worker pub array_size: Le32,
339*bb4ee6a4SAndroid Build Coastguard Worker pub last_level: Le32,
340*bb4ee6a4SAndroid Build Coastguard Worker pub nr_samples: Le32,
341*bb4ee6a4SAndroid Build Coastguard Worker pub flags: Le32,
342*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
343*bb4ee6a4SAndroid Build Coastguard Worker }
344*bb4ee6a4SAndroid Build Coastguard Worker
345*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_CTX_CREATE */
346*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CONTEXT_INIT_CAPSET_ID_MASK: u32 = 1 << 0;
347*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, FromZeroes, FromBytes, AsBytes)]
348*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
349*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_ctx_create {
350*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
351*bb4ee6a4SAndroid Build Coastguard Worker pub nlen: Le32,
352*bb4ee6a4SAndroid Build Coastguard Worker pub context_init: Le32,
353*bb4ee6a4SAndroid Build Coastguard Worker pub debug_name: [u8; 64],
354*bb4ee6a4SAndroid Build Coastguard Worker }
355*bb4ee6a4SAndroid Build Coastguard Worker
356*bb4ee6a4SAndroid Build Coastguard Worker impl Default for virtio_gpu_ctx_create {
default() -> Self357*bb4ee6a4SAndroid Build Coastguard Worker fn default() -> Self {
358*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: trivially safe
359*bb4ee6a4SAndroid Build Coastguard Worker unsafe { ::std::mem::zeroed() }
360*bb4ee6a4SAndroid Build Coastguard Worker }
361*bb4ee6a4SAndroid Build Coastguard Worker }
362*bb4ee6a4SAndroid Build Coastguard Worker
363*bb4ee6a4SAndroid Build Coastguard Worker impl Clone for virtio_gpu_ctx_create {
clone(&self) -> virtio_gpu_ctx_create364*bb4ee6a4SAndroid Build Coastguard Worker fn clone(&self) -> virtio_gpu_ctx_create {
365*bb4ee6a4SAndroid Build Coastguard Worker *self
366*bb4ee6a4SAndroid Build Coastguard Worker }
367*bb4ee6a4SAndroid Build Coastguard Worker }
368*bb4ee6a4SAndroid Build Coastguard Worker
369*bb4ee6a4SAndroid Build Coastguard Worker impl fmt::Debug for virtio_gpu_ctx_create {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result370*bb4ee6a4SAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
371*bb4ee6a4SAndroid Build Coastguard Worker let debug_name = from_utf8(&self.debug_name[..min(64, self.nlen.to_native() as usize)])
372*bb4ee6a4SAndroid Build Coastguard Worker .unwrap_or("<invalid>");
373*bb4ee6a4SAndroid Build Coastguard Worker f.debug_struct("virtio_gpu_ctx_create")
374*bb4ee6a4SAndroid Build Coastguard Worker .field("hdr", &self.hdr)
375*bb4ee6a4SAndroid Build Coastguard Worker .field("debug_name", &debug_name)
376*bb4ee6a4SAndroid Build Coastguard Worker .finish()
377*bb4ee6a4SAndroid Build Coastguard Worker }
378*bb4ee6a4SAndroid Build Coastguard Worker }
379*bb4ee6a4SAndroid Build Coastguard Worker
380*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_CTX_DESTROY */
381*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
382*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
383*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_ctx_destroy {
384*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
385*bb4ee6a4SAndroid Build Coastguard Worker }
386*bb4ee6a4SAndroid Build Coastguard Worker
387*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE, VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE */
388*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
389*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
390*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_ctx_resource {
391*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
392*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
393*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
394*bb4ee6a4SAndroid Build Coastguard Worker }
395*bb4ee6a4SAndroid Build Coastguard Worker
396*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_SUBMIT_3D */
397*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
398*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
399*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_cmd_submit {
400*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
401*bb4ee6a4SAndroid Build Coastguard Worker pub size: Le32,
402*bb4ee6a4SAndroid Build Coastguard Worker
403*bb4ee6a4SAndroid Build Coastguard Worker // The in-fence IDs are prepended to the cmd_buf and memory layout
404*bb4ee6a4SAndroid Build Coastguard Worker // of the VIRTIO_GPU_CMD_SUBMIT_3D buffer looks like this:
405*bb4ee6a4SAndroid Build Coastguard Worker // _________________
406*bb4ee6a4SAndroid Build Coastguard Worker // | CMD_SUBMIT_3D |
407*bb4ee6a4SAndroid Build Coastguard Worker // -----------------
408*bb4ee6a4SAndroid Build Coastguard Worker // | header |
409*bb4ee6a4SAndroid Build Coastguard Worker // | in-fence IDs |
410*bb4ee6a4SAndroid Build Coastguard Worker // | cmd_buf |
411*bb4ee6a4SAndroid Build Coastguard Worker // -----------------
412*bb4ee6a4SAndroid Build Coastguard Worker //
413*bb4ee6a4SAndroid Build Coastguard Worker // This makes in-fence IDs naturally aligned to the sizeof(u64) inside
414*bb4ee6a4SAndroid Build Coastguard Worker // of the virtio buffer.
415*bb4ee6a4SAndroid Build Coastguard Worker pub num_in_fences: Le32,
416*bb4ee6a4SAndroid Build Coastguard Worker }
417*bb4ee6a4SAndroid Build Coastguard Worker
418*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CAPSET_VIRGL: u32 = 1;
419*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CAPSET_VIRGL2: u32 = 2;
420*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CAPSET_GFXSTREAM: u32 = 3;
421*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CAPSET_VENUS: u32 = 4;
422*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_CAPSET_CROSS_DOMAIN: u32 = 5;
423*bb4ee6a4SAndroid Build Coastguard Worker
424*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */
425*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
426*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
427*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_get_capset_info {
428*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
429*bb4ee6a4SAndroid Build Coastguard Worker pub capset_index: Le32,
430*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
431*bb4ee6a4SAndroid Build Coastguard Worker }
432*bb4ee6a4SAndroid Build Coastguard Worker
433*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_RESP_OK_CAPSET_INFO */
434*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
435*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
436*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resp_capset_info {
437*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
438*bb4ee6a4SAndroid Build Coastguard Worker pub capset_id: Le32,
439*bb4ee6a4SAndroid Build Coastguard Worker pub capset_max_version: Le32,
440*bb4ee6a4SAndroid Build Coastguard Worker pub capset_max_size: Le32,
441*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
442*bb4ee6a4SAndroid Build Coastguard Worker }
443*bb4ee6a4SAndroid Build Coastguard Worker
444*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_GET_CAPSET */
445*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
446*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
447*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_get_capset {
448*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
449*bb4ee6a4SAndroid Build Coastguard Worker pub capset_id: Le32,
450*bb4ee6a4SAndroid Build Coastguard Worker pub capset_version: Le32,
451*bb4ee6a4SAndroid Build Coastguard Worker }
452*bb4ee6a4SAndroid Build Coastguard Worker
453*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_RESP_OK_CAPSET */
454*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default)]
455*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
456*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resp_capset {
457*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
458*bb4ee6a4SAndroid Build Coastguard Worker pub capset_data: PhantomData<[u8]>,
459*bb4ee6a4SAndroid Build Coastguard Worker }
460*bb4ee6a4SAndroid Build Coastguard Worker
461*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_GET_EDID */
462*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
463*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
464*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_get_edid {
465*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
466*bb4ee6a4SAndroid Build Coastguard Worker pub scanout: Le32,
467*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
468*bb4ee6a4SAndroid Build Coastguard Worker }
469*bb4ee6a4SAndroid Build Coastguard Worker
470*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_RESP_OK_EDID */
471*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, FromZeroes, FromBytes, AsBytes)]
472*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
473*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resp_get_edid {
474*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
475*bb4ee6a4SAndroid Build Coastguard Worker pub size: Le32,
476*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
477*bb4ee6a4SAndroid Build Coastguard Worker pub edid: [u8; 1024],
478*bb4ee6a4SAndroid Build Coastguard Worker }
479*bb4ee6a4SAndroid Build Coastguard Worker
480*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_RESP_OK_RESOURCE_PLANE_INFO */
481*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
482*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
483*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resp_resource_plane_info {
484*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
485*bb4ee6a4SAndroid Build Coastguard Worker pub count: Le32,
486*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
487*bb4ee6a4SAndroid Build Coastguard Worker pub format_modifier: Le64,
488*bb4ee6a4SAndroid Build Coastguard Worker pub strides: [Le32; 4],
489*bb4ee6a4SAndroid Build Coastguard Worker pub offsets: [Le32; 4],
490*bb4ee6a4SAndroid Build Coastguard Worker }
491*bb4ee6a4SAndroid Build Coastguard Worker
492*bb4ee6a4SAndroid Build Coastguard Worker pub const PLANE_INFO_MAX_COUNT: usize = 4;
493*bb4ee6a4SAndroid Build Coastguard Worker
494*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_EVENT_DISPLAY: u32 = 1 << 0;
495*bb4ee6a4SAndroid Build Coastguard Worker
496*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
497*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
498*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_create_blob {
499*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
500*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
501*bb4ee6a4SAndroid Build Coastguard Worker pub blob_mem: Le32,
502*bb4ee6a4SAndroid Build Coastguard Worker pub blob_flags: Le32,
503*bb4ee6a4SAndroid Build Coastguard Worker pub nr_entries: Le32,
504*bb4ee6a4SAndroid Build Coastguard Worker pub blob_id: Le64,
505*bb4ee6a4SAndroid Build Coastguard Worker pub size: Le64,
506*bb4ee6a4SAndroid Build Coastguard Worker }
507*bb4ee6a4SAndroid Build Coastguard Worker
508*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
509*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
510*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_map_blob {
511*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
512*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
513*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
514*bb4ee6a4SAndroid Build Coastguard Worker pub offset: Le64,
515*bb4ee6a4SAndroid Build Coastguard Worker }
516*bb4ee6a4SAndroid Build Coastguard Worker
517*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
518*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
519*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_unmap_blob {
520*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
521*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
522*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
523*bb4ee6a4SAndroid Build Coastguard Worker }
524*bb4ee6a4SAndroid Build Coastguard Worker
525*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
526*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
527*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resp_map_info {
528*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
529*bb4ee6a4SAndroid Build Coastguard Worker pub map_info: Le32,
530*bb4ee6a4SAndroid Build Coastguard Worker pub padding: u32,
531*bb4ee6a4SAndroid Build Coastguard Worker }
532*bb4ee6a4SAndroid Build Coastguard Worker
533*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
534*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
535*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resource_assign_uuid {
536*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
537*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
538*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
539*bb4ee6a4SAndroid Build Coastguard Worker }
540*bb4ee6a4SAndroid Build Coastguard Worker
541*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
542*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
543*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_resp_resource_uuid {
544*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
545*bb4ee6a4SAndroid Build Coastguard Worker pub uuid: [u8; 16],
546*bb4ee6a4SAndroid Build Coastguard Worker }
547*bb4ee6a4SAndroid Build Coastguard Worker
548*bb4ee6a4SAndroid Build Coastguard Worker /* VIRTIO_GPU_CMD_SET_SCANOUT_BLOB */
549*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Default, FromZeroes, FromBytes, AsBytes)]
550*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
551*bb4ee6a4SAndroid Build Coastguard Worker pub struct virtio_gpu_set_scanout_blob {
552*bb4ee6a4SAndroid Build Coastguard Worker pub hdr: virtio_gpu_ctrl_hdr,
553*bb4ee6a4SAndroid Build Coastguard Worker pub r: virtio_gpu_rect,
554*bb4ee6a4SAndroid Build Coastguard Worker pub scanout_id: Le32,
555*bb4ee6a4SAndroid Build Coastguard Worker pub resource_id: Le32,
556*bb4ee6a4SAndroid Build Coastguard Worker pub width: Le32,
557*bb4ee6a4SAndroid Build Coastguard Worker pub height: Le32,
558*bb4ee6a4SAndroid Build Coastguard Worker pub format: Le32,
559*bb4ee6a4SAndroid Build Coastguard Worker pub padding: Le32,
560*bb4ee6a4SAndroid Build Coastguard Worker pub strides: [Le32; 4],
561*bb4ee6a4SAndroid Build Coastguard Worker pub offsets: [Le32; 4],
562*bb4ee6a4SAndroid Build Coastguard Worker }
563*bb4ee6a4SAndroid Build Coastguard Worker
564*bb4ee6a4SAndroid Build Coastguard Worker /* simple formats for fbcon/X use */
565*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM: u32 = 1;
566*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM: u32 = 2;
567*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM: u32 = 3;
568*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM: u32 = 4;
569*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM: u32 = 67;
570*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM: u32 = 68;
571*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM: u32 = 121;
572*bb4ee6a4SAndroid Build Coastguard Worker pub const VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM: u32 = 134;
573*bb4ee6a4SAndroid Build Coastguard Worker
574*bb4ee6a4SAndroid Build Coastguard Worker /// A virtio gpu command and associated metadata specific to each command.
575*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
576*bb4ee6a4SAndroid Build Coastguard Worker pub enum GpuCommand {
577*bb4ee6a4SAndroid Build Coastguard Worker GetDisplayInfo(virtio_gpu_ctrl_hdr),
578*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreate2d(virtio_gpu_resource_create_2d),
579*bb4ee6a4SAndroid Build Coastguard Worker ResourceUnref(virtio_gpu_resource_unref),
580*bb4ee6a4SAndroid Build Coastguard Worker SetScanout(virtio_gpu_set_scanout),
581*bb4ee6a4SAndroid Build Coastguard Worker SetScanoutBlob(virtio_gpu_set_scanout_blob),
582*bb4ee6a4SAndroid Build Coastguard Worker ResourceFlush(virtio_gpu_resource_flush),
583*bb4ee6a4SAndroid Build Coastguard Worker TransferToHost2d(virtio_gpu_transfer_to_host_2d),
584*bb4ee6a4SAndroid Build Coastguard Worker ResourceAttachBacking(virtio_gpu_resource_attach_backing),
585*bb4ee6a4SAndroid Build Coastguard Worker ResourceDetachBacking(virtio_gpu_resource_detach_backing),
586*bb4ee6a4SAndroid Build Coastguard Worker GetCapsetInfo(virtio_gpu_get_capset_info),
587*bb4ee6a4SAndroid Build Coastguard Worker GetCapset(virtio_gpu_get_capset),
588*bb4ee6a4SAndroid Build Coastguard Worker GetEdid(virtio_gpu_get_edid),
589*bb4ee6a4SAndroid Build Coastguard Worker CtxCreate(virtio_gpu_ctx_create),
590*bb4ee6a4SAndroid Build Coastguard Worker CtxDestroy(virtio_gpu_ctx_destroy),
591*bb4ee6a4SAndroid Build Coastguard Worker CtxAttachResource(virtio_gpu_ctx_resource),
592*bb4ee6a4SAndroid Build Coastguard Worker CtxDetachResource(virtio_gpu_ctx_resource),
593*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreate3d(virtio_gpu_resource_create_3d),
594*bb4ee6a4SAndroid Build Coastguard Worker TransferToHost3d(virtio_gpu_transfer_host_3d),
595*bb4ee6a4SAndroid Build Coastguard Worker TransferFromHost3d(virtio_gpu_transfer_host_3d),
596*bb4ee6a4SAndroid Build Coastguard Worker CmdSubmit3d(virtio_gpu_cmd_submit),
597*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreateBlob(virtio_gpu_resource_create_blob),
598*bb4ee6a4SAndroid Build Coastguard Worker ResourceMapBlob(virtio_gpu_resource_map_blob),
599*bb4ee6a4SAndroid Build Coastguard Worker ResourceUnmapBlob(virtio_gpu_resource_unmap_blob),
600*bb4ee6a4SAndroid Build Coastguard Worker UpdateCursor(virtio_gpu_update_cursor),
601*bb4ee6a4SAndroid Build Coastguard Worker MoveCursor(virtio_gpu_update_cursor),
602*bb4ee6a4SAndroid Build Coastguard Worker ResourceAssignUuid(virtio_gpu_resource_assign_uuid),
603*bb4ee6a4SAndroid Build Coastguard Worker }
604*bb4ee6a4SAndroid Build Coastguard Worker
605*bb4ee6a4SAndroid Build Coastguard Worker /// An error indicating something went wrong decoding a `GpuCommand`. These correspond to
606*bb4ee6a4SAndroid Build Coastguard Worker /// `VIRTIO_GPU_CMD_*`.
607*bb4ee6a4SAndroid Build Coastguard Worker #[sorted]
608*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Error, Debug)]
609*bb4ee6a4SAndroid Build Coastguard Worker pub enum GpuCommandDecodeError {
610*bb4ee6a4SAndroid Build Coastguard Worker /// The type of the command was invalid.
611*bb4ee6a4SAndroid Build Coastguard Worker #[error("invalid command type ({0})")]
612*bb4ee6a4SAndroid Build Coastguard Worker InvalidType(u32),
613*bb4ee6a4SAndroid Build Coastguard Worker /// An I/O error occurred.
614*bb4ee6a4SAndroid Build Coastguard Worker #[error("an I/O error occurred: {0}")]
615*bb4ee6a4SAndroid Build Coastguard Worker IO(io::Error),
616*bb4ee6a4SAndroid Build Coastguard Worker }
617*bb4ee6a4SAndroid Build Coastguard Worker
618*bb4ee6a4SAndroid Build Coastguard Worker impl From<io::Error> for GpuCommandDecodeError {
from(e: io::Error) -> GpuCommandDecodeError619*bb4ee6a4SAndroid Build Coastguard Worker fn from(e: io::Error) -> GpuCommandDecodeError {
620*bb4ee6a4SAndroid Build Coastguard Worker GpuCommandDecodeError::IO(e)
621*bb4ee6a4SAndroid Build Coastguard Worker }
622*bb4ee6a4SAndroid Build Coastguard Worker }
623*bb4ee6a4SAndroid Build Coastguard Worker
624*bb4ee6a4SAndroid Build Coastguard Worker impl fmt::Debug for GpuCommand {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result625*bb4ee6a4SAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
626*bb4ee6a4SAndroid Build Coastguard Worker use self::GpuCommand::*;
627*bb4ee6a4SAndroid Build Coastguard Worker match self {
628*bb4ee6a4SAndroid Build Coastguard Worker GetDisplayInfo(_info) => f.debug_struct("GetDisplayInfo").finish(),
629*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreate2d(_info) => f.debug_struct("ResourceCreate2d").finish(),
630*bb4ee6a4SAndroid Build Coastguard Worker ResourceUnref(_info) => f.debug_struct("ResourceUnref").finish(),
631*bb4ee6a4SAndroid Build Coastguard Worker SetScanout(_info) => f.debug_struct("SetScanout").finish(),
632*bb4ee6a4SAndroid Build Coastguard Worker SetScanoutBlob(_info) => f.debug_struct("SetScanoutBlob").finish(),
633*bb4ee6a4SAndroid Build Coastguard Worker ResourceFlush(_info) => f.debug_struct("ResourceFlush").finish(),
634*bb4ee6a4SAndroid Build Coastguard Worker TransferToHost2d(_info) => f.debug_struct("TransferToHost2d").finish(),
635*bb4ee6a4SAndroid Build Coastguard Worker ResourceAttachBacking(_info) => f.debug_struct("ResourceAttachBacking").finish(),
636*bb4ee6a4SAndroid Build Coastguard Worker ResourceDetachBacking(_info) => f.debug_struct("ResourceDetachBacking").finish(),
637*bb4ee6a4SAndroid Build Coastguard Worker GetCapsetInfo(_info) => f.debug_struct("GetCapsetInfo").finish(),
638*bb4ee6a4SAndroid Build Coastguard Worker GetCapset(_info) => f.debug_struct("GetCapset").finish(),
639*bb4ee6a4SAndroid Build Coastguard Worker GetEdid(_info) => f.debug_struct("GetEdid").finish(),
640*bb4ee6a4SAndroid Build Coastguard Worker CtxCreate(_info) => f.debug_struct("CtxCreate").finish(),
641*bb4ee6a4SAndroid Build Coastguard Worker CtxDestroy(_info) => f.debug_struct("CtxDestroy").finish(),
642*bb4ee6a4SAndroid Build Coastguard Worker CtxAttachResource(_info) => f.debug_struct("CtxAttachResource").finish(),
643*bb4ee6a4SAndroid Build Coastguard Worker CtxDetachResource(_info) => f.debug_struct("CtxDetachResource").finish(),
644*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreate3d(_info) => f.debug_struct("ResourceCreate3d").finish(),
645*bb4ee6a4SAndroid Build Coastguard Worker TransferToHost3d(_info) => f.debug_struct("TransferToHost3d").finish(),
646*bb4ee6a4SAndroid Build Coastguard Worker TransferFromHost3d(_info) => f.debug_struct("TransferFromHost3d").finish(),
647*bb4ee6a4SAndroid Build Coastguard Worker CmdSubmit3d(_info) => f.debug_struct("CmdSubmit3d").finish(),
648*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreateBlob(_info) => f.debug_struct("ResourceCreateBlob").finish(),
649*bb4ee6a4SAndroid Build Coastguard Worker ResourceMapBlob(_info) => f.debug_struct("ResourceMapBlob").finish(),
650*bb4ee6a4SAndroid Build Coastguard Worker ResourceUnmapBlob(_info) => f.debug_struct("ResourceUnmapBlob").finish(),
651*bb4ee6a4SAndroid Build Coastguard Worker UpdateCursor(_info) => f.debug_struct("UpdateCursor").finish(),
652*bb4ee6a4SAndroid Build Coastguard Worker MoveCursor(_info) => f.debug_struct("MoveCursor").finish(),
653*bb4ee6a4SAndroid Build Coastguard Worker ResourceAssignUuid(_info) => f.debug_struct("ResourceAssignUuid").finish(),
654*bb4ee6a4SAndroid Build Coastguard Worker }
655*bb4ee6a4SAndroid Build Coastguard Worker }
656*bb4ee6a4SAndroid Build Coastguard Worker }
657*bb4ee6a4SAndroid Build Coastguard Worker
658*bb4ee6a4SAndroid Build Coastguard Worker impl GpuCommand {
659*bb4ee6a4SAndroid Build Coastguard Worker /// Decodes a command from the given chunk of memory.
decode(cmd: &mut Reader) -> Result<GpuCommand, GpuCommandDecodeError>660*bb4ee6a4SAndroid Build Coastguard Worker pub fn decode(cmd: &mut Reader) -> Result<GpuCommand, GpuCommandDecodeError> {
661*bb4ee6a4SAndroid Build Coastguard Worker use self::GpuCommand::*;
662*bb4ee6a4SAndroid Build Coastguard Worker let hdr = cmd.peek_obj::<virtio_gpu_ctrl_hdr>()?;
663*bb4ee6a4SAndroid Build Coastguard Worker Ok(match hdr.type_.into() {
664*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_GET_DISPLAY_INFO => GetDisplayInfo(cmd.read_obj()?),
665*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_CREATE_2D => ResourceCreate2d(cmd.read_obj()?),
666*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_UNREF => ResourceUnref(cmd.read_obj()?),
667*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_SET_SCANOUT => SetScanout(cmd.read_obj()?),
668*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_SET_SCANOUT_BLOB => SetScanoutBlob(cmd.read_obj()?),
669*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_FLUSH => ResourceFlush(cmd.read_obj()?),
670*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D => TransferToHost2d(cmd.read_obj()?),
671*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING => ResourceAttachBacking(cmd.read_obj()?),
672*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING => ResourceDetachBacking(cmd.read_obj()?),
673*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_GET_CAPSET_INFO => GetCapsetInfo(cmd.read_obj()?),
674*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_GET_CAPSET => GetCapset(cmd.read_obj()?),
675*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_GET_EDID => GetEdid(cmd.read_obj()?),
676*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_CTX_CREATE => CtxCreate(cmd.read_obj()?),
677*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_CTX_DESTROY => CtxDestroy(cmd.read_obj()?),
678*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE => CtxAttachResource(cmd.read_obj()?),
679*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE => CtxDetachResource(cmd.read_obj()?),
680*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_CREATE_3D => ResourceCreate3d(cmd.read_obj()?),
681*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D => TransferToHost3d(cmd.read_obj()?),
682*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D => TransferFromHost3d(cmd.read_obj()?),
683*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_SUBMIT_3D => CmdSubmit3d(cmd.read_obj()?),
684*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB => ResourceCreateBlob(cmd.read_obj()?),
685*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB => ResourceMapBlob(cmd.read_obj()?),
686*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB => ResourceUnmapBlob(cmd.read_obj()?),
687*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_UPDATE_CURSOR => UpdateCursor(cmd.read_obj()?),
688*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_MOVE_CURSOR => MoveCursor(cmd.read_obj()?),
689*bb4ee6a4SAndroid Build Coastguard Worker VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID => ResourceAssignUuid(cmd.read_obj()?),
690*bb4ee6a4SAndroid Build Coastguard Worker _ => return Err(GpuCommandDecodeError::InvalidType(hdr.type_.into())),
691*bb4ee6a4SAndroid Build Coastguard Worker })
692*bb4ee6a4SAndroid Build Coastguard Worker }
693*bb4ee6a4SAndroid Build Coastguard Worker
694*bb4ee6a4SAndroid Build Coastguard Worker /// Gets the generic `virtio_gpu_ctrl_hdr` from this command.
ctrl_hdr(&self) -> &virtio_gpu_ctrl_hdr695*bb4ee6a4SAndroid Build Coastguard Worker pub fn ctrl_hdr(&self) -> &virtio_gpu_ctrl_hdr {
696*bb4ee6a4SAndroid Build Coastguard Worker use self::GpuCommand::*;
697*bb4ee6a4SAndroid Build Coastguard Worker match self {
698*bb4ee6a4SAndroid Build Coastguard Worker GetDisplayInfo(info) => info,
699*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreate2d(info) => &info.hdr,
700*bb4ee6a4SAndroid Build Coastguard Worker ResourceUnref(info) => &info.hdr,
701*bb4ee6a4SAndroid Build Coastguard Worker SetScanout(info) => &info.hdr,
702*bb4ee6a4SAndroid Build Coastguard Worker SetScanoutBlob(info) => &info.hdr,
703*bb4ee6a4SAndroid Build Coastguard Worker ResourceFlush(info) => &info.hdr,
704*bb4ee6a4SAndroid Build Coastguard Worker TransferToHost2d(info) => &info.hdr,
705*bb4ee6a4SAndroid Build Coastguard Worker ResourceAttachBacking(info) => &info.hdr,
706*bb4ee6a4SAndroid Build Coastguard Worker ResourceDetachBacking(info) => &info.hdr,
707*bb4ee6a4SAndroid Build Coastguard Worker GetCapsetInfo(info) => &info.hdr,
708*bb4ee6a4SAndroid Build Coastguard Worker GetCapset(info) => &info.hdr,
709*bb4ee6a4SAndroid Build Coastguard Worker GetEdid(info) => &info.hdr,
710*bb4ee6a4SAndroid Build Coastguard Worker CtxCreate(info) => &info.hdr,
711*bb4ee6a4SAndroid Build Coastguard Worker CtxDestroy(info) => &info.hdr,
712*bb4ee6a4SAndroid Build Coastguard Worker CtxAttachResource(info) => &info.hdr,
713*bb4ee6a4SAndroid Build Coastguard Worker CtxDetachResource(info) => &info.hdr,
714*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreate3d(info) => &info.hdr,
715*bb4ee6a4SAndroid Build Coastguard Worker TransferToHost3d(info) => &info.hdr,
716*bb4ee6a4SAndroid Build Coastguard Worker TransferFromHost3d(info) => &info.hdr,
717*bb4ee6a4SAndroid Build Coastguard Worker CmdSubmit3d(info) => &info.hdr,
718*bb4ee6a4SAndroid Build Coastguard Worker ResourceCreateBlob(info) => &info.hdr,
719*bb4ee6a4SAndroid Build Coastguard Worker ResourceMapBlob(info) => &info.hdr,
720*bb4ee6a4SAndroid Build Coastguard Worker ResourceUnmapBlob(info) => &info.hdr,
721*bb4ee6a4SAndroid Build Coastguard Worker UpdateCursor(info) => &info.hdr,
722*bb4ee6a4SAndroid Build Coastguard Worker MoveCursor(info) => &info.hdr,
723*bb4ee6a4SAndroid Build Coastguard Worker ResourceAssignUuid(info) => &info.hdr,
724*bb4ee6a4SAndroid Build Coastguard Worker }
725*bb4ee6a4SAndroid Build Coastguard Worker }
726*bb4ee6a4SAndroid Build Coastguard Worker }
727*bb4ee6a4SAndroid Build Coastguard Worker
728*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Eq)]
729*bb4ee6a4SAndroid Build Coastguard Worker pub struct GpuResponsePlaneInfo {
730*bb4ee6a4SAndroid Build Coastguard Worker pub stride: u32,
731*bb4ee6a4SAndroid Build Coastguard Worker pub offset: u32,
732*bb4ee6a4SAndroid Build Coastguard Worker }
733*bb4ee6a4SAndroid Build Coastguard Worker
734*bb4ee6a4SAndroid Build Coastguard Worker /// A response to a `GpuCommand`. These correspond to `VIRTIO_GPU_RESP_*`.
735*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug)]
736*bb4ee6a4SAndroid Build Coastguard Worker pub enum GpuResponse {
737*bb4ee6a4SAndroid Build Coastguard Worker OkNoData,
738*bb4ee6a4SAndroid Build Coastguard Worker OkDisplayInfo(Vec<(u32, u32, bool)>),
739*bb4ee6a4SAndroid Build Coastguard Worker OkCapsetInfo {
740*bb4ee6a4SAndroid Build Coastguard Worker capset_id: u32,
741*bb4ee6a4SAndroid Build Coastguard Worker version: u32,
742*bb4ee6a4SAndroid Build Coastguard Worker size: u32,
743*bb4ee6a4SAndroid Build Coastguard Worker },
744*bb4ee6a4SAndroid Build Coastguard Worker OkCapset(Vec<u8>),
745*bb4ee6a4SAndroid Build Coastguard Worker OkEdid(Box<EdidBytes>),
746*bb4ee6a4SAndroid Build Coastguard Worker OkResourcePlaneInfo {
747*bb4ee6a4SAndroid Build Coastguard Worker format_modifier: u64,
748*bb4ee6a4SAndroid Build Coastguard Worker plane_info: Vec<GpuResponsePlaneInfo>,
749*bb4ee6a4SAndroid Build Coastguard Worker },
750*bb4ee6a4SAndroid Build Coastguard Worker OkResourceUuid {
751*bb4ee6a4SAndroid Build Coastguard Worker uuid: [u8; 16],
752*bb4ee6a4SAndroid Build Coastguard Worker },
753*bb4ee6a4SAndroid Build Coastguard Worker OkMapInfo {
754*bb4ee6a4SAndroid Build Coastguard Worker map_info: u32,
755*bb4ee6a4SAndroid Build Coastguard Worker },
756*bb4ee6a4SAndroid Build Coastguard Worker ErrUnspec,
757*bb4ee6a4SAndroid Build Coastguard Worker ErrTube(TubeError),
758*bb4ee6a4SAndroid Build Coastguard Worker ErrBase(BaseError),
759*bb4ee6a4SAndroid Build Coastguard Worker ErrRutabaga(RutabagaError),
760*bb4ee6a4SAndroid Build Coastguard Worker ErrDisplay(GpuDisplayError),
761*bb4ee6a4SAndroid Build Coastguard Worker ErrScanout {
762*bb4ee6a4SAndroid Build Coastguard Worker num_scanouts: u32,
763*bb4ee6a4SAndroid Build Coastguard Worker },
764*bb4ee6a4SAndroid Build Coastguard Worker ErrEdid(String),
765*bb4ee6a4SAndroid Build Coastguard Worker ErrOutOfMemory,
766*bb4ee6a4SAndroid Build Coastguard Worker ErrInvalidScanoutId,
767*bb4ee6a4SAndroid Build Coastguard Worker ErrInvalidResourceId,
768*bb4ee6a4SAndroid Build Coastguard Worker ErrInvalidContextId,
769*bb4ee6a4SAndroid Build Coastguard Worker ErrInvalidParameter,
770*bb4ee6a4SAndroid Build Coastguard Worker ErrUdmabuf(UdmabufError),
771*bb4ee6a4SAndroid Build Coastguard Worker }
772*bb4ee6a4SAndroid Build Coastguard Worker
773*bb4ee6a4SAndroid Build Coastguard Worker impl From<TubeError> for GpuResponse {
from(e: TubeError) -> GpuResponse774*bb4ee6a4SAndroid Build Coastguard Worker fn from(e: TubeError) -> GpuResponse {
775*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrTube(e)
776*bb4ee6a4SAndroid Build Coastguard Worker }
777*bb4ee6a4SAndroid Build Coastguard Worker }
778*bb4ee6a4SAndroid Build Coastguard Worker
779*bb4ee6a4SAndroid Build Coastguard Worker impl From<RutabagaError> for GpuResponse {
from(e: RutabagaError) -> GpuResponse780*bb4ee6a4SAndroid Build Coastguard Worker fn from(e: RutabagaError) -> GpuResponse {
781*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrRutabaga(e)
782*bb4ee6a4SAndroid Build Coastguard Worker }
783*bb4ee6a4SAndroid Build Coastguard Worker }
784*bb4ee6a4SAndroid Build Coastguard Worker
785*bb4ee6a4SAndroid Build Coastguard Worker impl From<GpuDisplayError> for GpuResponse {
from(e: GpuDisplayError) -> GpuResponse786*bb4ee6a4SAndroid Build Coastguard Worker fn from(e: GpuDisplayError) -> GpuResponse {
787*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrDisplay(e)
788*bb4ee6a4SAndroid Build Coastguard Worker }
789*bb4ee6a4SAndroid Build Coastguard Worker }
790*bb4ee6a4SAndroid Build Coastguard Worker
791*bb4ee6a4SAndroid Build Coastguard Worker impl From<UdmabufError> for GpuResponse {
from(e: UdmabufError) -> GpuResponse792*bb4ee6a4SAndroid Build Coastguard Worker fn from(e: UdmabufError) -> GpuResponse {
793*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrUdmabuf(e)
794*bb4ee6a4SAndroid Build Coastguard Worker }
795*bb4ee6a4SAndroid Build Coastguard Worker }
796*bb4ee6a4SAndroid Build Coastguard Worker
797*bb4ee6a4SAndroid Build Coastguard Worker impl Display for GpuResponse {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result798*bb4ee6a4SAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
799*bb4ee6a4SAndroid Build Coastguard Worker use self::GpuResponse::*;
800*bb4ee6a4SAndroid Build Coastguard Worker match self {
801*bb4ee6a4SAndroid Build Coastguard Worker ErrTube(e) => write!(f, "tube error: {}", e),
802*bb4ee6a4SAndroid Build Coastguard Worker ErrBase(e) => write!(f, "base error: {}", e),
803*bb4ee6a4SAndroid Build Coastguard Worker ErrRutabaga(e) => write!(f, "renderer error: {}", e),
804*bb4ee6a4SAndroid Build Coastguard Worker ErrDisplay(e) => write!(f, "display error: {}", e),
805*bb4ee6a4SAndroid Build Coastguard Worker ErrScanout { num_scanouts } => write!(f, "non-zero scanout: {}", num_scanouts),
806*bb4ee6a4SAndroid Build Coastguard Worker ErrUdmabuf(e) => write!(f, "udmabuf error: {}", e),
807*bb4ee6a4SAndroid Build Coastguard Worker _ => Ok(()),
808*bb4ee6a4SAndroid Build Coastguard Worker }
809*bb4ee6a4SAndroid Build Coastguard Worker }
810*bb4ee6a4SAndroid Build Coastguard Worker }
811*bb4ee6a4SAndroid Build Coastguard Worker
812*bb4ee6a4SAndroid Build Coastguard Worker impl std::error::Error for GpuResponse {}
813*bb4ee6a4SAndroid Build Coastguard Worker
814*bb4ee6a4SAndroid Build Coastguard Worker /// An error indicating something went wrong decoding a `GpuCommand`.
815*bb4ee6a4SAndroid Build Coastguard Worker #[sorted]
816*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Error, Debug)]
817*bb4ee6a4SAndroid Build Coastguard Worker pub enum GpuResponseEncodeError {
818*bb4ee6a4SAndroid Build Coastguard Worker /// An I/O error occurred.
819*bb4ee6a4SAndroid Build Coastguard Worker #[error("an I/O error occurred: {0}")]
820*bb4ee6a4SAndroid Build Coastguard Worker IO(io::Error),
821*bb4ee6a4SAndroid Build Coastguard Worker /// More displays than are valid were in a `OkDisplayInfo`.
822*bb4ee6a4SAndroid Build Coastguard Worker #[error("{0} is more displays than are valid")]
823*bb4ee6a4SAndroid Build Coastguard Worker TooManyDisplays(usize),
824*bb4ee6a4SAndroid Build Coastguard Worker /// More planes than are valid were in a `OkResourcePlaneInfo`.
825*bb4ee6a4SAndroid Build Coastguard Worker #[error("{0} is more planes than are valid")]
826*bb4ee6a4SAndroid Build Coastguard Worker TooManyPlanes(usize),
827*bb4ee6a4SAndroid Build Coastguard Worker }
828*bb4ee6a4SAndroid Build Coastguard Worker
829*bb4ee6a4SAndroid Build Coastguard Worker impl From<io::Error> for GpuResponseEncodeError {
from(e: io::Error) -> GpuResponseEncodeError830*bb4ee6a4SAndroid Build Coastguard Worker fn from(e: io::Error) -> GpuResponseEncodeError {
831*bb4ee6a4SAndroid Build Coastguard Worker GpuResponseEncodeError::IO(e)
832*bb4ee6a4SAndroid Build Coastguard Worker }
833*bb4ee6a4SAndroid Build Coastguard Worker }
834*bb4ee6a4SAndroid Build Coastguard Worker
835*bb4ee6a4SAndroid Build Coastguard Worker pub type VirtioGpuResult = std::result::Result<GpuResponse, GpuResponse>;
836*bb4ee6a4SAndroid Build Coastguard Worker
837*bb4ee6a4SAndroid Build Coastguard Worker impl GpuResponse {
838*bb4ee6a4SAndroid Build Coastguard Worker /// Encodes a this `GpuResponse` into `resp` and the given set of metadata.
encode( &self, flags: u32, fence_id: u64, ctx_id: u32, ring_idx: u8, resp: &mut Writer, ) -> Result<u32, GpuResponseEncodeError>839*bb4ee6a4SAndroid Build Coastguard Worker pub fn encode(
840*bb4ee6a4SAndroid Build Coastguard Worker &self,
841*bb4ee6a4SAndroid Build Coastguard Worker flags: u32,
842*bb4ee6a4SAndroid Build Coastguard Worker fence_id: u64,
843*bb4ee6a4SAndroid Build Coastguard Worker ctx_id: u32,
844*bb4ee6a4SAndroid Build Coastguard Worker ring_idx: u8,
845*bb4ee6a4SAndroid Build Coastguard Worker resp: &mut Writer,
846*bb4ee6a4SAndroid Build Coastguard Worker ) -> Result<u32, GpuResponseEncodeError> {
847*bb4ee6a4SAndroid Build Coastguard Worker let hdr = virtio_gpu_ctrl_hdr {
848*bb4ee6a4SAndroid Build Coastguard Worker type_: Le32::from(self.get_type()),
849*bb4ee6a4SAndroid Build Coastguard Worker flags: Le32::from(flags),
850*bb4ee6a4SAndroid Build Coastguard Worker fence_id: Le64::from(fence_id),
851*bb4ee6a4SAndroid Build Coastguard Worker ctx_id: Le32::from(ctx_id),
852*bb4ee6a4SAndroid Build Coastguard Worker ring_idx,
853*bb4ee6a4SAndroid Build Coastguard Worker padding: Default::default(),
854*bb4ee6a4SAndroid Build Coastguard Worker };
855*bb4ee6a4SAndroid Build Coastguard Worker let len = match *self {
856*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkDisplayInfo(ref info) => {
857*bb4ee6a4SAndroid Build Coastguard Worker if info.len() > VIRTIO_GPU_MAX_SCANOUTS {
858*bb4ee6a4SAndroid Build Coastguard Worker return Err(GpuResponseEncodeError::TooManyDisplays(info.len()));
859*bb4ee6a4SAndroid Build Coastguard Worker }
860*bb4ee6a4SAndroid Build Coastguard Worker let mut disp_info = virtio_gpu_resp_display_info {
861*bb4ee6a4SAndroid Build Coastguard Worker hdr,
862*bb4ee6a4SAndroid Build Coastguard Worker pmodes: Default::default(),
863*bb4ee6a4SAndroid Build Coastguard Worker };
864*bb4ee6a4SAndroid Build Coastguard Worker for (disp_mode, &(width, height, enabled)) in disp_info.pmodes.iter_mut().zip(info)
865*bb4ee6a4SAndroid Build Coastguard Worker {
866*bb4ee6a4SAndroid Build Coastguard Worker disp_mode.r.width = Le32::from(width);
867*bb4ee6a4SAndroid Build Coastguard Worker disp_mode.r.height = Le32::from(height);
868*bb4ee6a4SAndroid Build Coastguard Worker disp_mode.enabled = Le32::from(enabled as u32);
869*bb4ee6a4SAndroid Build Coastguard Worker }
870*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(disp_info)?;
871*bb4ee6a4SAndroid Build Coastguard Worker size_of_val(&disp_info)
872*bb4ee6a4SAndroid Build Coastguard Worker }
873*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkCapsetInfo {
874*bb4ee6a4SAndroid Build Coastguard Worker capset_id,
875*bb4ee6a4SAndroid Build Coastguard Worker version,
876*bb4ee6a4SAndroid Build Coastguard Worker size,
877*bb4ee6a4SAndroid Build Coastguard Worker } => {
878*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(virtio_gpu_resp_capset_info {
879*bb4ee6a4SAndroid Build Coastguard Worker hdr,
880*bb4ee6a4SAndroid Build Coastguard Worker capset_id: Le32::from(capset_id),
881*bb4ee6a4SAndroid Build Coastguard Worker capset_max_version: Le32::from(version),
882*bb4ee6a4SAndroid Build Coastguard Worker capset_max_size: Le32::from(size),
883*bb4ee6a4SAndroid Build Coastguard Worker padding: Le32::from(0),
884*bb4ee6a4SAndroid Build Coastguard Worker })?;
885*bb4ee6a4SAndroid Build Coastguard Worker size_of::<virtio_gpu_resp_capset_info>()
886*bb4ee6a4SAndroid Build Coastguard Worker }
887*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkCapset(ref data) => {
888*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(hdr)?;
889*bb4ee6a4SAndroid Build Coastguard Worker resp.write_all(data)?;
890*bb4ee6a4SAndroid Build Coastguard Worker size_of_val(&hdr) + data.len()
891*bb4ee6a4SAndroid Build Coastguard Worker }
892*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkEdid(ref edid_bytes) => {
893*bb4ee6a4SAndroid Build Coastguard Worker let mut edid_resp = virtio_gpu_resp_get_edid {
894*bb4ee6a4SAndroid Build Coastguard Worker hdr,
895*bb4ee6a4SAndroid Build Coastguard Worker size: Le32::from(1024),
896*bb4ee6a4SAndroid Build Coastguard Worker padding: Le32::from(0),
897*bb4ee6a4SAndroid Build Coastguard Worker edid: [0; 1024],
898*bb4ee6a4SAndroid Build Coastguard Worker };
899*bb4ee6a4SAndroid Build Coastguard Worker
900*bb4ee6a4SAndroid Build Coastguard Worker edid_resp.edid[0..edid_bytes.len()].copy_from_slice(edid_bytes.as_bytes());
901*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(edid_resp)?;
902*bb4ee6a4SAndroid Build Coastguard Worker size_of::<virtio_gpu_resp_get_edid>()
903*bb4ee6a4SAndroid Build Coastguard Worker }
904*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkResourcePlaneInfo {
905*bb4ee6a4SAndroid Build Coastguard Worker format_modifier,
906*bb4ee6a4SAndroid Build Coastguard Worker ref plane_info,
907*bb4ee6a4SAndroid Build Coastguard Worker } => {
908*bb4ee6a4SAndroid Build Coastguard Worker if plane_info.len() > PLANE_INFO_MAX_COUNT {
909*bb4ee6a4SAndroid Build Coastguard Worker return Err(GpuResponseEncodeError::TooManyPlanes(plane_info.len()));
910*bb4ee6a4SAndroid Build Coastguard Worker }
911*bb4ee6a4SAndroid Build Coastguard Worker let mut strides = [Le32::default(); PLANE_INFO_MAX_COUNT];
912*bb4ee6a4SAndroid Build Coastguard Worker let mut offsets = [Le32::default(); PLANE_INFO_MAX_COUNT];
913*bb4ee6a4SAndroid Build Coastguard Worker for (plane_index, plane) in plane_info.iter().enumerate() {
914*bb4ee6a4SAndroid Build Coastguard Worker strides[plane_index] = plane.stride.into();
915*bb4ee6a4SAndroid Build Coastguard Worker offsets[plane_index] = plane.offset.into();
916*bb4ee6a4SAndroid Build Coastguard Worker }
917*bb4ee6a4SAndroid Build Coastguard Worker let plane_info = virtio_gpu_resp_resource_plane_info {
918*bb4ee6a4SAndroid Build Coastguard Worker hdr,
919*bb4ee6a4SAndroid Build Coastguard Worker count: Le32::from(plane_info.len() as u32),
920*bb4ee6a4SAndroid Build Coastguard Worker padding: 0.into(),
921*bb4ee6a4SAndroid Build Coastguard Worker format_modifier: format_modifier.into(),
922*bb4ee6a4SAndroid Build Coastguard Worker strides,
923*bb4ee6a4SAndroid Build Coastguard Worker offsets,
924*bb4ee6a4SAndroid Build Coastguard Worker };
925*bb4ee6a4SAndroid Build Coastguard Worker if resp.available_bytes() >= size_of_val(&plane_info) {
926*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(plane_info)?;
927*bb4ee6a4SAndroid Build Coastguard Worker size_of_val(&plane_info)
928*bb4ee6a4SAndroid Build Coastguard Worker } else {
929*bb4ee6a4SAndroid Build Coastguard Worker // In case there is too little room in the response slice to store the
930*bb4ee6a4SAndroid Build Coastguard Worker // entire virtio_gpu_resp_resource_plane_info, convert response to a regular
931*bb4ee6a4SAndroid Build Coastguard Worker // VIRTIO_GPU_RESP_OK_NODATA and attempt to return that.
932*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(virtio_gpu_ctrl_hdr {
933*bb4ee6a4SAndroid Build Coastguard Worker type_: Le32::from(VIRTIO_GPU_RESP_OK_NODATA),
934*bb4ee6a4SAndroid Build Coastguard Worker ..hdr
935*bb4ee6a4SAndroid Build Coastguard Worker })?;
936*bb4ee6a4SAndroid Build Coastguard Worker size_of_val(&hdr)
937*bb4ee6a4SAndroid Build Coastguard Worker }
938*bb4ee6a4SAndroid Build Coastguard Worker }
939*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkResourceUuid { uuid } => {
940*bb4ee6a4SAndroid Build Coastguard Worker let resp_info = virtio_gpu_resp_resource_uuid { hdr, uuid };
941*bb4ee6a4SAndroid Build Coastguard Worker
942*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(resp_info)?;
943*bb4ee6a4SAndroid Build Coastguard Worker size_of_val(&resp_info)
944*bb4ee6a4SAndroid Build Coastguard Worker }
945*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkMapInfo { map_info } => {
946*bb4ee6a4SAndroid Build Coastguard Worker let resp_info = virtio_gpu_resp_map_info {
947*bb4ee6a4SAndroid Build Coastguard Worker hdr,
948*bb4ee6a4SAndroid Build Coastguard Worker map_info: Le32::from(map_info),
949*bb4ee6a4SAndroid Build Coastguard Worker padding: Default::default(),
950*bb4ee6a4SAndroid Build Coastguard Worker };
951*bb4ee6a4SAndroid Build Coastguard Worker
952*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(resp_info)?;
953*bb4ee6a4SAndroid Build Coastguard Worker size_of_val(&resp_info)
954*bb4ee6a4SAndroid Build Coastguard Worker }
955*bb4ee6a4SAndroid Build Coastguard Worker _ => {
956*bb4ee6a4SAndroid Build Coastguard Worker resp.write_obj(hdr)?;
957*bb4ee6a4SAndroid Build Coastguard Worker size_of_val(&hdr)
958*bb4ee6a4SAndroid Build Coastguard Worker }
959*bb4ee6a4SAndroid Build Coastguard Worker };
960*bb4ee6a4SAndroid Build Coastguard Worker Ok(len as u32)
961*bb4ee6a4SAndroid Build Coastguard Worker }
962*bb4ee6a4SAndroid Build Coastguard Worker
963*bb4ee6a4SAndroid Build Coastguard Worker /// Gets the `VIRTIO_GPU_*` enum value that corresponds to this variant.
get_type(&self) -> u32964*bb4ee6a4SAndroid Build Coastguard Worker pub fn get_type(&self) -> u32 {
965*bb4ee6a4SAndroid Build Coastguard Worker match self {
966*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkNoData => VIRTIO_GPU_RESP_OK_NODATA,
967*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkDisplayInfo(_) => VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
968*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkCapsetInfo { .. } => VIRTIO_GPU_RESP_OK_CAPSET_INFO,
969*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkCapset(_) => VIRTIO_GPU_RESP_OK_CAPSET,
970*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkEdid(_) => VIRTIO_GPU_RESP_OK_EDID,
971*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkResourcePlaneInfo { .. } => VIRTIO_GPU_RESP_OK_RESOURCE_PLANE_INFO,
972*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkResourceUuid { .. } => VIRTIO_GPU_RESP_OK_RESOURCE_UUID,
973*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::OkMapInfo { .. } => VIRTIO_GPU_RESP_OK_MAP_INFO,
974*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrUnspec => VIRTIO_GPU_RESP_ERR_UNSPEC,
975*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrTube(_) => VIRTIO_GPU_RESP_ERR_UNSPEC,
976*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrBase(_) => VIRTIO_GPU_RESP_ERR_UNSPEC,
977*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrRutabaga(_) => VIRTIO_GPU_RESP_ERR_UNSPEC,
978*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrDisplay(_) => VIRTIO_GPU_RESP_ERR_UNSPEC,
979*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrUdmabuf(_) => VIRTIO_GPU_RESP_ERR_UNSPEC,
980*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrScanout { num_scanouts: _ } => VIRTIO_GPU_RESP_ERR_UNSPEC,
981*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrEdid(_) => VIRTIO_GPU_RESP_ERR_UNSPEC,
982*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrOutOfMemory => VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY,
983*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrInvalidScanoutId => VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID,
984*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrInvalidResourceId => VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
985*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrInvalidContextId => VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
986*bb4ee6a4SAndroid Build Coastguard Worker GpuResponse::ErrInvalidParameter => VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
987*bb4ee6a4SAndroid Build Coastguard Worker }
988*bb4ee6a4SAndroid Build Coastguard Worker }
989*bb4ee6a4SAndroid Build Coastguard Worker }
990