Skip to content

Commit

Permalink
Take in more parameters for CmdBuildAccelerationStructure
Browse files Browse the repository at this point in the history
This commit just changes build acceleration structure, to allow for the different options/parameters to be take into account. I plan to amend this commit.
  • Loading branch information
AntarticCoder committed Jul 12, 2023
1 parent 9d1d547 commit 257a75f
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 9 deletions.
58 changes: 49 additions & 9 deletions MoltenVK/MoltenVK/Commands/MVKCmdAccelerationStructure.mm
Original file line number Diff line number Diff line change
Expand Up @@ -39,22 +39,62 @@

void MVKCmdBuildAccelerationStructure::encode(MVKCommandEncoder* cmdEncoder) {
id<MTLAccelerationStructureCommandEncoder> accStructEncoder = cmdEncoder->getMTLAccelerationStructureEncoder(kMVKCommandUseNone);
id<MTLAccelerationStructure> srcAccelerationStructure = (id<MTLAccelerationStructure>)_geometryInfos.srcAccelerationStructure;
id<MTLAccelerationStructure> dstAccelerationStructure = (id<MTLAccelerationStructure>)_geometryInfos.dstAccelerationStructure;

MTLAccelerationStructureDescriptor* accStructDescriptor = [MTLAccelerationStructureDescriptor new];
accStructDescriptor.usage = MTLAccelerationStructureUsageNone;
MVKAccelerationStructure* mvkSrcAccelerationStructure = (MVKAccelerationStructure*)_geometryInfos.srcAccelerationStructure;
MVKAccelerationStructure* mvkDstAccelerationStructure = (MVKAccelerationStructure*)_geometryInfos.dstAccelerationStructure;

id<MTLAccelerationStructure> srcAccelerationStructure = (id<MTLAccelerationStructure>)mvkSrcAccelerationStructure->getMTLAccelerationStructure();
id<MTLAccelerationStructure> dstAccelerationStructure = (id<MTLAccelerationStructure>)mvkDstAccelerationStructure->getMTLAccelerationStructure();

if(_geometryInfos.mode == VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR && !mvkDstAccelerationStructure->getAllowUpdate())
{
return;
}

MVKDevice* mvkDvc = cmdEncoder->getDevice();
MVKBuffer* mvkBuffer = mvkDvc->getBufferAtAddress(_geometryInfos.scratchData.deviceAddress);

id<MTLBuffer> scratchBuffer = mvkBuffer->getMTLBuffer();
int scratchBufferOffset = 0;
NSInteger scratchBufferOffset = mvkBuffer->getMTLBufferOffset();

if(_geometryInfos.mode == VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR)
{
MTLAccelerationStructureDescriptor* accStructBuildDescriptor = [MTLAccelerationStructureDescriptor new];

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

[accStructEncoder buildAccelerationStructure:dstAccelerationStructure
descriptor:accStructBuildDescriptor
scratchBuffer:scratchBuffer
scratchBufferOffset:scratchBufferOffset];
return;
}

if(_geometryInfos.mode == VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR)
{
MTLAccelerationStructureDescriptor* accStructRefitDescriptor = [MTLAccelerationStructureDescriptor new];

if(mvkIsAnyFlagEnabled(_geometryInfos.flags, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR)){
accStructRefitDescriptor.usage += MTLAccelerationStructureUsagePreferFastBuild;
}

[accStructEncoder refitAccelerationStructure:srcAccelerationStructure
descriptor:accStructRefitDescriptor
destination:dstAccelerationStructure
scratchBuffer:scratchBuffer
scratchBufferOffset:scratchBufferOffset];

return;
}

[accStructEncoder buildAccelerationStructure:dstAccelerationStructure
descriptor:accStructDescriptor
scratchBuffer:scratchBuffer
scratchBufferOffset:scratchBufferOffset];
return;
}

#pragma mark -
Expand Down
7 changes: 7 additions & 0 deletions MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,18 @@ class MVKAccelerationStructure : public MVKVulkanAPIDeviceObject {

/** Gets the device address of the acceleration structure*/
uint64_t getDeviceAddress();

/** Used when building the acceleration structure, to mark whether or not an acceleration structure can be updated*/
void setAllowUpdate(bool value) { _allowUpdate = value; }

/** Checks if this acceleration structure is allowed to be updated*/
bool getAllowUpdate() { return _allowUpdate; }

#pragma mark Construction
MVKAccelerationStructure(MVKDevice* device) : MVKVulkanAPIDeviceObject(device) {}
protected:
void propagateDebugName() override {}

id<MTLAccelerationStructure> _accelerationStructure;
bool _allowUpdate = false;
};

0 comments on commit 257a75f

Please sign in to comment.