summaryrefslogtreecommitdiffstats
path: root/wgpu/src/backend.rs
diff options
context:
space:
mode:
Diffstat (limited to 'wgpu/src/backend.rs')
-rw-r--r--wgpu/src/backend.rs61
1 files changed, 60 insertions, 1 deletions
diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs
index b524c615..8f37f285 100644
--- a/wgpu/src/backend.rs
+++ b/wgpu/src/backend.rs
@@ -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,