From 82df45e4885e7459faeb2077ce6b28555b05fc3b Mon Sep 17 00:00:00 2001 From: matthew Date: Sun, 13 Jul 2025 18:27:13 +1000 Subject: [PATCH] gui pipeline setup, misc vulkan work --- assets/shaders/gradient.comp.spv | Bin 3384 -> 2972 bytes assets/shaders/gui.frag.spv | Bin 0 -> 1744 bytes assets/shaders/gui.vert.spv | Bin 0 -> 4216 bytes assets/shaders/triangle.frag.spv | Bin 2120 -> 1708 bytes assets/shaders/triangle.vert.spv | Bin 3012 -> 2600 bytes src/gears/renderer.d | 163 +++++++++---- src/gears/vulkan.d | 380 ++++++++++++++++++++++++++++--- src/generated/assets_codegen.d | 6 + src/shaders/gui.frag.glsl | 18 ++ src/shaders/gui.vert.glsl | 46 ++++ src/shaders/structures.layout | 12 - src/shared/assets.d | 8 + src/shared/util.d | 43 ++++ 13 files changed, 595 insertions(+), 81 deletions(-) create mode 100644 assets/shaders/gui.frag.spv create mode 100644 assets/shaders/gui.vert.spv create mode 100644 src/shaders/gui.frag.glsl create mode 100644 src/shaders/gui.vert.glsl diff --git a/assets/shaders/gradient.comp.spv b/assets/shaders/gradient.comp.spv index 319e010161cb37e97eb379ebf53603642b110d15..23de3cb0cb8c082eb8f8b21df4c356750711966c 100644 GIT binary patch delta 182 zcmdlXHAkG6nMs+QfsK)Yn}L@hb0V+!L>(D!1|VPrVtxj`iNS`9X&XBknZ#KcQh-9v z`FX`9iFqZ(KsFl?rc7337H3S`Y{~4+$O}@y1jHT;K*gI?S&uXM$}up5^$7!o6&P3; qQh_ul5QCIjL-}b?F>N593&>6fVgVr50h$kTO9oUdee+h1W)=Ws9T%wp delta 608 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 literal 0 HcmV?d00001 diff --git a/assets/shaders/triangle.frag.spv b/assets/shaders/triangle.frag.spv index d039d54fe791968c68c7e439ab64b2fec2cbd82c..2bd01d0491a6e45eb28b133009d4e92179b08181 100644 GIT binary patch delta 177 zcmX>hu!h%}nMs+QfsK)Yn}L@>mjMC<8JHLtflO`&HZbk(6YQf`T#}+^Vrl?V!NK%?5;8lOHmPGwN*q$>hz*3sS%Y q#2ySl#hah9C^M=o{GwcKy>b&$BUmX08)I zWA^SQD~P#|w|S3B;6qC46TPI8`c*Bfbb7BZR7Fo3d5$(QBX-4VjfX}XVecOL2H8c9 z#IwHK4&P#quOPXTo*Dn=>1)%f5@CTe8bR=oT$rFXrjqHW7wc*Z@;2mO{N6q=y^<5t zV+*+sOmF1Wd7FF#Cz@GmYv2c{+`+T#AENRk_2W6GPioi|Sx@|EJ|3bjAnB8j$izCy&AnMs+QfsK)Yn}L_XmjMC<8JHLtflO`&HZbk(6YQf`T#}+^Vrl?V!N|x<`B_xufX0D@*??GqfrY^vNOJ-)NX#0__u0IXOPUb?0WlY$ delta 567 zcmYjN%Syvg5S`>EDW!y}1X_FqO%Xpr+}K5>S|2gGS4q%KD@`Kqf}c?Q2;EA4!Jlxg z{)gw>+kgYZoO9;R%t_vZ&t9bLK}$SKI^xTfm{=8CEI`)pV6h%{ege@-SJoE81NQ>W zE0(}J%!9KZUiXC?Kndb27zw2?=6Ow1UVqP50Rqm6K7 zg1(1bL5@Uemu82fF~|Ez?&KFR{?F6pj#eeY0%JRZppaZh*Nv&T{&KobwFh|&`4>Ms z1g2MVVtU-tskAq8>by;_+c?q8QriSSL* data_length ? data_length : transfer_length; + + vk.transfer_buf.data[0 .. copy_length] = data[copied .. copy_length]; + + auto fn = delegate() + { + VkBufferCopy copy = { + srcOffset: 0, + dstOffset: copied, + size: copy_length, + }; + + vkCmdCopyBuffer(vk.imm_cmd, vk.transfer_buf.buffer, buf.buffer, 1, ©); + }; + + ImmSubmit(vk, fn); + + copied += copy_length; + } +} + +void +Transfer(Vulkan* vk, Image* image, u8[] data, u32 w, u32 h) +{ + u64 copied = 0; + while(copied != data.length) + { + u64 transfer_length = cast(u64)vk.transfer_buf.data.length; + u64 data_length = cast(u64)data.length - copied; + u64 copy_length = transfer_length > data_length ? data_length : transfer_length; + + vk.transfer_buf.data[0 .. copy_length] = data[copied .. copy_length]; + + auto fn = delegate() + { + VkBufferImageCopy copy = { + bufferRowLength: w, + bufferImageHeight: h, + imageSubresource: { + aspectMask: VK_IMAGE_ASPECT_COLOR_BIT, + layerCount: 1, + }, + imageExtent: { + width: w, + height: h, + depth: 1, + }, + bufferOffset: copied, + }; + + Transition(vk.imm_cmd, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + + vkCmdCopyBufferToImage(vk.imm_cmd, vk.transfer_buf.buffer, image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); + + Transition(vk.imm_cmd, image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + }; + + ImmSubmit(vk, fn); + + copied += copy_length; + } +} + pragma(inline): void Copy(VkCommandBuffer cmd, VkImage src, VkImage dst, VkExtent2D src_ext, VkExtent2D dst_ext) { @@ -532,8 +783,8 @@ Transition(VkCommandBuffer cmd, VkImage image, VkImageLayout current_layout, VkI pragma(inline): void Transition(VkCommandBuffer cmd, ImageView* view, VkImageLayout new_layout) { - Transition(cmd, view.base.image, view.base.layout, new_layout); - view.base.layout = new_layout; + Transition(cmd, view.image, view.layout, new_layout); + view.layout = new_layout; } pragma(inline): void @@ -606,8 +857,8 @@ CreateGraphicsPipeline(Vulkan* vk, GfxPipelineInfo* build_info) VkPipelineRenderingCreateInfo rendering_info = { sType: VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO, colorAttachmentCount: 1, - pColorAttachmentFormats: &vk.draw_image.base.format, - depthAttachmentFormat: vk.depth_image.base.format, + pColorAttachmentFormats: &vk.draw_image.format, + depthAttachmentFormat: vk.depth_image.format, }; VkPipelineColorBlendAttachmentState blend_state = { @@ -656,8 +907,30 @@ CreateGraphicsPipeline(Vulkan* vk, GfxPipelineInfo* build_info) }, ]; - __traits(getMember, shader_info.ptr + 0, "module") = build_info.vertex_shader; - __traits(getMember, shader_info.ptr + 1, "module") = build_info.frag_shader; + u8[] vert_bytes = ap.LoadAssetData(build_info.vertex_shader); + u8[] frag_bytes = ap.LoadAssetData(build_info.frag_shader); + + scope(exit) + { + ap.UnloadAssetData(build_info.vertex_shader); + ap.UnloadAssetData(build_info.frag_shader); + } + + assert(vert_bytes && frag_bytes, "Unable to load shaders"); + + Result!(Shader) vert_module = BuildShader(vk, vert_bytes); + Result!(Shader) frag_module = BuildShader(vk, frag_bytes); + + assert(vert_module.ok && frag_module.ok, "Unable to build vulkan shaders"); + + scope(exit) + { + Destroy(vk, vert_module.value); + Destroy(vk, frag_module.value); + } + + __traits(getMember, shader_info.ptr + 0, "module") = vert_module.value; + __traits(getMember, shader_info.ptr + 1, "module") = frag_module.value; VkGraphicsPipelineCreateInfo create_info = { sType: VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, @@ -683,9 +956,8 @@ CreateGraphicsPipeline(Vulkan* vk, GfxPipelineInfo* build_info) return pipeline; } - Pipeline -CreateComputePipeline(Vulkan* vk, Shader shader) +CreateComputePipeline(Vulkan* vk, string shader) { VkComputePipelineCreateInfo info = { sType: VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, @@ -697,7 +969,15 @@ CreateComputePipeline(Vulkan* vk, Shader shader) }, }; - __traits(getMember, &info.stage, "module") = shader; + u8[] comp_bytes = ap.LoadAssetData(shader); + assert(comp_bytes != null, "Unable to load compute shader data"); + scope(exit) ap.UnloadAssetData(shader); + + Result!(Shader) comp_module = BuildShader(vk, comp_bytes); + assert(comp_module.ok, "Unable to build compute shader"); + scope(exit) Destroy(vk, comp_module.value); + + __traits(getMember, &info.stage, "module") = comp_module.value; PipelineHandle pipeline = { type: VK_PIPELINE_BIND_POINT_COMPUTE }; VkResult result = vkCreateComputePipelines(vk.device, null, 1, &info, null, &pipeline.handle); @@ -706,6 +986,31 @@ CreateComputePipeline(Vulkan* vk, Shader shader) return pipeline; } +void +SetUniform(Vulkan* vk, GlobalUniforms* globals) +{ + globals.res.x = vk.swapchain_extent.width; + globals.res.y = vk.swapchain_extent.height; + + vk.global_buf.data[0] = *globals; + + VkDescriptorBufferInfo buffer_info = { + buffer: vk.global_buf.buffer, + range: VK_WHOLE_SIZE, + }; + + VkWriteDescriptorSet write = { + sType: VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + dstSet: vk.desc_sets[DT.Shared], + dstBinding: 0, + descriptorType: VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + descriptorCount: 1, + pBufferInfo: &buffer_info, + }; + + vkUpdateDescriptorSets(vk.device, 1, &write, 0, null); +} + void Destroy(Vulkan* vk, Shader shader) { @@ -757,12 +1062,28 @@ Destroy(Vulkan* vk) case SI.Descriptors: Destroy(vk.desc_pool, vk.desc_layouts, vk.pipeline_layout, vk.nearest_sampler, vk.device); break; + case SI.Buffers: + Destroy(vk, &vk.transfer_buf); + break; default: break; } } } +void +Destroy(T)(Vulkan* vk, MappedBuffer!(T)* buf) +{ + vmaUnmapMemory(vk.vma, buf.alloc); + Destroy(vk, &buf.base); +} + +void +Destroy(Vulkan* vk, Buffer* buf) +{ + vmaDestroyBuffer(vk.vma, buf.buffer, buf.alloc); +} + bool InitDescriptors(Vulkan* vk) { @@ -824,7 +1145,6 @@ InitDescriptors(Vulkan* vk) VkDescriptorType[DT.max] type_lookup = [ DT.SampledImage: VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, DT.Material: VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - DT.Mesh: VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, ]; VkDescriptorBindingFlags bindless_flag = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT | VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT; @@ -1145,14 +1465,14 @@ CreateDrawImages(Vulkan* vk) format: draw_format, }; - VkResult result = vmaCreateImage(vk.vma, &image_info, &alloc_info, &vk.draw_image.base.image, &vk.draw_image.base.alloc, null); + VkResult result = vmaCreateImage(vk.vma, &image_info, &alloc_info, &vk.draw_image.image, &vk.draw_image.alloc, null); success = VkCheck("vmaCreateImage failure", result); if (success) { VkImageViewCreateInfo view_info = { sType: VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - image: vk.draw_image.base.image, + image: vk.draw_image.image, format: draw_format, viewType: VK_IMAGE_VIEW_TYPE_2D, subresourceRange: { @@ -1182,7 +1502,7 @@ CreateDrawImages(Vulkan* vk) extent: vk.swapchain_extent, }; - result = vmaCreateImage(vk.vma, &depth_image_info, &alloc_info, &vk.depth_image.base.image, &vk.depth_image.base.alloc, null); + result = vmaCreateImage(vk.vma, &depth_image_info, &alloc_info, &vk.depth_image.image, &vk.depth_image.alloc, null); success = VkCheck("vmaCreateImage failure", result); } @@ -1190,7 +1510,7 @@ CreateDrawImages(Vulkan* vk) { VkImageViewCreateInfo depth_view_info = { sType: VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - image: vk.depth_image.base.image, + image: vk.depth_image.image, viewType: VK_IMAGE_VIEW_TYPE_2D, format: depth_format, subresourceRange: { @@ -1206,10 +1526,10 @@ CreateDrawImages(Vulkan* vk) success = VkCheck("vmaCreateImageView failure", result); } - vk.draw_image.base.format = draw_format; - vk.draw_image.base.layout = VK_IMAGE_LAYOUT_UNDEFINED; - vk.depth_image.base.format = depth_format; - vk.depth_image.base.layout = VK_IMAGE_LAYOUT_UNDEFINED; + vk.draw_image.format = draw_format; + vk.draw_image.layout = VK_IMAGE_LAYOUT_UNDEFINED; + vk.depth_image.format = depth_format; + vk.depth_image.layout = VK_IMAGE_LAYOUT_UNDEFINED; return success; } @@ -1310,7 +1630,7 @@ CreateSwapchain(Vulkan* vk) foreach(i, image; vk.present_images) { - vk.present_images[i].base.image = images[i]; + vk.present_images[i].image = images[i]; view_info.image = images[i]; view_info.format = vk.surface_format.format; @@ -1771,9 +2091,9 @@ Destroy(ImageView* view, VkDevice device, VmaAllocator vma) vkDestroyImageView(device, view.view, null); } - if (view.base.image) + if (view.image) { - vmaDestroyImage(vma, view.base.image, view.base.alloc); + vmaDestroyImage(vma, view.image, view.alloc); } } diff --git a/src/generated/assets_codegen.d b/src/generated/assets_codegen.d index ac1a0c0..5469113 100644 --- a/src/generated/assets_codegen.d +++ b/src/generated/assets_codegen.d @@ -26,19 +26,25 @@ static immutable u64[] MODEL_HASHES = [ ]; static immutable string[] SHADER_FILES = [ + "shaders/gui.frag.spv", "shaders/triangle.vert.spv", + "shaders/gui.vert.spv", "shaders/gradient.comp.spv", "shaders/triangle.frag.spv", ]; static immutable string[] SHADER_NAMES = [ + "shaders/gui.frag", "shaders/triangle.vert", + "shaders/gui.vert", "shaders/gradient.comp", "shaders/triangle.frag", ]; static immutable u64[] SHADER_HASHES = [ + 15780387719315455808, 8769314645675479020, + 14797956403837654625, 16130483095684998267, 6282520872716708711, ]; diff --git a/src/shaders/gui.frag.glsl b/src/shaders/gui.frag.glsl new file mode 100644 index 0000000..500f07f --- /dev/null +++ b/src/shaders/gui.frag.glsl @@ -0,0 +1,18 @@ +#version 460 + +#extension GL_EXT_buffer_reference : require +#extension GL_GOOGLE_include_directive : require +#extension GL_EXT_nonuniform_qualifier : require + +#include "structures.layout" + +layout (location = 0) in vec4 in_color; +layout (location = 1) in vec2 in_uv; +layout (location = 2) flat in uint in_image; + +layout (location = 0) out vec4 out_frag_col; + +void main() +{ + out_frag_col = in_color; +} diff --git a/src/shaders/gui.vert.glsl b/src/shaders/gui.vert.glsl new file mode 100644 index 0000000..6e4c839 --- /dev/null +++ b/src/shaders/gui.vert.glsl @@ -0,0 +1,46 @@ +#version 460 + +#extension GL_EXT_buffer_reference : require +#extension GL_GOOGLE_include_directive : require +#extension GL_EXT_nonuniform_qualifier : require + +#include "structures.layout" + +layout (location = 0) in vec2 in_gui_pos_0; +layout (location = 1) in vec2 in_gui_pos_1; +layout (location = 2) in vec4 in_col; +layout (location = 3) in uint in_image; + +layout (location = 0) out vec4 out_color; +layout (location = 1) out vec2 out_uv; +layout (location = 2) out uint out_image; + +vec2 uvs[] = { + vec2(0.0, 1.0), + vec2(0.0, 0.0), + vec2(1.0, 1.0), + vec2(1.0, 0.0) +}; + +vec2 rotate(vec2 coords, float theta) +{ + return mat2(cos(theta), sin(theta), -sin(theta), cos(theta)) * coords; +} + +void main() +{ + // Draw with 6 indices, gl_VertexIndex will use the appropriate index, iterates through 0-3 and not 0-5 + vec2 dst_pos = gl_VertexIndex == 0 ? vec2(in_gui_pos_0.x, in_gui_pos_1.y) : + gl_VertexIndex == 1 ? vec2(in_gui_pos_0.x, in_gui_pos_0.y) : + gl_VertexIndex == 2 ? vec2(in_gui_pos_1.x, in_gui_pos_1.y) : + gl_VertexIndex == 3 ? vec2(in_gui_pos_1.x, in_gui_pos_0.y) : vec2(0.0, 0.0); + + out_uv = uvs[gl_VertexIndex]; + out_color = in_col; + out_image = in_image; + + gl_Position = vec4(2 * dst_pos.x / G.res.x - 1, + 2 * dst_pos.y / G.res.y - 1, + 0, + 1); +} diff --git a/src/shaders/structures.layout b/src/shaders/structures.layout index f6788dc..99c5f96 100644 --- a/src/shaders/structures.layout +++ b/src/shaders/structures.layout @@ -1,11 +1,3 @@ -struct Vertex { - vec4 pos; -}; - -layout (buffer_reference, std430) readonly buffer VertexBuffer { - Vertex vertices[]; -}; - layout (set = 0, binding = 0) uniform GlobalUniforms { vec2 res; } G; @@ -24,10 +16,6 @@ layout (set = 2, binding = 0) uniform Material { float placeholder; } Materials[]; -layout (set = 3, binding = 0) uniform Mesh { - VertexBuffer buf; -} Meshes[]; - layout (push_constant) uniform Constants { float placeholder; } PC; diff --git a/src/shared/assets.d b/src/shared/assets.d index 3fd53da..8225d08 100644 --- a/src/shared/assets.d +++ b/src/shared/assets.d @@ -41,6 +41,12 @@ struct ModelMeta u64 index_count; } +struct TexData +{ + void* data; + TexMeta meta; +} + struct TexMeta { u32 w; @@ -146,3 +152,5 @@ UnloadAssetData(string name) } } + + diff --git a/src/shared/util.d b/src/shared/util.d index a773084..45cd275 100644 --- a/src/shared/util.d +++ b/src/shared/util.d @@ -4,6 +4,7 @@ import includes; import std.stdio; import core.stdc.string : memset; import a = alloc; +import core.simd; void Logf(Args...)(string fmt, Args args) @@ -313,3 +314,45 @@ Hash(string str) { return xxh3_64bits_withSeed(str.ptr, str.length, HASH_SEED); } + +struct Matrix(T, int S) +{ + T[S][S] m; + alias m this; +} + +alias Mat2 = Matrix!(f32, 2); +alias Mat3 = Matrix!(f32, 3); +alias Mat4 = Matrix!(f32, 4); + +struct Vector(T, int S) +{ + union + { + struct + { + T r = 0.0; + T g = 0.0; + static if (S > 2) + T b = 0.0; + static if (S > 3) + T a = 0.0; + }; + struct + { + T x; + T y; + static if (S > 2) + T z; + static if (S > 3) + T w; + }; + static if (S == 4) + T[S] v; + float4 simd; + } +} + +alias Vec2 = Vector!(f32, 2); +alias Vec3 = Vector!(f32, 3); +alias Vec4 = Vector!(f32, 4);