xref: /aosp_15_r20/external/crosvm/gpu_display/examples/simple_open.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 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 use std::process::exit;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Context;
8*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Result;
9*bb4ee6a4SAndroid Build Coastguard Worker use gpu_display::GpuDisplay;
10*bb4ee6a4SAndroid Build Coastguard Worker use gpu_display::SurfaceType;
11*bb4ee6a4SAndroid Build Coastguard Worker use vm_control::gpu::DisplayMode;
12*bb4ee6a4SAndroid Build Coastguard Worker use vm_control::gpu::DisplayParameters;
13*bb4ee6a4SAndroid Build Coastguard Worker 
run() -> Result<()>14*bb4ee6a4SAndroid Build Coastguard Worker fn run() -> Result<()> {
15*bb4ee6a4SAndroid Build Coastguard Worker     let mut disp = GpuDisplay::open_x(None::<&str>).context("open_x")?;
16*bb4ee6a4SAndroid Build Coastguard Worker     let surface_id = disp
17*bb4ee6a4SAndroid Build Coastguard Worker         .create_surface(
18*bb4ee6a4SAndroid Build Coastguard Worker             None,
19*bb4ee6a4SAndroid Build Coastguard Worker             /* scanout_id= */ Some(0),
20*bb4ee6a4SAndroid Build Coastguard Worker             &DisplayParameters::default_with_mode(DisplayMode::Windowed(1280, 1024)),
21*bb4ee6a4SAndroid Build Coastguard Worker             SurfaceType::Scanout,
22*bb4ee6a4SAndroid Build Coastguard Worker         )
23*bb4ee6a4SAndroid Build Coastguard Worker         .context("create_surface")?;
24*bb4ee6a4SAndroid Build Coastguard Worker 
25*bb4ee6a4SAndroid Build Coastguard Worker     let mem = disp.framebuffer(surface_id).context("framebuffer")?;
26*bb4ee6a4SAndroid Build Coastguard Worker     for y in 0..1024 {
27*bb4ee6a4SAndroid Build Coastguard Worker         let mut row = [0u32; 1280];
28*bb4ee6a4SAndroid Build Coastguard Worker         for (x, item) in row.iter_mut().enumerate() {
29*bb4ee6a4SAndroid Build Coastguard Worker             let b = ((x as f32 / 1280.0) * 256.0) as u32;
30*bb4ee6a4SAndroid Build Coastguard Worker             let g = ((y as f32 / 1024.0) * 256.0) as u32;
31*bb4ee6a4SAndroid Build Coastguard Worker             *item = b | (g << 8);
32*bb4ee6a4SAndroid Build Coastguard Worker         }
33*bb4ee6a4SAndroid Build Coastguard Worker         mem.as_volatile_slice()
34*bb4ee6a4SAndroid Build Coastguard Worker             .offset(1280 * 4 * y)
35*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap()
36*bb4ee6a4SAndroid Build Coastguard Worker             .copy_from(&row);
37*bb4ee6a4SAndroid Build Coastguard Worker     }
38*bb4ee6a4SAndroid Build Coastguard Worker     disp.flip(surface_id);
39*bb4ee6a4SAndroid Build Coastguard Worker 
40*bb4ee6a4SAndroid Build Coastguard Worker     while !disp.close_requested(surface_id) {
41*bb4ee6a4SAndroid Build Coastguard Worker         disp.dispatch_events().context("dispatch_events")?;
42*bb4ee6a4SAndroid Build Coastguard Worker     }
43*bb4ee6a4SAndroid Build Coastguard Worker 
44*bb4ee6a4SAndroid Build Coastguard Worker     Ok(())
45*bb4ee6a4SAndroid Build Coastguard Worker }
46*bb4ee6a4SAndroid Build Coastguard Worker 
main()47*bb4ee6a4SAndroid Build Coastguard Worker fn main() {
48*bb4ee6a4SAndroid Build Coastguard Worker     if let Err(e) = run() {
49*bb4ee6a4SAndroid Build Coastguard Worker         eprintln!("error: {:#}", e);
50*bb4ee6a4SAndroid Build Coastguard Worker         exit(1);
51*bb4ee6a4SAndroid Build Coastguard Worker     }
52*bb4ee6a4SAndroid Build Coastguard Worker }
53