From c6b59db5b43fd78beb3b371a7db6738acc2bcddd Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 12 Jul 2019 15:50:58 -0700 Subject: [PATCH] panfrost: Delay resource mmaps We use the new PAN_ALLOCATE_DELAY_MMAP flag to only map resources on-demand, which should avoid mapping FBOs. Signed-off-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_drm.c | 4 ++-- src/gallium/drivers/panfrost/pan_resource.c | 12 +++++++++++- src/gallium/drivers/panfrost/pan_screen.h | 2 ++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_drm.c b/src/gallium/drivers/panfrost/pan_drm.c index dbf95a25232..c64117ce014 100644 --- a/src/gallium/drivers/panfrost/pan_drm.c +++ b/src/gallium/drivers/panfrost/pan_drm.c @@ -38,7 +38,7 @@ #include "pan_util.h" #include "pandecode/decode.h" -static void +void panfrost_drm_mmap_bo(struct panfrost_screen *screen, struct panfrost_bo *bo) { struct drm_panfrost_mmap_bo mmap_bo = { .handle = bo->gem_handle }; @@ -112,7 +112,7 @@ panfrost_drm_create_bo(struct panfrost_screen *screen, size_t size, * never map since we don't care about their contents; they're purely * for GPU-internal use. */ - if (!(flags & PAN_ALLOCATE_INVISIBLE)) + if (!(flags & (PAN_ALLOCATE_INVISIBLE | PAN_ALLOCATE_DELAY_MMAP))) panfrost_drm_mmap_bo(screen, bo); pipe_reference_init(&bo->reference, 1); diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index 4c794798d32..cdff805ab13 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -390,7 +390,10 @@ panfrost_resource_create_bo(struct panfrost_screen *screen, struct panfrost_reso size_t bo_size; panfrost_setup_slices(pres, &bo_size); - pres->bo = panfrost_drm_create_bo(screen, bo_size, 0); + + /* We create a BO immediately but don't bother mapping, since we don't + * care to map e.g. FBOs which the CPU probably won't touch */ + pres->bo = panfrost_drm_create_bo(screen, bo_size, PAN_ALLOCATE_DELAY_MMAP); } static struct pipe_resource * @@ -483,6 +486,13 @@ panfrost_transfer_map(struct pipe_context *pctx, *out_transfer = &transfer->base; + /* If we haven't already mmaped, now's the time */ + + if (!bo->cpu) { + struct panfrost_screen *screen = pan_screen(pctx->screen); + panfrost_drm_mmap_bo(screen, bo); + } + /* Check if we're bound for rendering and this is a read pixels. If so, * we need to flush */ diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h index 026a23b4541..8a01baabaf4 100644 --- a/src/gallium/drivers/panfrost/pan_screen.h +++ b/src/gallium/drivers/panfrost/pan_screen.h @@ -135,6 +135,8 @@ struct panfrost_bo * panfrost_drm_create_bo(struct panfrost_screen *screen, size_t size, uint32_t flags); void +panfrost_drm_mmap_bo(struct panfrost_screen *screen, struct panfrost_bo *bo); +void panfrost_drm_release_bo(struct panfrost_screen *screen, struct panfrost_bo *bo); struct panfrost_bo * panfrost_drm_import_bo(struct panfrost_screen *screen, int fd); -- 2.30.2