diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdAccelerationStructure.mm b/MoltenVK/MoltenVK/Commands/MVKCmdAccelerationStructure.mm index f3837e80e..6a15fb57b 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCmdAccelerationStructure.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCmdAccelerationStructure.mm @@ -41,7 +41,7 @@ } void MVKCmdBuildAccelerationStructure::encode(MVKCommandEncoder* cmdEncoder) { - id accStructEncoder = cmdEncoder->getMTLAccelerationStructureEncoder(kMVKCommandUseNone); + id accStructEncoder = cmdEncoder->getMTLAccelerationStructureEncoder(kMVKCommandUseBuildAccelerationStructure); for(int i = 0; i < _infoCount; i++) { @@ -210,7 +210,7 @@ } void MVKCmdCopyAccelerationStructure::encode(MVKCommandEncoder* cmdEncoder) { - id accStructEncoder = cmdEncoder->getMTLAccelerationStructureEncoder(kMVKCommandUseNone); + id accStructEncoder = cmdEncoder->getMTLAccelerationStructureEncoder(kMVKCommandUseCopyAccelerationStructure); if(_copyMode == VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR) { @@ -271,7 +271,7 @@ } void MVKCmdCopyMemoryToAccelerationStructure::encode(MVKCommandEncoder* cmdEncoder) { - id accStructEncoder = cmdEncoder->getMTLAccelerationStructureEncoder(kMVKCommandUseNone); + id accStructEncoder = cmdEncoder->getMTLAccelerationStructureEncoder(kMVKCommandUseCopyMemoryToAccelerationStructure); _mvkDevice = cmdEncoder->getDevice(); if(_copyMode != VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR){ diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h b/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h index d2078c4b9..b4715e87e 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h @@ -61,7 +61,7 @@ class MVKAccelerationStructure : public MVKVulkanAPIDeviceObject { #pragma mark - #pragma mark Getters and Setters - /** Used when building the acceleration structure, to mark whether or not an acceleration structure can be updated*/ + /** Used when building the acceleration structure, to mark whether or not an acceleration structure can be updated, only to be set by MVKCmdBuildAccelerationStructure*/ void setAllowUpdate(bool value) { _allowUpdate = value; } /** Checks if this acceleration structure is allowed to be updated*/ @@ -78,6 +78,12 @@ class MVKAccelerationStructure : public MVKVulkanAPIDeviceObject { /** Gets the address of the acceleration structure*/ uint64_t getDeviceAddress() { return _address; } + + /** Returns the Metal buffer using the same memory as the acceleration structure*/ + MVKBuffer* getMVKBuffer() { return _buffer; } + + /** Gets the heap allocation that the acceleration structure, and buffer share*/ + id getMTLHeap() { return _heap; } #pragma mark - #pragma mark Construction MVKAccelerationStructure(MVKDevice* device) : MVKVulkanAPIDeviceObject(device) {} @@ -87,6 +93,9 @@ class MVKAccelerationStructure : public MVKVulkanAPIDeviceObject { void propagateDebugName() override {} id _accelerationStructure; + MVKBuffer* _buffer; + id _heap; + bool _allowUpdate = false; bool _built = false; uint64_t _address = 0; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm b/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm index f68e635d7..6397fa213 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm @@ -22,11 +22,14 @@ #pragma mark - #pragma mark MVKAcceleration Structure -id MVKAccelerationStructure::getMTLAccelerationStructure() -{ +id MVKAccelerationStructure::getMTLAccelerationStructure() { return _accelerationStructure; } +MVKBuffer* MVKAccelerationStructure::getMVKBuffer() { + return _buffer; +} + VkAccelerationStructureBuildSizesInfoKHR MVKAccelerationStructure::getBuildSizes() { VkAccelerationStructureBuildSizesInfoKHR vkBuildSizes{}; @@ -48,4 +51,5 @@ void MVKAccelerationStructure::destroy() { // TODO + _built = false; } diff --git a/MoltenVK/MoltenVK/Utility/MVKFoundation.h b/MoltenVK/MoltenVK/Utility/MVKFoundation.h index b8f10720f..d4427fb7e 100644 --- a/MoltenVK/MoltenVK/Utility/MVKFoundation.h +++ b/MoltenVK/MoltenVK/Utility/MVKFoundation.h @@ -62,39 +62,43 @@ typedef struct { /** Tracks the Vulkan command currently being used. */ typedef enum : uint8_t { - kMVKCommandUseNone = 0, /**< No use defined. */ - kMVKCommandUseEndCommandBuffer, /**< vkEndCommandBuffer (prefilled VkCommandBuffer). */ - kMVKCommandUseQueueSubmit, /**< vkQueueSubmit. */ - kMVKCommandUseAcquireNextImage, /**< vkAcquireNextImageKHR. */ - kMVKCommandUseQueuePresent, /**< vkQueuePresentKHR. */ - kMVKCommandUseQueueWaitIdle, /**< vkQueueWaitIdle. */ - kMVKCommandUseDeviceWaitIdle, /**< vkDeviceWaitIdle. */ - kMVKCommandUseInvalidateMappedMemoryRanges, /**< vkInvalidateMappedMemoryRanges. */ - kMVKCommandUseBeginRendering, /**< vkCmdBeginRendering. */ - kMVKCommandUseBeginRenderPass, /**< vkCmdBeginRenderPass. */ - kMVKCommandUseNextSubpass, /**< vkCmdNextSubpass. */ - kMVKCommandUseRestartSubpass, /**< Restart a subpass because of explicit or implicit barrier. */ - kMVKCommandUsePipelineBarrier, /**< vkCmdPipelineBarrier. */ - kMVKCommandUseBlitImage, /**< vkCmdBlitImage. */ - kMVKCommandUseCopyImage, /**< vkCmdCopyImage. */ - kMVKCommandUseResolveImage, /**< vkCmdResolveImage - resolve stage. */ - kMVKCommandUseResolveExpandImage, /**< vkCmdResolveImage - expand stage. */ - kMVKCommandUseResolveCopyImage, /**< vkCmdResolveImage - copy stage. */ - kMVKCommandUseCopyBuffer, /**< vkCmdCopyBuffer. */ - kMVKCommandUseCopyBufferToImage, /**< vkCmdCopyBufferToImage. */ - kMVKCommandUseCopyImageToBuffer, /**< vkCmdCopyImageToBuffer. */ - kMVKCommandUseFillBuffer, /**< vkCmdFillBuffer. */ - kMVKCommandUseUpdateBuffer, /**< vkCmdUpdateBuffer. */ - kMVKCommandUseClearAttachments, /**< vkCmdClearAttachments. */ - kMVKCommandUseClearColorImage, /**< vkCmdClearColorImage. */ - kMVKCommandUseClearDepthStencilImage, /**< vkCmdClearDepthStencilImage. */ - kMVKCommandUseResetQueryPool, /**< vkCmdResetQueryPool. */ - kMVKCommandUseDispatch, /**< vkCmdDispatch. */ - kMVKCommandUseTessellationVertexTessCtl, /**< vkCmdDraw* - vertex and tessellation control stages. */ - kMVKCommandUseDrawIndirectConvertBuffers, /**< vkCmdDrawIndirect* convert indirect buffers. */ - kMVKCommandUseCopyQueryPoolResults, /**< vkCmdCopyQueryPoolResults. */ - kMVKCommandUseAccumOcclusionQuery, /**< Any command terminating a Metal render pass with active visibility buffer. */ - kMVKCommandUseRecordGPUCounterSample /**< Any command triggering the recording of a GPU counter sample. */ + kMVKCommandUseNone = 0, /**< No use defined. */ + kMVKCommandUseEndCommandBuffer, /**< vkEndCommandBuffer (prefilled VkCommandBuffer). */ + kMVKCommandUseQueueSubmit, /**< vkQueueSubmit. */ + kMVKCommandUseAcquireNextImage, /**< vkAcquireNextImageKHR. */ + kMVKCommandUseQueuePresent, /**< vkQueuePresentKHR. */ + kMVKCommandUseQueueWaitIdle, /**< vkQueueWaitIdle. */ + kMVKCommandUseDeviceWaitIdle, /**< vkDeviceWaitIdle. */ + kMVKCommandUseInvalidateMappedMemoryRanges, /**< vkInvalidateMappedMemoryRanges. */ + kMVKCommandUseBeginRendering, /**< vkCmdBeginRendering. */ + kMVKCommandUseBeginRenderPass, /**< vkCmdBeginRenderPass. */ + kMVKCommandUseNextSubpass, /**< vkCmdNextSubpass. */ + kMVKCommandUseRestartSubpass, /**< Restart a subpass because of explicit or implicit barrier. */ + kMVKCommandUsePipelineBarrier, /**< vkCmdPipelineBarrier. */ + kMVKCommandUseBlitImage, /**< vkCmdBlitImage. */ + kMVKCommandUseCopyImage, /**< vkCmdCopyImage. */ + kMVKCommandUseResolveImage, /**< vkCmdResolveImage - resolve stage. */ + kMVKCommandUseResolveExpandImage, /**< vkCmdResolveImage - expand stage. */ + kMVKCommandUseResolveCopyImage, /**< vkCmdResolveImage - copy stage. */ + kMVKCommandUseCopyBuffer, /**< vkCmdCopyBuffer. */ + kMVKCommandUseCopyBufferToImage, /**< vkCmdCopyBufferToImage. */ + kMVKCommandUseCopyImageToBuffer, /**< vkCmdCopyImageToBuffer. */ + kMVKCommandUseFillBuffer, /**< vkCmdFillBuffer. */ + kMVKCommandUseUpdateBuffer, /**< vkCmdUpdateBuffer. */ + kMVKCommandUseClearAttachments, /**< vkCmdClearAttachments. */ + kMVKCommandUseClearColorImage, /**< vkCmdClearColorImage. */ + kMVKCommandUseClearDepthStencilImage, /**< vkCmdClearDepthStencilImage. */ + kMVKCommandUseResetQueryPool, /**< vkCmdResetQueryPool. */ + kMVKCommandUseDispatch, /**< vkCmdDispatch. */ + kMVKCommandUseTessellationVertexTessCtl, /**< vkCmdDraw* - vertex and tessellation control stages. */ + kMVKCommandUseDrawIndirectConvertBuffers, /**< vkCmdDrawIndirect* convert indirect buffers. */ + kMVKCommandUseCopyQueryPoolResults, /**< vkCmdCopyQueryPoolResults. */ + kMVKCommandUseAccumOcclusionQuery, /**< Any command terminating a Metal render pass with active visibility buffer. */ + kMVKCommandUseRecordGPUCounterSample, /**< Any command triggering the recording of a GPU counter sample. */ + kMVKCommandUseBuildAccelerationStructure, /**< vkCmdBuiildAccelerationStructure - Builds an acceleration structure */ + kMVKCommandUseCopyAccelerationStructure, /**< vkCmdCopyAccelerationStructure- Copies an acceleration structure to another acceleration structure*/ + kMVKCommandUseCopyAccelerationStructureToMemory,/**< vkCmdCopyAccelerationStructureToMemory - Copies and serializes an acceleration structure to a buffer*/ + kMVKCommandUseCopyMemoryToAccelerationStructure,/**< vkCmdCopyMemoryToAccelerationStructure - Copies and deserializes an acceleration structure from a buffer*/ } MVKCommandUse; /** Represents a given stage of a graphics pipeline. */