From a32eb87a5dbfab320f3d24c5d94505b11a66e3dc Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Thu, 24 Jul 2025 21:01:49 +0000 Subject: [PATCH] panvk: Implement Flush/InvalidateMappedMemoryRanges() Reviewed-by: Boris Brezillon Reviewed-by: Christoph Pillmayer Part-of: --- src/panfrost/vulkan/panvk_device_memory.c | 35 +++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/panfrost/vulkan/panvk_device_memory.c b/src/panfrost/vulkan/panvk_device_memory.c index 66dc87b1367..32d621f2fcd 100644 --- a/src/panfrost/vulkan/panvk_device_memory.c +++ b/src/panfrost/vulkan/panvk_device_memory.c @@ -323,18 +323,49 @@ panvk_UnmapMemory2KHR(VkDevice _device, return VK_SUCCESS; } +static VkResult +sync_memory_ranges(struct panvk_device *device, uint32_t memoryRangeCount, + const VkMappedMemoryRange *pMemoryRanges, + enum pan_kmod_bo_sync_type type) +{ + for (uint32_t i = 0; i < memoryRangeCount; i++) { + const VkMappedMemoryRange *r = &pMemoryRanges[i]; + if (r->size == 0) + continue; + + VK_FROM_HANDLE(panvk_device_memory, memory, r->memory); + + pan_kmod_queue_bo_map_sync( + memory->bo, r->offset, (char *)memory->addr.host + r->offset, + vk_device_memory_range(&memory->vk, r->offset, r->size), type); + } + + return VK_SUCCESS; +} + VKAPI_ATTR VkResult VKAPI_CALL panvk_FlushMappedMemoryRanges(VkDevice _device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) { - return VK_SUCCESS; + VK_FROM_HANDLE(panvk_device, device, _device); + + return sync_memory_ranges(device, memoryRangeCount, pMemoryRanges, + PAN_KMOD_BO_SYNC_CPU_CACHE_FLUSH); } VKAPI_ATTR VkResult VKAPI_CALL panvk_InvalidateMappedMemoryRanges(VkDevice _device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) { - return VK_SUCCESS; + VK_FROM_HANDLE(panvk_device, device, _device); + VkResult result = + sync_memory_ranges(device, memoryRangeCount, pMemoryRanges, + PAN_KMOD_BO_SYNC_CPU_CACHE_FLUSH_AND_INVALIDATE); + + if (result == VK_SUCCESS) + pan_kmod_flush_bo_map_syncs(device->kmod.dev); + + return result; } VKAPI_ATTR VkResult VKAPI_CALL