{gfx,examples}: add labels to gpu objects
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
2b8bfcaa3e
commit
bffc668005
10 changed files with 78 additions and 34 deletions
|
|
@ -35,7 +35,9 @@ fn init(game: *Mod) !void {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create our render pipeline that will ultimately get pixels onto the screen.
|
// Create our render pipeline that will ultimately get pixels onto the screen.
|
||||||
|
const label = @tagName(name) ++ ".init";
|
||||||
const pipeline_descriptor = gpu.RenderPipeline.Descriptor{
|
const pipeline_descriptor = gpu.RenderPipeline.Descriptor{
|
||||||
|
.label = label,
|
||||||
.fragment = &fragment,
|
.fragment = &fragment,
|
||||||
.vertex = gpu.VertexState{
|
.vertex = gpu.VertexState{
|
||||||
.module = shader_module,
|
.module = shader_module,
|
||||||
|
|
@ -75,7 +77,8 @@ fn tick(
|
||||||
defer back_buffer_view.release();
|
defer back_buffer_view.release();
|
||||||
|
|
||||||
// Create a command encoder
|
// 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();
|
defer encoder.release();
|
||||||
|
|
||||||
// Begin render pass
|
// Begin render pass
|
||||||
|
|
@ -87,7 +90,7 @@ fn tick(
|
||||||
.store_op = .store,
|
.store_op = .store,
|
||||||
}};
|
}};
|
||||||
const render_pass = encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{
|
const render_pass = encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{
|
||||||
.label = "main render pass",
|
.label = label,
|
||||||
.color_attachments = &color_attachments,
|
.color_attachments = &color_attachments,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
@ -99,7 +102,7 @@ fn tick(
|
||||||
render_pass.end();
|
render_pass.end();
|
||||||
|
|
||||||
// Submit our commands to the queue
|
// Submit our commands to the queue
|
||||||
var command = encoder.finish(null);
|
var command = encoder.finish(&.{ .label = label });
|
||||||
defer command.release();
|
defer command.release();
|
||||||
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,9 @@ fn init(
|
||||||
.targets = &.{color_target},
|
.targets = &.{color_target},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const label = @tagName(name) ++ ".init";
|
||||||
const uniform_buffer = device.createBuffer(&.{
|
const uniform_buffer = device.createBuffer(&.{
|
||||||
|
.label = label ++ " uniform buffer",
|
||||||
.usage = .{ .copy_dst = true, .uniform = true },
|
.usage = .{ .copy_dst = true, .uniform = true },
|
||||||
.size = @sizeOf(UniformBufferObject) * uniform_offset * num_bind_groups,
|
.size = @sizeOf(UniformBufferObject) * uniform_offset * num_bind_groups,
|
||||||
.mapped_at_creation = .false,
|
.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_entry = gpu.BindGroupLayout.Entry.buffer(0, .{ .vertex = true }, .uniform, true, 0);
|
||||||
const bind_group_layout = device.createBindGroupLayout(
|
const bind_group_layout = device.createBindGroupLayout(
|
||||||
&gpu.BindGroupLayout.Descriptor.init(.{
|
&gpu.BindGroupLayout.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.entries = &.{bind_group_layout_entry},
|
.entries = &.{bind_group_layout_entry},
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
@ -73,6 +76,7 @@ fn init(
|
||||||
for (bind_groups, 0..) |_, i| {
|
for (bind_groups, 0..) |_, i| {
|
||||||
bind_groups[i] = device.createBindGroup(
|
bind_groups[i] = device.createBindGroup(
|
||||||
&gpu.BindGroup.Descriptor.init(.{
|
&gpu.BindGroup.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.layout = bind_group_layout,
|
.layout = bind_group_layout,
|
||||||
.entries = &.{
|
.entries = &.{
|
||||||
gpu.BindGroup.Entry.buffer(0, uniform_buffer, uniform_offset * i, @sizeOf(UniformBufferObject)),
|
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 bind_group_layouts = [_]*gpu.BindGroupLayout{bind_group_layout};
|
||||||
const pipeline_layout = device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{
|
const pipeline_layout = device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.bind_group_layouts = &bind_group_layouts,
|
.bind_group_layouts = &bind_group_layouts,
|
||||||
}));
|
}));
|
||||||
const pipeline_descriptor = gpu.RenderPipeline.Descriptor{
|
const pipeline_descriptor = gpu.RenderPipeline.Descriptor{
|
||||||
|
.label = label,
|
||||||
.fragment = &fragment,
|
.fragment = &fragment,
|
||||||
.layout = pipeline_layout,
|
.layout = pipeline_layout,
|
||||||
.vertex = gpu.VertexState{
|
.vertex = gpu.VertexState{
|
||||||
|
|
@ -127,8 +133,10 @@ fn tick(
|
||||||
.store_op = .store,
|
.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(.{
|
const render_pass_info = gpu.RenderPassDescriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.color_attachments = &.{color_attachment},
|
.color_attachments = &.{color_attachment},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -162,7 +170,7 @@ fn tick(
|
||||||
pass.end();
|
pass.end();
|
||||||
pass.release();
|
pass.release();
|
||||||
|
|
||||||
var command = encoder.finish(null);
|
var command = encoder.finish(&.{ .label = label });
|
||||||
encoder.release();
|
encoder.release();
|
||||||
|
|
||||||
renderer.state().queue.submit(&[_]*gpu.CommandBuffer{command});
|
renderer.state().queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,8 @@ fn tick(
|
||||||
sprite_pipeline.send(.pre_render, .{});
|
sprite_pipeline.send(.pre_render, .{});
|
||||||
|
|
||||||
// Create a command encoder for this frame
|
// 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
|
// Grab the back buffer of the swapchain
|
||||||
const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?;
|
const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?;
|
||||||
|
|
@ -216,9 +217,10 @@ fn tick(
|
||||||
.load_op = .clear,
|
.load_op = .clear,
|
||||||
.store_op = .store,
|
.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(.{
|
game.state().frame_render_pass = game.state().frame_encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{
|
||||||
.label = "main render pass",
|
.label = label,
|
||||||
.color_attachments = &color_attachments,
|
.color_attachments = &color_attachments,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
@ -235,7 +237,8 @@ fn tick(
|
||||||
fn endFrame(game: *Mod) !void {
|
fn endFrame(game: *Mod) !void {
|
||||||
// Finish render pass
|
// Finish render pass
|
||||||
game.state().frame_render_pass.end();
|
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();
|
game.state().frame_encoder.release();
|
||||||
defer command.release();
|
defer command.release();
|
||||||
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,9 @@ fn init(
|
||||||
const img_size = gpu.Extent3D{ .width = 1024, .height = 1024 };
|
const img_size = gpu.Extent3D{ .width = 1024, .height = 1024 };
|
||||||
|
|
||||||
// Create a GPU texture
|
// Create a GPU texture
|
||||||
|
const label = @tagName(name) ++ ".init";
|
||||||
const texture = device.createTexture(&.{
|
const texture = device.createTexture(&.{
|
||||||
|
.label = label,
|
||||||
.size = img_size,
|
.size = img_size,
|
||||||
.format = .rgba8_unorm,
|
.format = .rgba8_unorm,
|
||||||
.usage = .{
|
.usage = .{
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,8 @@ fn tick(
|
||||||
sprite_pipeline.send(.pre_render, .{});
|
sprite_pipeline.send(.pre_render, .{});
|
||||||
|
|
||||||
// Create a command encoder for this frame
|
// 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
|
// Grab the back buffer of the swapchain
|
||||||
const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?;
|
const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?;
|
||||||
|
|
@ -197,9 +198,10 @@ fn tick(
|
||||||
.load_op = .clear,
|
.load_op = .clear,
|
||||||
.store_op = .store,
|
.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(.{
|
game.state().frame_render_pass = game.state().frame_encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{
|
||||||
.label = "main render pass",
|
.label = label,
|
||||||
.color_attachments = &color_attachments,
|
.color_attachments = &color_attachments,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
@ -216,7 +218,8 @@ fn tick(
|
||||||
fn endFrame(game: *Mod) !void {
|
fn endFrame(game: *Mod) !void {
|
||||||
// Finish render pass
|
// Finish render pass
|
||||||
game.state().frame_render_pass.end();
|
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();
|
game.state().frame_encoder.release();
|
||||||
defer command.release();
|
defer command.release();
|
||||||
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
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)) };
|
const img_size = gpu.Extent3D{ .width = @as(u32, @intCast(img.width)), .height = @as(u32, @intCast(img.height)) };
|
||||||
|
|
||||||
// Create a GPU texture
|
// Create a GPU texture
|
||||||
|
const label = @tagName(name) ++ ".loadTexture";
|
||||||
const texture = device.createTexture(&.{
|
const texture = device.createTexture(&.{
|
||||||
|
.label = label,
|
||||||
.size = img_size,
|
.size = img_size,
|
||||||
.format = .rgba8_unorm,
|
.format = .rgba8_unorm,
|
||||||
.usage = .{
|
.usage = .{
|
||||||
|
|
|
||||||
|
|
@ -227,7 +227,8 @@ fn tick(
|
||||||
text_pipeline.send(.pre_render, .{});
|
text_pipeline.send(.pre_render, .{});
|
||||||
|
|
||||||
// Create a command encoder for this frame
|
// 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
|
// Grab the back buffer of the swapchain
|
||||||
const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?;
|
const back_buffer_view = mach.core.swap_chain.getCurrentTextureView().?;
|
||||||
|
|
@ -241,9 +242,9 @@ fn tick(
|
||||||
.load_op = .clear,
|
.load_op = .clear,
|
||||||
.store_op = .store,
|
.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(.{
|
game.state().frame_render_pass = game.state().frame_encoder.beginRenderPass(&gpu.RenderPassDescriptor.init(.{
|
||||||
.label = "main render pass",
|
.label = label,
|
||||||
.color_attachments = &color_attachments,
|
.color_attachments = &color_attachments,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
@ -260,7 +261,8 @@ fn tick(
|
||||||
fn endFrame(game: *Mod, text: *gfx.Text.Mod) !void {
|
fn endFrame(game: *Mod, text: *gfx.Text.Mod) !void {
|
||||||
// Finish render pass
|
// Finish render pass
|
||||||
game.state().frame_render_pass.end();
|
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();
|
game.state().frame_encoder.release();
|
||||||
defer command.release();
|
defer command.release();
|
||||||
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,8 @@ fn updatePipeline(
|
||||||
built: *gfx.SpritePipeline.BuiltPipeline,
|
built: *gfx.SpritePipeline.BuiltPipeline,
|
||||||
) !void {
|
) !void {
|
||||||
const device = core.state().device;
|
const device = core.state().device;
|
||||||
const encoder = device.createCommandEncoder(null);
|
const label = @tagName(name) ++ ".updatePipeline";
|
||||||
|
const encoder = device.createCommandEncoder(&.{ .label = label });
|
||||||
defer encoder.release();
|
defer encoder.release();
|
||||||
|
|
||||||
var archetypes_iter = sprite.entities.query(.{ .all = &.{
|
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.transforms, 0, gfx.SpritePipeline.cp_transforms[0..i]);
|
||||||
encoder.writeBuffer(built.uv_transforms, 0, gfx.SpritePipeline.cp_uv_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]);
|
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();
|
defer command.release();
|
||||||
core.state().queue.submit(&[_]*gpu.CommandBuffer{command});
|
core.state().queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -186,35 +186,42 @@ fn buildPipeline(
|
||||||
const opt_layout = sprite_pipeline.get(pipeline_id, .layout);
|
const opt_layout = sprite_pipeline.get(pipeline_id, .layout);
|
||||||
|
|
||||||
const device = core.state().device;
|
const device = core.state().device;
|
||||||
|
const label = @tagName(name) ++ ".buildPipeline";
|
||||||
|
|
||||||
// Storage buffers
|
// Storage buffers
|
||||||
const transforms = device.createBuffer(&.{
|
const transforms = device.createBuffer(&.{
|
||||||
|
.label = label ++ " transforms",
|
||||||
.usage = .{ .storage = true, .copy_dst = true },
|
.usage = .{ .storage = true, .copy_dst = true },
|
||||||
.size = @sizeOf(math.Mat4x4) * sprite_buffer_cap,
|
.size = @sizeOf(math.Mat4x4) * sprite_buffer_cap,
|
||||||
.mapped_at_creation = .false,
|
.mapped_at_creation = .false,
|
||||||
});
|
});
|
||||||
const uv_transforms = device.createBuffer(&.{
|
const uv_transforms = device.createBuffer(&.{
|
||||||
|
.label = label ++ " uv_transforms",
|
||||||
.usage = .{ .storage = true, .copy_dst = true },
|
.usage = .{ .storage = true, .copy_dst = true },
|
||||||
.size = @sizeOf(math.Mat3x3) * sprite_buffer_cap,
|
.size = @sizeOf(math.Mat3x3) * sprite_buffer_cap,
|
||||||
.mapped_at_creation = .false,
|
.mapped_at_creation = .false,
|
||||||
});
|
});
|
||||||
const sizes = device.createBuffer(&.{
|
const sizes = device.createBuffer(&.{
|
||||||
|
.label = label ++ " sizes",
|
||||||
.usage = .{ .storage = true, .copy_dst = true },
|
.usage = .{ .storage = true, .copy_dst = true },
|
||||||
.size = @sizeOf(math.Vec2) * sprite_buffer_cap,
|
.size = @sizeOf(math.Vec2) * sprite_buffer_cap,
|
||||||
.mapped_at_creation = .false,
|
.mapped_at_creation = .false,
|
||||||
});
|
});
|
||||||
|
|
||||||
const texture_sampler = opt_texture_sampler orelse device.createSampler(&.{
|
const texture_sampler = opt_texture_sampler orelse device.createSampler(&.{
|
||||||
|
.label = label ++ " sampler",
|
||||||
.mag_filter = .nearest,
|
.mag_filter = .nearest,
|
||||||
.min_filter = .nearest,
|
.min_filter = .nearest,
|
||||||
});
|
});
|
||||||
const uniforms = device.createBuffer(&.{
|
const uniforms = device.createBuffer(&.{
|
||||||
|
.label = label ++ " uniforms",
|
||||||
.usage = .{ .copy_dst = true, .uniform = true },
|
.usage = .{ .copy_dst = true, .uniform = true },
|
||||||
.size = @sizeOf(Uniforms),
|
.size = @sizeOf(Uniforms),
|
||||||
.mapped_at_creation = .false,
|
.mapped_at_creation = .false,
|
||||||
});
|
});
|
||||||
const bind_group_layout = opt_bind_group_layout orelse device.createBindGroupLayout(
|
const bind_group_layout = opt_bind_group_layout orelse device.createBindGroupLayout(
|
||||||
&gpu.BindGroupLayout.Descriptor.init(.{
|
&gpu.BindGroupLayout.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.entries = &.{
|
.entries = &.{
|
||||||
gpu.BindGroupLayout.Entry.buffer(0, .{ .vertex = true }, .uniform, false, 0),
|
gpu.BindGroupLayout.Entry.buffer(0, .{ .vertex = true }, .uniform, false, 0),
|
||||||
gpu.BindGroupLayout.Entry.buffer(1, .{ .vertex = true }, .read_only_storage, 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();
|
defer bind_group_layout.release();
|
||||||
|
|
||||||
const texture_view = texture.createView(&gpu.TextureView.Descriptor{});
|
const texture_view = texture.createView(&gpu.TextureView.Descriptor{ .label = label });
|
||||||
const texture2_view = if (opt_texture2) |tex| tex.createView(&gpu.TextureView.Descriptor{}) else texture_view;
|
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{}) 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{}) 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 texture_view.release();
|
||||||
defer texture2_view.release();
|
defer texture2_view.release();
|
||||||
defer texture3_view.release();
|
defer texture3_view.release();
|
||||||
|
|
@ -241,6 +248,7 @@ fn buildPipeline(
|
||||||
|
|
||||||
const bind_group = opt_bind_group orelse device.createBindGroup(
|
const bind_group = opt_bind_group orelse device.createBindGroup(
|
||||||
&gpu.BindGroup.Descriptor.init(.{
|
&gpu.BindGroup.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.layout = bind_group_layout,
|
.layout = bind_group_layout,
|
||||||
.entries = &.{
|
.entries = &.{
|
||||||
gpu.BindGroup.Entry.buffer(0, uniforms, 0, @sizeOf(Uniforms)),
|
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 bind_group_layouts = [_]*gpu.BindGroupLayout{bind_group_layout};
|
||||||
const pipeline_layout = opt_layout orelse device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{
|
const pipeline_layout = opt_layout orelse device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.bind_group_layouts = &bind_group_layouts,
|
.bind_group_layouts = &bind_group_layouts,
|
||||||
}));
|
}));
|
||||||
defer pipeline_layout.release();
|
defer pipeline_layout.release();
|
||||||
const render_pipeline = device.createRenderPipeline(&gpu.RenderPipeline.Descriptor{
|
const render_pipeline = device.createRenderPipeline(&gpu.RenderPipeline.Descriptor{
|
||||||
|
.label = label,
|
||||||
.fragment = &fragment,
|
.fragment = &fragment,
|
||||||
.layout = pipeline_layout,
|
.layout = pipeline_layout,
|
||||||
.vertex = gpu.VertexState{
|
.vertex = gpu.VertexState{
|
||||||
|
|
@ -316,9 +326,8 @@ fn buildPipeline(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn preRender(sprite_pipeline: *Mod) void {
|
fn preRender(sprite_pipeline: *Mod) void {
|
||||||
const encoder = mach.core.device.createCommandEncoder(&gpu.CommandEncoder.Descriptor{
|
const label = @tagName(name) ++ ".preRender";
|
||||||
.label = "SpritePipeline.encoder",
|
const encoder = mach.core.device.createCommandEncoder(&.{ .label = label });
|
||||||
});
|
|
||||||
defer encoder.release();
|
defer encoder.release();
|
||||||
|
|
||||||
var archetypes_iter = sprite_pipeline.entities.query(.{ .all = &.{
|
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();
|
defer command.release();
|
||||||
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,8 @@ fn updatePipeline(
|
||||||
built: *gfx.TextPipeline.BuiltPipeline,
|
built: *gfx.TextPipeline.BuiltPipeline,
|
||||||
) !void {
|
) !void {
|
||||||
const device = core.state().device;
|
const device = core.state().device;
|
||||||
const encoder = device.createCommandEncoder(null);
|
const label = @tagName(name) ++ ".updatePipeline";
|
||||||
|
const encoder = device.createCommandEncoder(&.{ .label = label });
|
||||||
defer encoder.release();
|
defer encoder.release();
|
||||||
|
|
||||||
const allocator = text_pipeline.state().allocator;
|
const allocator = text_pipeline.state().allocator;
|
||||||
|
|
@ -272,7 +273,7 @@ fn updatePipeline(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_texts > 0 or glyphs.items.len > 0) {
|
if (num_texts > 0 or glyphs.items.len > 0) {
|
||||||
var command = encoder.finish(null);
|
var command = encoder.finish(&.{ .label = label });
|
||||||
defer command.release();
|
defer command.release();
|
||||||
core.state().queue.submit(&[_]*gpu.CommandBuffer{command});
|
core.state().queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -208,8 +208,10 @@ fn buildPipeline(
|
||||||
// Prepare texture for the font atlas.
|
// Prepare texture for the font atlas.
|
||||||
// TODO(text): dynamic texture re-allocation when not large enough
|
// TODO(text): dynamic texture re-allocation when not large enough
|
||||||
// TODO(text): better default allocation size
|
// TODO(text): better default allocation size
|
||||||
|
const label = @tagName(name) ++ ".buildPipeline";
|
||||||
const img_size = gpu.Extent3D{ .width = 1024, .height = 1024 };
|
const img_size = gpu.Extent3D{ .width = 1024, .height = 1024 };
|
||||||
const texture = device.createTexture(&.{
|
const texture = device.createTexture(&.{
|
||||||
|
.label = label,
|
||||||
.size = img_size,
|
.size = img_size,
|
||||||
.format = .rgba8_unorm,
|
.format = .rgba8_unorm,
|
||||||
.usage = .{
|
.usage = .{
|
||||||
|
|
@ -226,32 +228,38 @@ fn buildPipeline(
|
||||||
|
|
||||||
// Storage buffers
|
// Storage buffers
|
||||||
const transforms = device.createBuffer(&.{
|
const transforms = device.createBuffer(&.{
|
||||||
|
.label = label ++ " transforms",
|
||||||
.usage = .{ .storage = true, .copy_dst = true },
|
.usage = .{ .storage = true, .copy_dst = true },
|
||||||
.size = @sizeOf(math.Mat4x4) * texts_buffer_cap,
|
.size = @sizeOf(math.Mat4x4) * texts_buffer_cap,
|
||||||
.mapped_at_creation = .false,
|
.mapped_at_creation = .false,
|
||||||
});
|
});
|
||||||
const colors = device.createBuffer(&.{
|
const colors = device.createBuffer(&.{
|
||||||
|
.label = label ++ " colors",
|
||||||
.usage = .{ .storage = true, .copy_dst = true },
|
.usage = .{ .storage = true, .copy_dst = true },
|
||||||
.size = @sizeOf(math.Vec4) * texts_buffer_cap,
|
.size = @sizeOf(math.Vec4) * texts_buffer_cap,
|
||||||
.mapped_at_creation = .false,
|
.mapped_at_creation = .false,
|
||||||
});
|
});
|
||||||
const glyphs = device.createBuffer(&.{
|
const glyphs = device.createBuffer(&.{
|
||||||
|
.label = label ++ " glyphs",
|
||||||
.usage = .{ .storage = true, .copy_dst = true },
|
.usage = .{ .storage = true, .copy_dst = true },
|
||||||
.size = @sizeOf(Glyph) * texts_buffer_cap,
|
.size = @sizeOf(Glyph) * texts_buffer_cap,
|
||||||
.mapped_at_creation = .false,
|
.mapped_at_creation = .false,
|
||||||
});
|
});
|
||||||
|
|
||||||
const texture_sampler = opt_texture_sampler orelse device.createSampler(&.{
|
const texture_sampler = opt_texture_sampler orelse device.createSampler(&.{
|
||||||
|
.label = label ++ " sampler",
|
||||||
.mag_filter = .nearest,
|
.mag_filter = .nearest,
|
||||||
.min_filter = .nearest,
|
.min_filter = .nearest,
|
||||||
});
|
});
|
||||||
const uniforms = device.createBuffer(&.{
|
const uniforms = device.createBuffer(&.{
|
||||||
|
.label = label ++ " uniforms",
|
||||||
.usage = .{ .copy_dst = true, .uniform = true },
|
.usage = .{ .copy_dst = true, .uniform = true },
|
||||||
.size = @sizeOf(Uniforms),
|
.size = @sizeOf(Uniforms),
|
||||||
.mapped_at_creation = .false,
|
.mapped_at_creation = .false,
|
||||||
});
|
});
|
||||||
const bind_group_layout = opt_bind_group_layout orelse device.createBindGroupLayout(
|
const bind_group_layout = opt_bind_group_layout orelse device.createBindGroupLayout(
|
||||||
&gpu.BindGroupLayout.Descriptor.init(.{
|
&gpu.BindGroupLayout.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.entries = &.{
|
.entries = &.{
|
||||||
gpu.BindGroupLayout.Entry.buffer(0, .{ .vertex = true }, .uniform, false, 0),
|
gpu.BindGroupLayout.Entry.buffer(0, .{ .vertex = true }, .uniform, false, 0),
|
||||||
gpu.BindGroupLayout.Entry.buffer(1, .{ .vertex = true }, .read_only_storage, 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();
|
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();
|
defer texture_view.release();
|
||||||
|
|
||||||
const bind_group = opt_bind_group orelse device.createBindGroup(
|
const bind_group = opt_bind_group orelse device.createBindGroup(
|
||||||
&gpu.BindGroup.Descriptor.init(.{
|
&gpu.BindGroup.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.layout = bind_group_layout,
|
.layout = bind_group_layout,
|
||||||
.entries = &.{
|
.entries = &.{
|
||||||
gpu.BindGroup.Entry.buffer(0, uniforms, 0, @sizeOf(Uniforms)),
|
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 bind_group_layouts = [_]*gpu.BindGroupLayout{bind_group_layout};
|
||||||
const pipeline_layout = opt_layout orelse device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{
|
const pipeline_layout = opt_layout orelse device.createPipelineLayout(&gpu.PipelineLayout.Descriptor.init(.{
|
||||||
|
.label = label,
|
||||||
.bind_group_layouts = &bind_group_layouts,
|
.bind_group_layouts = &bind_group_layouts,
|
||||||
}));
|
}));
|
||||||
defer pipeline_layout.release();
|
defer pipeline_layout.release();
|
||||||
const render_pipeline = device.createRenderPipeline(&gpu.RenderPipeline.Descriptor{
|
const render_pipeline = device.createRenderPipeline(&gpu.RenderPipeline.Descriptor{
|
||||||
|
.label = label,
|
||||||
.fragment = &fragment,
|
.fragment = &fragment,
|
||||||
.layout = pipeline_layout,
|
.layout = pipeline_layout,
|
||||||
.vertex = gpu.VertexState{
|
.vertex = gpu.VertexState{
|
||||||
|
|
@ -340,9 +351,8 @@ fn buildPipeline(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn preRender(text_pipeline: *Mod) void {
|
fn preRender(text_pipeline: *Mod) void {
|
||||||
const encoder = mach.core.device.createCommandEncoder(&gpu.CommandEncoder.Descriptor{
|
const label = @tagName(name) ++ ".preRender";
|
||||||
.label = "TextPipeline.encoder",
|
const encoder = mach.core.device.createCommandEncoder(&.{ .label = label });
|
||||||
});
|
|
||||||
defer encoder.release();
|
defer encoder.release();
|
||||||
|
|
||||||
var archetypes_iter = text_pipeline.entities.query(.{ .all = &.{
|
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();
|
defer command.release();
|
||||||
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
mach.core.queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue