From d840a81448845526b27b08bcd5c0e5d6aef4f9e8 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Thu, 30 Apr 2026 23:15:43 +0200 Subject: [PATCH] bugfixes --- examples/VulkanTriangle/project.cpp | 29 +++++++++++++++++ examples/VulkanTriangle/project.json | 32 ------------------- implementations/Crafter.Graphics-Mesh.cpp | 2 +- .../Crafter.Graphics-RenderingElement3D.cpp | 16 ++++++++-- .../Crafter.Graphics-RenderingElement3D.cppm | 2 +- 5 files changed, 45 insertions(+), 36 deletions(-) create mode 100644 examples/VulkanTriangle/project.cpp delete mode 100644 examples/VulkanTriangle/project.json diff --git a/examples/VulkanTriangle/project.cpp b/examples/VulkanTriangle/project.cpp new file mode 100644 index 0000000..826719b --- /dev/null +++ b/examples/VulkanTriangle/project.cpp @@ -0,0 +1,29 @@ +import std; +import Crafter.Build; +namespace fs = std::filesystem; +using namespace Crafter; + +extern "C" Configuration CrafterBuildProject(std::span args) { + std::vector graphicsArgs(args.begin(), args.end()); + graphicsArgs.push_back("--vulkan"); + Configuration* graphics = LocalProject({ + .projectFile = "../../project.cpp", + .args = graphicsArgs, + }); + + Configuration cfg; + cfg.path = "./"; + cfg.name = "VulkanTriangle"; + cfg.outputName = "VulkanTriangle"; + ApplyStandardArgs(cfg, args); + cfg.dependencies = { graphics }; + + std::array ifaces = {}; + std::array impls = { "main" }; + cfg.GetInterfacesAndImplementations(ifaces, impls); + + cfg.shaders.emplace_back(fs::path("raygen.glsl"), std::string("main"), ShaderType::RayGen); + cfg.shaders.emplace_back(fs::path("closesthit.glsl"), std::string("main"), ShaderType::ClosestHit); + cfg.shaders.emplace_back(fs::path("miss.glsl"), std::string("main"), ShaderType::Miss); + return cfg; +} diff --git a/examples/VulkanTriangle/project.json b/examples/VulkanTriangle/project.json deleted file mode 100644 index dd9d5a1..0000000 --- a/examples/VulkanTriangle/project.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "crafter-graphics", - "configurations": [ - { - "name": "executable", - "implementations": ["main"], - "dependencies": [ - { - "path":"../../project.json", - "configuration":"lib-wayland-vulkan-debug" - } - ], - "shaders": [ - { - "path":"raygen.glsl", - "type": 6, - "entrypoint":"main" - }, - { - "path":"closesthit.glsl", - "type": 9, - "entrypoint":"main" - }, - { - "path":"miss.glsl", - "type": 10, - "entrypoint":"main" - } - ] - } - ] -} diff --git a/implementations/Crafter.Graphics-Mesh.cpp b/implementations/Crafter.Graphics-Mesh.cpp index dfaf8f4..5db44be 100644 --- a/implementations/Crafter.Graphics-Mesh.cpp +++ b/implementations/Crafter.Graphics-Mesh.cpp @@ -40,7 +40,7 @@ void Mesh::Build(std::span> verticies, std::span RenderingElement3D::elements; void RenderingElement3D::BuildTLAS(VkCommandBuffer cmd, std::uint32_t index) { + { + VkMemoryBarrier asBarrier { + .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, + .srcAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, + .dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR + }; + vkCmdPipelineBarrier(cmd, + VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, + VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, + 0, 1, &asBarrier, 0, nullptr, 0, nullptr); + } + tlases[index].instanceBuffer.Resize(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, elements.size()); for(std::uint32_t i = 0; i < elements.size(); i++) { @@ -77,8 +89,8 @@ void RenderingElement3D::BuildTLAS(VkCommandBuffer cmd, std::uint32_t index) { &tlasBuildSizes ); - scratchBuffer.Resize(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tlasBuildSizes.buildScratchSize); - tlasBuildGeometryInfo.scratchData.deviceAddress = scratchBuffer.address; + tlases[index].scratchBuffer.Resize(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tlasBuildSizes.buildScratchSize); + tlasBuildGeometryInfo.scratchData.deviceAddress = tlases[index].scratchBuffer.address; tlases[index].buffer.Resize(VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tlasBuildSizes.accelerationStructureSize); diff --git a/interfaces/Crafter.Graphics-RenderingElement3D.cppm b/interfaces/Crafter.Graphics-RenderingElement3D.cppm index 9a6a031..2b1814a 100644 --- a/interfaces/Crafter.Graphics-RenderingElement3D.cppm +++ b/interfaces/Crafter.Graphics-RenderingElement3D.cppm @@ -35,13 +35,13 @@ export namespace Crafter { VulkanBuffer buffer; VkAccelerationStructureKHR accelerationStructure; VulkanBuffer instanceBuffer; + VulkanBuffer scratchBuffer; }; class RenderingElement3D { public: VkAccelerationStructureInstanceKHR instance; static std::vector elements; - inline static VulkanBuffer scratchBuffer; inline static TlasWithBuffer tlases[Window::numFrames]; static void BuildTLAS(VkCommandBuffer cmd, std::uint32_t index); };