From 8dcfbcde520ab0d39af5ee350ec728ae32fb194a Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Fri, 3 Oct 2025 11:01:41 +0100 Subject: [PATCH] pvr: support VK_KHR_map_memory2 Signed-off-by: Simon Perretta Reviewed-by: Frank Binns Part-of: --- docs/features.txt | 2 +- docs/relnotes/new_features.txt | 1 + src/imagination/vulkan/pvr_device.c | 66 +++++++++++++++++------------ src/imagination/vulkan/pvr_device.h | 5 ++- 4 files changed, 43 insertions(+), 31 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index aa6321718ee..d1abd80080f 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -521,7 +521,7 @@ Vulkan 1.4 -- all DONE: anv, hk, lvp, nvk, panvk/v10+, radv/gfx8+, tu/a7xx+, vn VK_KHR_load_store_op_none DONE (anv, lvp, nvk, panvk, radv, tu, v3dv, vn) VK_KHR_maintenance5 DONE (anv, lvp, nvk, panvk/v10+, radv, tu, v3dv, vn) VK_KHR_maintenance6 DONE (anv, lvp, nvk, panvk/v10+, radv, tu, vn) - VK_KHR_map_memory2 DONE (anv, lvp, nvk, panvk, radv, tu, vn) + VK_KHR_map_memory2 DONE (anv, lvp, nvk, panvk, pvr, radv, tu, vn) VK_KHR_push_descriptor DONE (anv, hasvk, lvp, nvk, panvk, radv, tu, vn) VK_KHR_shader_expect_assume DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) VK_KHR_shader_float_controls2 DONE (anv, lvp, nvk, panvk/v10+, radv, tu, vn) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index 670e53eea9f..ba809dff6b9 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -80,3 +80,4 @@ VK_KHR_shader_non_semantic_info on pvr VK_KHR_shader_relaxed_extended_instruction on pvr VK_EXT_shader_replicated_composites on pvr VK_KHR_device_group_creation on pvr +VK_KHR_map_memory2 on pvr diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index 8e789546889..d4d92c687ec 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -83,6 +83,7 @@ #include "util/os_misc.h" #include "util/u_math.h" #include "vk_alloc.h" +#include "vk_device_memory.h" #include "vk_extensions.h" #include "vk_log.h" #include "vk_object.h" @@ -205,6 +206,7 @@ static void pvr_physical_device_get_supported_extensions( .KHR_maintenance1 = true, .KHR_maintenance2 = true, .KHR_maintenance3 = true, + .KHR_map_memory2 = true, .KHR_multiview = true, .KHR_present_id2 = PVR_USE_WSI_PLATFORM, .KHR_present_wait2 = PVR_USE_WSI_PLATFORM, @@ -2591,10 +2593,10 @@ VkResult pvr_AllocateMemory(VkDevice _device, if (aligned_alloc_size > mem_heap->size) return VK_ERROR_OUT_OF_DEVICE_MEMORY; - mem = vk_object_alloc(&device->vk, - pAllocator, - sizeof(*mem), - VK_OBJECT_TYPE_DEVICE_MEMORY); + mem = vk_device_memory_create(&device->vk, + pAllocateInfo, + pAllocator, + sizeof(*mem)); if (!mem) return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); @@ -2629,7 +2631,7 @@ VkResult pvr_AllocateMemory(VkDevice _device, fd_info->fd, &mem->bo); if (result != VK_SUCCESS) - goto err_vk_object_free_mem; + goto err_vk_device_memory_destroy; /* For security purposes, we reject importing the bo if it's smaller * than the requested allocation size. This prevents a malicious client @@ -2647,7 +2649,7 @@ VkResult pvr_AllocateMemory(VkDevice _device, pAllocateInfo->allocationSize, mem->bo->size); device->ws->ops->buffer_destroy(mem->bo); - goto err_vk_object_free_mem; + goto err_vk_device_memory_destroy; } /* From the Vulkan spec: @@ -2681,15 +2683,15 @@ VkResult pvr_AllocateMemory(VkDevice _device, PVR_WINSYS_BO_FLAG_CPU_ACCESS, &mem->bo); if (result != VK_SUCCESS) - goto err_vk_object_free_mem; + goto err_vk_device_memory_destroy; } *pMem = pvr_device_memory_to_handle(mem); return VK_SUCCESS; -err_vk_object_free_mem: - vk_object_free(&device->vk, pAllocator, mem); +err_vk_device_memory_destroy: + vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk); return result; } @@ -2754,18 +2756,17 @@ void pvr_FreeMemory(VkDevice _device, device->ws->ops->buffer_destroy(mem->bo); - vk_object_free(&device->vk, pAllocator, mem); + vk_device_memory_destroy(&device->vk, pAllocator, &mem->vk); } -VkResult pvr_MapMemory(VkDevice _device, - VkDeviceMemory _memory, - VkDeviceSize offset, - VkDeviceSize size, - VkMemoryMapFlags flags, - void **ppData) +VkResult pvr_MapMemory2(VkDevice _device, + const VkMemoryMapInfo *pMemoryMapInfo, + void **ppData) { VK_FROM_HANDLE(pvr_device, device, _device); - VK_FROM_HANDLE(pvr_device_memory, mem, _memory); + VK_FROM_HANDLE(pvr_device_memory, mem, pMemoryMapInfo->memory); + VkDeviceSize offset; + VkDeviceSize size; VkResult result; if (!mem) { @@ -2773,8 +2774,8 @@ VkResult pvr_MapMemory(VkDevice _device, return VK_SUCCESS; } - if (size == VK_WHOLE_SIZE) - size = mem->bo->size - offset; + offset = pMemoryMapInfo->offset; + size = vk_device_memory_range(&mem->vk, offset, pMemoryMapInfo->size); /* From the Vulkan spec version 1.0.32 docs for MapMemory: * @@ -2787,10 +2788,18 @@ VkResult pvr_MapMemory(VkDevice _device, assert(size > 0); assert(offset + size <= mem->bo->size); - /* Check if already mapped */ - if (mem->bo->map) { - *ppData = (uint8_t *)mem->bo->map + offset; - return VK_SUCCESS; + /* From the Vulkan 1.2.194 spec: + * + * "memory must not be currently host mapped" + */ + if (mem->bo->map != NULL) { + return vk_errorf(device, + VK_ERROR_MEMORY_MAP_FAILED, + "Memory object already mapped."); + } + + vk_foreach_struct_const (ext, pMemoryMapInfo->pNext) { + vk_debug_ignored_stype(ext->sType); } /* Map it all at once */ @@ -2803,15 +2812,16 @@ VkResult pvr_MapMemory(VkDevice _device, return VK_SUCCESS; } -void pvr_UnmapMemory(VkDevice _device, VkDeviceMemory _memory) +VkResult pvr_UnmapMemory2(VkDevice _device, + const VkMemoryUnmapInfo *pMemoryUnmapInfo) { VK_FROM_HANDLE(pvr_device, device, _device); - VK_FROM_HANDLE(pvr_device_memory, mem, _memory); + VK_FROM_HANDLE(pvr_device_memory, mem, pMemoryUnmapInfo->memory); - if (!mem || !mem->bo->map) - return; + if (mem && mem->bo->map) + device->ws->ops->buffer_unmap(mem->bo); - device->ws->ops->buffer_unmap(mem->bo); + return VK_SUCCESS; } VkResult pvr_FlushMappedMemoryRanges(VkDevice _device, diff --git a/src/imagination/vulkan/pvr_device.h b/src/imagination/vulkan/pvr_device.h index 29c21444009..6099bea173b 100644 --- a/src/imagination/vulkan/pvr_device.h +++ b/src/imagination/vulkan/pvr_device.h @@ -15,6 +15,7 @@ #define PVR_DEVICE_H #include "vk_device.h" +#include "vk_device_memory.h" #include "vk_instance.h" #include "vk_physical_device.h" @@ -205,7 +206,7 @@ struct pvr_device { }; struct pvr_device_memory { - struct vk_object_base base; + struct vk_device_memory vk; struct pvr_winsys_bo *bo; }; @@ -220,7 +221,7 @@ VK_DEFINE_HANDLE_CASTS(pvr_physical_device, VK_OBJECT_TYPE_PHYSICAL_DEVICE) VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_device_memory, - base, + vk.base, VkDeviceMemory, VK_OBJECT_TYPE_DEVICE_MEMORY)