From 542c3f8df54f388786f95b2f16efcf423d2007bd Mon Sep 17 00:00:00 2001 From: Antarctic Coder Date: Tue, 11 Jul 2023 10:27:33 -0400 Subject: [PATCH] Implemented Acceleration Structure Compatibility Added in a function to check for acceleration structure compatibility. Also made sure to properly add the device features for acceleration structures. --- .../GPUObjects/MVKAccelerationStructure.h | 7 ++----- .../GPUObjects/MVKAccelerationStructure.mm | 10 ++++------ MoltenVK/MoltenVK/GPUObjects/MVKDevice.h | 5 ++++- MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 16 ++++++++++++++-- .../GPUObjects/MVKDeviceFeatureStructs.def | 1 + MoltenVK/MoltenVK/Vulkan/vulkan.mm | 11 +++++++++++ 6 files changed, 36 insertions(+), 14 deletions(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h b/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h index 0d811225e..24f9ac621 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.h @@ -20,7 +20,7 @@ Commands that need to be implemented vkCmdBuildAccelerationStructuresIndirectKHR - vkCmdBuildAccelerationStructuresKHR - IN PROGRESS + vkCmdBuildAccelerationStructuresKHR - DONE vkCmdCopyAccelerationStructureKHR - DONE vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyMemoryToAccelerationStructureKHR @@ -57,10 +57,7 @@ class MVKAccelerationStructure : public MVKVulkanAPIDeviceObject { static VkAccelerationStructureBuildSizesInfoKHR getBuildSizes(); /** Gets the device address of the acceleration structure*/ - void getDeviceAddress(); - - /** Builds the acceleration structure as a device command*/ - void build(); + uint64_t getDeviceAddress(); #pragma mark Construction MVKAccelerationStructure(MVKDevice* device) : MVKVulkanAPIDeviceObject(device) {} diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm b/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm index 9397aec36..3032215db 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKAccelerationStructure.mm @@ -31,12 +31,10 @@ { VkAccelerationStructureBuildSizesInfoKHR vkBuildSizes{}; - #if MVK_XCODE_12 - MTLAccelerationStructureSizes mtlBuildSizes; - vkBuildSizes.accelerationStructureSize = mtlBuildSizes.accelerationStructureSize; - vkBuildSizes.buildScratchSize = mtlBuildSizes.buildScratchBufferSize; - vkBuildSizes.updateScratchSize = mtlBuildSizes.refitScratchBufferSize; - #endif + MTLAccelerationStructureSizes mtlBuildSizes; + vkBuildSizes.accelerationStructureSize = mtlBuildSizes.accelerationStructureSize; + vkBuildSizes.buildScratchSize = mtlBuildSizes.buildScratchBufferSize; + vkBuildSizes.updateScratchSize = mtlBuildSizes.refitScratchBufferSize; return vkBuildSizes; } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h index efa027767..1016b7d52 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h @@ -526,7 +526,10 @@ class MVKDevice : public MVKDispatchableVulkanAPIObject { uint64_t* pMaxDeviation); /** Returns a pointer to the buffer at the provided address*/ - MVKBuffer* getBufferAtAddress(uint64_t address); + MVKBuffer* getBufferAtAddress(uint64_t address); // Unsure where to place + + /** Returns whether or not the device supports acceleration structures*/ + VkAccelerationStructureCompatibilityKHR getAccelerationStructureCompatibility(const VkAccelerationStructureVersionInfoKHR* pVersionInfo); #pragma mark Object lifecycle diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index 59074a71e..5129f8c58 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -206,8 +206,7 @@ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: { // In the future we should update this to allow for more advanced features if they can be supported. auto* storageFeatures = (VkPhysicalDeviceAccelerationStructureFeaturesKHR*)next; - storageFeatures->accelerationStructure = true; - storageFeatures->accelerationStructure = false; + storageFeatures->accelerationStructure = mvkOSVersionIsAtLeast(11.0, 14.0); storageFeatures->accelerationStructureCaptureReplay = false; storageFeatures->accelerationStructureIndirectBuild = false; storageFeatures->accelerationStructureHostCommands = false; @@ -3654,6 +3653,19 @@ static uint32_t mvkGetEntryProperty(io_registry_entry_t entry, CFStringRef prope } } +VkAccelerationStructureCompatibilityKHR MVKDevice::getAccelerationStructureCompatibility(const VkAccelerationStructureVersionInfoKHR* pVersionInfo) +{ + VkAccelerationStructureCompatibilityKHR compat = VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR; + + if(_enabledAccelerationStructureFeatures.accelerationStructure) + { + compat = VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR; + } + + return compat; +} + + #pragma mark Object lifecycle uint32_t MVKDevice::getVulkanMemoryTypeIndex(MTLStorageMode mtlStorageMode) { diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceFeatureStructs.def b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceFeatureStructs.def index c0bbb4816..1bc0acfff 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceFeatureStructs.def +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceFeatureStructs.def @@ -60,6 +60,7 @@ MVK_DEVICE_FEATURE(TimelineSemaphore, TIMELINE_SEMAPHORE, MVK_DEVICE_FEATURE(UniformBufferStandardLayout, UNIFORM_BUFFER_STANDARD_LAYOUT, 1) MVK_DEVICE_FEATURE(VariablePointer, VARIABLE_POINTER, 2) MVK_DEVICE_FEATURE(VulkanMemoryModel, VULKAN_MEMORY_MODEL, 3) +MVK_DEVICE_FEATURE_EXTN(AccelerationStructure, ACCELERATION_STRUCTURE, KHR, 5) MVK_DEVICE_FEATURE_EXTN(FragmentShaderBarycentric, FRAGMENT_SHADER_BARYCENTRIC, KHR, 1) MVK_DEVICE_FEATURE_EXTN(PortabilitySubset, PORTABILITY_SUBSET, KHR, 15) MVK_DEVICE_FEATURE_EXTN(4444Formats, 4444_FORMATS, EXT, 2) diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm index ecae600f7..2926aafc1 100644 --- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm +++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm @@ -2685,6 +2685,17 @@ MVK_PUBLIC_VULKAN_SYMBOL void vkCmdCopyAccelerationStructureKHR( MVKTraceVulkanCallEnd(); } +MVK_PUBLIC_VULKAN_SYMBOL void vkGetDeviceAccelerationStructureCompatibilityKHR( + VkDevice device, + const VkAccelerationStructureVersionInfoKHR* pVersionInfo, + VkAccelerationStructureCompatibilityKHR* pCompatibility) { + + MVKTraceVulkanCallStart(); + MVKDevice* mvkDev = (MVKDevice*)device; + *pCompatibility = mvkDev->getAccelerationStructureCompatibility(pVersionInfo); + MVKTraceVulkanCallEnd(); +} + #pragma mark - #pragma mark VK_KHR_bind_memory2 extension