summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-08-12 19:13:32 -0700
committerIrene Knapp <ireneista@irenes.space>2026-08-12 19:13:32 -0700
commit19e3a0f319fd04c1dde803796ec272d038b634f7 (patch)
tree502077d3e1dab810f037faea810f1cfd2c5ec691
parent87f60b880bd1ce586972f9b70dd6c627b1df92cd (diff)
split the texture's sampler and its image view into separaet bindings HEAD main
this will make it easier to change the image view dynamically as a push update, in a future CL

Force-Push: yes
Change-Id: If7cfab07913a5a462e16dd7fb478ed491d33d4d9
-rw-r--r--shaders/shader.frag5
-rw-r--r--src/graphics/permanent.rs10
-rw-r--r--src/graphics/render.rs25
-rw-r--r--src/graphics/window_dressing.rs8
4 files changed, 35 insertions, 13 deletions
diff --git a/shaders/shader.frag b/shaders/shader.frag
index 20550ba..a2561d1 100644
--- a/shaders/shader.frag
+++ b/shaders/shader.frag
@@ -1,6 +1,7 @@
 #version 460
 
-layout(binding = 1) uniform sampler2D textureSampler;
+layout(binding = 1) uniform sampler textureSampler;
+layout(binding = 2) uniform texture2D textureImage;
 
 layout(location = 0) in vec3 fragmentColor;
 layout(location = 1) in vec2 fragmentTextureCoordinate;
@@ -9,7 +10,7 @@ layout(location = 0) out vec4 outColor;
 
 void main() {
   outColor = vec4(fragmentColor
-                      * texture(textureSampler,
+                      * texture(sampler2D(textureImage, textureSampler),
                                 fragmentTextureCoordinate).rgb,
                   1.0);
 }
diff --git a/src/graphics/permanent.rs b/src/graphics/permanent.rs
index df86284..b39dbdd 100644
--- a/src/graphics/permanent.rs
+++ b/src/graphics/permanent.rs
@@ -575,11 +575,17 @@ fn init_descriptor_set_layout(device: &Device)
 
   let sampler_binding = vk::DescriptorSetLayoutBinding::builder()
           .binding(1)
-          .descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
+          .descriptor_type(vk::DescriptorType::SAMPLER)
           .descriptor_count(1)
           .stage_flags(vk::ShaderStageFlags::FRAGMENT);
 
-  let bindings = [uniform_block_binding, sampler_binding];
+  let texture_binding = vk::DescriptorSetLayoutBinding::builder()
+          .binding(2)
+          .descriptor_type(vk::DescriptorType::SAMPLED_IMAGE)
+          .descriptor_count(1)
+          .stage_flags(vk::ShaderStageFlags::FRAGMENT);
+
+  let bindings = [uniform_block_binding, sampler_binding, texture_binding];
   let descriptor_set_layout_info
           = vk::DescriptorSetLayoutCreateInfo::builder()
                 .bindings(&bindings);
diff --git a/src/graphics/render.rs b/src/graphics/render.rs
index 7318574..c88b1d6 100644
--- a/src/graphics/render.rs
+++ b/src/graphics/render.rs
@@ -472,19 +472,30 @@ fn init_descriptor_sets(device: &Device, layout: &vk::DescriptorSetLayout,
             .descriptor_type(vk::DescriptorType::UNIFORM_BUFFER)
             .buffer_info(&buffer_info_list);
 
-    let image_info = vk::DescriptorImageInfo::builder()
-            .image_layout(vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL)
-            .image_view(*texture_image_view)
+    let sampler_image_info = vk::DescriptorImageInfo::builder()
             .sampler(*sampler);
-    let image_info_list = [image_info];
+    let sampler_image_info_list = [sampler_image_info];
     let sampler_write_info = vk::WriteDescriptorSet::builder()
             .dst_set(sets[index])
             .dst_binding(1)
             .dst_array_element(0)
-            .descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
-            .image_info(&image_info_list);
+            .descriptor_type(vk::DescriptorType::SAMPLER)
+            .image_info(&sampler_image_info_list);
+
+    let texture_image_info = vk::DescriptorImageInfo::builder()
+            .image_layout(vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL)
+            .image_view(*texture_image_view);
+    let texture_image_info_list = [texture_image_info];
+    let texture_write_info = vk::WriteDescriptorSet::builder()
+            .dst_set(sets[index])
+            .dst_binding(2)
+            .dst_array_element(0)
+            .descriptor_type(vk::DescriptorType::SAMPLED_IMAGE)
+            .image_info(&texture_image_info_list);
 
-    let write_info_list = [uniform_block_write_info, sampler_write_info];
+    let write_info_list = [
+            uniform_block_write_info, sampler_write_info, texture_write_info
+    ];
     let copy_info_list: [vk::CopyDescriptorSet; 0] = [];
 
     unsafe {
diff --git a/src/graphics/window_dressing.rs b/src/graphics/window_dressing.rs
index cca0dc8..07dfaf0 100644
--- a/src/graphics/window_dressing.rs
+++ b/src/graphics/window_dressing.rs
@@ -428,10 +428,14 @@ fn init_descriptor_pool(device: &Device, count: usize)
           .descriptor_count(count as u32);
 
   let sampler_size = vk::DescriptorPoolSize::builder()
-          .type_(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
+          .type_(vk::DescriptorType::SAMPLER)
           .descriptor_count(count as u32);
 
-  let sizes = [uniform_block_size, sampler_size];
+  let texture_size = vk::DescriptorPoolSize::builder()
+          .type_(vk::DescriptorType::SAMPLED_IMAGE)
+          .descriptor_count(count as u32);
+
+  let sizes = [uniform_block_size, sampler_size, texture_size];
   let pool_info = vk::DescriptorPoolCreateInfo::builder()
           .pool_sizes(&sizes)
           .max_sets(count as u32);