Re: [Mesa-dev] [PATCH 09/10] winsys/radeon: use pb_cache instead of pb_cache_manager

2015-12-08 Thread Nicolai Hähnle

On 06.12.2015 19:01, Marek Olšák wrote:

From: Marek Olšák 

This 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

2015-12-06 Thread Marek Olšák
From: Marek Olšák 

This 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;