mirror of https://gitlab.freedesktop.org/mesa/mesa
pvr: Add pvr_bo_cpu_map_unchanged() helper to load saved vbits on map
When HAVE_VALGRIND is set, vbits of the CPU mapping are stored when pvr_bo_cpu_unmap() is called. They can be reloaded by calling pvr_bo_cpu_map_unchanged() instead of pvr_bo_cpu_map(). The vbits are not loaded by default on every map, since they could easily have been changed by the device between the unmap/map calls. Only use pvr_bo_cpu_map_unchanged() when you can safely assume that nothing has changed in the underlying memory. When HAVE_VALGRIND is not set, pvr_bo_cpu_map_unchanged() just inlines to pvr_bo_cpu_map(). Signed-off-by: Matt Coster <matt.coster@imgtec.com> Reviewed-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18948>
This commit is contained in:
parent
d51d79b450
commit
e6b752ff62
|
@ -171,8 +171,23 @@ void *pvr_bo_cpu_map(struct pvr_device *device, struct pvr_bo *pvr_bo)
|
|||
*/
|
||||
void pvr_bo_cpu_unmap(struct pvr_device *device, struct pvr_bo *pvr_bo)
|
||||
{
|
||||
assert(pvr_bo->bo->map);
|
||||
device->ws->ops->buffer_unmap(pvr_bo->bo);
|
||||
struct pvr_winsys_bo *bo = pvr_bo->bo;
|
||||
|
||||
assert(bo->map);
|
||||
|
||||
#if defined(HAVE_VALGRIND)
|
||||
if (!bo->vbits)
|
||||
bo->vbits = vk_alloc(&device->vk.alloc,
|
||||
bo->size,
|
||||
8,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
||||
if (bo->vbits)
|
||||
VALGRIND_GET_VBITS(bo->map, bo->vbits, bo->size);
|
||||
else
|
||||
mesa_loge("Failed to alloc vbits storage; expect bad valgrind results.");
|
||||
#endif /* defined(HAVE_VALGRIND) */
|
||||
|
||||
device->ws->ops->buffer_unmap(bo);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -188,6 +203,10 @@ void pvr_bo_free(struct pvr_device *device, struct pvr_bo *pvr_bo)
|
|||
if (!pvr_bo)
|
||||
return;
|
||||
|
||||
#if defined(HAVE_VALGRIND)
|
||||
vk_free(&device->vk.alloc, pvr_bo->bo->vbits);
|
||||
#endif /* defined(HAVE_VALGRIND) */
|
||||
|
||||
device->ws->ops->vma_unmap(pvr_bo->vma);
|
||||
device->ws->ops->heap_free(pvr_bo->vma);
|
||||
|
||||
|
@ -198,3 +217,14 @@ void pvr_bo_free(struct pvr_device *device, struct pvr_bo *pvr_bo)
|
|||
|
||||
vk_free(&device->vk.alloc, pvr_bo);
|
||||
}
|
||||
|
||||
#if defined(HAVE_VALGRIND)
|
||||
void *pvr_bo_cpu_map_unchanged(struct pvr_device *device, struct pvr_bo *pvr_bo)
|
||||
{
|
||||
void *ret = pvr_bo_cpu_map(device, pvr_bo);
|
||||
if (ret)
|
||||
VALGRIND_SET_VBITS(pvr_bo->bo->map, pvr_bo->bo->vbits, pvr_bo->bo->size);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif /* defined(HAVE_VALGRIND) */
|
||||
|
|
|
@ -87,4 +87,15 @@ void *pvr_bo_cpu_map(struct pvr_device *device, struct pvr_bo *bo);
|
|||
void pvr_bo_cpu_unmap(struct pvr_device *device, struct pvr_bo *bo);
|
||||
void pvr_bo_free(struct pvr_device *device, struct pvr_bo *bo);
|
||||
|
||||
#if defined(HAVE_VALGRIND)
|
||||
void *pvr_bo_cpu_map_unchanged(struct pvr_device *device,
|
||||
struct pvr_bo *pvr_bo);
|
||||
#else /* defined(HAVE_VALGRIND) */
|
||||
static ALWAYS_INLINE void *pvr_bo_cpu_map_unchanged(struct pvr_device *device,
|
||||
struct pvr_bo *pvr_bo)
|
||||
{
|
||||
return pvr_bo_cpu_map(device, pvr_bo);
|
||||
}
|
||||
#endif /* defined(HAVE_VALGRIND) */
|
||||
|
||||
#endif /* PVR_BO_H */
|
||||
|
|
|
@ -121,6 +121,10 @@ struct pvr_winsys_bo {
|
|||
uint64_t size;
|
||||
|
||||
bool is_imported;
|
||||
|
||||
#if defined(HAVE_VALGRIND)
|
||||
char *vbits;
|
||||
#endif /* defined(HAVE_VALGRIND) */
|
||||
};
|
||||
|
||||
struct pvr_winsys_vma {
|
||||
|
|
Loading…
Reference in New Issue