summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorZephyron <zephyron@citron-emu.org>2025-02-02 12:07:43 +1000
committerZephyron <zephyron@citron-emu.org>2025-02-02 12:07:43 +1000
commitcf43fd80387e0165a5ee0acf60048c403be448b9 (patch)
treedd7e79b8f05df70678b2ba9443ffb64049150f70 /src/video_core
parenta1cbcee7ab43f02750d95ef4285ff10c011e51ee (diff)
vulkan: Add 4KB memory alignment for AMD and Qualcomm drivers
Adds special handling for memory allocation size on AMD and Qualcomm (Adreno) drivers by aligning allocations to 4KB boundaries. This fixes potential memory allocation issues on these drivers where unaligned allocations may fail or cause undefined behavior. Affected drivers: - AMD Proprietary (AMDVLK) - AMD Open Source (RADV) - Qualcomm Proprietary (Adreno)
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/vulkan_common/vulkan_memory_allocator.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp
index 8f4a57e3c..d62c13f66 100644
--- a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp
+++ b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp
@@ -303,7 +303,12 @@ bool MemoryAllocator::TryAllocMemory(VkMemoryPropertyFlags flags, u32 type_mask,
vk::DeviceMemory memory = device.GetLogical().TryAllocateMemory({
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
.pNext = nullptr,
- .allocationSize = size,
+ /* AMD drivers (including Adreno) require 4KB alignment */
+ .allocationSize = (device.GetDriverID() == VK_DRIVER_ID_AMD_PROPRIETARY ||
+ device.GetDriverID() == VK_DRIVER_ID_AMD_OPEN_SOURCE ||
+ device.GetDriverID() == VK_DRIVER_ID_QUALCOMM_PROPRIETARY) ?
+ ((size + 4095) & ~4095) : /* AMD (AMDVLK, RADV, RadeonSI) & Adreno */
+ size, /* Others (NVIDIA, Intel, Mali, etc) */
.memoryTypeIndex = type,
});
if (!memory) {