summaryrefslogtreecommitdiffstats
path: root/src/gpu.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu.rs')
-rw-r--r--src/gpu.rs34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/gpu.rs b/src/gpu.rs
index 993e524..edcc073 100644
--- a/src/gpu.rs
+++ b/src/gpu.rs
@@ -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,
}
}