Added offscreen rendering support for wgpu & tiny-skia exposed with the window::screenshot command.

This commit is contained in:
Bingus 2023-03-25 10:45:39 -07:00 committed by Héctor Ramón Jiménez
parent c15f1b5f65
commit 233196eb14
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
16 changed files with 893 additions and 24 deletions

View file

@ -1,4 +1,3 @@
use crate::core;
use crate::core::{Color, Font, Point, Size};
use crate::graphics::backend;
use crate::graphics::color;
@ -6,6 +5,7 @@ use crate::graphics::{Primitive, Transformation, Viewport};
use crate::quad;
use crate::text;
use crate::triangle;
use crate::{core, offscreen};
use crate::{Layer, Settings};
#[cfg(feature = "tracing")]
@ -123,6 +123,65 @@ impl Backend {
self.image_pipeline.end_frame();
}
/// Performs an offscreen render pass. If the `format` selected by WGPU is not
/// `wgpu::TextureFormat::Rgba8UnormSrgb`, a conversion compute pipeline will run.
///
/// Returns `None` if the `frame` is `Rgba8UnormSrgb`, else returns the newly
/// converted texture view in `Rgba8UnormSrgb`.
pub fn offscreen<T: AsRef<str>>(
&mut self,
device: &wgpu::Device,
queue: &wgpu::Queue,
encoder: &mut wgpu::CommandEncoder,
clear_color: Option<Color>,
frame: &wgpu::TextureView,
format: wgpu::TextureFormat,
primitives: &[Primitive],
viewport: &Viewport,
overlay_text: &[T],
texture_extent: wgpu::Extent3d,
) -> Option<wgpu::Texture> {
#[cfg(feature = "tracing")]
let _ = info_span!("iced_wgpu::offscreen", "DRAW").entered();
self.present(
device,
queue,
encoder,
clear_color,
frame,
primitives,
viewport,
overlay_text,
);
if format != wgpu::TextureFormat::Rgba8UnormSrgb {
log::info!("Texture format is {format:?}; performing conversion to rgba8..");
let pipeline = offscreen::Pipeline::new(device);
let texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("iced_wgpu.offscreen.conversion.source_texture"),
size: texture_extent,
mip_level_count: 1,
sample_count: 1,
dimension: wgpu::TextureDimension::D2,
format: wgpu::TextureFormat::Rgba8Unorm,
usage: wgpu::TextureUsages::STORAGE_BINDING
| wgpu::TextureUsages::COPY_SRC,
view_formats: &[],
});
let view =
texture.create_view(&wgpu::TextureViewDescriptor::default());
pipeline.convert(device, texture_extent, frame, &view, encoder);
return Some(texture);
}
None
}
fn prepare_text(
&mut self,
device: &wgpu::Device,