]> git.nega.tv - josh/narcissus/commitdiff
narcissus-gpu: Renaming and lifetime cleanups
authorJoshua Simmons <josh@nega.tv>
Mon, 7 Aug 2023 19:09:32 +0000 (21:09 +0200)
committerJoshua Simmons <josh@nega.tv>
Mon, 7 Aug 2023 19:09:32 +0000 (21:09 +0200)
Rename CmdBuffer to CmdEncoder.
Rename MappedBuffer to PersistentBuffer.

bins/narcissus/src/main.rs
bins/narcissus/src/pipelines/basic.rs
bins/narcissus/src/pipelines/text.rs
libs/narcissus-gpu/src/backend/vulkan/mod.rs
libs/narcissus-gpu/src/lib.rs
libs/narcissus-gpu/src/mapped_buffer.rs [moved from libs/narcissus-gpu/src/mapped_memory.rs with 90% similarity]
libs/narcissus-gpu/src/tlsf.rs

index 79cf71ce0c1e928f33daa2ec1155435a70bc2e5f..33ef153239f890015466da2dff762d4ab3052165 100644 (file)
@@ -44,13 +44,13 @@ pub fn main() {
     let blåhaj_image_data = load_image("bins/narcissus/data/blåhaj.png");
     let (blåhaj_vertices, blåhaj_indices) = load_obj("bins/narcissus/data/blåhaj.obj");
 
-    let blåhaj_vertex_buffer = device.create_mapped_buffer_with_data(
+    let blåhaj_vertex_buffer = device.create_persistent_buffer_with_data(
         MemoryLocation::Device,
         BufferUsageFlags::STORAGE,
         blåhaj_vertices.as_slice(),
     );
 
-    let blåhaj_index_buffer = device.create_mapped_buffer_with_data(
+    let blåhaj_index_buffer = device.create_persistent_buffer_with_data(
         MemoryLocation::Device,
         BufferUsageFlags::INDEX,
         blåhaj_indices.as_slice(),
@@ -119,9 +119,10 @@ pub fn main() {
             blåhaj_image_data.as_slice(),
         );
 
-        let mut cmd_buffer = device.create_cmd_buffer(&frame, &thread_token);
+        let mut cmd_encoder = device.request_cmd_encoder(&frame, &thread_token);
+
         device.cmd_barrier(
-            &mut cmd_buffer,
+            &mut cmd_encoder,
             None,
             &[
                 ImageBarrier::layout_optimal(
@@ -140,7 +141,7 @@ pub fn main() {
         );
 
         device.cmd_copy_buffer_to_image(
-            &mut cmd_buffer,
+            &mut cmd_encoder,
             blåhaj_buffer.to_arg(),
             blåhaj_image,
             ImageLayout::Optimal,
@@ -159,7 +160,7 @@ pub fn main() {
         );
 
         device.cmd_barrier(
-            &mut cmd_buffer,
+            &mut cmd_encoder,
             None,
             &[ImageBarrier::layout_optimal(
                 &[Access::TransferWrite],
@@ -169,7 +170,7 @@ pub fn main() {
             )],
         );
 
-        device.submit(&frame, cmd_buffer);
+        device.submit(&frame, cmd_encoder);
         device.end_frame(frame);
     }
 
@@ -251,7 +252,7 @@ pub fn main() {
             }
         };
 
-        let mut cmd_buffer = device.create_cmd_buffer(&frame, &thread_token);
+        let mut cmd_buffer = device.request_cmd_encoder(&frame, &thread_token);
 
         if width != depth_width || height != depth_height {
             device.destroy_image(&frame, depth_image);
index 7c75e3a0c1bb752ed1934d9ee1fc69ee8a247e56..2678376be8b8b5b4f334eda34ad089f6c902e599 100644 (file)
@@ -1,10 +1,10 @@
 use narcissus_core::{cstr, default, include_bytes_align};
 use narcissus_gpu::{
     Bind, BindGroupLayout, BindGroupLayoutDesc, BindGroupLayoutEntryDesc, BindingType, BlendMode,
-    BufferUsageFlags, CmdBuffer, CompareOp, CullingMode, Device, DeviceExt, Frame, FrontFace,
+    BufferUsageFlags, CmdEncoder, CompareOp, CullingMode, Device, DeviceExt, Frame, FrontFace,
     GraphicsPipelineDesc, GraphicsPipelineLayout, Image, ImageFormat, ImageLayout, IndexType,
-    MappedBuffer, Pipeline, PolygonMode, Sampler, SamplerAddressMode, SamplerDesc, SamplerFilter,
-    ShaderDesc, ShaderStageFlags, ThreadToken, Topology, TypedBind,
+    PersistentBuffer, Pipeline, PolygonMode, Sampler, SamplerAddressMode, SamplerDesc,
+    SamplerFilter, ShaderDesc, ShaderStageFlags, ThreadToken, Topology, TypedBind,
 };
 use narcissus_maths::{Affine3, Mat4};
 
@@ -124,10 +124,10 @@ impl BasicPipeline {
         device: &(dyn Device + 'static),
         frame: &Frame,
         thread_token: &ThreadToken,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_buffer: &mut CmdEncoder,
         basic_uniforms: &BasicUniforms,
-        vertex_buffer: &MappedBuffer,
-        index_buffer: &MappedBuffer,
+        vertex_buffer: &PersistentBuffer,
+        index_buffer: &PersistentBuffer,
         transforms: &[Affine3],
         texture: Image,
     ) {
index 8ca76a6ea6488c79625977e756b1d27f8173c3e6..766e74fd160e3fe01e4fbed72c33f1b70edc2bc7 100644 (file)
@@ -2,7 +2,7 @@ use narcissus_core::{cstr, default, include_bytes_align};
 use narcissus_font::{TouchedGlyph, TouchedGlyphIndex};
 use narcissus_gpu::{
     Bind, BindGroupLayout, BindGroupLayoutDesc, BindGroupLayoutEntryDesc, BindingType, BlendMode,
-    BufferUsageFlags, CmdBuffer, CompareOp, CullingMode, Device, DeviceExt, Frame, FrontFace,
+    BufferUsageFlags, CmdEncoder, CompareOp, CullingMode, Device, DeviceExt, Frame, FrontFace,
     GraphicsPipelineDesc, GraphicsPipelineLayout, Image, ImageFormat, ImageLayout, Pipeline,
     PolygonMode, Sampler, SamplerAddressMode, SamplerDesc, SamplerFilter, ShaderDesc,
     ShaderStageFlags, ThreadToken, Topology, TypedBind,
@@ -146,7 +146,7 @@ impl TextPipeline {
         device: &(dyn Device + 'static),
         frame: &Frame,
         thread_token: &ThreadToken,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_buffer: &mut CmdEncoder,
         text_uniforms: &TextUniforms,
         primitive_vertices: &[PrimitiveVertex],
         touched_glyphs: &[TouchedGlyph],
index 35a9b3b0f0e5cc6270c98095102580ed60923859..abe34663555ffbf74799090d0889dd3236c5529b 100644 (file)
@@ -17,11 +17,12 @@ use vulkan_sys as vk;
 use crate::{
     delay_queue::DelayQueue, frame_counter::FrameCounter, Bind, BindGroupLayout,
     BindGroupLayoutDesc, Buffer, BufferArg, BufferDesc, BufferImageCopy, BufferUsageFlags,
-    CmdBuffer, ComputePipelineDesc, Device, Extent2d, Extent3d, Frame, GlobalBarrier,
+    CmdEncoder, ComputePipelineDesc, Device, Extent2d, Extent3d, Frame, GlobalBarrier,
     GpuConcurrent, GraphicsPipelineDesc, Image, ImageBarrier, ImageBlit, ImageDesc, ImageDimension,
-    ImageFormat, ImageLayout, ImageTiling, ImageUsageFlags, ImageViewDesc, IndexType, MappedBuffer,
-    MemoryLocation, Offset2d, Offset3d, Pipeline, Sampler, SamplerAddressMode, SamplerCompareOp,
-    SamplerDesc, SamplerFilter, SwapchainOutOfDateError, ThreadToken, TransientBuffer, TypedBind,
+    ImageFormat, ImageLayout, ImageTiling, ImageUsageFlags, ImageViewDesc, IndexType,
+    MemoryLocation, Offset2d, Offset3d, PersistentBuffer, Pipeline, Sampler, SamplerAddressMode,
+    SamplerCompareOp, SamplerDesc, SamplerFilter, SwapchainOutOfDateError, ThreadToken,
+    TransientBuffer, TypedBind,
 };
 
 mod allocator;
@@ -730,13 +731,13 @@ impl VulkanDevice {
         unsafe { &mut *self.frames[frame.frame_index % VULKAN_CONSTANTS.num_frames].get() }
     }
 
-    fn cmd_buffer_mut<'a>(&self, cmd_buffer: &'a mut CmdBuffer) -> &'a mut VulkanCmdBuffer {
-        // SAFETY: `CmdBuffer`s can't outlive a frame, and the memory for a cmd_buffer
+    fn cmd_buffer_mut<'a>(&self, cmd_encoder: &'a mut CmdEncoder) -> &'a mut VulkanCmdBuffer {
+        // SAFETY: `CmdEncoder`s can't outlive a frame, and the memory for a cmd_buffer
         // is reset when the frame ends. So the pointer contained in the cmd_buffer is
         // always valid while the `CmdBuffer` is valid. They can't cloned, copied or be
         // sent between threads, and we have a mutable reference.
         unsafe {
-            NonNull::new_unchecked(cmd_buffer.cmd_buffer_addr as *mut VulkanCmdBuffer).as_mut()
+            NonNull::new_unchecked(cmd_encoder.cmd_buffer_addr as *mut VulkanCmdBuffer).as_mut()
         }
     }
 
@@ -1481,11 +1482,11 @@ impl Device for VulkanDevice {
         self.request_transient_buffer(frame, thread_token, usage, size as u64)
     }
 
-    fn create_cmd_buffer<'a, 'thread>(
+    fn request_cmd_encoder<'a, 'thread>(
         &self,
         frame: &'a Frame,
-        thread_token: &'thread ThreadToken,
-    ) -> CmdBuffer<'a, 'thread> {
+        thread_token: &'a ThreadToken,
+    ) -> CmdEncoder<'a> {
         let frame = self.frame(frame);
         let per_thread = frame.per_thread.get(thread_token);
         let mut cmd_buffer_pool = per_thread.cmd_buffer_pool.borrow_mut();
@@ -1524,10 +1525,8 @@ impl Device for VulkanDevice {
             ..default()
         });
 
-        CmdBuffer {
+        CmdEncoder {
             cmd_buffer_addr: vulkan_cmd_buffer as *mut _ as usize,
-            _phantom: &PhantomData,
-
             thread_token,
             phantom_unsend: PhantomUnsend {},
         }
@@ -1535,7 +1534,7 @@ impl Device for VulkanDevice {
 
     fn cmd_barrier(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         global_barrier: Option<&GlobalBarrier>,
         image_barriers: &[ImageBarrier],
     ) {
@@ -1559,7 +1558,7 @@ impl Device for VulkanDevice {
                 vulkan_image_memory_barrier(image_barrier, image, subresource_range)
             }));
 
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe {
             self.device_fn.cmd_pipeline_barrier2(
                 command_buffer,
@@ -1574,7 +1573,7 @@ impl Device for VulkanDevice {
 
     fn cmd_copy_buffer_to_image(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         src_buffer: BufferArg,
         dst_image: Image,
         dst_image_layout: ImageLayout,
@@ -1605,7 +1604,7 @@ impl Device for VulkanDevice {
             ImageLayout::General => vk::ImageLayout::General,
         };
 
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe {
             self.device_fn.cmd_copy_buffer_to_image(
                 command_buffer,
@@ -1619,7 +1618,7 @@ impl Device for VulkanDevice {
 
     fn cmd_blit_image(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         src_image: Image,
         src_image_layout: ImageLayout,
         dst_image: Image,
@@ -1659,7 +1658,7 @@ impl Device for VulkanDevice {
             ImageLayout::General => vk::ImageLayout::General,
         };
 
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe {
             self.device_fn.cmd_blit_image(
                 command_buffer,
@@ -1676,7 +1675,7 @@ impl Device for VulkanDevice {
     fn cmd_set_bind_group(
         &self,
         frame: &Frame,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         layout: BindGroupLayout,
         bind_group_index: u32,
         bindings: &[Bind],
@@ -1686,7 +1685,7 @@ impl Device for VulkanDevice {
         let descriptor_set_layout = self.bind_group_layout_pool.lock().get(layout.0).unwrap().0;
 
         let frame = self.frame(frame);
-        let per_thread = frame.per_thread.get(cmd_buffer.thread_token);
+        let per_thread = frame.per_thread.get(cmd_encoder.thread_token);
 
         let mut descriptor_pool = per_thread.descriptor_pool.get();
         let mut allocated_pool = false;
@@ -1814,7 +1813,7 @@ impl Device for VulkanDevice {
                 .update_descriptor_sets(self.device, write_descriptors, &[])
         };
 
-        let cmd_buffer = self.cmd_buffer_mut(cmd_buffer);
+        let cmd_buffer = self.cmd_buffer_mut(cmd_encoder);
         let VulkanBoundPipeline {
             pipeline_layout,
             pipeline_bind_point,
@@ -1840,14 +1839,14 @@ impl Device for VulkanDevice {
 
     fn cmd_set_index_buffer(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         buffer: BufferArg,
         offset: u64,
         index_type: IndexType,
     ) {
         let (buffer, base_offset, _range) = self.unwrap_buffer_arg(&buffer);
 
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         let index_type = vulkan_index_type(index_type);
         unsafe {
             self.device_fn.cmd_bind_index_buffer(
@@ -1859,8 +1858,8 @@ impl Device for VulkanDevice {
         }
     }
 
-    fn cmd_set_pipeline(&self, cmd_buffer: &mut CmdBuffer, pipeline: Pipeline) {
-        let cmd_buffer = self.cmd_buffer_mut(cmd_buffer);
+    fn cmd_set_pipeline(&self, cmd_encoder: &mut CmdEncoder, pipeline: Pipeline) {
+        let cmd_buffer = self.cmd_buffer_mut(cmd_encoder);
 
         let VulkanPipeline {
             pipeline,
@@ -1881,9 +1880,9 @@ impl Device for VulkanDevice {
         };
     }
 
-    fn cmd_begin_rendering(&self, cmd_buffer: &mut CmdBuffer, desc: &crate::RenderingDesc) {
+    fn cmd_begin_rendering(&self, cmd_encoder: &mut CmdEncoder, desc: &crate::RenderingDesc) {
         let arena = HybridArena::<1024>::new();
-        let cmd_buffer = self.cmd_buffer_mut(cmd_buffer);
+        let cmd_buffer = self.cmd_buffer_mut(cmd_encoder);
 
         let color_attachments =
             arena.alloc_slice_fill_iter(desc.color_attachments.iter().map(|attachment| {
@@ -1996,13 +1995,13 @@ impl Device for VulkanDevice {
         }
     }
 
-    fn cmd_end_rendering(&self, cmd_buffer: &mut CmdBuffer) {
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+    fn cmd_end_rendering(&self, cmd_encoder: &mut CmdEncoder) {
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe { self.device_fn.cmd_end_rendering(command_buffer) }
     }
 
-    fn cmd_set_viewports(&self, cmd_buffer: &mut CmdBuffer, viewports: &[crate::Viewport]) {
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+    fn cmd_set_viewports(&self, cmd_encoder: &mut CmdEncoder, viewports: &[crate::Viewport]) {
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe {
             self.device_fn.cmd_set_viewport_with_count(
                 command_buffer,
@@ -2011,8 +2010,8 @@ impl Device for VulkanDevice {
         }
     }
 
-    fn cmd_set_scissors(&self, cmd_buffer: &mut CmdBuffer, scissors: &[crate::Scissor]) {
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+    fn cmd_set_scissors(&self, cmd_encoder: &mut CmdEncoder, scissors: &[crate::Scissor]) {
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe {
             self.device_fn.cmd_set_scissor_with_count(
                 command_buffer,
@@ -2023,13 +2022,13 @@ impl Device for VulkanDevice {
 
     fn cmd_draw(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         vertex_count: u32,
         instance_count: u32,
         first_vertex: u32,
         first_instance: u32,
     ) {
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe {
             self.device_fn.cmd_draw(
                 command_buffer,
@@ -2043,14 +2042,14 @@ impl Device for VulkanDevice {
 
     fn cmd_draw_indexed(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         index_count: u32,
         instance_count: u32,
         first_index: u32,
         vertex_offset: i32,
         first_instance: u32,
     ) {
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe {
             self.device_fn.cmd_draw_indexed(
                 command_buffer,
@@ -2065,25 +2064,25 @@ impl Device for VulkanDevice {
 
     fn cmd_dispatch(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         group_count_x: u32,
         group_count_y: u32,
         group_count_z: u32,
     ) {
-        let command_buffer = self.cmd_buffer_mut(cmd_buffer).command_buffer;
+        let command_buffer = self.cmd_buffer_mut(cmd_encoder).command_buffer;
         unsafe {
             self.device_fn
                 .cmd_dispatch(command_buffer, group_count_x, group_count_y, group_count_z)
         }
     }
 
-    fn submit(&self, frame: &Frame, mut cmd_buffer: CmdBuffer) {
+    fn submit(&self, frame: &Frame, mut cmd_encoder: CmdEncoder) {
         let fence = self.universal_queue_fence.fetch_add(1, Ordering::SeqCst) + 1;
 
         let frame = self.frame(frame);
         frame.universal_queue_fence.store(fence, Ordering::Relaxed);
 
-        let cmd_buffer = self.cmd_buffer_mut(&mut cmd_buffer);
+        let cmd_buffer = self.cmd_buffer_mut(&mut cmd_encoder);
 
         for &(image, _) in cmd_buffer.swapchains_touched.values() {
             // transition swapchain image from attachment optimal to present src
@@ -2261,7 +2260,10 @@ impl Device for VulkanDevice {
         self.destroy_swapchain(window)
     }
 
-    fn create_mapped_buffer<'device>(&'device self, desc: &BufferDesc) -> MappedBuffer<'device> {
+    fn create_persistent_buffer<'device>(
+        &'device self,
+        desc: &BufferDesc,
+    ) -> PersistentBuffer<'device> {
         assert!(desc.host_mapped);
 
         let buffer = self.create_buffer(desc);
@@ -2269,7 +2271,7 @@ impl Device for VulkanDevice {
             let ptr = std::ptr::NonNull::new(self.map_buffer(buffer))
                 .expect("failed to map buffer memory");
 
-            MappedBuffer {
+            PersistentBuffer {
                 ptr,
                 len: desc.size,
                 buffer,
@@ -2278,7 +2280,7 @@ impl Device for VulkanDevice {
         }
     }
 
-    fn destroy_mapped_buffer(&self, frame: &Frame, buffer: MappedBuffer) {
+    fn destroy_persistent_buffer(&self, frame: &Frame, buffer: PersistentBuffer) {
         unsafe { self.unmap_buffer(buffer.buffer) }
         self.destroy_buffer(frame, buffer.buffer)
     }
@@ -2477,7 +2479,7 @@ impl VulkanDevice {
                 transient.offset,
                 transient.len as u64,
             ),
-            BufferArg::Mapped(buffer) => (
+            BufferArg::Persistent(buffer) => (
                 self.buffer_pool.lock().get(buffer.buffer.0).unwrap().buffer,
                 0,
                 vk::WHOLE_SIZE,
index 3b13abdb16feda136af9cb0776ad342f0ba67ae5..ce07042739e554d4c67779ee7eb7cf2ee3c40126 100644 (file)
@@ -8,10 +8,10 @@ use narcissus_core::{
 mod backend;
 mod delay_queue;
 mod frame_counter;
-mod mapped_memory;
-pub mod tlsf;
+mod mapped_buffer;
+mod tlsf;
 
-pub use mapped_memory::{MappedBuffer, TransientBuffer};
+pub use mapped_buffer::{PersistentBuffer, TransientBuffer};
 
 pub enum DeviceBackend {
     Vulkan,
@@ -476,7 +476,7 @@ pub struct Bind<'a> {
 
 pub enum BufferArg<'a> {
     Unmanaged(Buffer),
-    Mapped(&'a MappedBuffer<'a>),
+    Persistent(&'a PersistentBuffer<'a>),
     Transient(&'a TransientBuffer<'a>),
 }
 
@@ -674,10 +674,9 @@ impl<'a> Frame<'a> {
     }
 }
 
-pub struct CmdBuffer<'a, 'thread> {
+pub struct CmdEncoder<'a> {
     cmd_buffer_addr: usize,
-    thread_token: &'thread ThreadToken,
-    _phantom: &'a PhantomData<()>,
+    thread_token: &'a ThreadToken,
     phantom_unsend: PhantomUnsend,
 }
 
@@ -694,7 +693,10 @@ impl std::error::Error for SwapchainOutOfDateError {}
 
 pub trait Device {
     fn create_buffer(&self, desc: &BufferDesc) -> Buffer;
-    fn create_mapped_buffer<'device>(&'device self, desc: &BufferDesc) -> MappedBuffer<'device>;
+    fn create_persistent_buffer<'device>(
+        &'device self,
+        desc: &BufferDesc,
+    ) -> PersistentBuffer<'device>;
     fn create_image(&self, desc: &ImageDesc) -> Image;
     fn create_image_view(&self, desc: &ImageViewDesc) -> Image;
     fn create_sampler(&self, desc: &SamplerDesc) -> Sampler;
@@ -703,7 +705,7 @@ pub trait Device {
     fn create_compute_pipeline(&self, desc: &ComputePipelineDesc) -> Pipeline;
 
     fn destroy_buffer(&self, frame: &Frame, buffer: Buffer);
-    fn destroy_mapped_buffer(&self, frame: &Frame, buffer: MappedBuffer);
+    fn destroy_persistent_buffer(&self, frame: &Frame, buffer: PersistentBuffer);
     fn destroy_image(&self, frame: &Frame, image: Image);
     fn destroy_sampler(&self, frame: &Frame, sampler: Sampler);
     fn destroy_bind_group_layout(&self, frame: &Frame, bind_group_layout: BindGroupLayout);
@@ -745,16 +747,16 @@ pub trait Device {
     ) -> TransientBuffer<'a>;
 
     #[must_use]
-    fn create_cmd_buffer<'a, 'thread>(
+    fn request_cmd_encoder<'a>(
         &'a self,
-        frame: &'a Frame,
-        thread_token: &'thread ThreadToken,
-    ) -> CmdBuffer<'a, 'thread>;
+        frame: &'a Frame<'a>,
+        thread_token: &'a ThreadToken,
+    ) -> CmdEncoder<'a>;
 
     fn cmd_set_bind_group(
         &self,
         frame: &Frame,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         layout: BindGroupLayout,
         bind_group_index: u32,
         bindings: &[Bind],
@@ -762,28 +764,28 @@ pub trait Device {
 
     fn cmd_set_index_buffer(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         buffer: BufferArg,
         offset: u64,
         index_type: IndexType,
     );
 
-    fn cmd_set_pipeline(&self, cmd_buffer: &mut CmdBuffer, pipeline: Pipeline);
+    fn cmd_set_pipeline(&self, cmd_encoder: &mut CmdEncoder, pipeline: Pipeline);
 
-    fn cmd_set_viewports(&self, cmd_buffer: &mut CmdBuffer, viewports: &[Viewport]);
+    fn cmd_set_viewports(&self, cmd_encoder: &mut CmdEncoder, viewports: &[Viewport]);
 
-    fn cmd_set_scissors(&self, cmd_buffer: &mut CmdBuffer, scissors: &[Scissor]);
+    fn cmd_set_scissors(&self, cmd_encoder: &mut CmdEncoder, scissors: &[Scissor]);
 
     fn cmd_barrier(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         global_barrier: Option<&GlobalBarrier>,
         image_barriers: &[ImageBarrier],
     );
 
     fn cmd_copy_buffer_to_image(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         src_buffer: BufferArg,
         dst_image: Image,
         dst_image_layout: ImageLayout,
@@ -792,7 +794,7 @@ pub trait Device {
 
     fn cmd_blit_image(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         src_image: Image,
         src_image_layout: ImageLayout,
         dst_image: Image,
@@ -800,13 +802,13 @@ pub trait Device {
         regions: &[ImageBlit],
     );
 
-    fn cmd_begin_rendering(&self, cmd_buffer: &mut CmdBuffer, desc: &RenderingDesc);
+    fn cmd_begin_rendering(&self, cmd_encoder: &mut CmdEncoder, desc: &RenderingDesc);
 
-    fn cmd_end_rendering(&self, cmd_buffer: &mut CmdBuffer);
+    fn cmd_end_rendering(&self, cmd_encoder: &mut CmdEncoder);
 
     fn cmd_draw(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         vertex_count: u32,
         instance_count: u32,
         first_vertex: u32,
@@ -815,7 +817,7 @@ pub trait Device {
 
     fn cmd_draw_indexed(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         index_count: u32,
         instance_count: u32,
         first_index: u32,
@@ -825,13 +827,13 @@ pub trait Device {
 
     fn cmd_dispatch(
         &self,
-        cmd_buffer: &mut CmdBuffer,
+        cmd_encoder: &mut CmdEncoder,
         group_count_x: u32,
         group_count_y: u32,
         group_count_z: u32,
     );
 
-    fn submit(&self, frame: &Frame, cmd_buffer: CmdBuffer);
+    fn submit(&self, frame: &Frame, cmd_encoder: CmdEncoder);
 
     fn begin_frame(&self) -> Frame;
 
@@ -839,31 +841,14 @@ pub trait Device {
 }
 
 pub trait DeviceExt: Device {
-    fn create_mapped_buffer_with_data<'a, T: ?Sized>(
-        &'a self,
-        memory_location: MemoryLocation,
-        usage: BufferUsageFlags,
-        data: &T,
-    ) -> MappedBuffer<'a>;
-
-    fn request_transient_buffer_with_data<'a, T: ?Sized>(
-        &'a self,
-        frame: &'a Frame<'a>,
-        thread_token: &'a ThreadToken,
-        usage: BufferUsageFlags,
-        data: &T,
-    ) -> TransientBuffer<'a>;
-}
-
-impl DeviceExt for dyn Device {
-    fn create_mapped_buffer_with_data<'a, T: ?Sized>(
+    fn create_persistent_buffer_with_data<'a, T: ?Sized>(
         &'a self,
         memory_location: MemoryLocation,
         usage: BufferUsageFlags,
         data: &T,
-    ) -> MappedBuffer<'a> {
+    ) -> PersistentBuffer<'a> {
         let size = std::mem::size_of_val(data);
-        let mut mapped_buffer = self.create_mapped_buffer(&BufferDesc {
+        let mut mapped_buffer = self.create_persistent_buffer(&BufferDesc {
             memory_location,
             host_mapped: true,
             usage,
@@ -886,3 +871,5 @@ impl DeviceExt for dyn Device {
         transient_buffer
     }
 }
+
+impl DeviceExt for dyn Device {}
similarity index 90%
rename from libs/narcissus-gpu/src/mapped_memory.rs
rename to libs/narcissus-gpu/src/mapped_buffer.rs
index 8511d33de21b53edd7d9cfd08cd69dc10bc966f9..21ba0d7f36e2f17d36fefefd92514982071000d1 100644 (file)
@@ -52,21 +52,20 @@ unsafe fn copy_from_with_offset<T: ?Sized>(ptr: NonNull<u8>, len: usize, offset:
     std::ptr::copy_nonoverlapping(src, dst, count)
 }
 
-/// A mapped buffer is a GPU memory buffer that is persistently mapped into CPU
-/// address space and can be written to at any time.
+/// Persistent mapped buffer.
 ///
 /// Making sure the buffer is not updated while it is concurrently in use by the
 /// GPU is the responsibility of the caller.
-pub struct MappedBuffer<'a> {
+pub struct PersistentBuffer<'a> {
     pub(crate) ptr: NonNull<u8>,
     pub(crate) len: usize,
     pub(crate) buffer: Buffer,
     pub(crate) phantom: PhantomData<&'a u8>,
 }
 
-impl<'a> MappedBuffer<'a> {
+impl<'a> PersistentBuffer<'a> {
     pub fn to_arg(&self) -> BufferArg {
-        BufferArg::Mapped(self)
+        BufferArg::Persistent(self)
     }
 
     pub fn copy_from<T: ?Sized>(&mut self, src: &T) {
@@ -78,6 +77,9 @@ impl<'a> MappedBuffer<'a> {
     }
 }
 
+/// Transient mapped buffer that is tied to the lifetime of the current frame.
+///
+/// This buffer will be invalidated and recycled at the end of the frame.
 pub struct TransientBuffer<'a> {
     pub(crate) ptr: NonNull<u8>,
     pub(crate) offset: u64,
index 6985e391a2770eaa60ada636d5b0c0ba515d7b2a..7a16ca5f6523f58ba7ce655b847b19719ef6912a 100644 (file)
@@ -730,6 +730,7 @@ where
     }
 
     #[cfg(debug_assertions)]
+    #[allow(unused)]
     pub fn debug_bitmap_svg(&self, w: &mut dyn std::io::Write) -> Result<(), std::io::Error> {
         use narcissus_core::svg::{self, svg_begin, svg_end};