From 176953279d478c27083c0bb60a6282e7661cb027 Mon Sep 17 00:00:00 2001 From: Josh Simmons Date: Sat, 25 May 2024 20:34:35 +0200 Subject: [PATCH] shark: Use push constants for primitive uniforms --- .../shaders/primitive_2d_bindings.h | 22 +++++------ title/shark/src/main.rs | 37 +++++++++---------- title/shark/src/pipelines/primitive_2d.rs | 10 +++-- 3 files changed, 34 insertions(+), 35 deletions(-) diff --git a/title/shark-shaders/shaders/primitive_2d_bindings.h b/title/shark-shaders/shaders/primitive_2d_bindings.h index 5962fef..47294b0 100644 --- a/title/shark-shaders/shaders/primitive_2d_bindings.h +++ b/title/shark-shaders/shaders/primitive_2d_bindings.h @@ -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; diff --git a/title/shark/src/main.rs b/title/shark/src/main.rs index b478814..65d8a9b 100644 --- a/title/shark/src/main.rs +++ b/title/shark/src/main.rs @@ -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, diff --git a/title/shark/src/pipelines/primitive_2d.rs b/title/shark/src/pipelines/primitive_2d.rs index 2af7742..125bcf3 100644 --- a/title/shark/src/pipelines/primitive_2d.rs +++ b/title/shark/src/pipelines/primitive_2d.rs @@ -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::() as u32, + }], }; let coarse_bin_pipeline = gpu.create_compute_pipeline(&ComputePipelineDesc { -- 2.49.0