diff options
Diffstat (limited to 'src/gpu.rs')
| -rw-r--r-- | src/gpu.rs | 34 |
1 files changed, 23 insertions, 11 deletions
@@ -178,20 +178,20 @@ pub fn destroy_fence(client: &VkClient, fence: vk::Fence) { /// Refresh all texture inputs from TSV shared images. /// Handles format detection and texture recreation internally. pub fn refresh_textures( - cache: &mut crate::uniform::UniformCache, + pools: &mut crate::uniform::ResourcePools, device: &wgpu::Device, client: &mut VkClient, fence: vk::Fence, -) { +) -> bool { let mut needs_rebind = false; - for slot in cache.texture_slots_mut() { - let tsv_name = match slot.tsv_name() { + for texture in pools.textures_mut() { + let tsv_name = match texture.tsv_name() { Some(n) => n.to_string(), None => continue, }; - if !slot.tsv_registered() { + if !texture.tsv_registered() { if let Err(e) = client.find_image(&tsv_name, true) { log::debug!("tsv find '{tsv_name}': {e}"); continue; @@ -200,11 +200,14 @@ pub fn refresh_textures( match client.find_image_data(&tsv_name, true) { Ok(Some((_lock, data))) => { let format = img_format_to_wgpu(data.format); - if slot.resize( + let view_dimension = + img_type_to_view_dimension(data.image_type, data.depth_or_array_layers); + if texture.resize( device, data.width, data.height, data.depth_or_array_layers, + view_dimension, format, ) { needs_rebind = true; @@ -213,10 +216,10 @@ pub fn refresh_textures( _ => continue, } - slot.set_tsv_registered(); + texture.set_tsv_registered(); } - let raw = unsafe { raw_image(slot.texture()) }; + let raw = unsafe { raw_image(texture.texture()) }; match client.recv_image( &tsv_name, raw, @@ -224,13 +227,22 @@ pub fn refresh_textures( vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL, fence, ) { - Ok(Some(())) => log::trace!("texture '{}' updated from '{tsv_name}'", slot.name()), + Ok(Some(())) => log::trace!("texture '{}' updated from '{tsv_name}'", texture.id()), Ok(None) => {} Err(e) => log::warn!("recv_image '{tsv_name}': {e}"), } } - if needs_rebind { - cache.rebuild_bind_group(device); + needs_rebind +} + +fn img_type_to_view_dimension( + image_type: ImgType, + depth_or_array_layers: u32, +) -> wgpu::TextureViewDimension { + match image_type { + ImgType::D3 => wgpu::TextureViewDimension::D3, + ImgType::D2 if depth_or_array_layers > 1 => wgpu::TextureViewDimension::D2Array, + _ => wgpu::TextureViewDimension::D2, } } |
