render_helpers: Extract common functions

This commit is contained in:
Ivan Molodetskikh
2026-03-10 10:49:03 +03:00
parent b3f5255bb9
commit 45582ad095
+31 -17
View File
@@ -6,9 +6,13 @@ use smithay::backend::allocator::dmabuf::Dmabuf;
use smithay::backend::allocator::{Buffer, Fourcc};
use smithay::backend::renderer::element::utils::{Relocate, RelocateRenderElement};
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::{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_shm;
use smithay::utils::{Logical, Physical, Point, Rectangle, Scale, Size, Transform};
@@ -155,6 +159,23 @@ pub fn encompassing_geo(
.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(
renderer: &mut GlesRenderer,
scale: Scale<f64>,
@@ -183,11 +204,7 @@ pub fn render_to_texture(
) -> anyhow::Result<(GlesTexture, SyncPoint)> {
let _span = tracy_client::span!();
let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal);
let mut texture: GlesTexture = renderer
.create_buffer(fourcc, buffer_size)
.context("error creating texture")?;
let mut texture = create_texture(renderer, size, fourcc).context("error creating texture")?;
let sync_point = {
let mut target = renderer
@@ -210,18 +227,15 @@ pub fn render_and_download(
) -> anyhow::Result<GlesMapping> {
let _span = tracy_client::span!();
let (mut texture, _) = render_to_texture(renderer, size, scale, transform, fourcc, elements)?;
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
let mut texture = create_texture(renderer, size, fourcc).context("error creating texture")?;
let mut target = renderer
.bind(&mut texture)
.context("error binding texture")?;
let mapping = renderer
.copy_framebuffer(&target, Rectangle::from_size(buffer_size), fourcc)
.context("error copying framebuffer")?;
Ok(mapping)
let _sync = render_elements(renderer, &mut target, size, scale, transform, elements)
.context("error rendering")?;
copy_framebuffer(renderer, &target, fourcc).context("error copying framebuffer")
}
pub fn render_to_vec(