diff --git a/local/recipes/gpu/redox-drm/source/src/driver.rs b/local/recipes/gpu/redox-drm/source/src/driver.rs index 8b1c382707..cc98faf36e 100644 --- a/local/recipes/gpu/redox-drm/source/src/driver.rs +++ b/local/recipes/gpu/redox-drm/source/src/driver.rs @@ -103,6 +103,13 @@ pub trait GpuDriver: Send + Sync { fn page_flip(&self, crtc_id: u32, fb_handle: u32, flags: u32) -> Result; fn get_vblank(&self, crtc_id: u32) -> Result; + fn cursor_set(&self, _crtc_id: u32, _fb_handle: u32, _hot_x: u32, _hot_y: u32) -> Result<()> { + Err(DriverError::Unsupported("hardware cursor unavailable")) + } + fn cursor_move(&self, _crtc_id: u32, _x: i32, _y: i32) -> Result<()> { + Err(DriverError::Unsupported("hardware cursor movement unavailable")) + } + fn gem_create(&self, size: u64, width: u32, height: u32) -> Result; fn gem_close(&self, handle: GemHandle) -> Result<()>; fn gem_mmap(&self, handle: GemHandle) -> Result; diff --git a/local/recipes/gpu/redox-drm/source/src/scheme.rs b/local/recipes/gpu/redox-drm/source/src/scheme.rs index 9b9abd8226..42c32ba349 100644 --- a/local/recipes/gpu/redox-drm/source/src/scheme.rs +++ b/local/recipes/gpu/redox-drm/source/src/scheme.rs @@ -67,6 +67,7 @@ const DRM_IOCTL_MODE_OBJ_SETPROPERTY: usize = DRM_IOCTL_BASE + 0x55; const DRM_IOCTL_MODE_GETPLANERESOURCES: usize = DRM_IOCTL_BASE + 0x56; const DRM_IOCTL_MODE_GETPLANE: usize = DRM_IOCTL_BASE + 0x57; const DRM_IOCTL_MODE_SETPLANE: usize = DRM_IOCTL_BASE + 0x58; +const DRM_IOCTL_MODE_CURSOR: usize = DRM_IOCTL_BASE + 0x3B; const DRM_IOCTL_MODE_ADDFB2: usize = DRM_IOCTL_BASE + 0x59; const DRM_IOCTL_GET_PCI_INFO: usize = DRM_IOCTL_BASE + 0x60; const DRM_IOCTL_VIRTGPU_MAP: usize = 0x0041; @@ -1309,6 +1310,7 @@ impl DrmScheme { DRM_IOCTL_VIRTGPU_GET_CAPS => "VIRTGPU_GET_CAPS", DRM_IOCTL_VIRTGPU_RESOURCE_CREATE_BLOB => "VIRTGPU_RESOURCE_CREATE_BLOB", DRM_IOCTL_VIRTGPU_CONTEXT_INIT => "VIRTGPU_CONTEXT_INIT", + DRM_IOCTL_MODE_CURSOR => "CURSOR", _ => "UNKNOWN", }; log::info!( @@ -1442,6 +1444,24 @@ impl DrmScheme { seqno.to_le_bytes().to_vec() } + DRM_IOCTL_MODE_CURSOR => { + let flags = read_u32(payload, 0)?; + let crtc_id = read_u32(payload, 4)?; + if flags & 0x01 != 0 { + let fb_handle = read_u32(payload, 12)?; + let hot_x = read_u32(payload, 16)?; + let hot_y = read_u32(payload, 20)?; + self.driver.cursor_set(crtc_id, fb_handle, hot_x, hot_y) + .map_err(driver_to_syscall)?; + } else if flags & 0x02 != 0 { + let x = read_u32(payload, 8)? as i32; + let y = read_u32(payload, 12)? as i32; + self.driver.cursor_move(crtc_id, x, y) + .map_err(driver_to_syscall)?; + } + Vec::new() + } + DRM_IOCTL_MODE_CREATE_DUMB => { let mut req = decode_wire::(payload)?; info!(