From 27ba32cdf5efd987640339355ee546aec26bb315 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Sat, 26 Apr 2025 20:49:56 +0200 Subject: [PATCH] working mesh shader --- Crafter.Graphics-VulkanElement.cpp | 15 ++++ Crafter.Graphics-VulkanElement.cppm | 31 +++++++ Crafter.Graphics-VulkanPipeline.cppm | 98 +++++++++++++++++++--- Crafter.Graphics-VulkanShader.cppm | 24 ++++-- Crafter.Graphics-WindowWaylandVulkan.cpp | 14 ++-- Crafter.Graphics-WindowWaylandVulkan.cppm | 2 + Crafter.Graphics.cppm | 3 +- main.cpp | 14 +++- project.json | 4 +- test.spirv | Bin 3016 -> 0 bytes test2.spirv | Bin 516 -> 0 bytes 11 files changed, 175 insertions(+), 30 deletions(-) create mode 100644 Crafter.Graphics-VulkanElement.cpp create mode 100644 Crafter.Graphics-VulkanElement.cppm delete mode 100644 test.spirv delete mode 100644 test2.spirv diff --git a/Crafter.Graphics-VulkanElement.cpp b/Crafter.Graphics-VulkanElement.cpp new file mode 100644 index 0000000..a873b91 --- /dev/null +++ b/Crafter.Graphics-VulkanElement.cpp @@ -0,0 +1,15 @@ +module; + +#include +#include + +module Crafter.Graphics; +using namespace Crafter; + +VulkanElement::VulkanElement(VkPipelineLayout pipelineLayout, VkDescriptorSet* descriptorSet, VkPipeline pipeline) : pipelineLayout(pipelineLayout), descriptorSet(descriptorSet), pipeline(pipeline) { + +} + +VulkanElement::VulkanElement(VkPipelineLayout pipelineLayout, VkDescriptorSet* descriptorSet, VkPipeline pipeline, std::uint32_t sizeX, std::uint32_t sizeY, std::uint32_t sizeZ) : pipelineLayout(pipelineLayout), descriptorSet(descriptorSet), pipeline(pipeline), sizeX(sizeX), sizeY(sizeY), sizeZ(sizeZ) { + +} \ No newline at end of file diff --git a/Crafter.Graphics-VulkanElement.cppm b/Crafter.Graphics-VulkanElement.cppm new file mode 100644 index 0000000..e561d5e --- /dev/null +++ b/Crafter.Graphics-VulkanElement.cppm @@ -0,0 +1,31 @@ +module; + +#include +#include + +export module Crafter.Graphics:VulkanElement; +import Crafter.Component; + +namespace Crafter { + export class VulkanElement : public Component { + public: + VkPipelineLayout pipelineLayout; + VkDescriptorSet* descriptorSet; + VkPipeline pipeline; + std::uint32_t sizeX; + std::uint32_t sizeY; + std::uint32_t sizeZ; + VulkanElement(VkPipelineLayout pipelineLayout, VkDescriptorSet* descriptorSet, VkPipeline pipeline); + VulkanElement(VkPipelineLayout pipelineLayout, VkDescriptorSet* descriptorSet, VkPipeline pipeline, std::uint32_t sizeX, std::uint32_t sizeY, std::uint32_t sizeZ); + + template + static VulkanElement FromPipeline() { + return VulkanElement(Pipeline::pipelineLayout, &Pipeline::descriptorSet, Pipeline::pipeline); + } + + template + static VulkanElement FromPipeline(std::uint32_t sizeX, std::uint32_t sizeY, std::uint32_t sizeZ) { + return VulkanElement(Pipeline::pipelineLayout, &Pipeline::descriptorSet, Pipeline::pipeline, sizeX, sizeY, sizeZ); + } + }; +} diff --git a/Crafter.Graphics-VulkanPipeline.cppm b/Crafter.Graphics-VulkanPipeline.cppm index 047bef0..5076506 100644 --- a/Crafter.Graphics-VulkanPipeline.cppm +++ b/Crafter.Graphics-VulkanPipeline.cppm @@ -13,6 +13,7 @@ module; #include #include "VulkanBuffer.h" #include "camera.hpp" +#include export module Crafter.Graphics:VulkanPipeline; import :VulkanDevice; @@ -20,8 +21,88 @@ import :VulkanShader; import :WindowWaylandVulkan; namespace Crafter { + struct DescriptorEntry { + VkDescriptorType type; + std::uint32_t occurrences = 0; + }; + export template class VulkanPipeline { + private: + constexpr static std::uint32_t totalDescriptorCount = MeshShader::descriptorCount+FragmentShader::descriptorCount; + consteval static std::uint32_t GetUniqueDiscriptorCount() { + DescriptorEntry types[] = {{VK_DESCRIPTOR_TYPE_SAMPLER, 0},{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0},{VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 0},{VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 0},{VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 0},{VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0},{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0},{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 0},{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 0},{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 0},{VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 0},{VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK, 0},{VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 0},{VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, 0},{VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM, 0},{VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM, 0},{VK_DESCRIPTOR_TYPE_MUTABLE_EXT, 0},{VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV, 0},{VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, 0},{VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, 0}}; + + for(const DescriptorBinding& binding : MeshShader::descriptors) { + for(DescriptorEntry& type : types) { + if(type.type == binding.type) { + type.occurrences++; + } + } + } + + for(const DescriptorBinding& binding : FragmentShader::descriptors) { + for(DescriptorEntry& type : types) { + if(type.type == binding.type) { + type.occurrences++; + } + } + } + + std::uint32_t size = 0; + for(DescriptorEntry& type : types) { + size+=type.occurrences; + } + + return size; + } + constexpr static std::uint32_t uniqueDescriptorCount = GetUniqueDiscriptorCount(); + consteval static std::array GetPoolSizes() { + std::array types = {}; + std::uint32_t i = 0; + + for(const DescriptorBinding& binding : MeshShader::descriptors) { + for(VkDescriptorPoolSize& type : types) { + if(type.type == binding.type) { + type.descriptorCount++; + goto next; + } + } + types[i].type = binding.type; + types[i].descriptorCount = 1; + next:; + } + + for(const DescriptorBinding& binding : FragmentShader::descriptors) { + for(VkDescriptorPoolSize& type : types) { + if(type.type == binding.type) { + type.descriptorCount++; + goto next2; + } + } + types[i].type = binding.type; + types[i].descriptorCount = 1; + next2:; + } + + return types; + } + consteval static std::array GetDescriptorSet() { + std::array set; + + std::uint32_t i = 0; + for(const DescriptorBinding& binding : MeshShader::descriptors) { + set[i] = {binding.slot, binding.type, 1, VK_SHADER_STAGE_MESH_BIT_EXT, nullptr}; + i++; + } + + for(const DescriptorBinding& binding : FragmentShader::descriptors) { + set[i] = {binding.slot, binding.type, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}; + i++; + } + + return set; + } public: inline static VkPipeline pipeline; inline static VkPipelineLayout pipelineLayout; @@ -51,34 +132,31 @@ namespace Crafter { memcpy(uniformBuffer.mapped, &uniformData, sizeof(UniformData)); // Pool - std::vector poolSizes = { - vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1), - }; - VkDescriptorPoolCreateInfo descriptorPoolInfo = vks::initializers::descriptorPoolCreateInfo(static_cast(poolSizes.size()), poolSizes.data(), 1); + std::array poolSizes = GetPoolSizes(); + VkDescriptorPoolCreateInfo descriptorPoolInfo = vks::initializers::descriptorPoolCreateInfo(uniqueDescriptorCount, poolSizes.data(), 1); VulkanDevice::CHECK_VK_RESULT(vkCreateDescriptorPool(VulkanDevice::device, &descriptorPoolInfo, nullptr, &descriptorPool)); // Layout - std::vector setLayoutBindings = { - vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_MESH_BIT_EXT, 0), - }; - VkDescriptorSetLayoutCreateInfo descriptorLayoutInfo = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings); + constexpr std::array setLayoutBindings = GetDescriptorSet(); + VkDescriptorSetLayoutCreateInfo descriptorLayoutInfo = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings.data(), totalDescriptorCount); VulkanDevice::CHECK_VK_RESULT(vkCreateDescriptorSetLayout(VulkanDevice::device, &descriptorLayoutInfo, nullptr, &descriptorSetLayout)); // Set VkDescriptorSetAllocateInfo allocInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayout, 1); VulkanDevice::CHECK_VK_RESULT(vkAllocateDescriptorSets(VulkanDevice::device, &allocInfo, &descriptorSet)); + std::vector modelWriteDescriptorSets = { vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffer.descriptor), }; - vkUpdateDescriptorSets(VulkanDevice::device, static_cast(modelWriteDescriptorSets.size()), modelWriteDescriptorSets.data(), 0, nullptr); + // Layout VkPipelineLayoutCreateInfo pipelineLayoutInfo = vks::initializers::pipelineLayoutCreateInfo(&descriptorSetLayout, 1); VulkanDevice::CHECK_VK_RESULT(vkCreatePipelineLayout(VulkanDevice::device, &pipelineLayoutInfo, nullptr, &pipelineLayout)); // Pipeline VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = vks::initializers::pipelineInputAssemblyStateCreateInfo(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE); - VkPipelineRasterizationStateCreateInfo rasterizationState = vks::initializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_CLOCKWISE, 0); + VkPipelineRasterizationStateCreateInfo rasterizationState = vks::initializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_COUNTER_CLOCKWISE, 0); VkPipelineColorBlendAttachmentState blendAttachmentState = vks::initializers::pipelineColorBlendAttachmentState(0xf, VK_FALSE); VkPipelineColorBlendStateCreateInfo colorBlendState = vks::initializers::pipelineColorBlendStateCreateInfo(1, &blendAttachmentState); VkPipelineDepthStencilStateCreateInfo depthStencilState = vks::initializers::pipelineDepthStencilStateCreateInfo(VK_TRUE, VK_TRUE, VK_COMPARE_OP_LESS_OR_EQUAL); diff --git a/Crafter.Graphics-VulkanShader.cppm b/Crafter.Graphics-VulkanShader.cppm index e13fec1..7aa5724 100644 --- a/Crafter.Graphics-VulkanShader.cppm +++ b/Crafter.Graphics-VulkanShader.cppm @@ -6,6 +6,7 @@ module; #include #include #include +#include export module Crafter.Graphics:VulkanShader; import :VulkanDevice; @@ -20,13 +21,26 @@ namespace Crafter { char value[N]; }; - export template + export struct DescriptorBinding { + VkDescriptorType type; + std::uint32_t slot; + }; + + export template < + StringLiteral path, + StringLiteral entrypoint, + VkShaderStageFlagBits stage, + std::uint32_t DescriptorCount, + std::array Descriptors + > class VulkanShader { public: - inline static VkShaderModule shader; - constexpr static StringLiteral _entrypoint = entrypoint; - constexpr static VkShaderStageFlagBits _stage = stage; - static void CreateShader() { + inline static VkShaderModule shader; + constexpr static std::uint32_t descriptorCount = DescriptorCount; + constexpr static std::array descriptors = Descriptors; + constexpr static StringLiteral _entrypoint = entrypoint; + constexpr static VkShaderStageFlagBits _stage = stage; + static void CreateShader() { std::ifstream file(path.value, std::ios::binary); if (!file) { std::cerr << "Error: Could not open file " << path.value << std::endl; diff --git a/Crafter.Graphics-WindowWaylandVulkan.cpp b/Crafter.Graphics-WindowWaylandVulkan.cpp index 5ad9378..b9b3a07 100644 --- a/Crafter.Graphics-WindowWaylandVulkan.cpp +++ b/Crafter.Graphics-WindowWaylandVulkan.cpp @@ -418,14 +418,12 @@ void WindowWaylandVulkan::Start() { VkRect2D scissor = vks::initializers::rect2D(width, height, 0, 0); vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); - vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, VulkanPipeline, VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT>>::pipelineLayout, 0, 1, &VulkanPipeline, VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT>>::descriptorSet, 0, NULL); - - vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, VulkanPipeline, VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT>>::pipeline); - - // Use mesh and task shader to draw the scene - VulkanDevice::vkCmdDrawMeshTasksEXTProc(drawCmdBuffers[i], 3, 1, 1); - - VulkanDevice::vkCmdEndRenderingKHRProc(drawCmdBuffers[i]); + for(VulkanElement* element : vulkanElements.components) { + vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, element->pipelineLayout, 0, 1, element->descriptorSet, 0, NULL); + vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, element->pipeline); + VulkanDevice::vkCmdDrawMeshTasksEXTProc(drawCmdBuffers[i], element->sizeX, element->sizeY, element->sizeZ); + VulkanDevice::vkCmdEndRenderingKHRProc(drawCmdBuffers[i]); + } image_layout_transition(drawCmdBuffers[i], images[i], diff --git a/Crafter.Graphics-WindowWaylandVulkan.cppm b/Crafter.Graphics-WindowWaylandVulkan.cppm index 52c4736..fffd388 100644 --- a/Crafter.Graphics-WindowWaylandVulkan.cppm +++ b/Crafter.Graphics-WindowWaylandVulkan.cppm @@ -10,6 +10,7 @@ module; export module Crafter.Graphics:WindowWaylandVulkan; import Crafter.Event; import :WindowWayland; +import :VulkanElement; import Crafter.Component; namespace Crafter { @@ -28,6 +29,7 @@ namespace Crafter { export class WindowWaylandVulkan : public WindowWayland { public: + ComponentRefVector vulkanElements; WindowWaylandVulkan(std::string name, std::uint32_t width, std::uint32_t height); ~WindowWaylandVulkan(); void Start(); diff --git a/Crafter.Graphics.cppm b/Crafter.Graphics.cppm index a51ec86..aaa5758 100644 --- a/Crafter.Graphics.cppm +++ b/Crafter.Graphics.cppm @@ -8,4 +8,5 @@ export import :UiElement; export import :Types; export import :VulkanDevice; export import :VulkanPipeline; -export import :VulkanShader; \ No newline at end of file +export import :VulkanShader; +export import :VulkanElement; \ No newline at end of file diff --git a/main.cpp b/main.cpp index 40515a5..f64750f 100644 --- a/main.cpp +++ b/main.cpp @@ -5,6 +5,10 @@ import Crafter.Graphics; using namespace Crafter; +typedef VulkanShader<"test.spirv", "main", VK_SHADER_STAGE_MESH_BIT_EXT, 1, {{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0}}> MeshShader; +typedef VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT, 0, {}> FragmentShader; +typedef VulkanPipeline, VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT, 0, {}>> Pipeline; + int main() { // WindowWaylandWayland window("test", 128, 128); // UiElement test( @@ -28,10 +32,12 @@ int main() { // } VulkanDevice::CreateDevice(); - WindowWaylandVulkan window("bruh", 128, 128); - VulkanShader<"test.spirv", "main", VK_SHADER_STAGE_MESH_BIT_EXT>::CreateShader(); - VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT>::CreateShader(); - VulkanPipeline, VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT>>::CreatePipeline(); + WindowWaylandVulkan window("Crafter.Graphics", 128, 128); + MeshShader::CreateShader(); + FragmentShader::CreateShader(); + Pipeline::CreatePipeline(); + VulkanElement test = VulkanElement::FromPipeline(3, 1, 1); + window.vulkanElements.AddComponent(&test); window.Start(); while(true) { diff --git a/project.json b/project.json index 0aff66f..9045a7e 100644 --- a/project.json +++ b/project.json @@ -4,9 +4,9 @@ { "name": "base", "standard": "c++26", - "source_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics-UiElement", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-WindowWaylandVulkan", "VulkanBuffer", "VulkanTools"], + "source_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics-UiElement", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-WindowWaylandVulkan", "VulkanBuffer", "VulkanTools", "Crafter.Graphics-VulkanElement"], "c_files": ["wayland-xdg-decoration-unstable-v1-client-protocol", "xdg-shell-protocol", "shm"], - "module_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics", "Crafter.Graphics-UiElement", "Crafter.Graphics-Types", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-VulkanPipeline", "Crafter.Graphics-VulkanShader", "Crafter.Graphics-WindowWaylandVulkan"], + "module_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics", "Crafter.Graphics-UiElement", "Crafter.Graphics-Types", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-VulkanPipeline", "Crafter.Graphics-VulkanShader", "Crafter.Graphics-WindowWaylandVulkan", "Crafter.Graphics-VulkanElement"], "build_dir": "./build", "output_dir": "./bin", "type":"library", diff --git a/test.spirv b/test.spirv deleted file mode 100644 index d9dcb786c3ec88981e584ba31655131273f45533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3016 zcmZQ(Qf6mhVPxQD;9y8#fB-=TCWgf#3=CWhYz)BxVezgJA@RAX#ToI%8Hp*WMGV{w zYz&MH3=Hl*!9IG$B`JC)rUoFLd<@JW3M|LZz{BuWgn@yDfq@}6F*6S&!Og(HAj-hN zpvb_$V9db4;KRVc5X!*75XQj3Ai%%|Rx8NB0M-vOAA|)MSis^^3=Ck?Vf<+#5Oo3! z%wYLVA|QEY1||juhC_@Xd)XM=eK4HPzzQ`F<|bAKW(E!h28PVc6b4oX4hE1L({ti| z@{<#DJoC!(lM_oa^Yc7iK<)?W6=q;y$WKcvPAy>os|WcfJty8hCqD^81ITPSkpIgH z7(i@!kbj;08Q2)u7(i^0nFU4pS*gh&I~W+)7+AsLAb;oPr=;dEAjClaD$7hQ2k8Ns z1q#E`qR=7rlfb9Xvf%K&3#0TUTXM!zagX#g< z0~XKBD+$i5N(HHd$${)k&xv==$t-ZmEG|jROHO5g$$?@SBv+b~1D6B20~DuFcYqv` znVeb-as~q{0~>=UD4xMC^DiwaC@q25#R?V&v6J(2@{1TiVaf(h7iDN_SsA#%X$9oo zqRiaPlFYKykfO}Qy!4z@&%6{QyEwq<2}>O2rKDCcxHGVT;}{gr(x5cVzyeN_AifNk z&kT+OkpDdxSio$M`&bzm7(Afy1LCuT(=4i(GDrff4x$efzR3DOd~|&vF_1n7Bz+*e zk@bQ2==wlnAbkyBH?x5A6evxAoB;A8h^++TfaRINX#}JPFFKwuKJV@s8Le+!J6Juaz5CGf5zyLBER33r&AipXw zurLTQFo5j`iG$1n$%#PCg4qQs6Oiqaf|gw%^&mSy=?)|>!N9@*N^>ByVCI9u1>`r7 zxEwUSf!Ht%aswzVKw$$aLqK+d_@MX(iGjik6z?E0kR2d9L3~hJ0XY+-Uxk4I9L^v! zVe;xwF&JMP8YVIfEDZY4v<`B&90MCTErHw&@;gWlghA>I85qEFApe5wF@pLVBo1;X zhz}|wK+lhdBcS11Nk!>OeF|9%QyP)NGI%m|8mq z1_qEikQ$g;m>j482Z@6)Oim7(c0p!<-0#J}08Yy=_j^O_0EvU#58{K;H^}`kbA6%i zLpB#C=MR;G*#}YslM7^EU;yz!av%(1gWM3zzyMCqps)t{GX&}ekT}Q3El)fUMajC<=1~w~_fq?;(-a%%9Niw?OqPj1S5Spt1zScVu8?0Qr>I)Qdse z9LVa$85kHq;sp#W;Jhxu0LtqO3<1zI2P%s|aRS01IS>sp8{{^S+cdbFo48iYBZo~KzR+OMw5Yo0VF<&ffZa9XfZG_fb@aHVfu8S z`apRSrcalFfdM2A)2GM4zyQ(<5(l{z6mB3fn0gZi1_qEAh!0Bd7U1%hfuWIs6&$~o z&^QH&PlSqDF)%QI^nv6Y8Q2&=dCmsfb_4kngh6(J#6W66W`q1~i)NQSnq8o}4wQC4 z;xM}$85kHq`ap6pyPTkQf&2}#3nT_n3n@FD(d=?Xv&)TvfdQ08LE9#( zFuOdUc7fssW*0~dq!y;e587r0$%8P+?;tTynun#9~V8Ou1000Hc<2C>Q diff --git a/test2.spirv b/test2.spirv deleted file mode 100644 index fc2aac6d1c422e625823a6c0a6055d515f68b3a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmZQ(Qf6mhVPxQD;9wA9fB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N^4QPD;dCSF$QJ^HU^_h?KuSRN{a|2XU}a!naAaU*0I3y#hCj#*Td3Ow Y!STVsV8_4=4i^yrF9Rck1p^}k0A@HKxc~qF