From 8f02a358a49cc1345fbc344ef4cf3cc93d3dd74f Mon Sep 17 00:00:00 2001 From: Shadow Cat Date: Sun, 24 Aug 2025 22:31:51 -0400 Subject: [PATCH] fix view count --- src/layout/texture.rs | 8 ++++++-- src/layout/ui.rs | 2 +- src/render/texture.rs | 7 ++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/layout/texture.rs b/src/layout/texture.rs index 9d8e384..47e023e 100644 --- a/src/layout/texture.rs +++ b/src/layout/texture.rs @@ -3,7 +3,7 @@ use std::{ sync::mpsc::{Receiver, Sender, channel}, }; -use image::DynamicImage; +use image::{DynamicImage, GenericImageView}; use crate::{render::TexturePrimitive, util::RefCounter}; @@ -25,6 +25,7 @@ pub struct Textures { } pub enum TextureUpdate<'a> { + PushFree, Push(&'a DynamicImage), Set(u32, &'a DynamicImage), Free(u32), @@ -84,7 +85,10 @@ impl Textures { pub fn updates(&mut self) -> impl Iterator> { self.updates.drain(..).map(|u| match u { - Update::Push(i) => TextureUpdate::Push(self.images[i as usize].as_ref().unwrap()), + Update::Push(i) => self.images[i as usize] + .as_ref() + .map(TextureUpdate::Push) + .unwrap_or(TextureUpdate::PushFree), Update::Set(i) => TextureUpdate::Set(i, self.images[i as usize].as_ref().unwrap()), Update::Free(i) => TextureUpdate::Free(i), }) diff --git a/src/layout/ui.rs b/src/layout/ui.rs index 90c7943..d5f470b 100644 --- a/src/layout/ui.rs +++ b/src/layout/ui.rs @@ -137,7 +137,6 @@ impl Ui { where Ctx: 'static, { - self.free(); let mut painter = Painter::new( &self.widgets, &mut self.primitives, @@ -152,6 +151,7 @@ impl Ui { for id in self.updates.drain(..) { painter.redraw(&id.id); } + self.free(); } /// free any resources that don't have references anymore diff --git a/src/render/texture.rs b/src/render/texture.rs index f3ed155..a539aa9 100644 --- a/src/render/texture.rs +++ b/src/render/texture.rs @@ -1,4 +1,4 @@ -use image::{DynamicImage, EncodableLayout}; +use image::{DynamicImage, EncodableLayout, GenericImageView}; use wgpu::{util::DeviceExt, *}; use crate::layout::{TextureUpdate, Textures}; @@ -22,6 +22,7 @@ impl GpuTextures { TextureUpdate::Push(image) => self.push(image), TextureUpdate::Set(i, image) => self.set(i, image), TextureUpdate::Free(i) => self.free(i), + TextureUpdate::PushFree => self.push_free(), } } changed @@ -40,6 +41,10 @@ impl GpuTextures { let view = self.create_view(image); self.views.push(view); } + fn push_free(&mut self) { + self.view_count += 1; + self.views.push(self.null_view.clone()); + } fn create_view(&self, image: &DynamicImage) -> TextureView { let image = image.to_rgba8();