diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index b898478d9..59a930f5e 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -175,6 +175,7 @@ private: uint32_t GPULocalMemIndex; VkPhysicalDeviceFeatures features; + VkPhysicalDeviceProperties props; VkPhysicalDeviceMemoryProperties memProps; }; @@ -216,6 +217,8 @@ private: const VkPhysicalDeviceFeatures &GetDeviceFeatures() { return m_PhysicalDeviceData.features; } + const VkPhysicalDeviceProperties &GetDeviceProps() + { return m_PhysicalDeviceData.props; } uint32_t GetReadbackMemoryIndex(uint32_t resourceRequiredBitmask); uint32_t GetUploadMemoryIndex(uint32_t resourceRequiredBitmask); diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 26466498b..ed53e4894 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -94,10 +94,12 @@ void VulkanDebugManager::GPUBuffer::Create(WrappedVulkan *driver, VkDevice dev, m_ResourceManager = driver->GetResourceManager(); + align = (VkDeviceSize)driver->GetDeviceProps().limits.minUniformBufferOffsetAlignment; + sz = size; - // offset must be 256-aligned, so ensure we have at least ringSize + // offset must be aligned, so ensure we have at least ringSize // copies accounting for that - totalsize = ringSize == 1 ? size : AlignUp(size, (VkDeviceSize)256ULL)*ringSize; + totalsize = ringSize == 1 ? size : AlignUp(size, align)*ringSize; curoffset = 0; VkBufferCreateInfo bufInfo = { @@ -175,8 +177,8 @@ void *VulkanDebugManager::GPUBuffer::Map(const VkLayerDispatchTable *vt, VkDevic offset = 0; RDCASSERT(offset + size <= totalsize); - // offset must be 256-aligned - curoffset = AlignUp(offset+size, (VkDeviceSize)256ULL); + // offset must be aligned + curoffset = AlignUp(offset+size, align); if(bindoffset) *bindoffset = (uint32_t)offset; diff --git a/renderdoc/driver/vulkan/vk_debug.h b/renderdoc/driver/vulkan/vk_debug.h index 47fb9b4e8..ed8600238 100644 --- a/renderdoc/driver/vulkan/vk_debug.h +++ b/renderdoc/driver/vulkan/vk_debug.h @@ -71,6 +71,9 @@ class VulkanDebugManager VkBuffer buf; VkDeviceMemory mem; + // uniform buffer alignment requirement + VkDeviceSize align; + // for handling ring allocations VkDeviceSize totalsize; VkDeviceSize curoffset; diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 45bea949b..c18d5fd3e 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -438,7 +438,9 @@ bool WrappedVulkan::Serialise_vkCreateDevice( GetResourceManager()->WrapResource(Unwrap(device), m_InternalCmds.m_CmdPool); } - + + ObjDisp(physicalDevice)->GetPhysicalDeviceProperties(Unwrap(physicalDevice), &m_PhysicalDeviceData.props); + ObjDisp(physicalDevice)->GetPhysicalDeviceMemoryProperties(Unwrap(physicalDevice), &m_PhysicalDeviceData.memProps); ObjDisp(physicalDevice)->GetPhysicalDeviceFeatures(Unwrap(physicalDevice), &m_PhysicalDeviceData.features); @@ -573,6 +575,8 @@ VkResult WrappedVulkan::vkCreateDevice( GetResourceManager()->WrapResource(Unwrap(device), m_InternalCmds.m_CmdPool); } + ObjDisp(physicalDevice)->GetPhysicalDeviceProperties(Unwrap(physicalDevice), &m_PhysicalDeviceData.props); + ObjDisp(physicalDevice)->GetPhysicalDeviceMemoryProperties(Unwrap(physicalDevice), &m_PhysicalDeviceData.memProps); ObjDisp(physicalDevice)->GetPhysicalDeviceFeatures(Unwrap(physicalDevice), &m_PhysicalDeviceData.features);