Skip to content

Commit

Permalink
Implemented AABB Geometry for Build and Get Sizes
Browse files Browse the repository at this point in the history
This commit is pretty small and just adds AABBs to be allowed to be pushed to the acceleration structure.
  • Loading branch information
AntarticCoder committed Jun 26, 2024
1 parent 4362ea1 commit 3f1fbde
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 69 deletions.
53 changes: 26 additions & 27 deletions MoltenVK/MoltenVK/Commands/MVKCmdAccelerationStructure.mm
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@
accStructBuildDescriptor.usage = MTLAccelerationStructureUsageNone;
}

// What would the offset be?
[dstAccelerationStructureHeap newAccelerationStructureWithDescriptor:accStructBuildDescriptor];

[accStructEncoder buildAccelerationStructure:dstAccelerationStructure
Expand All @@ -92,21 +91,21 @@

if(_geometryInfos[i].type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR)
{
MTLPrimitiveAccelerationStructureDescriptor* accStructBuildDescriptor = [MTLPrimitiveAccelerationStructureDescriptor new];

if(mvkIsAnyFlagEnabled(_geometryInfos[i].flags, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR)){
accStructBuildDescriptor.usage += MTLAccelerationStructureUsageRefit;
mvkDstAccelerationStructure->setAllowUpdate(true);
}else if(mvkIsAnyFlagEnabled(_geometryInfos[i].flags, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR)){
accStructBuildDescriptor.usage += MTLAccelerationStructureUsagePreferFastBuild;
}else{
accStructBuildDescriptor.usage = MTLAccelerationStructureUsageNone;
}

if(_geometryInfos[i].pGeometries->geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { return; }

if(_geometryInfos[i].pGeometries->geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR)
{
MTLPrimitiveAccelerationStructureDescriptor* accStructTriangleBuildDescriptor = [MTLPrimitiveAccelerationStructureDescriptor new];

if(mvkIsAnyFlagEnabled(_geometryInfos[i].flags, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR)){
accStructTriangleBuildDescriptor.usage += MTLAccelerationStructureUsageRefit;
mvkDstAccelerationStructure->setAllowUpdate(true);
}else if(mvkIsAnyFlagEnabled(_geometryInfos[i].flags, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR)){
accStructTriangleBuildDescriptor.usage += MTLAccelerationStructureUsagePreferFastBuild;
}else{
accStructTriangleBuildDescriptor.usage = MTLAccelerationStructureUsageNone;
}

VkAccelerationStructureGeometryTrianglesDataKHR triangleGeometryData = _geometryInfos[i].pGeometries->geometry.triangles;
uint64_t vertexBDA = triangleGeometryData.vertexData.deviceAddress;
uint64_t indexBDA = triangleGeometryData.indexData.deviceAddress;
Expand All @@ -116,37 +115,37 @@
MTLAccelerationStructureTriangleGeometryDescriptor* geometryTriangles = [MTLAccelerationStructureTriangleGeometryDescriptor new];
geometryTriangles.triangleCount = _geometryInfos[i].geometryCount;
geometryTriangles.vertexBuffer = mvkVertexBuffer->getMTLBuffer();
geometryTriangles.vertexBufferOffset = _buildRangeInfos[i].primitiveOffset;
geometryTriangles.vertexBufferOffset = mvkVertexBuffer->getMTLBufferOffset();

geometryTriangles.indexBuffer = mvkIndexBuffer->getMTLBuffer();
geometryTriangles.indexBufferOffset = 0; // Need to get this value
geometryTriangles.indexBufferOffset = mvkIndexBuffer->getMTLBufferOffset();
geometryTriangles.indexType = mvkMTLIndexTypeFromVkIndexType(triangleGeometryData.indexType);
accStructTriangleBuildDescriptor.geometryDescriptors = @[geometryTriangles];
accStructBuildDescriptor.geometryDescriptors = @[geometryTriangles];

[accStructEncoder buildAccelerationStructure:dstAccelerationStructure
descriptor:accStructTriangleBuildDescriptor
descriptor:accStructBuildDescriptor
scratchBuffer:scratchBuffer
scratchBufferOffset:scratchBufferOffset];
}
// Need to implement AABBS
// This is just a dummy copy of Bottom Level

if(_geometryInfos[i].pGeometries->geometryType == VK_GEOMETRY_TYPE_AABBS_KHR)
{
VkAccelerationStructureGeometryAabbsDataKHR aabbGeometryData = _geometryInfos[i].pGeometries->geometry.aabbs;
uint64_t boundingBoxBDA = aabbGeometryData.data.deviceAddress;
MVKBuffer* mvkBoundingBoxBuffer = _mvkDevice->getBufferAtAddress(boundingBoxBDA);

MTLAccelerationStructureBoundingBoxGeometryDescriptor* geometryAABBs = [MTLAccelerationStructureBoundingBoxGeometryDescriptor new];
geometryAABBs.boundingBoxCount = _geometryInfos[i].geometryCount;
geometryAABBs.boundingBoxBuffer = mvkBoundingBoxBuffer->getMTLBuffer();
geometryAABBs.boundingBoxStride = 0; // Need to get this
geometryAABBs.boundingBoxBufferOffset = mvkBoundingBoxBuffer->getMTLBufferOffset();
accStructBuildDescriptor.geometryDescriptors = @[geometryAABBs];
}
}

if(_geometryInfos[i].type == VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR)
{
MTLInstanceAccelerationStructureDescriptor* accStructInstanceBuildDescriptor = [MTLInstanceAccelerationStructureDescriptor new];

if(mvkIsAnyFlagEnabled(_geometryInfos[i].flags, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR)){
accStructInstanceBuildDescriptor.usage += MTLAccelerationStructureUsageRefit;
mvkDstAccelerationStructure->setAllowUpdate(true);
}else if(mvkIsAnyFlagEnabled(_geometryInfos[i].flags, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR)){
accStructInstanceBuildDescriptor.usage += MTLAccelerationStructureUsagePreferFastBuild;
}else{
accStructInstanceBuildDescriptor.usage = MTLAccelerationStructureUsageNone;
}
}
}

Expand Down
20 changes: 10 additions & 10 deletions MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vkGetDeviceAccelerationStructureCompatibilityKHR * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Expand All @@ -20,16 +20,16 @@
Commands that need to be implemented
vkCmdBuildAccelerationStructuresIndirectKHR
vkCmdBuildAccelerationStructuresKHR - DONE
vkCmdCopyAccelerationStructureKHR - DONE
vkCmdCopyAccelerationStructureToMemoryKHR - DONE
vkCmdCopyMemoryToAccelerationStructureKHR - DONE
vkCmdBuildAccelerationStructuresKHR
vkCmdCopyAccelerationStructureKHR
vkCmdCopyAccelerationStructureToMemoryKHR
vkCmdCopyMemoryToAccelerationStructureKHR
vkCmdWriteAccelerationStructuresPropertiesKHR
vkCreateAccelerationStructureKHR - DONE
vkDestroyAccelerationStructureKHR - DONE
vkGetAccelerationStructureBuildSizesKHR
vkGetAccelerationStructureDeviceAddressKHR - DONE
vkGetDeviceAccelerationStructureCompatibilityKHR - DONE
vkCreateAccelerationStructureKHR - Complete
vkDestroyAccelerationStructureKHR - Complete
vkGetAccelerationStructureBuildSizesKHR
vkGetAccelerationStructureDeviceAddressKHR - Complete
vkGetDeviceAccelerationStructureCompatibilityKHR - Complete
*/

#pragma once
Expand Down
75 changes: 43 additions & 32 deletions MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm
Original file line number Diff line number Diff line change
Expand Up @@ -42,33 +42,35 @@
case VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR:
{
accStructDescriptor = [MTLAccelerationStructureDescriptor new];

if(mvkIsAnyFlagEnabled(info->flags, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR)){
accStructDescriptor.usage += MTLAccelerationStructureUsageRefit;
}else if(mvkIsAnyFlagEnabled(info->flags, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR)){
accStructDescriptor.usage += MTLAccelerationStructureUsagePreferFastBuild;
}else{
accStructDescriptor.usage = MTLAccelerationStructureUsageNone;
}
break;
}

case VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR:
{
if(info->pGeometries->geometryType == VK_GEOMETRY_TYPE_AABBS_KHR) { return vkBuildSizes; }
if(info->pGeometries->geometryType == VK_GEOMETRY_TYPE_AABBS_KHR)
{
accStructDescriptor = [MTLPrimitiveAccelerationStructureDescriptor new];
MTLPrimitiveAccelerationStructureDescriptor* primitiveAccStructDescriptor = (MTLPrimitiveAccelerationStructureDescriptor*)accStructDescriptor;

VkAccelerationStructureGeometryAabbsDataKHR aabbGeometryData = info->pGeometries->geometry.aabbs;
uint64_t boundingBoxBDA = aabbGeometryData.data.deviceAddress;
MVKBuffer* mvkBoundingBoxBuffer = device->getBufferAtAddress(boundingBoxBDA);

MTLAccelerationStructureBoundingBoxGeometryDescriptor* geometryAABBs = [MTLAccelerationStructureBoundingBoxGeometryDescriptor new];
geometryAABBs.boundingBoxCount = info->geometryCount;
geometryAABBs.boundingBoxBuffer = mvkBoundingBoxBuffer->getMTLBuffer();
geometryAABBs.boundingBoxStride = 0; // Need to get this
geometryAABBs.boundingBoxBufferOffset = mvkBoundingBoxBuffer->getMTLBufferOffset();
primitiveAccStructDescriptor.geometryDescriptors = @[geometryAABBs];
break;

}
if(info->pGeometries->geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { return vkBuildSizes; }

if(info->pGeometries->geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR)
{
accStructDescriptor = [MTLPrimitiveAccelerationStructureDescriptor new];

if(mvkIsAnyFlagEnabled(info->flags, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR)){
accStructDescriptor.usage += MTLAccelerationStructureUsageRefit;
}else if(mvkIsAnyFlagEnabled(info->flags, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR)){
accStructDescriptor.usage += MTLAccelerationStructureUsagePreferFastBuild;
}else{
accStructDescriptor.usage = MTLAccelerationStructureUsageNone;
}
MTLPrimitiveAccelerationStructureDescriptor* primitiveAccStructDescriptor = (MTLPrimitiveAccelerationStructureDescriptor*)accStructDescriptor;

VkAccelerationStructureGeometryTrianglesDataKHR triangleGeometryData = info->pGeometries->geometry.triangles;
uint64_t vertexBDA = triangleGeometryData.vertexData.deviceAddress;
Expand All @@ -79,35 +81,44 @@
MTLAccelerationStructureTriangleGeometryDescriptor* geometryTriangles = [MTLAccelerationStructureTriangleGeometryDescriptor new];
geometryTriangles.triangleCount = info->geometryCount;
geometryTriangles.vertexBuffer = mvkVertexBuffer->getMTLBuffer();
// geometryTriangles.vertexBufferOffset = _buildRangeInfos[i].primitiveOffset;
geometryTriangles.vertexBufferOffset = mvkVertexBuffer->getMTLBufferOffset();

geometryTriangles.indexBuffer = mvkIndexBuffer->getMTLBuffer();
geometryTriangles.indexBufferOffset = 0; // Need to get this value
geometryTriangles.indexBufferOffset = mvkIndexBuffer->getMTLBufferOffset();
geometryTriangles.indexType = mvkMTLIndexTypeFromVkIndexType(triangleGeometryData.indexType);
// accStructDescriptor.geometryDescriptors = @[geometryTriangles];
primitiveAccStructDescriptor.geometryDescriptors = @[geometryTriangles];
break;
}
else
{
accStructDescriptor = [MTLPrimitiveAccelerationStructureDescriptor new];
}
break;
}
case VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR:
{
MTLInstanceAccelerationStructureDescriptor* accStructInstanceBuildDescriptor = [MTLInstanceAccelerationStructureDescriptor new];
accStructDescriptor = [MTLInstanceAccelerationStructureDescriptor new];
MTLInstanceAccelerationStructureDescriptor* instanceAccStructDescriptor = (MTLInstanceAccelerationStructureDescriptor*)accStructDescriptor;

if(mvkIsAnyFlagEnabled(info->flags, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR)){
accStructInstanceBuildDescriptor.usage += MTLAccelerationStructureUsageRefit;
}else if(mvkIsAnyFlagEnabled(info->flags, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR)){
accStructInstanceBuildDescriptor.usage += MTLAccelerationStructureUsagePreferFastBuild;
}else{
accStructInstanceBuildDescriptor.usage = MTLAccelerationStructureUsageNone;
}
instanceAccStructDescriptor.instanceDescriptorType = MTLAccelerationStructureInstanceDescriptorTypeDefault;
}
default:
accStructDescriptor = [MTLAccelerationStructureDescriptor new];
break;
}

// MTLAccelerationStructureSizes sizes = [device->getMTLDevi ce() accelerationStructureSizesWithDescriptor:accelerationStructureDescriptor];
// vkBuildSizes.accelerationStructureSize = sizes.accelerationStructureSize;
// vkBuildSizes.buildScratchSize = sizes.buildScratchBufferSize;
// vkBuildSizes.updateScratchSize = sizes.refitScratchBufferSize;
if(mvkIsAnyFlagEnabled(info->flags, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR)){
accStructDescriptor.usage += MTLAccelerationStructureUsageRefit;
}else if(mvkIsAnyFlagEnabled(info->flags, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR)){
accStructDescriptor.usage += MTLAccelerationStructureUsagePreferFastBuild;
}else{
accStructDescriptor.usage = MTLAccelerationStructureUsageNone;
}

MTLAccelerationStructureSizes sizes = [device->getMTLDevice() accelerationStructureSizesWithDescriptor: accStructDescriptor];
vkBuildSizes.accelerationStructureSize = sizes.accelerationStructureSize;
vkBuildSizes.buildScratchSize = sizes.buildScratchBufferSize;
vkBuildSizes.updateScratchSize = sizes.refitScratchBufferSize;

return vkBuildSizes;
}
Expand Down

0 comments on commit 3f1fbde

Please sign in to comment.