X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fpanfrost%2Fpan_screen.h;h=d8ea55912b4e39421268999fd2a867a1767d8a46;hb=50fde5b20801a82bd95f14301707c32cf5df38a2;hp=3a0e544c1a639dc0cb4325cbdc6074be586a7680;hpb=1ffca961abe7d4f3dfc7884745ed9a96209c2731;p=mesa.git diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h index 3a0e544c1a6..d8ea55912b4 100644 --- a/src/gallium/drivers/panfrost/pan_screen.h +++ b/src/gallium/drivers/panfrost/pan_screen.h @@ -29,6 +29,7 @@ #ifndef PAN_SCREEN_H #define PAN_SCREEN_H +#include #include "pipe/p_screen.h" #include "pipe/p_defines.h" #include "renderonly/renderonly.h" @@ -42,6 +43,9 @@ struct panfrost_context; struct panfrost_resource; struct panfrost_screen; +/* Driver limits */ +#define PAN_MAX_CONST_BUFFERS 16 + /* Flags for allocated memory */ /* This memory region is executable */ @@ -78,13 +82,30 @@ struct panfrost_screen; #define MAX_TRANSIENT_SLABS (1024*1024 / TRANSIENT_SLAB_PAGES) +/* How many power-of-two levels in the BO cache do we want? 2^12 + * minimum chosen as it is the page size that all allocations are + * rounded to */ + +#define MIN_BO_CACHE_BUCKET (12) /* 2^12 = 4KB */ +#define MAX_BO_CACHE_BUCKET (22) /* 2^22 = 4MB */ + +/* Fencepost problem, hence the off-by-one */ +#define NR_BO_CACHE_BUCKETS (MAX_BO_CACHE_BUCKET - MIN_BO_CACHE_BUCKET + 1) + struct panfrost_screen { struct pipe_screen base; int fd; + + /* Properties of the GPU in use */ unsigned gpu_id; + bool require_sfbd; + + drmVersionPtr kernel_version; struct renderonly *ro; + pthread_mutex_t transient_lock; + /* Transient memory management is based on borrowing fixed-size slabs * off the screen (loaning them out to the batch). Dynamic array * container of panfrost_bo */ @@ -94,11 +115,13 @@ struct panfrost_screen { /* Set of free transient BOs */ BITSET_DECLARE(free_transient, MAX_TRANSIENT_SLABS); - /* While we're busy building up the job for frame N, the GPU is - * still busy executing frame N-1. So hold a reference to - * yesterjob */ - int last_fragment_flushed; - struct panfrost_job *last_job; + pthread_mutex_t bo_cache_lock; + + /* The BO cache is a set of buckets with power-of-two sizes ranging + * from 2^12 (4096, the page size) to 2^(12 + MAX_BO_CACHE_BUCKETS). + * Each bucket is a linked list of free panfrost_bo objects. */ + + struct list_head bo_cache[NR_BO_CACHE_BUCKETS]; }; static inline struct panfrost_screen * @@ -134,14 +157,13 @@ panfrost_drm_create_bo(struct panfrost_screen *screen, size_t size, 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, bool cacheable); struct panfrost_bo * panfrost_drm_import_bo(struct panfrost_screen *screen, int fd); int panfrost_drm_export_bo(struct panfrost_screen *screen, const struct panfrost_bo *bo); int -panfrost_drm_submit_vs_fs_job(struct panfrost_context *ctx, bool has_draws, - bool is_scanout); +panfrost_drm_submit_vs_fs_job(struct panfrost_context *ctx, bool has_draws); void panfrost_drm_force_flush_fragment(struct panfrost_context *ctx, struct pipe_fence_handle **fence); @@ -158,5 +180,18 @@ panfrost_drm_fence_finish(struct pipe_screen *pscreen, struct pipe_context *ctx, struct pipe_fence_handle *fence, uint64_t timeout); +struct panfrost_bo * +panfrost_bo_cache_fetch( + struct panfrost_screen *screen, + size_t size, uint32_t flags); + +bool +panfrost_bo_cache_put( + struct panfrost_screen *screen, + struct panfrost_bo *bo); + +void +panfrost_bo_cache_evict_all( + struct panfrost_screen *screen); #endif /* PAN_SCREEN_H */