summaryrefslogtreecommitdiffstats
path: root/wgpu/src/lib.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-05-06 12:14:42 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-05-06 12:23:44 +0200
commit547446f0de076149a4c61e6a4179308b266fd9fd (patch)
treeaf7a1a6a731d0d65d4a2fc2c733a0f0f7b889f7a /wgpu/src/lib.rs
parenta94984d681875146d7af9f568bf8713503c1ca96 (diff)
downloadiced-547446f0de076149a4c61e6a4179308b266fd9fd.tar.gz
iced-547446f0de076149a4c61e6a4179308b266fd9fd.tar.bz2
iced-547446f0de076149a4c61e6a4179308b266fd9fd.zip
Fix windows fighting over shared `image::Cache`
Image caches are local to each window now.
Diffstat (limited to 'wgpu/src/lib.rs')
-rw-r--r--wgpu/src/lib.rs15
1 files changed, 11 insertions, 4 deletions
diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs
index 4c168029..35da3211 100644
--- a/wgpu/src/lib.rs
+++ b/wgpu/src/lib.rs
@@ -67,6 +67,8 @@ use crate::core::{
use crate::graphics::text::{Editor, Paragraph};
use crate::graphics::Viewport;
+use std::cell::RefCell;
+
/// A [`wgpu`] graphics renderer for [`iced`].
///
/// [`wgpu`]: https://github.com/gfx-rs/wgpu-rs
@@ -82,11 +84,12 @@ pub struct Renderer {
// TODO: Centralize all the image feature handling
#[cfg(any(feature = "svg", feature = "image"))]
- image_cache: image::cache::Shared,
+ image_cache: RefCell<image::Cache>,
}
impl Renderer {
pub fn new(
+ _device: &wgpu::Device,
_engine: &Engine,
default_font: Font,
default_text_size: Pixels,
@@ -100,7 +103,7 @@ impl Renderer {
text_storage: text::Storage::new(),
#[cfg(any(feature = "svg", feature = "image"))]
- image_cache: _engine.image_cache().clone(),
+ image_cache: RefCell::new(_engine.create_image_cache(_device)),
}
}
@@ -191,6 +194,7 @@ impl Renderer {
device,
encoder,
&mut engine.staging_belt,
+ &mut self.image_cache.borrow_mut(),
&layer.images,
viewport.projection(),
scale_factor,
@@ -246,6 +250,8 @@ impl Renderer {
#[cfg(any(feature = "svg", feature = "image"))]
let mut image_layer = 0;
+ #[cfg(any(feature = "svg", feature = "image"))]
+ let image_cache = self.image_cache.borrow();
let scale_factor = viewport.scale_factor() as f32;
let physical_bounds = Rectangle::<f32>::from(Rectangle::with_size(
@@ -359,6 +365,7 @@ impl Renderer {
#[cfg(any(feature = "svg", feature = "image"))]
if !layer.images.is_empty() {
engine.image_pipeline.render(
+ &image_cache,
image_layer,
scissor_rect,
&mut render_pass,
@@ -509,7 +516,7 @@ impl core::image::Renderer for Renderer {
type Handle = core::image::Handle;
fn measure_image(&self, handle: &Self::Handle) -> Size<u32> {
- self.image_cache.lock().measure_image(handle)
+ self.image_cache.borrow_mut().measure_image(handle)
}
fn draw_image(
@@ -535,7 +542,7 @@ impl core::image::Renderer for Renderer {
#[cfg(feature = "svg")]
impl core::svg::Renderer for Renderer {
fn measure_svg(&self, handle: &core::svg::Handle) -> Size<u32> {
- self.image_cache.lock().measure_svg(handle)
+ self.image_cache.borrow_mut().measure_svg(handle)
}
fn draw_svg(