aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Meissl <meissl.christian@gmail.com>2024-01-23 20:44:47 +0100
committerIvan Molodetskikh <yalterz@gmail.com>2024-01-25 07:49:51 +0400
commit73f3c160b299e956402c7b5856701cc812bd250f (patch)
treea559620edf0eca6d65ad336b5f48cf29ca485f71
parent5f99eb13ab3e26f860a858b52129ce6227441e35 (diff)
downloadniri-73f3c160b299e956402c7b5856701cc812bd250f.tar.gz
niri-73f3c160b299e956402c7b5856701cc812bd250f.tar.bz2
niri-73f3c160b299e956402c7b5856701cc812bd250f.zip
use pixman for cursor plane rendering
-rw-r--r--Cargo.lock25
-rw-r--r--Cargo.toml1
-rw-r--r--src/cursor.rs26
-rw-r--r--src/niri.rs49
4 files changed, 53 insertions, 48 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 4344b8aa..0d6e5e2e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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",
diff --git a/Cargo.toml b/Cargo.toml
index e179269f..069e0888 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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)