]> git.nega.tv - josh/narcissus/commitdiff
shark-shaders: Omit image format in uniform bindings
authorJosh Simmons <josh@nega.tv>
Sat, 5 Apr 2025 21:07:56 +0000 (23:07 +0200)
committerJosh Simmons <josh@nega.tv>
Sat, 5 Apr 2025 21:07:56 +0000 (23:07 +0200)
Avoids a validation issue when binding a swapchain image in a different
format.

engine/narcissus-gpu/src/backend/vulkan/mod.rs
engine/narcissus-gpu/src/backend/vulkan/physical_device_features.rs
title/shark-shaders/shaders/bindings_compute.h
title/shark-shaders/shaders/composite.comp
title/shark-shaders/shaders/draw_2d_rasterize.comp

index 9ef452283430b37ad5b196ef18e47fd5aec2aaa5..7477cdca1f0ca051cb9be281f68a5bce29e94aa0 100644 (file)
@@ -591,16 +591,18 @@ impl VulkanDevice {
 
             let mut enabled_features: Box<VulkanPhysicalDeviceFeatures> = default();
 
-            enabled_features.set_dynamic_rendering(true);
-            enabled_features.set_synchronization2(true);
-            enabled_features.set_subgroup_size_control(true);
-            enabled_features.set_compute_full_subgroups(true);
-            enabled_features.set_maintenance4(true);
             enabled_features.set_buffer_device_address(true);
-            enabled_features.set_timeline_semaphore(true);
-            enabled_features.set_descriptor_indexing(true);
+            enabled_features.set_compute_full_subgroups(true);
             enabled_features.set_descriptor_binding_partially_bound(true);
+            enabled_features.set_descriptor_indexing(true);
             enabled_features.set_draw_indirect_count(true);
+            enabled_features.set_dynamic_rendering(true);
+            enabled_features.set_maintenance4(true);
+            enabled_features.set_shader_storage_image_read_without_format(true);
+            enabled_features.set_shader_storage_image_write_without_format(true);
+            enabled_features.set_subgroup_size_control(true);
+            enabled_features.set_synchronization2(true);
+            enabled_features.set_timeline_semaphore(true);
             enabled_features.set_uniform_buffer_standard_layout(true);
 
             if wsi_support.swapchain_maintenance1() {
index 66f3299de7ac1da2ca3dd6c4254a953e3d227aa6..0fb71b79c71eef449931ad7cf2785c64935c6585 100644 (file)
@@ -10,6 +10,22 @@ pub struct VulkanPhysicalDeviceFeatures {
 }
 
 impl VulkanPhysicalDeviceFeatures {
+    pub fn compute_full_subgroups(&self) -> bool {
+        self.features_13.compute_full_subgroups == vk::Bool32::True
+    }
+
+    pub fn descriptor_binding_partially_bound(&self) -> bool {
+        self.features_12.descriptor_binding_partially_bound == vk::Bool32::True
+    }
+
+    pub fn descriptor_indexing(&self) -> bool {
+        self.features_12.descriptor_indexing == vk::Bool32::True
+    }
+
+    pub fn draw_indirect_count(&self) -> bool {
+        self.features_12.draw_indirect_count == vk::Bool32::True
+    }
+
     pub fn dynamic_rendering(&self) -> bool {
         self.features_13.dynamic_rendering == vk::Bool32::True
     }
@@ -22,76 +38,72 @@ impl VulkanPhysicalDeviceFeatures {
         self.features_13.maintenance4 == vk::Bool32::True
     }
 
-    pub fn compute_full_subgroups(&self) -> bool {
-        self.features_13.compute_full_subgroups == vk::Bool32::True
-    }
-
     pub fn timeline_semaphore(&self) -> bool {
         self.features_12.timeline_semaphore == vk::Bool32::True
     }
 
-    pub fn descriptor_indexing(&self) -> bool {
-        self.features_12.descriptor_indexing == vk::Bool32::True
-    }
-
-    pub fn descriptor_binding_partially_bound(&self) -> bool {
-        self.features_12.descriptor_binding_partially_bound == vk::Bool32::True
+    pub fn uniform_buffer_standard_layout(&self) -> bool {
+        self.features_12.uniform_buffer_standard_layout == vk::Bool32::True
     }
 
-    pub fn draw_indirect_count(&self) -> bool {
-        self.features_12.draw_indirect_count == vk::Bool32::True
+    pub fn set_buffer_device_address(&mut self, arg: bool) {
+        self.features_12.buffer_device_address = vk::Bool32::from(arg)
     }
 
-    pub fn uniform_buffer_standard_layout(&self) -> bool {
-        self.features_12.uniform_buffer_standard_layout == vk::Bool32::True
+    pub fn set_compute_full_subgroups(&mut self, arg: bool) {
+        self.features_13.compute_full_subgroups = vk::Bool32::from(arg)
     }
 
-    pub fn set_dynamic_rendering(&mut self, arg: bool) {
-        self.features_13.dynamic_rendering = vk::Bool32::from(arg)
+    pub fn set_descriptor_binding_partially_bound(&mut self, arg: bool) {
+        self.features_12.descriptor_binding_partially_bound = vk::Bool32::from(arg)
     }
 
-    pub fn set_synchronization2(&mut self, arg: bool) {
-        self.features_13.synchronization2 = vk::Bool32::from(arg)
+    pub fn set_descriptor_indexing(&mut self, arg: bool) {
+        self.features_12.descriptor_indexing = vk::Bool32::from(arg)
     }
 
-    pub fn set_subgroup_size_control(&mut self, arg: bool) {
-        self.features_13.subgroup_size_control = vk::Bool32::from(arg)
+    pub fn set_draw_indirect_count(&mut self, arg: bool) {
+        self.features_12.draw_indirect_count = vk::Bool32::from(arg)
     }
 
-    pub fn set_compute_full_subgroups(&mut self, arg: bool) {
-        self.features_13.compute_full_subgroups = vk::Bool32::from(arg)
+    pub fn set_dynamic_rendering(&mut self, arg: bool) {
+        self.features_13.dynamic_rendering = vk::Bool32::from(arg)
     }
 
     pub fn set_maintenance4(&mut self, arg: bool) {
         self.features_13.maintenance4 = vk::Bool32::from(arg)
     }
 
-    pub fn set_buffer_device_address(&mut self, arg: bool) {
-        self.features_12.buffer_device_address = vk::Bool32::from(arg)
+    pub fn set_shader_storage_image_read_without_format(&mut self, arg: bool) {
+        self.features
+            .features
+            .shader_storage_image_read_without_format = vk::Bool32::from(arg)
     }
 
-    pub fn set_timeline_semaphore(&mut self, arg: bool) {
-        self.features_12.timeline_semaphore = vk::Bool32::from(arg)
+    pub fn set_shader_storage_image_write_without_format(&mut self, arg: bool) {
+        self.features
+            .features
+            .shader_storage_image_write_without_format = vk::Bool32::from(arg)
     }
 
-    pub fn set_descriptor_indexing(&mut self, arg: bool) {
-        self.features_12.descriptor_indexing = vk::Bool32::from(arg)
+    pub fn set_subgroup_size_control(&mut self, arg: bool) {
+        self.features_13.subgroup_size_control = vk::Bool32::from(arg)
     }
 
-    pub fn set_descriptor_binding_partially_bound(&mut self, arg: bool) {
-        self.features_12.descriptor_binding_partially_bound = vk::Bool32::from(arg)
+    pub fn set_swapchain_maintenance1(&mut self, arg: bool) {
+        self.features_swapchain_maintenance1.swapchain_maintenance1 = vk::Bool32::from(arg)
     }
 
-    pub fn set_draw_indirect_count(&mut self, arg: bool) {
-        self.features_12.draw_indirect_count = vk::Bool32::from(arg)
+    pub fn set_synchronization2(&mut self, arg: bool) {
+        self.features_13.synchronization2 = vk::Bool32::from(arg)
     }
 
-    pub fn set_uniform_buffer_standard_layout(&mut self, arg: bool) {
-        self.features_12.uniform_buffer_standard_layout = vk::Bool32::from(arg)
+    pub fn set_timeline_semaphore(&mut self, arg: bool) {
+        self.features_12.timeline_semaphore = vk::Bool32::from(arg)
     }
 
-    pub fn set_swapchain_maintenance1(&mut self, arg: bool) {
-        self.features_swapchain_maintenance1.swapchain_maintenance1 = vk::Bool32::from(arg)
+    pub fn set_uniform_buffer_standard_layout(&mut self, arg: bool) {
+        self.features_12.uniform_buffer_standard_layout = vk::Bool32::from(arg)
     }
 
     pub fn link(&mut self) -> &mut vk::PhysicalDeviceFeatures2 {
index 5792348e6698e527e99a0ae6648ebf95af33734d..1eb1fd34a961b71e7e70abeaf49edb69c07908bb 100644 (file)
@@ -8,9 +8,9 @@ const uint SAMPLER_COUNT = 2;
 layout (set = 0, binding = 0) uniform sampler samplers[SAMPLER_COUNT];
 layout (set = 0, binding = 1) uniform texture3D tony_mc_mapface_lut;
 layout (set = 0, binding = 2) uniform texture2D glyph_atlas;
-layout (set = 0, binding = 3, rgba16f) uniform writeonly image2D ui_layer_write;
-layout (set = 0, binding = 3, rgba16f) uniform readonly image2D ui_layer_read;
-layout (set = 0, binding = 4, rgba16f) uniform readonly image2D color_layer;
-layout (set = 0, binding = 5, rgba16f) uniform writeonly image2D composited_output;
+layout (set = 0, binding = 3) uniform writeonly image2D ui_layer_write;
+layout (set = 0, binding = 3) uniform readonly image2D ui_layer_read;
+layout (set = 0, binding = 4) uniform readonly image2D color_layer;
+layout (set = 0, binding = 5) uniform writeonly image2D composited_output;
 
 #endif
index 8c153c84c276d8ca8b37f5c84b62e71813377e94..e5319a2236acac8a1f672784f44f09e4dd2ff31a 100644 (file)
@@ -5,6 +5,7 @@
 #extension GL_EXT_buffer_reference : require
 #extension GL_EXT_buffer_reference2 : require
 #extension GL_EXT_scalar_block_layout : require
+#extension GL_EXT_shader_image_load_formatted : require
 
 #include "bindings_compute.h"
 #include "draw_2d.h"
index a88124ee7b4af42d9db02346ce6a8dfedf04f3ab..09a79307e19509e95716112df5cf2bbc7d940cd8 100644 (file)
@@ -2,10 +2,11 @@
 
 #extension GL_GOOGLE_include_directive : require
 
+#extension GL_EXT_control_flow_attributes : require
 #extension GL_EXT_buffer_reference : require
 #extension GL_EXT_buffer_reference2 : require
 #extension GL_EXT_scalar_block_layout : require
-#extension GL_EXT_control_flow_attributes : require
+#extension GL_EXT_shader_image_load_formatted : require
 
 #extension GL_KHR_shader_subgroup_vote : require
 #extension GL_KHR_shader_subgroup_ballot : require