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 Workerfn 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 Workerfn 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