From 235d9b2f838223e13d698f3c1afb888e99cbd27e Mon Sep 17 00:00:00 2001 From: hydrogendeuteride Date: Thu, 30 Oct 2025 01:41:54 +0900 Subject: [PATCH] EDIT: Docs and minor bug fixed 2 --- src/compute/vk_compute.cpp | 21 ++++++++++++++------- src/core/vk_raytracing.cpp | 21 ++++++++++++++++----- src/core/vk_swapchain.cpp | 3 +++ src/render/rg_graph.cpp | 3 ++- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/compute/vk_compute.cpp b/src/compute/vk_compute.cpp index b74f077..15207c2 100644 --- a/src/compute/vk_compute.cpp +++ b/src/compute/vk_compute.cpp @@ -572,14 +572,21 @@ void ComputeManager::insertBarriers(VkCommandBuffer cmd, const ComputeDispatchIn return; } - VkDependencyInfo dependencyInfo = {}; + // Copy and sanitize buffer barriers: replace size=0 with VK_WHOLE_SIZE (VUID 01188) + std::vector fixedBufferBarriers = dispatchInfo.bufferBarriers; + for (auto &b : fixedBufferBarriers) + { + if (b.size == 0) b.size = VK_WHOLE_SIZE; + } + + VkDependencyInfo dependencyInfo{}; dependencyInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO; - dependencyInfo.memoryBarrierCount = dispatchInfo.memoryBarriers.size(); - dependencyInfo.pMemoryBarriers = dispatchInfo.memoryBarriers.data(); - dependencyInfo.bufferMemoryBarrierCount = dispatchInfo.bufferBarriers.size(); - dependencyInfo.pBufferMemoryBarriers = dispatchInfo.bufferBarriers.data(); - dependencyInfo.imageMemoryBarrierCount = dispatchInfo.imageBarriers.size(); - dependencyInfo.pImageMemoryBarriers = dispatchInfo.imageBarriers.data(); + dependencyInfo.memoryBarrierCount = static_cast(dispatchInfo.memoryBarriers.size()); + dependencyInfo.pMemoryBarriers = dispatchInfo.memoryBarriers.empty() ? nullptr : dispatchInfo.memoryBarriers.data(); + dependencyInfo.bufferMemoryBarrierCount = static_cast(fixedBufferBarriers.size()); + dependencyInfo.pBufferMemoryBarriers = fixedBufferBarriers.empty() ? nullptr : fixedBufferBarriers.data(); + dependencyInfo.imageMemoryBarrierCount = static_cast(dispatchInfo.imageBarriers.size()); + dependencyInfo.pImageMemoryBarriers = dispatchInfo.imageBarriers.empty() ? nullptr : dispatchInfo.imageBarriers.data(); vkCmdPipelineBarrier2(cmd, &dependencyInfo); } diff --git a/src/core/vk_raytracing.cpp b/src/core/vk_raytracing.cpp index 0d3e361..970e0cc 100644 --- a/src/core/vk_raytracing.cpp +++ b/src/core/vk_raytracing.cpp @@ -72,7 +72,7 @@ AccelStructureHandle RayTracingManager::getOrBuildBLAS(const std::shared_ptrsecond; } - // Build BLAS with one geometry per surface + // Build BLAS with one geometry per surface (skip empty primitives) std::vector geoms; std::vector ranges; geoms.reserve(mesh->surfaces.size()); @@ -84,6 +84,11 @@ AccelStructureHandle RayTracingManager::getOrBuildBLAS(const std::shared_ptrsurfaces) { + // Compute primitive count from index count; skip empty surfaces + const uint32_t primitiveCount = s.count / 3u; + if (primitiveCount == 0) + continue; + VkAccelerationStructureGeometryTrianglesDataKHR tri{ VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR }; @@ -103,13 +108,19 @@ AccelStructureHandle RayTracingManager::getOrBuildBLAS(const std::shared_ptr pRanges(geoms.size()); - for (size_t i = 0; i < geoms.size(); ++i) pRanges[i] = &ranges[i]; + const VkAccelerationStructureBuildRangeInfoKHR* pRange = ranges.data(); _resources->immediate_submit([&](VkCommandBuffer cmd) { - _vkCmdBuildAccelerationStructuresKHR(cmd, 1, &buildInfo, pRanges.data()); + // ppBuildRangeInfos is an array of infoCount pointers; we have 1 build info + _vkCmdBuildAccelerationStructuresKHR(cmd, 1, &buildInfo, &pRange); }); // destroy scratch diff --git a/src/core/vk_swapchain.cpp b/src/core/vk_swapchain.cpp index 8bf2ed7..d872e0c 100644 --- a/src/core/vk_swapchain.cpp +++ b/src/core/vk_swapchain.cpp @@ -35,6 +35,8 @@ void SwapchainManager::init_swapchain() drawImageUsages |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; drawImageUsages |= VK_IMAGE_USAGE_STORAGE_BIT; drawImageUsages |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + // Post-processing (tonemap) samples HDR; allow sampling. + drawImageUsages |= VK_IMAGE_USAGE_SAMPLED_BIT; VkImageCreateInfo rimg_info = vkinit::image_create_info(_drawImage.imageFormat, drawImageUsages, drawImageExtent); @@ -158,6 +160,7 @@ void SwapchainManager::resize_swapchain(struct SDL_Window *window) drawImageUsages |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; drawImageUsages |= VK_IMAGE_USAGE_STORAGE_BIT; drawImageUsages |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + drawImageUsages |= VK_IMAGE_USAGE_SAMPLED_BIT; VkImageCreateInfo rimg_info = vkinit::image_create_info(_drawImage.imageFormat, drawImageUsages, drawImageExtent); VmaAllocationCreateInfo rimg_allocinfo = {}; diff --git a/src/render/rg_graph.cpp b/src/render/rg_graph.cpp index 88afca2..28ca485 100644 --- a/src/render/rg_graph.cpp +++ b/src/render/rg_graph.cpp @@ -570,7 +570,8 @@ bool RenderGraph::compile() const RGBufferRecord *rec = _resources.get_buffer(RGBufferHandle{id}); barrier.buffer = rec ? rec->buffer : VK_NULL_HANDLE; barrier.offset = 0; - barrier.size = rec ? rec->size : VK_WHOLE_SIZE; + // If size is unknown or 0 for imported buffers, use WHOLE_SIZE to satisfy VUID 01188 + barrier.size = (rec && rec->size > 0) ? rec->size : VK_WHOLE_SIZE; pass.preBufferBarriers.push_back(barrier); if (rec && !rec->imported)