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 <alyssa.rosenzweig@collabora.com>
This commit is contained in:
@@ -38,7 +38,7 @@
|
|||||||
#include "pan_util.h"
|
#include "pan_util.h"
|
||||||
#include "pandecode/decode.h"
|
#include "pandecode/decode.h"
|
||||||
|
|
||||||
static void
|
void
|
||||||
panfrost_drm_mmap_bo(struct panfrost_screen *screen, struct panfrost_bo *bo)
|
panfrost_drm_mmap_bo(struct panfrost_screen *screen, struct panfrost_bo *bo)
|
||||||
{
|
{
|
||||||
struct drm_panfrost_mmap_bo mmap_bo = { .handle = bo->gem_handle };
|
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
|
* never map since we don't care about their contents; they're purely
|
||||||
* for GPU-internal use. */
|
* for GPU-internal use. */
|
||||||
|
|
||||||
if (!(flags & PAN_ALLOCATE_INVISIBLE))
|
if (!(flags & (PAN_ALLOCATE_INVISIBLE | PAN_ALLOCATE_DELAY_MMAP)))
|
||||||
panfrost_drm_mmap_bo(screen, bo);
|
panfrost_drm_mmap_bo(screen, bo);
|
||||||
|
|
||||||
pipe_reference_init(&bo->reference, 1);
|
pipe_reference_init(&bo->reference, 1);
|
||||||
|
@@ -390,7 +390,10 @@ panfrost_resource_create_bo(struct panfrost_screen *screen, struct panfrost_reso
|
|||||||
size_t bo_size;
|
size_t bo_size;
|
||||||
|
|
||||||
panfrost_setup_slices(pres, &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 *
|
static struct pipe_resource *
|
||||||
@@ -483,6 +486,13 @@ panfrost_transfer_map(struct pipe_context *pctx,
|
|||||||
|
|
||||||
*out_transfer = &transfer->base;
|
*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,
|
/* Check if we're bound for rendering and this is a read pixels. If so,
|
||||||
* we need to flush */
|
* we need to flush */
|
||||||
|
|
||||||
|
@@ -135,6 +135,8 @@ struct panfrost_bo *
|
|||||||
panfrost_drm_create_bo(struct panfrost_screen *screen, size_t size,
|
panfrost_drm_create_bo(struct panfrost_screen *screen, size_t size,
|
||||||
uint32_t flags);
|
uint32_t flags);
|
||||||
void
|
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);
|
panfrost_drm_release_bo(struct panfrost_screen *screen, struct panfrost_bo *bo);
|
||||||
struct panfrost_bo *
|
struct panfrost_bo *
|
||||||
panfrost_drm_import_bo(struct panfrost_screen *screen, int fd);
|
panfrost_drm_import_bo(struct panfrost_screen *screen, int fd);
|
||||||
|
Reference in New Issue
Block a user