EDIT: Docs and minor bug fixed 2
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = {};
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user