diff --git a/lvk/LVK.h b/lvk/LVK.h index cfb7a597da..07ea2be083 100644 --- a/lvk/LVK.h +++ b/lvk/LVK.h @@ -808,6 +808,13 @@ enum AccelStructGeometryFlagBits : uint8_t { AccelStructGeometryFlagBits_NoDuplicateAnyHit = 1 << 1, }; +enum AccelStructInstanceFlagBits : uint8_t { + AccelStructInstanceFlagBits_TriangleFacingCullDisable = 1 << 0, + AccelStructInstanceFlagBits_TriangleFlipFacing = 1 << 1, + AccelStructInstanceFlagBits_ForceOpaque = 1 << 2, + AccelStructInstanceFlagBits_ForceNoOpaque = 1 << 3, +}; + struct AccelStructBuildRange { uint32_t primitiveCount = 0; uint32_t primitiveOffset = 0; @@ -815,6 +822,19 @@ struct AccelStructBuildRange { uint32_t transformOffset = 0; }; +struct mat3x4 { + float matrix[3][4]; +}; + +struct AccelStructInstance { + mat3x4 transform; + uint32_t instanceCustomIndex : 24 = 0; + uint32_t mask : 8 = 0xff; + uint32_t instanceShaderBindingTableRecordOffset : 24 = 0; + uint32_t flags : 8 = AccelStructInstanceFlagBits_TriangleFacingCullDisable; + uint64_t accelerationStructureReference = 0; +}; + struct AccelStructDesc { AccelStructType type = AccelStructType_Invalid; AccelStructGeomType geometryType = AccelStructGeomType_Triangles; @@ -827,6 +847,7 @@ struct AccelStructDesc { IndexFormat indexFormat = IndexFormat_UI32; BufferHandle indexBuffer; BufferHandle transformBuffer; + BufferHandle instancesBuffer; AccelStructBuildRange buildRange = {}; uint8_t buildFlags = AccelStructBuildFlagBits_PreferFastTrace; const char* debugName = ""; diff --git a/lvk/vulkan/VulkanClasses.cpp b/lvk/vulkan/VulkanClasses.cpp index badb7e5c3a..a546ad3eac 100644 --- a/lvk/vulkan/VulkanClasses.cpp +++ b/lvk/vulkan/VulkanClasses.cpp @@ -38,6 +38,7 @@ static_assert(lvk::Swizzle_R == (uint32_t)VK_COMPONENT_SWIZZLE_R); static_assert(lvk::Swizzle_G == (uint32_t)VK_COMPONENT_SWIZZLE_G); static_assert(lvk::Swizzle_B == (uint32_t)VK_COMPONENT_SWIZZLE_B); static_assert(lvk::Swizzle_A == (uint32_t)VK_COMPONENT_SWIZZLE_A); +static_assert(sizeof(lvk::AccelStructInstance) == sizeof(VkAccelerationStructureInstanceKHR)); namespace {