diff options
| author | Christian Meissl <meissl.christian@gmail.com> | 2024-01-23 20:44:47 +0100 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-25 07:49:51 +0400 |
| commit | 73f3c160b299e956402c7b5856701cc812bd250f (patch) | |
| tree | a559620edf0eca6d65ad336b5f48cf29ca485f71 | |
| parent | 5f99eb13ab3e26f860a858b52129ce6227441e35 (diff) | |
| download | niri-73f3c160b299e956402c7b5856701cc812bd250f.tar.gz niri-73f3c160b299e956402c7b5856701cc812bd250f.tar.bz2 niri-73f3c160b299e956402c7b5856701cc812bd250f.zip | |
use pixman for cursor plane rendering
| -rw-r--r-- | Cargo.lock | 25 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/cursor.rs | 26 | ||||
| -rw-r--r-- | src/niri.rs | 49 |
4 files changed, 53 insertions, 48 deletions
@@ -2123,6 +2123,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] name = "peeking_take_while" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2186,6 +2192,24 @@ dependencies = [ ] [[package]] +name = "pixman" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a24da0bec14f4e43a495c1837a3c358b87532e7fe66bd75c348b89f0451b6" +dependencies = [ + "drm-fourcc", + "paste", + "pixman-sys", + "thiserror", +] + +[[package]] +name = "pixman-sys" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0483e89e81d7915defe83c51f23f6800594d64f6f4a21253ce87fd8444ada" + +[[package]] name = "pkg-config" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2714,6 +2738,7 @@ dependencies = [ "libloading", "libseat", "once_cell", + "pixman", "pkg-config", "profiling", "rand", @@ -80,6 +80,7 @@ features = [ "backend_winit", "desktop", "renderer_gl", + "renderer_pixman", "renderer_multi", "use_system_lib", "wayland_frontend", diff --git a/src/cursor.rs b/src/cursor.rs index bdaba542..e31808a9 100644 --- a/src/cursor.rs +++ b/src/cursor.rs @@ -8,8 +8,7 @@ use std::sync::Mutex; use anyhow::{anyhow, Context}; use smithay::backend::allocator::Fourcc; -use smithay::backend::renderer::element::texture::TextureBuffer; -use smithay::backend::renderer::gles::{GlesRenderer, GlesTexture}; +use smithay::backend::renderer::element::memory::MemoryRenderBuffer; use smithay::input::pointer::{CursorIcon, CursorImageAttributes, CursorImageStatus}; use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface; use smithay::utils::{IsAlive, Logical, Physical, Point, Transform}; @@ -224,7 +223,7 @@ pub enum RenderCursor { }, } -type TextureCache = HashMap<(CursorIcon, i32), Vec<Option<TextureBuffer<GlesTexture>>>>; +type TextureCache = HashMap<(CursorIcon, i32), Vec<MemoryRenderBuffer>>; #[derive(Default)] pub struct CursorTextureCache { @@ -238,12 +237,11 @@ impl CursorTextureCache { pub fn get( &self, - renderer: &mut GlesRenderer, icon: CursorIcon, scale: i32, cursor: &XCursor, idx: usize, - ) -> Option<TextureBuffer<GlesTexture>> { + ) -> MemoryRenderBuffer { self.cache .borrow_mut() .entry((icon, scale)) @@ -252,26 +250,14 @@ impl CursorTextureCache { .frames() .iter() .map(|frame| { - let _span = tracy_client::span!("create TextureBuffer"); - - let buffer = TextureBuffer::from_memory( - renderer, + MemoryRenderBuffer::from_slice( &frame.pixels_rgba, - Fourcc::Abgr8888, + Fourcc::Argb8888, (frame.width as i32, frame.height as i32), - false, scale, Transform::Normal, None, - ); - - match buffer { - Ok(x) => Some(x), - Err(err) => { - warn!("error creating a cursor texture: {err:?}"); - None - } - } + ) }) .collect() })[idx] diff --git a/src/niri.rs b/src/niri.rs index 4e9bf257..2bdf785c 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -13,11 +13,11 @@ use anyhow::Context; use calloop::futures::Scheduler; use niri_config::{Config, TrackLayout}; use smithay::backend::allocator::Fourcc; +use smithay::backend::renderer::element::memory::MemoryRenderBufferRenderElement; use smithay::backend::renderer::element::solid::{SolidColorBuffer, SolidColorRenderElement}; use smithay::backend::renderer::element::surface::{ render_elements_from_surface_tree, WaylandSurfaceRenderElement, }; -use smithay::backend::renderer::element::texture::TextureRenderElement; use smithay::backend::renderer::element::utils::select_dmabuf_feedback; use smithay::backend::renderer::element::{ default_primary_scanout_output_compare, AsRenderElements, Element, Id, Kind, RenderElement, @@ -106,7 +106,7 @@ use crate::input::{apply_libinput_settings, TabletData}; use crate::ipc::server::IpcServer; use crate::layout::{Layout, MonitorRenderElement}; use crate::pw_utils::{Cast, PipeWire}; -use crate::render_helpers::{NiriRenderer, PrimaryGpuTextureRenderElement}; +use crate::render_helpers::NiriRenderer; use crate::screenshot_ui::{ScreenshotUi, ScreenshotUiRenderElement}; use crate::utils::{ center, get_monotonic_time, make_screenshot_path, output_size, write_png_rgba8, @@ -1670,26 +1670,25 @@ impl Niri { let pointer_pos = (pointer_pos - hotspot.to_f64()).to_physical_precise_round(output_scale); - let texture = self.cursor_texture_cache.get( - renderer.as_gles_renderer(), - icon, - scale, - &cursor, - idx, - ); - + let texture = self.cursor_texture_cache.get(icon, scale, &cursor, idx); let mut pointer_elements = vec![]; - if let Some(texture) = texture { - pointer_elements.push(OutputRenderElements::NamedPointer( - PrimaryGpuTextureRenderElement(TextureRenderElement::from_texture_buffer( - pointer_pos.to_f64(), - &texture, - None, - None, - None, - Kind::Cursor, - )), - )); + let pointer_element = match MemoryRenderBufferRenderElement::from_buffer( + renderer, + pointer_pos.to_f64(), + &texture, + None, + None, + None, + Kind::Cursor, + ) { + Ok(element) => Some(element), + Err(err) => { + warn!("error importing a cursor texture: {err:?}"); + None + } + }; + if let Some(element) = pointer_element { + pointer_elements.push(OutputRenderElements::NamedPointer(element)); } (pointer_elements, pointer_pos) @@ -2931,7 +2930,7 @@ fn render_to_dmabuf( pub enum OutputRenderElements<R: NiriRenderer> { Monitor(MonitorRenderElement<R>), Wayland(WaylandSurfaceRenderElement<R>), - NamedPointer(PrimaryGpuTextureRenderElement), + NamedPointer(MemoryRenderBufferRenderElement<R>), SolidColor(SolidColorRenderElement), ScreenshotUi(ScreenshotUiRenderElement), ConfigErrorNotification(ConfigErrorNotificationRenderElement<R>), @@ -3131,12 +3130,6 @@ impl<R: NiriRenderer> From<WaylandSurfaceRenderElement<R>> for OutputRenderEleme } } -impl<R: NiriRenderer> From<PrimaryGpuTextureRenderElement> for OutputRenderElements<R> { - fn from(x: PrimaryGpuTextureRenderElement) -> Self { - Self::NamedPointer(x) - } -} - impl<R: NiriRenderer> From<SolidColorRenderElement> for OutputRenderElements<R> { fn from(x: SolidColorRenderElement) -> Self { Self::SolidColor(x) |
