@@ -412,19 +412,20 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
412
412
};
413
413
// fun fact: you can use garbage/invalid pointers/offset for the Device/Host addresses of the per-geometry data, just make sure what was supposed to be null is null
414
414
template <class Geometry > requires nbl::is_any_of_v<Geometry,
415
- IGPUBottomLevelAccelerationStructure:: Triangles<const IGPUBuffer>,
416
- IGPUBottomLevelAccelerationStructure:: Triangles<const asset::ICPUBuffer>,
417
- IGPUBottomLevelAccelerationStructure:: AABBs<const IGPUBuffer>,
418
- IGPUBottomLevelAccelerationStructure:: AABBs<const asset::ICPUBuffer>
415
+ asset::IBottomLevelAccelerationStructure:: Triangles<IGPUBuffer>,
416
+ asset::IBottomLevelAccelerationStructure:: Triangles<asset::ICPUBuffer>,
417
+ asset::IBottomLevelAccelerationStructure:: AABBs<IGPUBuffer>,
418
+ asset::IBottomLevelAccelerationStructure:: AABBs<asset::ICPUBuffer>
419
419
>
420
420
inline AccelerationStructureBuildSizes getAccelerationStructureBuildSizes (
421
- const core::bitflag<IGPUBottomLevelAccelerationStructure::BUILD_FLAGS> flags,
421
+ const bool hostBuild,
422
+ const core::bitflag<asset::IBottomLevelAccelerationStructure::BUILD_FLAGS> flags,
422
423
const bool motionBlur,
423
424
const std::span<const Geometry> geometries,
424
425
const uint32_t * const pMaxPrimitiveCounts
425
426
) const
426
427
{
427
- if (invalidFeaturesForASBuild< typename Geometry:: buffer_t >( motionBlur))
428
+ if (invalidFeaturesForASBuild (hostBuild, motionBlur))
428
429
{
429
430
NBL_LOG_ERROR (" Required features are not enabled" );
430
431
return {};
@@ -455,13 +456,29 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
455
456
uint32_t primsFree = limits.maxAccelerationStructurePrimitiveCount ;
456
457
for (auto i=0u ; i<geometries.size (); i++)
457
458
{
458
- if constexpr (std::is_same_v<IGPUBottomLevelAccelerationStructure::Triangles<const Geometry::buffer_t >,Geometry>)
459
+ const auto & geom = geometries[i];
460
+ if constexpr (Geometry::Type==asset::IBottomLevelAccelerationStructure::GeometryType::Triangles)
459
461
{
460
- // TODO: do we check `maxVertex`, `vertexStride` and `indexType` for validity?
462
+ if (flags.hasFlags (asset::IBottomLevelAccelerationStructure::BUILD_FLAGS::GEOMETRY_TYPE_IS_AABB_BIT))
463
+ {
464
+ NBL_LOG_ERROR (" Primitive type is Triangles but build flag says BLAS build is AABBs" );
465
+ return {};
466
+ }
467
+ if (!getPhysicalDevice ()->getBufferFormatUsages ()[geom.vertexFormat ].accelerationStructureVertex )
468
+ {
469
+ NBL_LOG_ERROR (" Vertex Format %d not supported as Acceleration Structure Vertex Position Input on this Device" ,geom.vertexFormat );
470
+ return {};
471
+ }
472
+ // TODO: do we check `maxVertex`, `vertexStride` and `indexType` for validity
461
473
}
462
- if constexpr (std::is_same_v<IGPUBottomLevelAccelerationStructure::AABBs< const Geometry:: buffer_t >,Geometry> )
474
+ if constexpr (Geometry::Type==asset::IBottomLevelAccelerationStructure::GeometryType::AABBs )
463
475
{
464
- // TODO: check stride and geometry flags for validity?
476
+ if (!flags.hasFlags (asset::IBottomLevelAccelerationStructure::BUILD_FLAGS::GEOMETRY_TYPE_IS_AABB_BIT))
477
+ {
478
+ NBL_LOG_ERROR (" Primitive type is AABB but build flag says BLAS build is not AABBs" );
479
+ return {};
480
+ }
481
+ // TODO: check stride and geometry flags for validity
465
482
}
466
483
if (pMaxPrimitiveCounts[i] > primsFree)
467
484
{
@@ -471,16 +488,16 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
471
488
primsFree -= pMaxPrimitiveCounts[i];
472
489
}
473
490
474
- return getAccelerationStructureBuildSizes_impl (flags,motionBlur,geometries,pMaxPrimitiveCounts);
491
+ return getAccelerationStructureBuildSizes_impl (hostBuild, flags,motionBlur,geometries,pMaxPrimitiveCounts);
475
492
}
476
493
inline AccelerationStructureBuildSizes getAccelerationStructureBuildSizes (
477
494
const bool hostBuild,
478
- const core::bitflag<IGPUTopLevelAccelerationStructure ::BUILD_FLAGS> flags,
495
+ const core::bitflag<asset::ITopLevelAccelerationStructure ::BUILD_FLAGS> flags,
479
496
const bool motionBlur,
480
497
const uint32_t maxInstanceCount
481
498
) const
482
499
{
483
- if (invalidFeaturesForASBuild<IGPUBuffer>( motionBlur))
500
+ if (invalidFeaturesForASBuild (hostBuild, motionBlur))
484
501
{
485
502
NBL_LOG_ERROR (" Required features are not enabled" );
486
503
return {};
@@ -504,7 +521,7 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
504
521
}
505
522
// little utility
506
523
template <typename BufferType=IGPUBuffer>
507
- inline AccelerationStructureBuildSizes getAccelerationStructureBuildSizes (const core::bitflag<IGPUTopLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur, const uint32_t maxInstanceCount) const
524
+ inline AccelerationStructureBuildSizes getAccelerationStructureBuildSizes (const core::bitflag<asset::ITopLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur, const uint32_t maxInstanceCount) const
508
525
{
509
526
return getAccelerationStructureBuildSizes (std::is_same_v<std::remove_cv_t <BufferType>,asset::ICPUBuffer>,flags,motionBlur,maxInstanceCount);
510
527
}
@@ -1070,20 +1087,20 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
1070
1087
virtual core::smart_refctd_ptr<IGPUTopLevelAccelerationStructure> createTopLevelAccelerationStructure_impl (IGPUTopLevelAccelerationStructure::SCreationParams&& params) = 0;
1071
1088
1072
1089
virtual AccelerationStructureBuildSizes getAccelerationStructureBuildSizes_impl (
1073
- const core::bitflag<IGPUBottomLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur,
1074
- const std::span<const IGPUBottomLevelAccelerationStructure:: AABBs<const IGPUBuffer>> geometries, const uint32_t * const pMaxPrimitiveCounts
1090
+ const bool hostBuild, const core::bitflag<asset::IBottomLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur,
1091
+ const std::span<const asset::IBottomLevelAccelerationStructure:: AABBs<IGPUBuffer>> geometries, const uint32_t * const pMaxPrimitiveCounts
1075
1092
) const = 0;
1076
1093
virtual AccelerationStructureBuildSizes getAccelerationStructureBuildSizes_impl (
1077
- const core::bitflag<IGPUBottomLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur,
1078
- const std::span<const IGPUBottomLevelAccelerationStructure:: AABBs<const asset::ICPUBuffer>> geometries, const uint32_t * const pMaxPrimitiveCounts
1094
+ const bool hostBuild, const core::bitflag<asset::IBottomLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur,
1095
+ const std::span<const asset::IBottomLevelAccelerationStructure:: AABBs<asset::ICPUBuffer>> geometries, const uint32_t * const pMaxPrimitiveCounts
1079
1096
) const = 0;
1080
1097
virtual AccelerationStructureBuildSizes getAccelerationStructureBuildSizes_impl (
1081
- const core::bitflag<IGPUBottomLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur,
1082
- const std::span<const IGPUBottomLevelAccelerationStructure:: Triangles<const IGPUBuffer>> geometries, const uint32_t * const pMaxPrimitiveCounts
1098
+ const bool hostBuild, const core::bitflag<asset::IBottomLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur,
1099
+ const std::span<const asset::IBottomLevelAccelerationStructure:: Triangles<IGPUBuffer>> geometries, const uint32_t * const pMaxPrimitiveCounts
1083
1100
) const = 0;
1084
1101
virtual AccelerationStructureBuildSizes getAccelerationStructureBuildSizes_impl (
1085
- const core::bitflag<IGPUBottomLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur,
1086
- const std::span<const IGPUBottomLevelAccelerationStructure:: Triangles<const asset::ICPUBuffer>> geometries, const uint32_t * const pMaxPrimitiveCounts
1102
+ const bool hostBuild, const core::bitflag<asset::IBottomLevelAccelerationStructure ::BUILD_FLAGS> flags, const bool motionBlur,
1103
+ const std::span<const asset::IBottomLevelAccelerationStructure:: Triangles<asset::ICPUBuffer>> geometries, const uint32_t * const pMaxPrimitiveCounts
1087
1104
) const = 0;
1088
1105
virtual AccelerationStructureBuildSizes getAccelerationStructureBuildSizes_impl (
1089
1106
const bool hostBuild, const core::bitflag<IGPUTopLevelAccelerationStructure::BUILD_FLAGS> flags,
@@ -1333,8 +1350,7 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
1333
1350
}
1334
1351
return false ;
1335
1352
}
1336
- template <class BufferType >
1337
- bool invalidFeaturesForASBuild (const bool motionBlur) const
1353
+ bool invalidFeaturesForASBuild (const bool hostBuild, const bool motionBlur) const
1338
1354
{
1339
1355
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureBuildSizesKHR-accelerationStructure-08933
1340
1356
if (!m_enabledFeatures.accelerationStructure )
@@ -1343,7 +1359,7 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
1343
1359
return true ;
1344
1360
}
1345
1361
// not sure of VUID
1346
- if (std::is_same_v<BufferType, asset::ICPUBuffer> && !m_enabledFeatures.accelerationStructureHostCommands )
1362
+ if (hostBuild && !m_enabledFeatures.accelerationStructureHostCommands )
1347
1363
{
1348
1364
NBL_LOG_ERROR (" Feature `acceleration structure` host commands is not enabled" );
1349
1365
return true ;
0 commit comments