From 53d063246b03c4fd50f31bc981b1f0c9f9a9b000 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Mon, 8 Jul 2024 10:51:42 -0400 Subject: [PATCH] pass a uniform --- src/Uber.zig | 9 ++------ src/main.zig | 48 ++++++++++++++++++++++++++++++++++++++- src/shaders/triangle.vert | 12 ++++++---- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/Uber.zig b/src/Uber.zig index 1a64888..3144a25 100644 --- a/src/Uber.zig +++ b/src/Uber.zig @@ -44,14 +44,9 @@ pub const Vertex = extern struct { }; pub const Uniform = extern struct { - proj: [16]f32 = .{ - 0.5, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1, - }, + proj: [16]f32, - const DescriptorLayoutInfo = vk.DescriptorSetLayoutCreateInfo{ + pub const DescriptorLayoutInfo = vk.DescriptorSetLayoutCreateInfo{ .flags = .{}, .binding_count = 1, .p_bindings = &.{ diff --git a/src/main.zig b/src/main.zig index 203eb21..ccd4d87 100644 --- a/src/main.zig +++ b/src/main.zig @@ -23,7 +23,14 @@ const vertices = [_]Uber.Vertex{ const indices = [_]Uber.Index{ 4, 5, 6, 6, 5, 7 }; -const uniform = Uber.Uniform{}; +const uniform = Uber.Uniform{ + .proj = .{ + 0.5, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + }, +}; const Frame = struct { pub fn init() !Frame { @@ -41,9 +48,11 @@ const Frame = struct { view: vk.ImageView, scissor: vk.Rect2D, pipeline: vk.Pipeline, + layout: vk.PipelineLayout, vertex_buffer: vk.Buffer, index_buffer: vk.Buffer, uniform_buffer: vk.Buffer, + descriptor_set: vk.DescriptorSet, ) !void { _ = self; @@ -103,6 +112,7 @@ const Frame = struct { cmd.beginRendering(&info); + cmd.bindDescriptorSets(.graphics, layout, 0, 1, &.{descriptor_set}, 0, null); cmd.bindPipeline(.graphics, pipeline); cmd.bindVertexBuffers(0, 1, &.{vertex_buffer}, &.{0}); cmd.bindIndexBuffer(index_buffer, 0, .uint16); @@ -282,6 +292,8 @@ pub fn main() !void { defer au.D.unmapMemory(index_memory); index_data.* = indices; + // todo ring buffer for frames in flight. need to use an offset when binding + // use dynamic offset - descriptor type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC const uniform_buffer = try au.D.createBuffer(&vk.BufferCreateInfo{ .size = @sizeOf(@TypeOf(uniform)), .usage = .{ .uniform_buffer_bit = true }, @@ -299,6 +311,38 @@ pub fn main() !void { defer au.D.unmapMemory(uniform_memory); uniform_data.* = uniform; + var descriptorSet: vk.DescriptorSet = undefined; + try au.D.allocateDescriptorSets(&vk.DescriptorSetAllocateInfo{ + .descriptor_pool = descriptorPool, + .descriptor_set_count = 1, + .p_set_layouts = &.{uber.set_layout}, + }, @ptrCast(&descriptorSet)); + defer au.D.freeDescriptorSets(descriptorPool, 1, &.{descriptorSet}) catch unreachable; // todo handle this? + + au.D.updateDescriptorSets( + 1, + &.{ + vk.WriteDescriptorSet{ + .dst_set = descriptorSet, + .dst_binding = 0, + .dst_array_element = 0, + .descriptor_type = .uniform_buffer, + .descriptor_count = 1, + .p_image_info = &[0]vk.DescriptorImageInfo{}, + .p_texel_buffer_view = &[0]vk.BufferView{}, + .p_buffer_info = &.{ + vk.DescriptorBufferInfo{ + .buffer = uniform_buffer, + .offset = 0, + .range = vk.WHOLE_SIZE, + }, + }, + }, + }, + 0, + null, + ); + var prng = std.Random.Sfc64.init(std.crypto.random.int(u64)); const rand = prng.random(); @@ -350,9 +394,11 @@ pub fn main() !void { view, vk.Rect2D{ .offset = .{ .x = 0, .y = 0 }, .extent = sc.cinfo.image_extent }, uber.pipeline, + uber.layout, vertex_buffer, index_buffer, uniform_buffer, + descriptorSet, ); for (vertex_data) |*v| { diff --git a/src/shaders/triangle.vert b/src/shaders/triangle.vert index f820750..f98be1c 100644 --- a/src/shaders/triangle.vert +++ b/src/shaders/triangle.vert @@ -1,11 +1,15 @@ #version 450 -layout(location = 0) in vec4 a_pos; -layout(location = 1) in vec3 a_color; +layout (set = 0, binding = 0) uniform CameraBuffer { + mat4 viewproj; +} cam; -layout(location = 0) out vec3 v_color; +layout (location = 0) in vec4 a_pos; +layout (location = 1) in vec3 a_color; + +layout (location = 0) out vec3 v_color; void main() { - gl_Position = a_pos; + gl_Position = a_pos * cam.viewproj; v_color = a_color; }