From d95b49192f53eb4444560d63119de0e9b9318c60 Mon Sep 17 00:00:00 2001 From: Panagiotis Christopoulos Charitos Date: Thu, 5 Sep 2024 12:21:32 +0200 Subject: [PATCH] Increase the precision of shadows --- AnKi/Gr/Vulkan/VkGpuMemoryManager.cpp | 24 ++++++++++++++++++++++++ AnKi/Gr/Vulkan/VkGpuMemoryManager.h | 2 ++ AnKi/Gr/Vulkan/VkTexture.cpp | 15 +++------------ AnKi/Renderer/ShadowMapping.cpp | 2 +- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/AnKi/Gr/Vulkan/VkGpuMemoryManager.cpp b/AnKi/Gr/Vulkan/VkGpuMemoryManager.cpp index 2b3545508..a0aa5f99e 100644 --- a/AnKi/Gr/Vulkan/VkGpuMemoryManager.cpp +++ b/AnKi/Gr/Vulkan/VkGpuMemoryManager.cpp @@ -303,4 +303,28 @@ void GpuMemoryManager::updateStats() const g_deviceMemoryAllocationCountStatVar.increment(m_dedicatedAllocationCount.load()); } +void GpuMemoryManager::getImageMemoryRequirements(VkImage image, VkMemoryDedicatedRequirementsKHR& dedicatedRequirements, + VkMemoryRequirements2& requirements) +{ + dedicatedRequirements = {}; + dedicatedRequirements.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR; + + requirements = {}; + requirements.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2; + requirements.pNext = &dedicatedRequirements; + + VkImageMemoryRequirementsInfo2 imageRequirements = {}; + imageRequirements.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2; + imageRequirements.image = image; + + vkGetImageMemoryRequirements2(getVkDevice(), &imageRequirements, &requirements); + + if(requirements.memoryRequirements.size > kClasses.getBack().m_chunkSize) + { + // Allocation to big, force a dedicated allocation + dedicatedRequirements.prefersDedicatedAllocation = true; + dedicatedRequirements.requiresDedicatedAllocation = true; + } +} + } // end namespace anki diff --git a/AnKi/Gr/Vulkan/VkGpuMemoryManager.h b/AnKi/Gr/Vulkan/VkGpuMemoryManager.h index d1c5297f6..2d917a8ac 100644 --- a/AnKi/Gr/Vulkan/VkGpuMemoryManager.h +++ b/AnKi/Gr/Vulkan/VkGpuMemoryManager.h @@ -124,6 +124,8 @@ class GpuMemoryManager : public MakeSingleton GpuMemoryManager& operator=(const GpuMemoryManager&) = delete; // Non-copyable + void getImageMemoryRequirements(VkImage image, VkMemoryDedicatedRequirementsKHR& dedicatedRequirements, VkMemoryRequirements2& requirements); + /// Allocate memory. void allocateMemory(U32 memTypeIdx, PtrSize size, U32 alignment, GpuMemoryHandle& handle); diff --git a/AnKi/Gr/Vulkan/VkTexture.cpp b/AnKi/Gr/Vulkan/VkTexture.cpp index b8d699a18..b136f5f98 100644 --- a/AnKi/Gr/Vulkan/VkTexture.cpp +++ b/AnKi/Gr/Vulkan/VkTexture.cpp @@ -256,18 +256,9 @@ Error TextureImpl::initImage(const TextureInitInfo& init) // Allocate memory // - VkMemoryDedicatedRequirementsKHR dedicatedRequirements = {}; - dedicatedRequirements.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR; - - VkMemoryRequirements2 requirements = {}; - requirements.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2; - requirements.pNext = &dedicatedRequirements; - - VkImageMemoryRequirementsInfo2 imageRequirementsInfo = {}; - imageRequirementsInfo.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2; - imageRequirementsInfo.image = m_imageHandle; - - vkGetImageMemoryRequirements2(getVkDevice(), &imageRequirementsInfo, &requirements); + VkMemoryDedicatedRequirementsKHR dedicatedRequirements; + VkMemoryRequirements2 requirements; + GpuMemoryManager::getSingleton().getImageMemoryRequirements(m_imageHandle, dedicatedRequirements, requirements); U32 memIdx = GpuMemoryManager::getSingleton().findMemoryType(requirements.memoryRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); diff --git a/AnKi/Renderer/ShadowMapping.cpp b/AnKi/Renderer/ShadowMapping.cpp index 52fea2fed..37efc6743 100644 --- a/AnKi/Renderer/ShadowMapping.cpp +++ b/AnKi/Renderer/ShadowMapping.cpp @@ -90,7 +90,7 @@ Error ShadowMapping::initInternal() // RT const TextureUsageBit usage = TextureUsageBit::kSrvPixel | TextureUsageBit::kSrvCompute | TextureUsageBit::kAllRtvDsv; TextureInitInfo texinit = getRenderer().create2DRenderTargetInitInfo( - m_tileResolution * m_tileCountBothAxis, m_tileResolution * m_tileCountBothAxis, Format::kD16_Unorm, usage, "ShadowAtlas"); + m_tileResolution * m_tileCountBothAxis, m_tileResolution * m_tileCountBothAxis, Format::kD32_Sfloat, usage, "ShadowAtlas"); ClearValue clearVal; clearVal.m_colorf[0] = 1.0f; m_atlasTex = getRenderer().createAndClearRenderTarget(texinit, TextureUsageBit::kSrvPixel, clearVal);