| 1016 | } |
| 1017 | |
| 1018 | VkAccelerationStructureBuildSizesInfoKHR BuildGeometryInfoKHR::GetSizeInfo(bool use_ppGeometries /*= true*/) { |
| 1019 | // Computer total primitives count, and get pointers to geometries |
| 1020 | std::vector<uint32_t> primitives_count(geometries_.size()); |
| 1021 | std::vector<const VkAccelerationStructureGeometryKHR*> pGeometries; |
| 1022 | std::vector<VkAccelerationStructureGeometryKHR> geometries; |
| 1023 | |
| 1024 | if (use_ppGeometries) { |
| 1025 | pGeometries.reserve(geometries_.size()); |
| 1026 | } else { |
| 1027 | geometries.reserve(geometries_.size()); |
| 1028 | } |
| 1029 | |
| 1030 | for (const auto& [geometry_i, geometry] : vvl::enumerate(geometries_)) { |
| 1031 | primitives_count[geometry_i] = geometry.GetFullBuildRange().primitiveCount; |
| 1032 | if (use_ppGeometries) { |
| 1033 | pGeometries.emplace_back(&geometry.GetVkObj()); |
| 1034 | } else { |
| 1035 | geometries.emplace_back(geometry.GetVkObj()); |
| 1036 | } |
| 1037 | } |
| 1038 | vk_info_.geometryCount = static_cast<uint32_t>(geometries_.size()); |
| 1039 | if (use_null_geometries_) { |
| 1040 | vk_info_.pGeometries = nullptr; |
| 1041 | vk_info_.ppGeometries = nullptr; |
| 1042 | } else if (use_ppGeometries) { |
| 1043 | vk_info_.ppGeometries = pGeometries.data(); |
| 1044 | } else { |
| 1045 | vk_info_.pGeometries = geometries.data(); |
| 1046 | } |
| 1047 | |
| 1048 | // Get VkAccelerationStructureBuildSizesInfoKHR using this->vk_info_ |
| 1049 | VkAccelerationStructureBuildSizesInfoKHR size_info = vku::InitStructHelper(); |
| 1050 | if (vk_info_.type == VK_ACCELERATION_STRUCTURE_TYPE_OPACITY_MICROMAP_KHR) { |
| 1051 | vk::GetAccelerationStructureBuildSizesKHR(device_->handle(), build_type_, &vk_info_, nullptr, &size_info); |
| 1052 | } else { |
| 1053 | vk::GetAccelerationStructureBuildSizesKHR(device_->handle(), build_type_, &vk_info_, primitives_count.data(), &size_info); |
| 1054 | } |
| 1055 | |
| 1056 | // pGeometries and geometries are going to be destroyed |
| 1057 | vk_info_.geometryCount = 0; |
| 1058 | vk_info_.ppGeometries = nullptr; |
| 1059 | vk_info_.pGeometries = nullptr; |
| 1060 | |
| 1061 | return size_info; |
| 1062 | } |
| 1063 | |
| 1064 | std::vector<VkAccelerationStructureBuildRangeInfoKHR> BuildGeometryInfoKHR::GetBuildRangeInfosFromGeometries() { |
| 1065 | std::vector<VkAccelerationStructureBuildRangeInfoKHR> range_infos(geometries_.size()); |
no test coverage detected