diff --git a/examples/core-custom-entrypoint/Game.zig b/examples/core-custom-entrypoint/Game.zig index 30b6a7b8..48ea9c81 100644 --- a/examples/core-custom-entrypoint/Game.zig +++ b/examples/core-custom-entrypoint/Game.zig @@ -35,7 +35,9 @@ fn init(game: *Mod) !void { }); // Create our render pipeline that will ultimately get pixels onto the screen. + const label = @tagName(name) ++ ".init"; const pipeline_descriptor = gpu.RenderPipeline.Descriptor{ + .label = label, .fragment = &fragment, .vertex = gpu.VertexState{ .module = shader_module, @@ -75,7 +77,8 @@ fn tick( defer back_buffer_view.release(); // Create a command encoder - const encoder = mach.core.device.createCommandEncoder(null); + const label = @tagName(name) ++ ".tick"; + const encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); defer encoder.release(); // Begin render pass @@ -87,7 +90,7 @@ fn tick( .store_op = .store, }}; const render_pass = encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{ - .label = "main render pass", + .label = label, .color_attachments = &color_attachments, })); @@ -99,7 +102,7 @@ fn tick( render_pass.end(); // Submit our commands to the queue - var command = encoder.finish(null); + var command = encoder.finish(&.{ .label = label }); defer command.release(); mach.core.queue.submit(&[_]*gpu.CommandBuffer{command}); diff --git a/examples/custom-renderer/Renderer.zig b/examples/custom-renderer/Renderer.zig index f8d4734f..e4ab654d 100644 --- a/examples/custom-renderer/Renderer.zig +++ b/examples/custom-renderer/Renderer.zig @@ -58,7 +58,9 @@ fn init( .targets = &.{color_target}, }); + const label = @tagName(name) ++ ".init"; const uniform_buffer = device.createBuffer(&.{ + .label = label ++ " uniform buffer", .usage = .{ .copy_dst = true, .uniform = true }, .size = @sizeOf(UniformBufferObject) * uniform_offset * num_bind_groups, .mapped_at_creation = .false, @@ -66,6 +68,7 @@ fn init( const bind_group_layout_entry = gpu.BindGroupLayout.Entry.buffer(0, .{ .vertex = true }, .uniform, true, 0); const bind_group_layout = device.createBindGroupLayout( &gpu.BindGroupLayout.Descriptor.init(.{ + .label = label, .entries = &.{bind_group_layout_entry}, }), ); @@ -73,6 +76,7 @@ fn init( for (bind_groups, 0..) |_, i| { bind_groups[i] = device.createBindGroup( &gpu.BindGroup.Descriptor.init(.{ + .label = label, .layout = bind_group_layout, .entries = &.{ gpu.BindGroup.Entry.buffer(0, uniform_buffer, uniform_offset * i, @sizeOf(UniformBufferObject)), @@ -83,9 +87,11 @@ fn init( const bind_group_layouts = [_]*gpu.BindGroupLayout{bind_group_layout}; const pipeline_layout = device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{ + .label = label, .bind_group_layouts = &bind_group_layouts, })); const pipeline_descriptor = gpu.RenderPipeline.Descriptor{ + .label = label, .fragment = &fragment, .layout = pipeline_layout, .vertex = gpu.VertexState{ @@ -127,8 +133,10 @@ fn tick( .store_op = .store, }; - const encoder = device.createCommandEncoder(null); + const label = @tagName(name) ++ ".tick"; + const encoder = device.createCommandEncoder(&.{ .label = label }); const render_pass_info = gpu.RenderPassDescriptor.init(.{ + .label = label, .color_attachments = &.{color_attachment}, }); @@ -162,7 +170,7 @@ fn tick( pass.end(); pass.release(); - var command = encoder.finish(null); + var command = encoder.finish(&.{ .label = label }); encoder.release(); renderer.state().queue.submit(&[_]*gpu.CommandBuffer{command}); diff --git a/examples/glyphs/Game.zig b/examples/glyphs/Game.zig index 34595114..ce04b560 100644 --- a/examples/glyphs/Game.zig +++ b/examples/glyphs/Game.zig @@ -202,7 +202,8 @@ fn tick( sprite_pipeline.send(.pre_render, .{}); // Create a command encoder for this frame - game.state().frame_encoder = mach.core.device.createCommandEncoder(null); + const label = @tagName(name) ++ ".tick"; + game.state().frame_encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); // Grab the back buffer of the swapchain const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?; @@ -216,9 +217,10 @@ fn tick( .load_op = .clear, .store_op = .store, }}; - game.state().frame_encoder = mach.core.device.createCommandEncoder(null); + // TODO: can we eliminate this assignment + game.state().frame_encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); game.state().frame_render_pass = game.state().frame_encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{ - .label = "main render pass", + .label = label, .color_attachments = &color_attachments, })); @@ -235,7 +237,8 @@ fn tick( fn endFrame(game: *Mod) !void { // Finish render pass game.state().frame_render_pass.end(); - var command = game.state().frame_encoder.finish(null); + const label = @tagName(name) ++ ".endFrame"; + var command = game.state().frame_encoder.finish(&.{ .label = label }); game.state().frame_encoder.release(); defer command.release(); mach.core.queue.submit(&[_]*gpu.CommandBuffer{command}); diff --git a/examples/glyphs/Glyphs.zig b/examples/glyphs/Glyphs.zig index 5f58c7d8..9e94d44d 100644 --- a/examples/glyphs/Glyphs.zig +++ b/examples/glyphs/Glyphs.zig @@ -48,7 +48,9 @@ fn init( const img_size = gpu.Extent3D{ .width = 1024, .height = 1024 }; // Create a GPU texture + const label = @tagName(name) ++ ".init"; const texture = device.createTexture(&.{ + .label = label, .size = img_size, .format = .rgba8_unorm, .usage = .{ diff --git a/examples/sprite/Game.zig b/examples/sprite/Game.zig index 7ab4d40c..4281deb4 100644 --- a/examples/sprite/Game.zig +++ b/examples/sprite/Game.zig @@ -183,7 +183,8 @@ fn tick( sprite_pipeline.send(.pre_render, .{}); // Create a command encoder for this frame - game.state().frame_encoder = mach.core.device.createCommandEncoder(null); + const label = @tagName(name) ++ ".tick"; + game.state().frame_encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); // Grab the back buffer of the swapchain const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?; @@ -197,9 +198,10 @@ fn tick( .load_op = .clear, .store_op = .store, }}; - game.state().frame_encoder = mach.core.device.createCommandEncoder(null); + // TODO: can we eliminate this assignment + game.state().frame_encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); game.state().frame_render_pass = game.state().frame_encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{ - .label = "main render pass", + .label = label, .color_attachments = &color_attachments, })); @@ -216,7 +218,8 @@ fn tick( fn endFrame(game: *Mod) !void { // Finish render pass game.state().frame_render_pass.end(); - var command = game.state().frame_encoder.finish(null); + const label = @tagName(name) ++ ".endFrame"; + var command = game.state().frame_encoder.finish(&.{ .label = label }); game.state().frame_encoder.release(); defer command.release(); mach.core.queue.submit(&[_]*gpu.CommandBuffer{command}); @@ -244,7 +247,9 @@ fn loadTexture(core: *mach.Core.Mod, allocator: std.mem.Allocator) !*gpu.Texture const img_size = gpu.Extent3D{ .width = @as(u32, @intCast(img.width)), .height = @as(u32, @intCast(img.height)) }; // Create a GPU texture + const label = @tagName(name) ++ ".loadTexture"; const texture = device.createTexture(&.{ + .label = label, .size = img_size, .format = .rgba8_unorm, .usage = .{ diff --git a/examples/text/Game.zig b/examples/text/Game.zig index d90dc3f2..34ed97b2 100644 --- a/examples/text/Game.zig +++ b/examples/text/Game.zig @@ -227,7 +227,8 @@ fn tick( text_pipeline.send(.pre_render, .{}); // Create a command encoder for this frame - game.state().frame_encoder = mach.core.device.createCommandEncoder(null); + const label = @tagName(name) ++ ".tick"; + game.state().frame_encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); // Grab the back buffer of the swapchain const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?; @@ -241,9 +242,9 @@ fn tick( .load_op = .clear, .store_op = .store, }}; - game.state().frame_encoder = mach.core.device.createCommandEncoder(null); + game.state().frame_encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); game.state().frame_render_pass = game.state().frame_encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{ - .label = "main render pass", + .label = label, .color_attachments = &color_attachments, })); @@ -260,7 +261,8 @@ fn tick( fn endFrame(game: *Mod, text: *gfx.Text.Mod) !void { // Finish render pass game.state().frame_render_pass.end(); - var command = game.state().frame_encoder.finish(null); + const label = @tagName(name) ++ ".tick"; + var command = game.state().frame_encoder.finish(&.{ .label = label }); game.state().frame_encoder.release(); defer command.release(); mach.core.queue.submit(&[_]*gpu.CommandBuffer{command}); diff --git a/src/gfx/Sprite.zig b/src/gfx/Sprite.zig index 707149a6..2ef67374 100644 --- a/src/gfx/Sprite.zig +++ b/src/gfx/Sprite.zig @@ -65,7 +65,8 @@ fn updatePipeline( built: *gfx.SpritePipeline.BuiltPipeline, ) !void { const device = core.state().device; - const encoder = device.createCommandEncoder(null); + const label = @tagName(name) ++ ".updatePipeline"; + const encoder = device.createCommandEncoder(&.{ .label = label }); defer encoder.release(); var archetypes_iter = sprite.entities.query(.{ .all = &.{ @@ -106,7 +107,7 @@ fn updatePipeline( encoder.writeBuffer(built.transforms, 0, gfx.SpritePipeline.cp_transforms[0..i]); encoder.writeBuffer(built.uv_transforms, 0, gfx.SpritePipeline.cp_uv_transforms[0..i]); encoder.writeBuffer(built.sizes, 0, gfx.SpritePipeline.cp_sizes[0..i]); - var command = encoder.finish(null); + var command = encoder.finish(&.{ .label = label }); defer command.release(); core.state().queue.submit(&[_]*gpu.CommandBuffer{command}); } diff --git a/src/gfx/SpritePipeline.zig b/src/gfx/SpritePipeline.zig index 06c29d6e..81525408 100644 --- a/src/gfx/SpritePipeline.zig +++ b/src/gfx/SpritePipeline.zig @@ -186,35 +186,42 @@ fn buildPipeline( const opt_layout = sprite_pipeline.get(pipeline_id, .layout); const device = core.state().device; + const label = @tagName(name) ++ ".buildPipeline"; // Storage buffers const transforms = device.createBuffer(&.{ + .label = label ++ " transforms", .usage = .{ .storage = true, .copy_dst = true }, .size = @sizeOf(math.Mat4x4) * sprite_buffer_cap, .mapped_at_creation = .false, }); const uv_transforms = device.createBuffer(&.{ + .label = label ++ " uv_transforms", .usage = .{ .storage = true, .copy_dst = true }, .size = @sizeOf(math.Mat3x3) * sprite_buffer_cap, .mapped_at_creation = .false, }); const sizes = device.createBuffer(&.{ + .label = label ++ " sizes", .usage = .{ .storage = true, .copy_dst = true }, .size = @sizeOf(math.Vec2) * sprite_buffer_cap, .mapped_at_creation = .false, }); const texture_sampler = opt_texture_sampler orelse device.createSampler(&.{ + .label = label ++ " sampler", .mag_filter = .nearest, .min_filter = .nearest, }); const uniforms = device.createBuffer(&.{ + .label = label ++ " uniforms", .usage = .{ .copy_dst = true, .uniform = true }, .size = @sizeOf(Uniforms), .mapped_at_creation = .false, }); const bind_group_layout = opt_bind_group_layout orelse device.createBindGroupLayout( &gpu.BindGroupLayout.Descriptor.init(.{ + .label = label, .entries = &.{ gpu.BindGroupLayout.Entry.buffer(0, .{ .vertex = true }, .uniform, false, 0), gpu.BindGroupLayout.Entry.buffer(1, .{ .vertex = true }, .read_only_storage, false, 0), @@ -230,10 +237,10 @@ fn buildPipeline( ); defer bind_group_layout.release(); - const texture_view = texture.createView(&gpu.TextureView.Descriptor{}); - const texture2_view = if (opt_texture2) |tex| tex.createView(&gpu.TextureView.Descriptor{}) else texture_view; - const texture3_view = if (opt_texture3) |tex| tex.createView(&gpu.TextureView.Descriptor{}) else texture_view; - const texture4_view = if (opt_texture4) |tex| tex.createView(&gpu.TextureView.Descriptor{}) else texture_view; + const texture_view = texture.createView(&gpu.TextureView.Descriptor{ .label = label }); + const texture2_view = if (opt_texture2) |tex| tex.createView(&gpu.TextureView.Descriptor{ .label = label }) else texture_view; + const texture3_view = if (opt_texture3) |tex| tex.createView(&gpu.TextureView.Descriptor{ .label = label }) else texture_view; + const texture4_view = if (opt_texture4) |tex| tex.createView(&gpu.TextureView.Descriptor{ .label = label }) else texture_view; defer texture_view.release(); defer texture2_view.release(); defer texture3_view.release(); @@ -241,6 +248,7 @@ fn buildPipeline( const bind_group = opt_bind_group orelse device.createBindGroup( &gpu.BindGroup.Descriptor.init(.{ + .label = label, .layout = bind_group_layout, .entries = &.{ gpu.BindGroup.Entry.buffer(0, uniforms, 0, @sizeOf(Uniforms)), @@ -285,10 +293,12 @@ fn buildPipeline( const bind_group_layouts = [_]*gpu.BindGroupLayout{bind_group_layout}; const pipeline_layout = opt_layout orelse device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{ + .label = label, .bind_group_layouts = &bind_group_layouts, })); defer pipeline_layout.release(); const render_pipeline = device.createRenderPipeline(&gpu.RenderPipeline.Descriptor{ + .label = label, .fragment = &fragment, .layout = pipeline_layout, .vertex = gpu.VertexState{ @@ -316,9 +326,8 @@ fn buildPipeline( } fn preRender(sprite_pipeline: *Mod) void { - const encoder = mach.core.device.createCommandEncoder(&gpu.CommandEncoder.Descriptor{ - .label = "SpritePipeline.encoder", - }); + const label = @tagName(name) ++ ".preRender"; + const encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); defer encoder.release(); var archetypes_iter = sprite_pipeline.entities.query(.{ .all = &.{ @@ -353,7 +362,7 @@ fn preRender(sprite_pipeline: *Mod) void { } } - var command = encoder.finish(null); + var command = encoder.finish(&.{ .label = label }); defer command.release(); mach.core.queue.submit(&[_]*gpu.CommandBuffer{command}); } diff --git a/src/gfx/Text.zig b/src/gfx/Text.zig index 625debc2..36929a0f 100644 --- a/src/gfx/Text.zig +++ b/src/gfx/Text.zig @@ -81,7 +81,8 @@ fn updatePipeline( built: *gfx.TextPipeline.BuiltPipeline, ) !void { const device = core.state().device; - const encoder = device.createCommandEncoder(null); + const label = @tagName(name) ++ ".updatePipeline"; + const encoder = device.createCommandEncoder(&.{ .label = label }); defer encoder.release(); const allocator = text_pipeline.state().allocator; @@ -272,7 +273,7 @@ fn updatePipeline( } if (num_texts > 0 or glyphs.items.len > 0) { - var command = encoder.finish(null); + var command = encoder.finish(&.{ .label = label }); defer command.release(); core.state().queue.submit(&[_]*gpu.CommandBuffer{command}); } diff --git a/src/gfx/TextPipeline.zig b/src/gfx/TextPipeline.zig index 2a0b71d3..24963ba9 100644 --- a/src/gfx/TextPipeline.zig +++ b/src/gfx/TextPipeline.zig @@ -208,8 +208,10 @@ fn buildPipeline( // Prepare texture for the font atlas. // TODO(text): dynamic texture re-allocation when not large enough // TODO(text): better default allocation size + const label = @tagName(name) ++ ".buildPipeline"; const img_size = gpu.Extent3D{ .width = 1024, .height = 1024 }; const texture = device.createTexture(&.{ + .label = label, .size = img_size, .format = .rgba8_unorm, .usage = .{ @@ -226,32 +228,38 @@ fn buildPipeline( // Storage buffers const transforms = device.createBuffer(&.{ + .label = label ++ " transforms", .usage = .{ .storage = true, .copy_dst = true }, .size = @sizeOf(math.Mat4x4) * texts_buffer_cap, .mapped_at_creation = .false, }); const colors = device.createBuffer(&.{ + .label = label ++ " colors", .usage = .{ .storage = true, .copy_dst = true }, .size = @sizeOf(math.Vec4) * texts_buffer_cap, .mapped_at_creation = .false, }); const glyphs = device.createBuffer(&.{ + .label = label ++ " glyphs", .usage = .{ .storage = true, .copy_dst = true }, .size = @sizeOf(Glyph) * texts_buffer_cap, .mapped_at_creation = .false, }); const texture_sampler = opt_texture_sampler orelse device.createSampler(&.{ + .label = label ++ " sampler", .mag_filter = .nearest, .min_filter = .nearest, }); const uniforms = device.createBuffer(&.{ + .label = label ++ " uniforms", .usage = .{ .copy_dst = true, .uniform = true }, .size = @sizeOf(Uniforms), .mapped_at_creation = .false, }); const bind_group_layout = opt_bind_group_layout orelse device.createBindGroupLayout( &gpu.BindGroupLayout.Descriptor.init(.{ + .label = label, .entries = &.{ gpu.BindGroupLayout.Entry.buffer(0, .{ .vertex = true }, .uniform, false, 0), gpu.BindGroupLayout.Entry.buffer(1, .{ .vertex = true }, .read_only_storage, false, 0), @@ -264,11 +272,12 @@ fn buildPipeline( ); defer bind_group_layout.release(); - const texture_view = texture.createView(&gpu.TextureView.Descriptor{}); + const texture_view = texture.createView(&gpu.TextureView.Descriptor{ .label = label }); defer texture_view.release(); const bind_group = opt_bind_group orelse device.createBindGroup( &gpu.BindGroup.Descriptor.init(.{ + .label = label, .layout = bind_group_layout, .entries = &.{ gpu.BindGroup.Entry.buffer(0, uniforms, 0, @sizeOf(Uniforms)), @@ -310,10 +319,12 @@ fn buildPipeline( const bind_group_layouts = [_]*gpu.BindGroupLayout{bind_group_layout}; const pipeline_layout = opt_layout orelse device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{ + .label = label, .bind_group_layouts = &bind_group_layouts, })); defer pipeline_layout.release(); const render_pipeline = device.createRenderPipeline(&gpu.RenderPipeline.Descriptor{ + .label = label, .fragment = &fragment, .layout = pipeline_layout, .vertex = gpu.VertexState{ @@ -340,9 +351,8 @@ fn buildPipeline( } fn preRender(text_pipeline: *Mod) void { - const encoder = mach.core.device.createCommandEncoder(&gpu.CommandEncoder.Descriptor{ - .label = "TextPipeline.encoder", - }); + const label = @tagName(name) ++ ".preRender"; + const encoder = mach.core.device.createCommandEncoder(&.{ .label = label }); defer encoder.release(); var archetypes_iter = text_pipeline.entities.query(.{ .all = &.{ @@ -377,7 +387,7 @@ fn preRender(text_pipeline: *Mod) void { } } - var command = encoder.finish(null); + var command = encoder.finish(&.{ .label = label }); defer command.release(); mach.core.queue.submit(&[_]*gpu.CommandBuffer{command}); }