diff --git a/local/recipes/gpu/redox-drm/source/src/drivers/amd/display.rs b/local/recipes/gpu/redox-drm/source/src/drivers/amd/display.rs index b29e0b6f..41243342 100644 --- a/local/recipes/gpu/redox-drm/source/src/drivers/amd/display.rs +++ b/local/recipes/gpu/redox-drm/source/src/drivers/amd/display.rs @@ -338,7 +338,22 @@ impl DisplayCore { match self.read_edid_block(connector_index, 0x00) { Ok(edid) if edid.len() >= 128 => edid, - Ok(_) | Err(_) => Vec::new(), + Ok(short) => { + log::warn!( + "redox-drm: short EDID ({} bytes) from AMD connector {}", + short.len(), + connector_index + ); + Vec::new() + } + Err(e) => { + log::warn!( + "redox-drm: EDID read failed for AMD connector {}: {}", + connector_index, + e + ); + Vec::new() + } } } diff --git a/local/recipes/gpu/redox-drm/source/src/gem.rs b/local/recipes/gpu/redox-drm/source/src/gem.rs index b631cb67..06d1d02b 100644 --- a/local/recipes/gpu/redox-drm/source/src/gem.rs +++ b/local/recipes/gpu/redox-drm/source/src/gem.rs @@ -121,3 +121,42 @@ impl GemManager { Ok(self.object(handle)?.gpu_addr) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn create_and_object_exists() { + let mut mgr = GemManager::new(); + let h = mgr.create(4096).expect("create should succeed"); + let obj = mgr.object(h).expect("object should exist after create"); + assert_eq!(obj.handle, h); + assert_eq!(obj.size, 4096); + } + + #[test] + fn close_removes_object() { + let mut mgr = GemManager::new(); + let h = mgr.create(4096).expect("create should succeed"); + mgr.close(h).expect("close should succeed"); + assert!(mgr.object(h).is_err(), "object should be gone after close"); + } + + #[test] + fn double_close_returns_error() { + let mut mgr = GemManager::new(); + let h = mgr.create(4096).expect("create should succeed"); + mgr.close(h).expect("first close should succeed"); + assert!(mgr.close(h).is_err(), "second close should fail"); + } + + #[test] + fn object_by_invalid_handle_returns_error() { + let mgr = GemManager::new(); + assert!( + mgr.object(99999).is_err(), + "querying a non-existent handle should fail" + ); + } +} diff --git a/local/recipes/gpu/redox-drm/source/src/main.rs b/local/recipes/gpu/redox-drm/source/src/main.rs index 5f9a0af0..717e3805 100644 --- a/local/recipes/gpu/redox-drm/source/src/main.rs +++ b/local/recipes/gpu/redox-drm/source/src/main.rs @@ -129,8 +129,11 @@ fn run() -> Result<()> { let response = match response { Ok(response) => response, - Err(_request) => { - error!("redox-drm: failed to handle request"); + Err(request) => { + error!( + "redox-drm: failed to handle request from context {}", + request.context_id() + ); continue; } }; diff --git a/local/recipes/gpu/redox-drm/source/src/scheme.rs b/local/recipes/gpu/redox-drm/source/src/scheme.rs index 582f77c3..2b068407 100644 --- a/local/recipes/gpu/redox-drm/source/src/scheme.rs +++ b/local/recipes/gpu/redox-drm/source/src/scheme.rs @@ -1011,14 +1011,16 @@ impl DrmScheme { ); return Err(Error::new(EINVAL)); } - let required_size = (pitch as u64).checked_mul(req.height as u64); - if required_size.is_none() { - warn!( - "redox-drm: ADDFB pitch * height overflows pitch={} height={}", - pitch, req.height - ); - return Err(Error::new(EINVAL)); - } + let required_size = match (pitch as u64).checked_mul(req.height as u64) { + Some(s) => s, + None => { + warn!( + "redox-drm: ADDFB pitch * height overflows pitch={} height={}", + pitch, req.height + ); + return Err(Error::new(EINVAL)); + } + }; let owned = self .handles .get(&id) @@ -1035,10 +1037,10 @@ impl DrmScheme { warn!("redox-drm: ADDFB handle {} not found: {}", req.handle, e); Error::new(ENOENT) })?; - if required_size.unwrap() > actual_size { + if required_size > actual_size { warn!( "redox-drm: ADDFB requires {} bytes but GEM {} is {} bytes", - required_size.unwrap(), + required_size, req.handle, actual_size );