mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-22 02:01:55 +07:00
render_helpers: Extract common functions
This commit is contained in:
+31
-17
@@ -6,9 +6,13 @@ use smithay::backend::allocator::dmabuf::Dmabuf;
|
|||||||
use smithay::backend::allocator::{Buffer, Fourcc};
|
use smithay::backend::allocator::{Buffer, Fourcc};
|
||||||
use smithay::backend::renderer::element::utils::{Relocate, RelocateRenderElement};
|
use smithay::backend::renderer::element::utils::{Relocate, RelocateRenderElement};
|
||||||
use smithay::backend::renderer::element::{Element, Kind, RenderElement};
|
use smithay::backend::renderer::element::{Element, Kind, RenderElement};
|
||||||
use smithay::backend::renderer::gles::{GlesMapping, GlesRenderer, GlesTarget, GlesTexture};
|
use smithay::backend::renderer::gles::{
|
||||||
|
GlesError, GlesMapping, GlesRenderer, GlesTarget, GlesTexture,
|
||||||
|
};
|
||||||
use smithay::backend::renderer::sync::SyncPoint;
|
use smithay::backend::renderer::sync::SyncPoint;
|
||||||
use smithay::backend::renderer::{Bind, Color32F, ExportMem, Frame, Offscreen, Renderer};
|
use smithay::backend::renderer::{
|
||||||
|
Bind, Color32F, ExportMem, Frame, Offscreen, Renderer, Texture as _,
|
||||||
|
};
|
||||||
use smithay::reexports::wayland_server::protocol::wl_buffer::WlBuffer;
|
use smithay::reexports::wayland_server::protocol::wl_buffer::WlBuffer;
|
||||||
use smithay::reexports::wayland_server::protocol::wl_shm;
|
use smithay::reexports::wayland_server::protocol::wl_shm;
|
||||||
use smithay::utils::{Logical, Physical, Point, Rectangle, Scale, Size, Transform};
|
use smithay::utils::{Logical, Physical, Point, Rectangle, Scale, Size, Transform};
|
||||||
@@ -155,6 +159,23 @@ pub fn encompassing_geo(
|
|||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_texture(
|
||||||
|
renderer: &mut GlesRenderer,
|
||||||
|
size: Size<i32, Physical>,
|
||||||
|
fourcc: Fourcc,
|
||||||
|
) -> Result<GlesTexture, GlesError> {
|
||||||
|
let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal);
|
||||||
|
renderer.create_buffer(fourcc, buffer_size)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn copy_framebuffer(
|
||||||
|
renderer: &mut GlesRenderer,
|
||||||
|
target: &GlesTarget,
|
||||||
|
fourcc: Fourcc,
|
||||||
|
) -> Result<GlesMapping, GlesError> {
|
||||||
|
renderer.copy_framebuffer(target, Rectangle::from_size(target.size()), fourcc)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn render_to_encompassing_texture(
|
pub fn render_to_encompassing_texture(
|
||||||
renderer: &mut GlesRenderer,
|
renderer: &mut GlesRenderer,
|
||||||
scale: Scale<f64>,
|
scale: Scale<f64>,
|
||||||
@@ -183,11 +204,7 @@ pub fn render_to_texture(
|
|||||||
) -> anyhow::Result<(GlesTexture, SyncPoint)> {
|
) -> anyhow::Result<(GlesTexture, SyncPoint)> {
|
||||||
let _span = tracy_client::span!();
|
let _span = tracy_client::span!();
|
||||||
|
|
||||||
let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal);
|
let mut texture = create_texture(renderer, size, fourcc).context("error creating texture")?;
|
||||||
|
|
||||||
let mut texture: GlesTexture = renderer
|
|
||||||
.create_buffer(fourcc, buffer_size)
|
|
||||||
.context("error creating texture")?;
|
|
||||||
|
|
||||||
let sync_point = {
|
let sync_point = {
|
||||||
let mut target = renderer
|
let mut target = renderer
|
||||||
@@ -210,18 +227,15 @@ pub fn render_and_download(
|
|||||||
) -> anyhow::Result<GlesMapping> {
|
) -> anyhow::Result<GlesMapping> {
|
||||||
let _span = tracy_client::span!();
|
let _span = tracy_client::span!();
|
||||||
|
|
||||||
let (mut texture, _) = render_to_texture(renderer, size, scale, transform, fourcc, elements)?;
|
let mut texture = create_texture(renderer, size, fourcc).context("error creating texture")?;
|
||||||
|
let mut target = renderer
|
||||||
let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal);
|
|
||||||
// FIXME: would be nice to avoid binding the second time here (after render_to_texture()), but
|
|
||||||
// borrowing makes this inconvenient.
|
|
||||||
let target = renderer
|
|
||||||
.bind(&mut texture)
|
.bind(&mut texture)
|
||||||
.context("error binding texture")?;
|
.context("error binding texture")?;
|
||||||
let mapping = renderer
|
|
||||||
.copy_framebuffer(&target, Rectangle::from_size(buffer_size), fourcc)
|
let _sync = render_elements(renderer, &mut target, size, scale, transform, elements)
|
||||||
.context("error copying framebuffer")?;
|
.context("error rendering")?;
|
||||||
Ok(mapping)
|
|
||||||
|
copy_framebuffer(renderer, &target, fourcc).context("error copying framebuffer")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render_to_vec(
|
pub fn render_to_vec(
|
||||||
|
|||||||
Reference in New Issue
Block a user