pvr: support VK_EXT_map_memory_placed.memoryUnmapReserve
Signed-off-by: Simon Perretta <simon.perretta@imgtec.com> Reviewed-by: Frank Binns <frank.binns@imgtec.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37726>
This commit is contained in:
committed by
Marge Bot
parent
733444aaec
commit
d62fdc0a2e
@@ -390,7 +390,7 @@ err_heap_free:
|
||||
|
||||
err_buffer_unmap:
|
||||
if (flags & PVR_BO_ALLOC_FLAG_CPU_MAPPED)
|
||||
device->ws->ops->buffer_unmap(pvr_bo->bo);
|
||||
device->ws->ops->buffer_unmap(pvr_bo->bo, false);
|
||||
|
||||
err_buffer_destroy:
|
||||
device->ws->ops->buffer_destroy(pvr_bo->bo);
|
||||
@@ -455,7 +455,7 @@ void pvr_bo_cpu_unmap(struct pvr_device *device, struct pvr_bo *pvr_bo)
|
||||
}
|
||||
#endif /* defined(HAVE_VALGRIND) */
|
||||
|
||||
device->ws->ops->buffer_unmap(bo);
|
||||
device->ws->ops->buffer_unmap(bo, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -484,7 +484,7 @@ void pvr_bo_free(struct pvr_device *device, struct pvr_bo *pvr_bo)
|
||||
device->ws->ops->heap_free(pvr_bo->vma);
|
||||
|
||||
if (pvr_bo->bo->map)
|
||||
device->ws->ops->buffer_unmap(pvr_bo->bo);
|
||||
device->ws->ops->buffer_unmap(pvr_bo->bo, false);
|
||||
|
||||
device->ws->ops->buffer_destroy(pvr_bo->bo);
|
||||
|
||||
|
||||
@@ -461,7 +461,7 @@ static void pvr_physical_device_get_supported_features(
|
||||
/* VK_EXT_map_memory_placed */
|
||||
.memoryMapPlaced = true,
|
||||
.memoryMapRangePlaced = false,
|
||||
.memoryUnmapReserve = false,
|
||||
.memoryUnmapReserve = true,
|
||||
|
||||
/* Vulkan 1.3 / VK_EXT_private_data */
|
||||
.privateData = true,
|
||||
@@ -2761,7 +2761,7 @@ void pvr_FreeMemory(VkDevice _device,
|
||||
* unmapped.
|
||||
*/
|
||||
if (mem->bo->map)
|
||||
device->ws->ops->buffer_unmap(mem->bo);
|
||||
device->ws->ops->buffer_unmap(mem->bo, false);
|
||||
|
||||
device->ws->ops->buffer_destroy(mem->bo);
|
||||
|
||||
@@ -2835,8 +2835,11 @@ VkResult pvr_UnmapMemory2(VkDevice _device,
|
||||
VK_FROM_HANDLE(pvr_device, device, _device);
|
||||
VK_FROM_HANDLE(pvr_device_memory, mem, pMemoryUnmapInfo->memory);
|
||||
|
||||
if (mem && mem->bo->map)
|
||||
device->ws->ops->buffer_unmap(mem->bo);
|
||||
if (mem && mem->bo->map) {
|
||||
bool reserve =
|
||||
!!(pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT);
|
||||
return device->ws->ops->buffer_unmap(mem->bo, reserve);
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -334,19 +334,22 @@ err_out:
|
||||
return result;
|
||||
}
|
||||
|
||||
void pvr_drm_winsys_buffer_unmap(struct pvr_winsys_bo *bo)
|
||||
VkResult pvr_drm_winsys_buffer_unmap(struct pvr_winsys_bo *bo, bool reserve)
|
||||
{
|
||||
struct pvr_drm_winsys_bo *drm_bo = to_pvr_drm_winsys_bo(bo);
|
||||
VkResult result;
|
||||
|
||||
assert(bo->map);
|
||||
|
||||
pvr_munmap(bo->map, bo->size);
|
||||
result = pvr_munmap(bo->map, bo->size, reserve);
|
||||
|
||||
VG(VALGRIND_FREELIKE_BLOCK(bo->map, 0));
|
||||
|
||||
bo->map = NULL;
|
||||
|
||||
pvr_drm_buffer_release(drm_bo);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* This function must be used to allocate from a heap carveout and must only be
|
||||
|
||||
@@ -67,8 +67,8 @@ void pvr_drm_winsys_buffer_destroy(struct pvr_winsys_bo *bo);
|
||||
VkResult pvr_drm_winsys_buffer_get_fd(struct pvr_winsys_bo *bo,
|
||||
int *const fd_out);
|
||||
|
||||
VkResult pvr_drm_winsys_buffer_map(struct pvr_winsys_bo *bo);
|
||||
void pvr_drm_winsys_buffer_unmap(struct pvr_winsys_bo *bo);
|
||||
VkResult pvr_drm_winsys_buffer_map(struct pvr_winsys_bo *bo, void *addr);
|
||||
VkResult pvr_drm_winsys_buffer_unmap(struct pvr_winsys_bo *bo, bool reserve);
|
||||
|
||||
VkResult pvr_drm_heap_alloc_carveout(struct pvr_winsys_heap *const heap,
|
||||
const pvr_dev_addr_t carveout_dev_addr,
|
||||
|
||||
@@ -370,7 +370,7 @@ struct pvr_winsys_ops {
|
||||
VkResult (*buffer_get_fd)(struct pvr_winsys_bo *bo, int *const fd_out);
|
||||
|
||||
VkResult (*buffer_map)(struct pvr_winsys_bo *bo, void *addr);
|
||||
void (*buffer_unmap)(struct pvr_winsys_bo *bo);
|
||||
VkResult (*buffer_unmap)(struct pvr_winsys_bo *bo, bool reserve);
|
||||
|
||||
VkResult (*heap_alloc)(struct pvr_winsys_heap *heap,
|
||||
uint64_t size,
|
||||
|
||||
@@ -342,17 +342,17 @@ pvr_winsys_helper_fill_static_memory(struct pvr_winsys *const ws,
|
||||
pvr_setup_static_pixel_event_program(pds_vma->bo->map,
|
||||
pds_vma->heap->static_data_offsets.eot);
|
||||
|
||||
ws->ops->buffer_unmap(usc_vma->bo);
|
||||
ws->ops->buffer_unmap(pds_vma->bo);
|
||||
ws->ops->buffer_unmap(general_vma->bo);
|
||||
ws->ops->buffer_unmap(usc_vma->bo, false);
|
||||
ws->ops->buffer_unmap(pds_vma->bo, false);
|
||||
ws->ops->buffer_unmap(general_vma->bo, false);
|
||||
|
||||
return VK_SUCCESS;
|
||||
|
||||
err_pvr_srv_winsys_buffer_unmap_pds:
|
||||
ws->ops->buffer_unmap(pds_vma->bo);
|
||||
ws->ops->buffer_unmap(pds_vma->bo, false);
|
||||
|
||||
err_pvr_srv_winsys_buffer_unmap_general:
|
||||
ws->ops->buffer_unmap(general_vma->bo);
|
||||
ws->ops->buffer_unmap(general_vma->bo, false);
|
||||
|
||||
err_out:
|
||||
return result;
|
||||
|
||||
@@ -108,8 +108,29 @@ static inline VkResult pvr_mmap(void *addr,
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
static inline VkResult pvr_munmap(void *const addr, const size_t len)
|
||||
static inline VkResult
|
||||
pvr_munmap(void *const addr, const size_t len, bool reserve)
|
||||
{
|
||||
if (reserve) {
|
||||
void *ret = mmap(addr,
|
||||
len,
|
||||
PROT_NONE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
|
||||
-1,
|
||||
0);
|
||||
|
||||
if (ret == MAP_FAILED) {
|
||||
const int err = errno;
|
||||
return vk_errorf(NULL,
|
||||
VK_ERROR_UNKNOWN,
|
||||
"mmap(reserve) failed (errno %d: %s)",
|
||||
err,
|
||||
strerror(err));
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
const int ret = munmap(addr, len);
|
||||
if (ret) {
|
||||
const int err = errno;
|
||||
|
||||
@@ -329,9 +329,10 @@ VkResult pvr_srv_winsys_buffer_map(struct pvr_winsys_bo *bo, void *addr)
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
void pvr_srv_winsys_buffer_unmap(struct pvr_winsys_bo *bo)
|
||||
VkResult pvr_srv_winsys_buffer_unmap(struct pvr_winsys_bo *bo, bool reserve)
|
||||
{
|
||||
struct pvr_srv_winsys_bo *srv_bo = to_pvr_srv_winsys_bo(bo);
|
||||
VkResult result;
|
||||
|
||||
/* output error if trying to unmap memory that is not previously mapped */
|
||||
assert(bo->map);
|
||||
@@ -339,11 +340,13 @@ void pvr_srv_winsys_buffer_unmap(struct pvr_winsys_bo *bo)
|
||||
VG(VALGRIND_FREELIKE_BLOCK(bo->map, 0));
|
||||
|
||||
/* Unmap the whole PMR from CPU space */
|
||||
pvr_munmap(bo->map, bo->size);
|
||||
result = pvr_munmap(bo->map, bo->size, reserve);
|
||||
|
||||
bo->map = NULL;
|
||||
|
||||
buffer_release(srv_bo);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* This function must be used to allocate from a heap carveout and must only be
|
||||
|
||||
@@ -155,8 +155,8 @@ void pvr_srv_winsys_buffer_destroy(struct pvr_winsys_bo *bo);
|
||||
VkResult pvr_srv_winsys_buffer_get_fd(struct pvr_winsys_bo *bo,
|
||||
int *const fd_out);
|
||||
|
||||
VkResult pvr_srv_winsys_buffer_map(struct pvr_winsys_bo *bo);
|
||||
void pvr_srv_winsys_buffer_unmap(struct pvr_winsys_bo *bo);
|
||||
VkResult pvr_srv_winsys_buffer_map(struct pvr_winsys_bo *bo, void *addr);
|
||||
VkResult pvr_srv_winsys_buffer_unmap(struct pvr_winsys_bo *bo, bool reserve);
|
||||
|
||||
VkResult pvr_srv_heap_alloc_carveout(struct pvr_winsys_heap *heap,
|
||||
const pvr_dev_addr_t carveout_dev_addr,
|
||||
|
||||
Reference in New Issue
Block a user