gallium/pipebuffer: Use persistent maps for slabs

Instead of the ugly practice of relying on the provider caching maps,
introduce and use persistent pipebuffer maps. Providers that can't handle
persistent maps can't use the slab manager.

The only current user is the svga drm winsys which always maps
persistently.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4804>
This commit is contained in:
Thomas Hellstrom 2020-04-22 13:27:35 +02:00 committed by Marge Bot
parent e4e1a0ac13
commit 422148de52
3 changed files with 14 additions and 4 deletions

View File

@ -66,6 +66,11 @@ enum pb_usage_flags {
PB_USAGE_GPU_WRITE = (1 << 3),
PB_USAGE_DONTBLOCK = (1 << 9),
PB_USAGE_UNSYNCHRONIZED = (1 << 10),
/* Persistent mappings may remain across a flush. Note that contrary
* to OpenGL persistent maps, there is no requirement at the pipebuffer
* api level to explicitly enforce coherency by barriers or range flushes.
*/
PB_USAGE_PERSISTENT = (1 << 13)
};
/* For error checking elsewhere */
@ -74,7 +79,8 @@ enum pb_usage_flags {
PB_USAGE_GPU_READ | \
PB_USAGE_GPU_WRITE | \
PB_USAGE_DONTBLOCK | \
PB_USAGE_UNSYNCHRONIZED)
PB_USAGE_UNSYNCHRONIZED | \
PB_USAGE_PERSISTENT)
#define PB_USAGE_CPU_READ_WRITE (PB_USAGE_CPU_READ | PB_USAGE_CPU_WRITE)
#define PB_USAGE_GPU_READ_WRITE (PB_USAGE_GPU_READ | PB_USAGE_GPU_WRITE)

View File

@ -215,6 +215,7 @@ pb_slab_buffer_destroy(struct pb_buffer *_buf)
if (slab->numFree == slab->numBuffers) {
list = &slab->head;
list_delinit(list);
pb_unmap(slab->bo);
pb_reference(&slab->bo, NULL);
FREE(slab->buffers);
FREE(slab);
@ -315,15 +316,16 @@ pb_slab_create(struct pb_slab_manager *mgr)
}
/* Note down the slab virtual address. All mappings are accessed directly
* through this address so it is required that the buffer is pinned. */
* through this address so it is required that the buffer is mapped
* persistent */
slab->virtual = pb_map(slab->bo,
PB_USAGE_CPU_READ |
PB_USAGE_CPU_WRITE, NULL);
PB_USAGE_CPU_WRITE |
PB_USAGE_PERSISTENT, NULL);
if(!slab->virtual) {
ret = PIPE_ERROR_OUT_OF_MEMORY;
goto out_err1;
}
pb_unmap(slab->bo);
numBuffers = slab->bo->size / mgr->bufSize;

View File

@ -364,6 +364,8 @@ vmw_svga_winsys_buffer_map(struct svga_winsys_screen *sws,
(unsigned) PIPE_TRANSFER_DONTBLOCK);
STATIC_ASSERT((unsigned) PB_USAGE_UNSYNCHRONIZED ==
(unsigned) PIPE_TRANSFER_UNSYNCHRONIZED);
STATIC_ASSERT((unsigned) PB_USAGE_PERSISTENT ==
(unsigned) PIPE_TRANSFER_PERSISTENT);
map = pb_map(vmw_pb_buffer(buf), flags & PB_USAGE_ALL, NULL);