multithreading remains a mystery

This commit is contained in:
Quaternions 2023-10-01 14:56:02 -07:00
parent c7538869b4
commit 1f9bdd9a34

View File

@ -97,59 +97,66 @@ impl GraphicsData {
//idk how to do this gooder lol //idk how to do this gooder lol
let mut double_map=std::collections::HashMap::<u32,u32>::new(); let mut double_map=std::collections::HashMap::<u32,u32>::new();
let mut texture_views:Vec<wgpu::TextureView>=Vec::with_capacity(indexed_models.textures.len()); let mut texture_loading_threads=Vec::new();
let the_device=std::sync::Arc::new(device);
let the_queue=std::sync::Arc::new(queue);
for (i,t) in indexed_models.textures.iter().enumerate(){ for (i,t) in indexed_models.textures.iter().enumerate(){
if let Ok(mut file) = std::fs::File::open(std::path::Path::new(&format!("textures/{}.dds",t))){ if let Ok(mut file) = std::fs::File::open(std::path::Path::new(&format!("textures/{}.dds",t))){
let image = ddsfile::Dds::read(&mut file).unwrap(); double_map.insert(i as u32, texture_loading_threads.len() as u32);
let thread_device=the_device.clone();
let thread_queue=the_queue.clone();
texture_loading_threads.push(std::thread::spawn(move ||{
let image = ddsfile::Dds::read(&mut file).unwrap();
let (mut width,mut height)=(image.get_width(),image.get_height()); let (mut width,mut height)=(image.get_width(),image.get_height());
let format=match image.header10.unwrap().dxgi_format{ let format=match image.header10.unwrap().dxgi_format{
ddsfile::DxgiFormat::R8G8B8A8_UNorm_sRGB => wgpu::TextureFormat::Rgba8UnormSrgb, ddsfile::DxgiFormat::R8G8B8A8_UNorm_sRGB => wgpu::TextureFormat::Rgba8UnormSrgb,
ddsfile::DxgiFormat::BC7_UNorm_sRGB => { ddsfile::DxgiFormat::BC7_UNorm_sRGB => {
//floor(w,4), should be ceil(w,4) //floor(w,4), should be ceil(w,4)
width=width/4*4; width=width/4*4;
height=height/4*4; height=height/4*4;
wgpu::TextureFormat::Bc7RgbaUnormSrgb wgpu::TextureFormat::Bc7RgbaUnormSrgb
}, },
other=>panic!("unsupported format {:?}",other), other=>panic!("unsupported format {:?}",other),
}; };
let size = wgpu::Extent3d { let size = wgpu::Extent3d {
width, width,
height, height,
depth_or_array_layers: 1, depth_or_array_layers: 1,
}; };
let layer_size = wgpu::Extent3d { let layer_size = wgpu::Extent3d {
depth_or_array_layers: 1, depth_or_array_layers: 1,
..size ..size
}; };
let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2);
let texture = device.create_texture_with_data( let texture = thread_device.create_texture_with_data(
queue, &thread_queue,
&wgpu::TextureDescriptor { &wgpu::TextureDescriptor {
size, size,
mip_level_count: max_mips, mip_level_count: max_mips,
sample_count: 1, sample_count: 1,
dimension: wgpu::TextureDimension::D2, dimension: wgpu::TextureDimension::D2,
format, format,
usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
label: Some(format!("Texture{}",i).as_str()), label: Some(format!("Texture{}",i).as_str()),
view_formats: &[], view_formats: &[],
}, },
&image.data, &image.data,
); );
texture.create_view(&wgpu::TextureViewDescriptor {
double_map.insert(i as u32, texture_views.len() as u32); label: Some(format!("Texture{} View",i).as_str()),
texture_views.push(texture.create_view(&wgpu::TextureViewDescriptor { dimension: Some(wgpu::TextureViewDimension::D2),
label: Some(format!("Texture{} View",i).as_str()), ..wgpu::TextureViewDescriptor::default()
dimension: Some(wgpu::TextureViewDimension::D2), })
..wgpu::TextureViewDescriptor::default()
})); }));
} }
} }
let texture_views:Vec<wgpu::TextureView>=texture_loading_threads.iter().map(|t|{t.join().unwrap()}).collect();
let indexed_models_len=indexed_models.models.len(); let indexed_models_len=indexed_models.models.len();
//split groups with different textures into separate models //split groups with different textures into separate models
//the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups. //the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups.