EDIT: Docs and minor bug fixed 2

This commit is contained in:
2025-10-30 01:41:54 +09:00
parent 0226c0b5b3
commit 235d9b2f83
4 changed files with 35 additions and 13 deletions

View File

@@ -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<VkBufferMemoryBarrier2> 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<uint32_t>(dispatchInfo.memoryBarriers.size());
dependencyInfo.pMemoryBarriers = dispatchInfo.memoryBarriers.empty() ? nullptr : dispatchInfo.memoryBarriers.data();
dependencyInfo.bufferMemoryBarrierCount = static_cast<uint32_t>(fixedBufferBarriers.size());
dependencyInfo.pBufferMemoryBarriers = fixedBufferBarriers.empty() ? nullptr : fixedBufferBarriers.data();
dependencyInfo.imageMemoryBarrierCount = static_cast<uint32_t>(dispatchInfo.imageBarriers.size());
dependencyInfo.pImageMemoryBarriers = dispatchInfo.imageBarriers.empty() ? nullptr : dispatchInfo.imageBarriers.data();
vkCmdPipelineBarrier2(cmd, &dependencyInfo);
}

View File

@@ -72,7 +72,7 @@ AccelStructureHandle RayTracingManager::getOrBuildBLAS(const std::shared_ptr<Mes
return it->second;
}
// Build BLAS with one geometry per surface
// Build BLAS with one geometry per surface (skip empty primitives)
std::vector<VkAccelerationStructureGeometryKHR> geoms;
std::vector<VkAccelerationStructureBuildRangeInfoKHR> ranges;
geoms.reserve(mesh->surfaces.size());
@@ -84,6 +84,11 @@ AccelStructureHandle RayTracingManager::getOrBuildBLAS(const std::shared_ptr<Mes
for (const auto &s: mesh->surfaces)
{
// 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<Mes
geoms.push_back(g);
VkAccelerationStructureBuildRangeInfoKHR r{};
r.primitiveCount = s.count / 3;
r.primitiveCount = primitiveCount;
r.primitiveOffset = 0; // encoded through indexData deviceAddress
r.firstVertex = 0;
r.transformOffset = 0;
ranges.push_back(r);
}
// If no valid geometries, skip BLAS build
if (geoms.empty())
{
return {};
}
VkAccelerationStructureBuildGeometryInfoKHR buildInfo{
VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR
};
@@ -149,10 +160,10 @@ AccelStructureHandle RayTracingManager::getOrBuildBLAS(const std::shared_ptr<Mes
buildInfo.scratchData.deviceAddress = scratchAddr;
// build with immediate submit
std::vector<const VkAccelerationStructureBuildRangeInfoKHR *> 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

View File

@@ -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 = {};

View File

@@ -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)