diff options
Diffstat (limited to 'client/src/render/scene/textures.rs')
-rw-r--r-- | client/src/render/scene/textures.rs | 84 |
1 files changed, 48 insertions, 36 deletions
diff --git a/client/src/render/scene/textures.rs b/client/src/render/scene/textures.rs index c385be2..2da84be 100644 --- a/client/src/render/scene/textures.rs +++ b/client/src/render/scene/textures.rs @@ -18,7 +18,12 @@ use super::{GraphicsConfig, ScenePreparer, TextureIdentityKind}; use anyhow::Result; use image::ImageReader; use log::debug; -use std::{io::Cursor, sync::Arc, time::Instant}; +use rayon::iter::{IntoParallelIterator, ParallelIterator}; +use std::{ + io::Cursor, + sync::{Arc, atomic::AtomicUsize}, + time::Instant, +}; use wgpu::{ AddressMode, BindGroup, BindGroupDescriptor, BindGroupEntry, BindGroupLayout, BindingResource, Color, ColorTargetState, ColorWrites, CommandEncoderDescriptor, Device, Extent3d, FilterMode, @@ -99,42 +104,49 @@ impl ScenePreparer { self.placeholder_textures.insert(kind, tex_bg, 4); *num_done += 1; } - for spec in self.textures.needed() { - let start = Instant::now(); - let format = if spec.linear { - TextureFormat::Rgba8Unorm - } else { - TextureFormat::Rgba8UnormSrgb - }; - if let Some(mipgen) = self.mip_generation_pipelines.try_get(format) { - if let Some(buf) = self.downloader.try_get(spec.data.clone())? { - let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?; - let image = image.decode()?; - let dims = (image.width(), image.height()); - let image = image.into_rgba8(); - let image = image.into_vec(); - let tex_bg = create_texture( - &self.device, - &self.queue, - &self.layouts.texture, - &image, - dims.0, - dims.1, - format, - Some(&mipgen), - &self.config.read().unwrap().clone(), - ); - self.textures.insert(spec, tex_bg, image.len()); - debug!( - "texture created (res={}x{}, took {:?})", - dims.0, - dims.1, - start.elapsed() - ); - *num_done += 1; + + let numdone = AtomicUsize::new(0); + self.textures + .needed() + .into_par_iter() + .try_for_each(|spec| { + let start = Instant::now(); + let format = if spec.linear { + TextureFormat::Rgba8Unorm + } else { + TextureFormat::Rgba8UnormSrgb + }; + if let Some(mipgen) = self.mip_generation_pipelines.try_get(format) { + if let Some(buf) = self.downloader.try_get(spec.data.clone())? { + let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?; + let image = image.decode()?; + let dims = (image.width(), image.height()); + let image = image.into_rgba8(); + let image = image.into_vec(); + let tex_bg = create_texture( + &self.device, + &self.queue, + &self.layouts.texture, + &image, + dims.0, + dims.1, + format, + Some(&mipgen), + &self.config.read().unwrap().clone(), + ); + self.textures.insert(spec, tex_bg, image.len()); + debug!( + "texture created (res={}x{}, took {:?})", + dims.0, + dims.1, + start.elapsed() + ); + numdone.fetch_add(1, std::sync::atomic::Ordering::Relaxed); + } } - } - } + Ok::<(), anyhow::Error>(()) + })?; + *num_done += numdone.load(std::sync::atomic::Ordering::Relaxed); Ok(()) } } |