diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/pipebuffer/pb_buffer.h | 8 | ||||
-rw-r--r-- | src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c | 8 | ||||
-rw-r--r-- | src/gallium/winsys/svga/drm/vmw_buffer.c | 2 |
3 files changed, 14 insertions, 4 deletions
diff --git a/src/gallium/auxiliary/pipebuffer/pb_buffer.h b/src/gallium/auxiliary/pipebuffer/pb_buffer.h index bd60eba1432..9c71fc86c9c 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_buffer.h +++ b/src/gallium/auxiliary/pipebuffer/pb_buffer.h @@ -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) diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c index dd59733fe9b..c936096210a 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c @@ -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; diff --git a/src/gallium/winsys/svga/drm/vmw_buffer.c b/src/gallium/winsys/svga/drm/vmw_buffer.c index 34c5e341782..e2ddf78ed2e 100644 --- a/src/gallium/winsys/svga/drm/vmw_buffer.c +++ b/src/gallium/winsys/svga/drm/vmw_buffer.c @@ -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); |