Re: [Mesa-dev] [PATCH 09/10] winsys/radeon: use pb_cache instead of pb_cache_manager
On 06.12.2015 19:01, Marek Olšák wrote: From: Marek OlšákThis is a prerequisite for the removal of radeon_winsys_cs_handle. --- src/gallium/winsys/radeon/drm/radeon_drm_bo.c | 212 +++--- src/gallium/winsys/radeon/drm/radeon_drm_bo.h | 14 +- src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 22 +-- src/gallium/winsys/radeon/drm/radeon_drm_winsys.h | 4 +- 4 files changed, 74 insertions(+), 178 deletions(-) diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c index 4c38379..9532c77 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c ... static const struct pb_vtbl radeon_bo_vtbl = { -radeon_bo_destroy, -NULL, /* never called */ -NULL, /* never called */ -radeon_bo_validate, -radeon_bo_fence, -radeon_bo_get_base_buffer, +radeon_bo_destroy_or_cache }; I take it the other functions aren't called anymore? Perhaps this patch and #3 could use an explanation to that effect. Nicolai #ifndef RADEON_GEM_GTT_WC @@ -540,40 +490,39 @@ static const struct pb_vtbl radeon_bo_vtbl = { #define RADEON_GEM_NO_CPU_ACCESS (1 << 4) #endif -static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr, -pb_size size, -const struct pb_desc *desc) +static struct radeon_bo *radeon_create_bo(struct radeon_drm_winsys *rws, + unsigned size, unsigned alignment, + unsigned usage, + unsigned initial_domains, + unsigned flags) { -struct radeon_bomgr *mgr = radeon_bomgr(_mgr); -struct radeon_drm_winsys *rws = mgr->rws; struct radeon_bo *bo; struct drm_radeon_gem_create args; -struct radeon_bo_desc *rdesc = (struct radeon_bo_desc*)desc; int r; memset(, 0, sizeof(args)); -assert(rdesc->initial_domains); -assert((rdesc->initial_domains & +assert(initial_domains); +assert((initial_domains & ~(RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) == 0); args.size = size; -args.alignment = desc->alignment; -args.initial_domain = rdesc->initial_domains; +args.alignment = alignment; +args.initial_domain = initial_domains; args.flags = 0; -if (rdesc->flags & RADEON_FLAG_GTT_WC) +if (flags & RADEON_FLAG_GTT_WC) args.flags |= RADEON_GEM_GTT_WC; -if (rdesc->flags & RADEON_FLAG_CPU_ACCESS) +if (flags & RADEON_FLAG_CPU_ACCESS) args.flags |= RADEON_GEM_CPU_ACCESS; -if (rdesc->flags & RADEON_FLAG_NO_CPU_ACCESS) +if (flags & RADEON_FLAG_NO_CPU_ACCESS) args.flags |= RADEON_GEM_NO_CPU_ACCESS; if (drmCommandWriteRead(rws->fd, DRM_RADEON_GEM_CREATE, , sizeof(args))) { fprintf(stderr, "radeon: Failed to allocate a buffer:\n"); fprintf(stderr, "radeon:size : %d bytes\n", size); -fprintf(stderr, "radeon:alignment : %d bytes\n", desc->alignment); +fprintf(stderr, "radeon:alignment : %d bytes\n", alignment); fprintf(stderr, "radeon:domains : %d\n", args.initial_domain); fprintf(stderr, "radeon:flags : %d\n", args.flags); return NULL; @@ -584,20 +533,21 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr, return NULL; pipe_reference_init(>base.reference, 1); -bo->base.alignment = desc->alignment; -bo->base.usage = desc->usage; +bo->base.alignment = alignment; +bo->base.usage = usage; bo->base.size = size; bo->base.vtbl = _bo_vtbl; bo->rws = rws; bo->handle = args.handle; bo->va = 0; -bo->initial_domain = rdesc->initial_domains; +bo->initial_domain = initial_domains; pipe_mutex_init(bo->map_mutex); +pb_cache_init_entry(>bo_cache, >cache_entry, >base); if (rws->info.r600_virtual_address) { struct drm_radeon_gem_va va; -bo->va = radeon_bomgr_find_va(rws, size, desc->alignment); +bo->va = radeon_bomgr_find_va(rws, size, alignment); va.handle = bo->handle; va.vm_id = 0; @@ -610,7 +560,7 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr, if (r && va.operation == RADEON_VA_RESULT_ERROR) { fprintf(stderr, "radeon: Failed to allocate virtual address for buffer:\n"); fprintf(stderr, "radeon:size : %d bytes\n", size); -fprintf(stderr, "radeon:alignment : %d bytes\n", desc->alignment); +fprintf(stderr, "radeon:alignment : %d bytes\n", alignment); fprintf(stderr, "radeon:domains : %d\n", args.initial_domain);
[Mesa-dev] [PATCH 09/10] winsys/radeon: use pb_cache instead of pb_cache_manager
From: Marek OlšákThis is a prerequisite for the removal of radeon_winsys_cs_handle. --- src/gallium/winsys/radeon/drm/radeon_drm_bo.c | 212 +++--- src/gallium/winsys/radeon/drm/radeon_drm_bo.h | 14 +- src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 22 +-- src/gallium/winsys/radeon/drm/radeon_drm_winsys.h | 4 +- 4 files changed, 74 insertions(+), 178 deletions(-) diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c index 4c38379..9532c77 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c @@ -41,11 +41,8 @@ #include #include -static const struct pb_vtbl radeon_bo_vtbl; - static inline struct radeon_bo *radeon_bo(struct pb_buffer *bo) { -assert(bo->vtbl == _bo_vtbl); return (struct radeon_bo *)bo; } @@ -55,37 +52,6 @@ struct radeon_bo_va_hole { uint64_t size; }; -struct radeon_bomgr { -/* Base class. */ -struct pb_manager base; - -/* Winsys. */ -struct radeon_drm_winsys *rws; -}; - -static inline struct radeon_bomgr *radeon_bomgr(struct pb_manager *mgr) -{ -return (struct radeon_bomgr *)mgr; -} - -static struct radeon_bo *get_radeon_bo(struct pb_buffer *_buf) -{ -struct radeon_bo *bo = NULL; - -if (_buf->vtbl == _bo_vtbl) { -bo = radeon_bo(_buf); -} else { -struct pb_buffer *base_buf; -pb_size offset; -pb_get_base_buffer(_buf, _buf, ); - -if (base_buf->vtbl == _bo_vtbl) -bo = radeon_bo(base_buf); -} - -return bo; -} - static bool radeon_bo_is_busy(struct radeon_bo *bo) { struct drm_radeon_gem_busy args = {0}; @@ -107,7 +73,7 @@ static void radeon_bo_wait_idle(struct radeon_bo *bo) static bool radeon_bo_wait(struct pb_buffer *_buf, uint64_t timeout, enum radeon_bo_usage usage) { -struct radeon_bo *bo = get_radeon_bo(_buf); +struct radeon_bo *bo = radeon_bo(_buf); int64_t abs_timeout; /* No timeout. Just query. */ @@ -296,7 +262,7 @@ out: pipe_mutex_unlock(rws->bo_va_mutex); } -static void radeon_bo_destroy(struct pb_buffer *_buf) +void radeon_bo_destroy(struct pb_buffer *_buf) { struct radeon_bo *bo = radeon_bo(_buf); struct radeon_drm_winsys *rws = bo->rws; @@ -352,6 +318,16 @@ static void radeon_bo_destroy(struct pb_buffer *_buf) FREE(bo); } +static void radeon_bo_destroy_or_cache(struct pb_buffer *_buf) +{ + struct radeon_bo *bo = radeon_bo(_buf); + + if (bo->use_reusable_pool) + pb_cache_add_buffer(>cache_entry); + else + radeon_bo_destroy(_buf); +} + void *radeon_bo_do_map(struct radeon_bo *bo) { struct drm_radeon_gem_mmap args = {0}; @@ -498,34 +474,8 @@ static void radeon_bo_unmap(struct radeon_winsys_cs_handle *_buf) pipe_mutex_unlock(bo->map_mutex); } -static void radeon_bo_get_base_buffer(struct pb_buffer *buf, - struct pb_buffer **base_buf, - unsigned *offset) -{ -*base_buf = buf; -*offset = 0; -} - -static enum pipe_error radeon_bo_validate(struct pb_buffer *_buf, - struct pb_validate *vl, - unsigned flags) -{ -/* Always pinned */ -return PIPE_OK; -} - -static void radeon_bo_fence(struct pb_buffer *buf, -struct pipe_fence_handle *fence) -{ -} - static const struct pb_vtbl radeon_bo_vtbl = { -radeon_bo_destroy, -NULL, /* never called */ -NULL, /* never called */ -radeon_bo_validate, -radeon_bo_fence, -radeon_bo_get_base_buffer, +radeon_bo_destroy_or_cache }; #ifndef RADEON_GEM_GTT_WC @@ -540,40 +490,39 @@ static const struct pb_vtbl radeon_bo_vtbl = { #define RADEON_GEM_NO_CPU_ACCESS (1 << 4) #endif -static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr, -pb_size size, -const struct pb_desc *desc) +static struct radeon_bo *radeon_create_bo(struct radeon_drm_winsys *rws, + unsigned size, unsigned alignment, + unsigned usage, + unsigned initial_domains, + unsigned flags) { -struct radeon_bomgr *mgr = radeon_bomgr(_mgr); -struct radeon_drm_winsys *rws = mgr->rws; struct radeon_bo *bo; struct drm_radeon_gem_create args; -struct radeon_bo_desc *rdesc = (struct radeon_bo_desc*)desc; int r; memset(, 0, sizeof(args)); -assert(rdesc->initial_domains); -assert((rdesc->initial_domains & +assert(initial_domains); +assert((initial_domains & ~(RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) == 0); args.size = size;