]> git.nega.tv - josh/narcissus/commitdiff
shark: Use push constants for primitive uniforms
authorJosh Simmons <josh@nega.tv>
Sat, 25 May 2024 18:34:35 +0000 (20:34 +0200)
committerJosh Simmons <josh@nega.tv>
Sat, 25 May 2024 18:34:35 +0000 (20:34 +0200)
title/shark-shaders/shaders/primitive_2d_bindings.h
title/shark/src/main.rs
title/shark/src/pipelines/primitive_2d.rs

index 5962fef4c14e9aaa07f16f39f9aea4c8de72ccb8..47294b01a5a7e3255774c7c2537b4570e381b7f6 100644 (file)
@@ -1,39 +1,39 @@
 
 
-layout(std430, set = 0, binding = 0) uniform uniformBuffer {
+layout(std430, push_constant) uniform uniformBuffer {
     PrimitiveUniforms primitive_uniforms; 
 };
 
-layout (set = 0, binding = 1) uniform sampler bilinear_sampler;
+layout (set = 0, binding = 0) uniform sampler bilinear_sampler;
 
-layout (set = 0, binding = 2) uniform texture2D glyph_atlas;
+layout (set = 0, binding = 1) uniform texture2D glyph_atlas;
 
-layout(std430, set = 0, binding = 3) readonly buffer glyphBuffer {
+layout(std430, set = 0, binding = 2) readonly buffer glyphBuffer {
     Glyph glyphs[];
 };
 
-layout(std430, set = 0, binding = 4) readonly buffer glyphInstanceBuffer {
+layout(std430, set = 0, binding = 3) readonly buffer glyphInstanceBuffer {
     GlyphInstance glyph_instances[];
 };
 
-layout(std430, set = 0, binding = 5) readonly buffer primitiveInstanceBuffer {
+layout(std430, set = 0, binding = 4) readonly buffer primitiveInstanceBuffer {
     PrimitiveInstance primitive_instances[];
 };
 
-layout(std430, set = 0, binding = 6) readonly buffer coarseTileBufferRead {
+layout(std430, set = 0, binding = 5) readonly buffer coarseTileBufferRead {
     uint coarse_bitmap_ro[];
 };
 
-layout(std430, set = 0, binding = 6) writeonly buffer coarseTileBufferWrite {
+layout(std430, set = 0, binding = 5) writeonly buffer coarseTileBufferWrite {
     uint coarse_bitmap_wo[];
 };
 
-layout(std430, set = 0, binding = 7) readonly buffer fineTileBufferRead {
+layout(std430, set = 0, binding = 6) readonly buffer fineTileBufferRead {
     uint fine_bitmap_ro[];
 };
 
-layout(std430, set = 0, binding = 7) writeonly buffer fineTileBufferWrite {
+layout(std430, set = 0, binding = 6) writeonly buffer fineTileBufferWrite {
     uint fine_bitmap_wo[];
 };
 
-layout (set = 0, binding = 8, rgba16f) uniform writeonly image2D ui_image;
+layout (set = 0, binding = 7, rgba16f) uniform writeonly image2D ui_image;
index b478814c3ac30478ac3d84193da1f9256effb8e2..65d8a9b1a47245acc3c1ed9514252309383f1e09 100644 (file)
@@ -19,8 +19,8 @@ use narcissus_gpu::{
     ImageAspectFlags, ImageBarrier, ImageDesc, ImageDimension, ImageFormat, ImageLayout,
     ImageSubresourceRange, ImageTiling, ImageUsageFlags, IndexType, LoadOp, MemoryLocation,
     Offset2d, PersistentBuffer, PresentMode, RenderingAttachment, RenderingDesc, Sampler,
-    SamplerAddressMode, SamplerDesc, SamplerFilter, Scissor, StoreOp, SwapchainConfigurator,
-    SwapchainImage, ThreadToken, TypedBind, Viewport,
+    SamplerAddressMode, SamplerDesc, SamplerFilter, Scissor, ShaderStageFlags, StoreOp,
+    SwapchainConfigurator, SwapchainImage, ThreadToken, TypedBind, Viewport,
 };
 use narcissus_image as image;
 use narcissus_maths::{
@@ -1314,13 +1314,16 @@ impl<'gpu> DrawState<'gpu> {
 
             // Render UI
             {
+                gpu.cmd_set_pipeline(cmd_encoder, self.primitive_2d_pipeline.coarse_bin_pipeline);
+
                 let num_primitives = ui_state.primitive_instances.len() as u32;
                 let num_primitives_32 = (num_primitives + 31) / 32;
                 let num_primitives_1024 = (num_primitives_32 + 31) / 32;
-                let uniforms_buffer = gpu.request_transient_buffer_with_data(
-                    frame,
-                    thread_token,
-                    BufferUsageFlags::UNIFORM,
+
+                gpu.cmd_push_constants(
+                    cmd_encoder,
+                    ShaderStageFlags::COMPUTE,
+                    0,
                     &PrimitiveUniforms {
                         screen_resolution_x: self.width,
                         screen_resolution_y: self.height,
@@ -1336,6 +1339,7 @@ impl<'gpu> DrawState<'gpu> {
                         _pad0: 0,
                     },
                 );
+
                 let glyph_buffer = gpu.request_transient_buffer_with_data(
                     frame,
                     thread_token,
@@ -1355,8 +1359,6 @@ impl<'gpu> DrawState<'gpu> {
                     &[0u32],
                 );
 
-                gpu.cmd_set_pipeline(cmd_encoder, self.primitive_2d_pipeline.coarse_bin_pipeline);
-
                 gpu.cmd_set_bind_group(
                     frame,
                     cmd_encoder,
@@ -1366,15 +1368,10 @@ impl<'gpu> DrawState<'gpu> {
                         Bind {
                             binding: 0,
                             array_element: 0,
-                            typed: TypedBind::UniformBuffer(&[uniforms_buffer.to_arg()]),
-                        },
-                        Bind {
-                            binding: 1,
-                            array_element: 0,
                             typed: TypedBind::Sampler(&[self.samplers[SamplerRes::Bilinear]]),
                         },
                         Bind {
-                            binding: 2,
+                            binding: 1,
                             array_element: 0,
                             typed: TypedBind::SampledImage(&[(
                                 ImageLayout::Optimal,
@@ -1382,36 +1379,36 @@ impl<'gpu> DrawState<'gpu> {
                             )]),
                         },
                         Bind {
-                            binding: 3,
+                            binding: 2,
                             array_element: 0,
                             typed: TypedBind::StorageBuffer(&[glyph_buffer.to_arg()]),
                         },
                         Bind {
-                            binding: 4,
+                            binding: 3,
                             array_element: 0,
                             typed: TypedBind::StorageBuffer(&[glyph_instance_buffer.to_arg()]),
                         },
                         Bind {
-                            binding: 5,
+                            binding: 4,
                             array_element: 0,
                             typed: TypedBind::StorageBuffer(&[primitive_instance_buffer.to_arg()]),
                         },
                         Bind {
-                            binding: 6,
+                            binding: 5,
                             array_element: 0,
                             typed: TypedBind::StorageBuffer(&[self
                                 .coarse_tile_bitmap_buffer
                                 .to_arg()]),
                         },
                         Bind {
-                            binding: 7,
+                            binding: 6,
                             array_element: 0,
                             typed: TypedBind::StorageBuffer(&[self
                                 .fine_tile_bitmap_buffer
                                 .to_arg()]),
                         },
                         Bind {
-                            binding: 8,
+                            binding: 7,
                             array_element: 0,
                             typed: TypedBind::StorageImage(&[(
                                 ImageLayout::General,
index 2af7742dca9403de3298d84230584a74bf155b55..125bcf3576d799a70933bb52c81a945c8559bdaf 100644 (file)
@@ -1,7 +1,7 @@
 use narcissus_font::TouchedGlyphIndex;
 use narcissus_gpu::{
     BindDesc, BindGroupLayout, BindingType, ComputePipelineDesc, Pipeline, PipelineLayout,
-    ShaderDesc, ShaderStageFlags,
+    PushConstantRange, ShaderDesc, ShaderStageFlags,
 };
 
 use crate::Gpu;
@@ -52,8 +52,6 @@ pub struct Primitive2dPipeline {
 impl Primitive2dPipeline {
     pub fn new(gpu: &Gpu) -> Self {
         let bind_group_layout = gpu.create_bind_group_layout(&[
-            // Uniforms
-            BindDesc::new(ShaderStageFlags::COMPUTE, BindingType::UniformBuffer),
             // Sampler
             BindDesc::new(ShaderStageFlags::COMPUTE, BindingType::Sampler),
             // Glyph Atlas
@@ -74,7 +72,11 @@ impl Primitive2dPipeline {
 
         let layout = &PipelineLayout {
             bind_group_layouts: &[bind_group_layout],
-            push_constant_ranges: &[],
+            push_constant_ranges: &[PushConstantRange {
+                stage_flags: ShaderStageFlags::COMPUTE,
+                offset: 0,
+                size: std::mem::size_of::<PrimitiveUniforms>() as u32,
+            }],
         };
 
         let coarse_bin_pipeline = gpu.create_compute_pipeline(&ComputePipelineDesc {