From e2dd19e542cee8634aaf1376ba0272c41a89dc2d Mon Sep 17 00:00:00 2001 From: azhirnov Date: Wed, 25 Nov 2020 22:28:38 +0300 Subject: Disable validation layers if they are not compatible with headers, fixed compilation on iOS --- .../include/VulkanUtilities/VulkanInstance.hpp | 2 +- .../VulkanUtilities/VulkanLogicalDevice.hpp | 2 ++ .../src/BottomLevelASVkImpl.cpp | 2 +- .../GraphicsEngineVulkan/src/TopLevelASVkImpl.cpp | 2 +- .../src/VulkanUtilities/VulkanInstance.cpp | 23 +++++++++++++++++----- .../src/VulkanUtilities/VulkanLogicalDevice.cpp | 10 ++++++++++ 6 files changed, 33 insertions(+), 8 deletions(-) (limited to 'Graphics/GraphicsEngineVulkan') diff --git a/Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanInstance.hpp b/Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanInstance.hpp index c28be56c..e2bb7ad8 100644 --- a/Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanInstance.hpp +++ b/Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanInstance.hpp @@ -62,7 +62,7 @@ public: } // clang-format off - bool IsLayerAvailable (const char* LayerName) const; + bool IsLayerAvailable (const char* LayerName, uint32_t& Version) const; bool IsExtensionAvailable(const char* ExtensionName)const; bool IsExtensionEnabled (const char* ExtensionName)const; diff --git a/Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanLogicalDevice.hpp b/Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanLogicalDevice.hpp index 0e309eff..6d2d827c 100644 --- a/Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanLogicalDevice.hpp +++ b/Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanLogicalDevice.hpp @@ -216,6 +216,8 @@ public: dataSize, pData, stride, flags); } + void GetAccelerationStructureBuildSizes(const VkAccelerationStructureBuildGeometryInfoKHR& BuildInfo, const uint32_t* pMaxPrimitiveCounts, VkAccelerationStructureBuildSizesInfoKHR& SizeInfo) const; + VkResult GetRayTracingShaderGroupHandles(VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void* pData) const; VkPipelineStageFlags GetEnabledShaderStages() const { return m_EnabledShaderStages; } diff --git a/Graphics/GraphicsEngineVulkan/src/BottomLevelASVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/BottomLevelASVkImpl.cpp index ffe1eb02..19253b1f 100644 --- a/Graphics/GraphicsEngineVulkan/src/BottomLevelASVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/BottomLevelASVkImpl.cpp @@ -112,7 +112,7 @@ BottomLevelASVkImpl::BottomLevelASVkImpl(IReferenceCounters* pRefCounters, VERIFY_EXPR(vkBuildInfo.geometryCount <= Limits.maxGeometryCount); - vkGetAccelerationStructureBuildSizesKHR(LogicalDevice.GetVkDevice(), VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &vkBuildInfo, MaxPrimitiveCounts.data(), &vkSizeInfo); + LogicalDevice.GetAccelerationStructureBuildSizes(vkBuildInfo, MaxPrimitiveCounts.data(), vkSizeInfo); AccelStructSize = static_cast(vkSizeInfo.accelerationStructureSize); m_ScratchSize.Build = static_cast(vkSizeInfo.buildScratchSize); diff --git a/Graphics/GraphicsEngineVulkan/src/TopLevelASVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/TopLevelASVkImpl.cpp index d4c771ec..03724a8a 100644 --- a/Graphics/GraphicsEngineVulkan/src/TopLevelASVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/TopLevelASVkImpl.cpp @@ -63,7 +63,7 @@ TopLevelASVkImpl::TopLevelASVkImpl(IReferenceCounters* pRefCounters, VERIFY_EXPR(MaxPrimitiveCount <= Limits.maxInstanceCount); - vkGetAccelerationStructureBuildSizesKHR(LogicalDevice.GetVkDevice(), VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &vkBuildInfo, &MaxPrimitiveCount, &vkSizeInfo); + LogicalDevice.GetAccelerationStructureBuildSizes(vkBuildInfo, &MaxPrimitiveCount, vkSizeInfo); AccelStructSize = static_cast(vkSizeInfo.accelerationStructureSize); m_ScratchSize.Build = static_cast(vkSizeInfo.buildScratchSize); diff --git a/Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanInstance.cpp b/Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanInstance.cpp index 405149a5..a88a5888 100644 --- a/Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanInstance.cpp +++ b/Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanInstance.cpp @@ -46,12 +46,16 @@ namespace VulkanUtilities { -bool VulkanInstance::IsLayerAvailable(const char* LayerName) const +bool VulkanInstance::IsLayerAvailable(const char* LayerName, uint32_t& Version) const { for (const auto& Layer : m_Layers) + { if (strcmp(Layer.layerName, LayerName) == 0) + { + Version = Layer.specVersion; return true; - + } + } return false; } @@ -220,11 +224,20 @@ VulkanInstance::VulkanInstance(uint32_t ApiVersion, bool ValidationLayersPresent = true; for (size_t l = 0; l < _countof(VulkanUtilities::ValidationLayerNames); ++l) { - auto* pLayerName = VulkanUtilities::ValidationLayerNames[l]; - if (!IsLayerAvailable(pLayerName)) + auto* pLayerName = VulkanUtilities::ValidationLayerNames[l]; + uint32_t LayerVer = 0; + if (!IsLayerAvailable(pLayerName, LayerVer)) + { + ValidationLayersPresent = false; + LOG_WARNING_MESSAGE("Failed to find '", pLayerName, "' layer. Validation will be disabled"); + } + if (LayerVer < VK_HEADER_VERSION_COMPLETE) { ValidationLayersPresent = false; - LOG_WARNING_MESSAGE("Failed to find ", pLayerName, " layer. Validation will be disabled"); + LOG_WARNING_MESSAGE("Layer '", pLayerName, "' version (", VK_VERSION_MAJOR(LayerVer), ".", VK_VERSION_MINOR(LayerVer), ".", VK_VERSION_PATCH(LayerVer), + ") is less than header version (", + VK_VERSION_MAJOR(VK_HEADER_VERSION_COMPLETE), ".", VK_VERSION_MINOR(VK_HEADER_VERSION_COMPLETE), ".", VK_VERSION_PATCH(VK_HEADER_VERSION_COMPLETE), + "). Validation will be disabled"); } } if (ValidationLayersPresent) diff --git a/Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanLogicalDevice.cpp b/Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanLogicalDevice.cpp index 70bdd20a..0d1534b8 100644 --- a/Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanLogicalDevice.cpp +++ b/Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanLogicalDevice.cpp @@ -504,6 +504,16 @@ VkDeviceAddress VulkanLogicalDevice::GetAccelerationStructureDeviceAddress(VkAcc #endif } +void VulkanLogicalDevice::GetAccelerationStructureBuildSizes(const VkAccelerationStructureBuildGeometryInfoKHR& BuildInfo, const uint32_t* pMaxPrimitiveCounts, VkAccelerationStructureBuildSizesInfoKHR& SizeInfo) const +{ +#if DILIGENT_USE_VOLK + vkGetAccelerationStructureBuildSizesKHR(m_VkDevice, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &BuildInfo, pMaxPrimitiveCounts, &SizeInfo); +#else + UNSUPPORTED("vkGetAccelerationStructureDeviceAddressKHR is only available through Volk"); + return VK_ERROR_FEATURE_NOT_PRESENT; +#endif +} + VkResult VulkanLogicalDevice::MapMemory(VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData) const { return vkMapMemory(m_VkDevice, memory, offset, size, flags, ppData); -- cgit v1.2.3