EDIT: Docs and minor bug fixed 2
This commit is contained in:
@@ -572,14 +572,21 @@ void ComputeManager::insertBarriers(VkCommandBuffer cmd, const ComputeDispatchIn
|
|||||||
return;
|
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.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
|
||||||
dependencyInfo.memoryBarrierCount = dispatchInfo.memoryBarriers.size();
|
dependencyInfo.memoryBarrierCount = static_cast<uint32_t>(dispatchInfo.memoryBarriers.size());
|
||||||
dependencyInfo.pMemoryBarriers = dispatchInfo.memoryBarriers.data();
|
dependencyInfo.pMemoryBarriers = dispatchInfo.memoryBarriers.empty() ? nullptr : dispatchInfo.memoryBarriers.data();
|
||||||
dependencyInfo.bufferMemoryBarrierCount = dispatchInfo.bufferBarriers.size();
|
dependencyInfo.bufferMemoryBarrierCount = static_cast<uint32_t>(fixedBufferBarriers.size());
|
||||||
dependencyInfo.pBufferMemoryBarriers = dispatchInfo.bufferBarriers.data();
|
dependencyInfo.pBufferMemoryBarriers = fixedBufferBarriers.empty() ? nullptr : fixedBufferBarriers.data();
|
||||||
dependencyInfo.imageMemoryBarrierCount = dispatchInfo.imageBarriers.size();
|
dependencyInfo.imageMemoryBarrierCount = static_cast<uint32_t>(dispatchInfo.imageBarriers.size());
|
||||||
dependencyInfo.pImageMemoryBarriers = dispatchInfo.imageBarriers.data();
|
dependencyInfo.pImageMemoryBarriers = dispatchInfo.imageBarriers.empty() ? nullptr : dispatchInfo.imageBarriers.data();
|
||||||
|
|
||||||
vkCmdPipelineBarrier2(cmd, &dependencyInfo);
|
vkCmdPipelineBarrier2(cmd, &dependencyInfo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ AccelStructureHandle RayTracingManager::getOrBuildBLAS(const std::shared_ptr<Mes
|
|||||||
return it->second;
|
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<VkAccelerationStructureGeometryKHR> geoms;
|
||||||
std::vector<VkAccelerationStructureBuildRangeInfoKHR> ranges;
|
std::vector<VkAccelerationStructureBuildRangeInfoKHR> ranges;
|
||||||
geoms.reserve(mesh->surfaces.size());
|
geoms.reserve(mesh->surfaces.size());
|
||||||
@@ -84,6 +84,11 @@ AccelStructureHandle RayTracingManager::getOrBuildBLAS(const std::shared_ptr<Mes
|
|||||||
|
|
||||||
for (const auto &s: mesh->surfaces)
|
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{
|
VkAccelerationStructureGeometryTrianglesDataKHR tri{
|
||||||
VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR
|
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);
|
geoms.push_back(g);
|
||||||
|
|
||||||
VkAccelerationStructureBuildRangeInfoKHR r{};
|
VkAccelerationStructureBuildRangeInfoKHR r{};
|
||||||
r.primitiveCount = s.count / 3;
|
r.primitiveCount = primitiveCount;
|
||||||
r.primitiveOffset = 0; // encoded through indexData deviceAddress
|
r.primitiveOffset = 0; // encoded through indexData deviceAddress
|
||||||
r.firstVertex = 0;
|
r.firstVertex = 0;
|
||||||
r.transformOffset = 0;
|
r.transformOffset = 0;
|
||||||
ranges.push_back(r);
|
ranges.push_back(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If no valid geometries, skip BLAS build
|
||||||
|
if (geoms.empty())
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
VkAccelerationStructureBuildGeometryInfoKHR buildInfo{
|
VkAccelerationStructureBuildGeometryInfoKHR buildInfo{
|
||||||
VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR
|
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;
|
buildInfo.scratchData.deviceAddress = scratchAddr;
|
||||||
|
|
||||||
// build with immediate submit
|
// build with immediate submit
|
||||||
std::vector<const VkAccelerationStructureBuildRangeInfoKHR *> pRanges(geoms.size());
|
const VkAccelerationStructureBuildRangeInfoKHR* pRange = ranges.data();
|
||||||
for (size_t i = 0; i < geoms.size(); ++i) pRanges[i] = &ranges[i];
|
|
||||||
_resources->immediate_submit([&](VkCommandBuffer cmd) {
|
_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
|
// destroy scratch
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ void SwapchainManager::init_swapchain()
|
|||||||
drawImageUsages |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
drawImageUsages |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||||
drawImageUsages |= VK_IMAGE_USAGE_STORAGE_BIT;
|
drawImageUsages |= VK_IMAGE_USAGE_STORAGE_BIT;
|
||||||
drawImageUsages |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_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);
|
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_TRANSFER_SRC_BIT;
|
||||||
drawImageUsages |= VK_IMAGE_USAGE_STORAGE_BIT;
|
drawImageUsages |= VK_IMAGE_USAGE_STORAGE_BIT;
|
||||||
drawImageUsages |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_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);
|
VkImageCreateInfo rimg_info = vkinit::image_create_info(_drawImage.imageFormat, drawImageUsages, drawImageExtent);
|
||||||
VmaAllocationCreateInfo rimg_allocinfo = {};
|
VmaAllocationCreateInfo rimg_allocinfo = {};
|
||||||
|
|||||||
@@ -570,7 +570,8 @@ bool RenderGraph::compile()
|
|||||||
const RGBufferRecord *rec = _resources.get_buffer(RGBufferHandle{id});
|
const RGBufferRecord *rec = _resources.get_buffer(RGBufferHandle{id});
|
||||||
barrier.buffer = rec ? rec->buffer : VK_NULL_HANDLE;
|
barrier.buffer = rec ? rec->buffer : VK_NULL_HANDLE;
|
||||||
barrier.offset = 0;
|
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);
|
pass.preBufferBarriers.push_back(barrier);
|
||||||
|
|
||||||
if (rec && !rec->imported)
|
if (rec && !rec->imported)
|
||||||
|
|||||||
Reference in New Issue
Block a user