summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/panfrost/pan_drm.c4
-rw-r--r--src/gallium/drivers/panfrost/pan_resource.c12
-rw-r--r--src/gallium/drivers/panfrost/pan_screen.h2
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);