From 1e8465f1cc55fcf491eda0307c757e2e1b9f9d9e Mon Sep 17 00:00:00 2001 From: jiaweig Date: Fri, 25 Jun 2021 14:17:17 -0700 Subject: [PATCH] address comments Signed-off-by: John --- Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp | 17 ++++++++++------- Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.h | 4 +++- .../Vulkan/Code/Source/RHI/PhysicalDevice.cpp | 8 ++++++++ .../RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h | 1 + 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp index 213f8f332f..0f3d8fa5e5 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp @@ -787,21 +787,25 @@ namespace AZ return *m_nullDescriptorManager; } - VkBufferUsageFlags Device::ValidateBufferUsageFlagsByFeatures(const VkBufferUsageFlags& bufferUsageFlags) const + VkBufferUsageFlags Device::GetBufferUsageFlagBitsUnderRestrictions(RHI::BufferBindFlags bindFlags) const { + VkBufferUsageFlags bufferUsageFlags = GetBufferUsageFlagBits(bindFlags); + const auto& physicalDevice = static_cast(GetPhysicalDevice()); - VkBufferUsageFlags result = bufferUsageFlags; + // VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT require bufferDeviceAddress enabled. if (!physicalDevice.GetPhysicalDeviceBufferDeviceAddressFeatures().bufferDeviceAddress) { - result &= ~VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; + bufferUsageFlags &= ~VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; } + // VK_KHR_acceleration_structure provides VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR + // Otherwise unrecognized flag. if (!physicalDevice.IsOptionalDeviceExtensionSupported(OptionalDeviceExtension::AccelerationStructure)) { - result &= ~VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR; + bufferUsageFlags &= ~VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR; } - return result; + return bufferUsageFlags; } VkBuffer Device::CreateBufferResouce(const RHI::BufferDescriptor& descriptor) const @@ -814,8 +818,7 @@ namespace AZ createInfo.pNext = nullptr; createInfo.flags = 0; createInfo.size = descriptor.m_byteCount; - createInfo.usage = GetBufferUsageFlagBits(descriptor.m_bindFlags); - createInfo.usage = ValidateBufferUsageFlagsByFeatures(createInfo.usage); + createInfo.usage = GetBufferUsageFlagBitsUnderRestrictions(descriptor.m_bindFlags); // Trying to guess here if the buffers are going to be used as attachments. Maybe it would be better to add an explicit flag in the descriptor. createInfo.sharingMode = RHI::CheckBitsAny( diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.h index 94e78afc0c..234f87e8e9 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.h @@ -149,7 +149,9 @@ namespace AZ template RHI::Ptr AcquireObjectFromCache(ObjectCache& cache, const size_t hash, Args... args); - VkBufferUsageFlags ValidateBufferUsageFlagsByFeatures(const VkBufferUsageFlags& bufferUsageFlags) const; + //! Get the vulkan buffer usage flags from buffer bind flags. + //! Flags will be corrected if required features or extensions are not enabled. + VkBufferUsageFlags GetBufferUsageFlagBitsUnderRestrictions(RHI::BufferBindFlags bindFlags) const; VkDevice m_nativeDevice = VK_NULL_HANDLE; VkPhysicalDeviceFeatures m_enabledDeviceFeatures{}; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.cpp index e597ef30b8..c391a15006 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.cpp @@ -266,12 +266,20 @@ namespace AZ VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME } }; + uint32_t optionalExtensionCount = sizeof(optionalExtensions) / sizeof(VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME); + + AZ_Assert(optionalExtensionCount == static_cast(OptionalDeviceExtension::Count), "The order and size must match the enum OptionalDeviceExtensions."); + + // Optional device extensions are filtered based on what the device support. + // It returns in the same order as in the original list. StringList deviceExtensions = GetDeviceExtensionNames(); RawStringList filteredOptionalExtensions = FilterList(optionalExtensions, deviceExtensions); + // Mark the supported optional extensions in the bitset for faster look up compared to string search. uint32_t originalIndex = 0; for (const auto& extension : filteredOptionalExtensions) { + AZ_Assert(originalIndex < optionalExtensionCount, "Out of range index. Check FilterList algorithm if list is returned in the original order."); while (strcmp(extension, optionalExtensions[originalIndex]) != 0) { ++originalIndex; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h index 0b84f42e0d..7a06e08e56 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h @@ -92,6 +92,7 @@ namespace AZ StringList GetDeviceExtensionNames(const char* layerName = nullptr) const; bool IsFormatSupported(RHI::Format format, VkImageTiling tiling, VkFormatFeatureFlags features) const; void LoadSupportedFeatures(); + //! Filter optional extensions based on what the physics device support. RawStringList FilterSupportedOptionalExtensions(); void CompileMemoryStatistics(RHI::MemoryStatisticsBuilder& builder) const;