iced_wgpu/
engine.rs

1use crate::graphics::Antialiasing;
2use crate::primitive;
3use crate::quad;
4use crate::text;
5use crate::triangle;
6
7use std::sync::{Arc, RwLock};
8
9#[derive(Clone)]
10pub struct Engine {
11    pub(crate) device: wgpu::Device,
12    pub(crate) queue: wgpu::Queue,
13    pub(crate) format: wgpu::TextureFormat,
14
15    pub(crate) quad_pipeline: quad::Pipeline,
16    pub(crate) text_pipeline: text::Pipeline,
17    pub(crate) triangle_pipeline: triangle::Pipeline,
18    #[cfg(any(feature = "image", feature = "svg"))]
19    pub(crate) image_pipeline: crate::image::Pipeline,
20    pub(crate) primitive_storage: Arc<RwLock<primitive::Storage>>,
21}
22
23impl Engine {
24    pub fn new(
25        _adapter: &wgpu::Adapter,
26        device: wgpu::Device,
27        queue: wgpu::Queue,
28        format: wgpu::TextureFormat,
29        antialiasing: Option<Antialiasing>, // TODO: Initialize AA pipelines lazily
30    ) -> Self {
31        Self {
32            format,
33
34            quad_pipeline: quad::Pipeline::new(&device, format),
35            text_pipeline: text::Pipeline::new(&device, &queue, format),
36            triangle_pipeline: triangle::Pipeline::new(
37                &device,
38                format,
39                antialiasing,
40            ),
41
42            #[cfg(any(feature = "image", feature = "svg"))]
43            image_pipeline: {
44                let backend = _adapter.get_info().backend;
45
46                crate::image::Pipeline::new(&device, format, backend)
47            },
48
49            primitive_storage: Arc::new(RwLock::new(
50                primitive::Storage::default(),
51            )),
52
53            device,
54            queue,
55        }
56    }
57
58    #[cfg(any(feature = "image", feature = "svg"))]
59    pub fn create_image_cache(
60        &self,
61        device: &wgpu::Device,
62    ) -> crate::image::Cache {
63        self.image_pipeline.create_cache(device)
64    }
65}