]> git.nega.tv - josh/narcissus/commitdiff
shark: Use immutable samplers
authorJosh Simmons <josh@nega.tv>
Sat, 8 Jun 2024 19:32:45 +0000 (21:32 +0200)
committerJosh Simmons <josh@nega.tv>
Sat, 8 Jun 2024 19:32:45 +0000 (21:32 +0200)
title/shark/src/main.rs
title/shark/src/pipelines/basic.rs
title/shark/src/pipelines/display_transform.rs
title/shark/src/pipelines/primitive_2d.rs

index be862fcf87303bb03e2cf18185b6dfb3a81284d9..c79ccab0be559a96cb06c0fbf647d38b4a86d988 100644 (file)
@@ -877,7 +877,7 @@ struct DrawState<'gpu> {
 
     glyph_atlas_image: Image,
 
-    samplers: Samplers,
+    _samplers: Samplers,
     models: Models<'gpu>,
     images: Images,
 
@@ -886,11 +886,13 @@ struct DrawState<'gpu> {
 
 impl<'gpu> DrawState<'gpu> {
     fn new(gpu: &'gpu Gpu, thread_token: &ThreadToken) -> Self {
-        let basic_pipeline = BasicPipeline::new(gpu);
-        let primitive_2d_pipeline = Primitive2dPipeline::new(gpu);
-        let display_transform_pipeline = DisplayTransformPipeline::new(gpu);
-
         let samplers = Samplers::load(gpu);
+        let immutable_samplers = &[samplers[SamplerRes::Bilinear]];
+
+        let basic_pipeline = BasicPipeline::new(gpu, immutable_samplers);
+        let primitive_2d_pipeline = Primitive2dPipeline::new(gpu, immutable_samplers);
+        let display_transform_pipeline = DisplayTransformPipeline::new(gpu, immutable_samplers);
+
         let models = Models::load(gpu);
         let images = Images::load(gpu, thread_token);
 
@@ -908,7 +910,7 @@ impl<'gpu> DrawState<'gpu> {
             ui_image: default(),
             tile_bitmap_buffer: default(),
             glyph_atlas_image: default(),
-            samplers,
+            _samplers: samplers,
             models,
             images,
             transforms: vec![],
@@ -1252,18 +1254,11 @@ impl<'gpu> DrawState<'gpu> {
                     cmd_encoder,
                     self.basic_pipeline.uniforms_bind_group_layout,
                     0,
-                    &[
-                        Bind {
-                            binding: 0,
-                            array_element: 0,
-                            typed: TypedBind::UniformBuffer(&[uniform_buffer.to_arg()]),
-                        },
-                        Bind {
-                            binding: 1,
-                            array_element: 0,
-                            typed: TypedBind::Sampler(&[self.samplers[SamplerRes::Bilinear]]),
-                        },
-                    ],
+                    &[Bind {
+                        binding: 0,
+                        array_element: 0,
+                        typed: TypedBind::UniformBuffer(&[uniform_buffer.to_arg()]),
+                    }],
                 );
 
                 {
@@ -1361,11 +1356,6 @@ impl<'gpu> DrawState<'gpu> {
                     self.primitive_2d_pipeline.bind_group_layout,
                     0,
                     &[
-                        Bind {
-                            binding: 0,
-                            array_element: 0,
-                            typed: TypedBind::Sampler(&[self.samplers[SamplerRes::Bilinear]]),
-                        },
                         Bind {
                             binding: 1,
                             array_element: 0,
@@ -1498,11 +1488,6 @@ impl<'gpu> DrawState<'gpu> {
                     self.display_transform_pipeline.bind_group_layout,
                     0,
                     &[
-                        Bind {
-                            binding: 0,
-                            array_element: 0,
-                            typed: TypedBind::Sampler(&[self.samplers[SamplerRes::Bilinear]]),
-                        },
                         Bind {
                             binding: 1,
                             array_element: 0,
index ffb67238ee415c20978682d2adee40b9653d4ca9..fc4d88a02d4552206825f45211f7460b379ceaf0 100644 (file)
@@ -2,7 +2,7 @@ use narcissus_core::default;
 use narcissus_gpu::{
     BindDesc, BindGroupLayout, BindingType, BlendMode, CompareOp, CullingMode, FrontFace,
     GraphicsPipelineAttachments, GraphicsPipelineDesc, ImageFormat, Pipeline, PipelineLayout,
-    PolygonMode, ShaderDesc, ShaderStageFlags, Topology,
+    PolygonMode, Sampler, ShaderDesc, ShaderStageFlags, Topology,
 };
 use narcissus_maths::Mat4;
 
@@ -29,12 +29,12 @@ pub struct BasicPipeline {
 }
 
 impl BasicPipeline {
-    pub fn new(gpu: &Gpu) -> Self {
+    pub fn new(gpu: &Gpu, immutable_samplers: &[Sampler]) -> Self {
         let uniforms_bind_group_layout = gpu.create_bind_group_layout(&[
             // Uniforms
             BindDesc::new(ShaderStageFlags::ALL, BindingType::UniformBuffer),
-            // Bilinear Sampler
-            BindDesc::new(ShaderStageFlags::ALL, BindingType::Sampler),
+            // Samplers
+            BindDesc::with_immutable_samplers(ShaderStageFlags::ALL, immutable_samplers),
         ]);
 
         let storage_bind_group_layout = gpu.create_bind_group_layout(&[
index 4405b4e86f6b1a2cbd8478a280947574e5d78880..3b96a934381196911d322c977ba3fedd126e658a 100644 (file)
@@ -1,6 +1,6 @@
 use narcissus_gpu::{
     BindDesc, BindGroupLayout, BindingType, ComputePipelineDesc, Pipeline, PipelineLayout,
-    PushConstantRange, ShaderDesc, ShaderStageFlags,
+    PushConstantRange, Sampler, ShaderDesc, ShaderStageFlags,
 };
 
 use crate::Gpu;
@@ -13,10 +13,10 @@ pub struct DisplayTransformPipeline {
 }
 
 impl DisplayTransformPipeline {
-    pub fn new(gpu: &Gpu) -> Self {
+    pub fn new(gpu: &Gpu, immutable_samplers: &[Sampler]) -> Self {
         let bind_group_layout = gpu.create_bind_group_layout(&[
-            // Sampler
-            BindDesc::new(ShaderStageFlags::COMPUTE, BindingType::Sampler),
+            // Samplers
+            BindDesc::with_immutable_samplers(ShaderStageFlags::COMPUTE, immutable_samplers),
             // Tony Mc'mapface LUT
             BindDesc::new(ShaderStageFlags::COMPUTE, BindingType::SampledImage),
             // Tiles
index 2259d7723670dd24ed54c6ba53a51cb29cb21312..246b419db5b6669985c74687dadf6aa302afd3cb 100644 (file)
@@ -1,7 +1,7 @@
 use narcissus_font::TouchedGlyphIndex;
 use narcissus_gpu::{
     BindDesc, BindGroupLayout, BindingType, ComputePipelineDesc, Pipeline, PipelineLayout,
-    PushConstantRange, ShaderDesc, ShaderStageFlags,
+    PushConstantRange, Sampler, ShaderDesc, ShaderStageFlags,
 };
 
 use crate::Gpu;
@@ -44,10 +44,10 @@ pub struct Primitive2dPipeline {
 }
 
 impl Primitive2dPipeline {
-    pub fn new(gpu: &Gpu) -> Self {
+    pub fn new(gpu: &Gpu, immutable_samplers: &[Sampler]) -> Self {
         let bind_group_layout = gpu.create_bind_group_layout(&[
             // Sampler
-            BindDesc::new(ShaderStageFlags::COMPUTE, BindingType::Sampler),
+            BindDesc::with_immutable_samplers(ShaderStageFlags::COMPUTE, immutable_samplers),
             // Glyph Atlas
             BindDesc::new(ShaderStageFlags::COMPUTE, BindingType::SampledImage),
             // Glyphs