winsys/intel: make struct intel_bo alias drm_intel_bo
authorChia-I Wu <olvaffe@gmail.com>
Wed, 12 Jun 2013 09:05:26 +0000 (17:05 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 12 Jun 2013 09:46:52 +0000 (17:46 +0800)
There is really nothing in struct intel_bo, and having it alias drm_intel_bo
makes the winsys impose almost zero overhead.

We can make the overhead gone completely by making the functions static
inline, if needed.

src/gallium/winsys/intel/drm/intel_drm_winsys.c

index f4e8bd4e08004f240fa469163458063666d9df1d..4d121bb5597c3bb08a2b0ba561c60a40fc44835a 100644 (file)
 struct intel_winsys {
    int fd;
    drm_intel_bufmgr *bufmgr;
-   struct drm_intel_decode *decode;
-
    struct intel_winsys_info info;
 
-   drm_intel_bo **drm_bo_array;
-   int array_size;
-};
-
-struct intel_bo {
-   struct pipe_reference reference;
-
-   drm_intel_bo *bo;
+   struct drm_intel_decode *decode;
 };
 
 static bool
@@ -164,7 +155,6 @@ intel_winsys_destroy(struct intel_winsys *winsys)
       drm_intel_decode_context_free(winsys->decode);
 
    drm_intel_bufmgr_destroy(winsys->bufmgr);
-   FREE(winsys->drm_bo_array);
    FREE(winsys);
 }
 
@@ -201,20 +191,6 @@ intel_winsys_read_reg(struct intel_winsys *winsys,
    return drm_intel_reg_read(winsys->bufmgr, reg, val);
 }
 
-static struct intel_bo *
-create_bo(void)
-{
-   struct intel_bo *bo;
-
-   bo = CALLOC_STRUCT(intel_bo);
-   if (!bo)
-      return NULL;
-
-   pipe_reference_init(&bo->reference, 1);
-
-   return bo;
-}
-
 struct intel_bo *
 intel_winsys_alloc_buffer(struct intel_winsys *winsys,
                           const char *name,
@@ -222,27 +198,18 @@ intel_winsys_alloc_buffer(struct intel_winsys *winsys,
                           unsigned long flags)
 {
    const int alignment = 4096; /* always page-aligned */
-   struct intel_bo *bo;
-
-   bo = create_bo();
-   if (!bo)
-      return NULL;
+   drm_intel_bo *bo;
 
    if (flags == INTEL_ALLOC_FOR_RENDER) {
-      bo->bo = drm_intel_bo_alloc_for_render(winsys->bufmgr,
+      bo = drm_intel_bo_alloc_for_render(winsys->bufmgr,
             name, size, alignment);
    }
    else {
       assert(!flags);
-      bo->bo = drm_intel_bo_alloc(winsys->bufmgr, name, size, alignment);
+      bo = drm_intel_bo_alloc(winsys->bufmgr, name, size, alignment);
    }
 
-   if (!bo->bo) {
-      FREE(bo);
-      return NULL;
-   }
-
-   return bo;
+   return (struct intel_bo *) bo;
 }
 
 struct intel_bo *
@@ -254,27 +221,20 @@ intel_winsys_alloc_texture(struct intel_winsys *winsys,
                            unsigned long *pitch)
 {
    uint32_t real_tiling = tiling;
-   struct intel_bo *bo;
-
-   bo = create_bo();
-   if (!bo)
-      return NULL;
+   drm_intel_bo *bo;
 
-   bo->bo = drm_intel_bo_alloc_tiled(winsys->bufmgr, name,
+   bo = drm_intel_bo_alloc_tiled(winsys->bufmgr, name,
          width, height, cpp, &real_tiling, pitch, flags);
-   if (!bo->bo) {
-      FREE(bo);
+   if (!bo)
       return NULL;
-   }
 
    if (real_tiling != tiling) {
       assert(!"tiling mismatch");
-      drm_intel_bo_unreference(bo->bo);
-      FREE(bo);
+      drm_intel_bo_unreference(bo);
       return NULL;
    }
 
-   return bo;
+   return (struct intel_bo *) bo;
 }
 
 struct intel_bo *
@@ -285,51 +245,45 @@ intel_winsys_import_handle(struct intel_winsys *winsys,
                            enum intel_tiling_mode *tiling,
                            unsigned long *pitch)
 {
-   struct intel_bo *bo;
    uint32_t real_tiling, swizzle;
+   drm_intel_bo *bo;
    int err;
 
-   bo = create_bo();
-   if (!bo)
-      return NULL;
-
    switch (handle->type) {
    case DRM_API_HANDLE_TYPE_SHARED:
       {
          const uint32_t gem_name = handle->handle;
-         bo->bo = drm_intel_bo_gem_create_from_name(winsys->bufmgr,
+         bo = drm_intel_bo_gem_create_from_name(winsys->bufmgr,
                name, gem_name);
       }
       break;
 #if 0
-   case DRM_API_HANDLE_TYPE_PRIME:
+   case DRM_API_HANDLE_TYPE_FD:
       {
          const int fd = (int) handle->handle;
-         bo->bo = drm_intel_bo_gem_create_from_prime(winsys->bufmgr,
+         bo = drm_intel_bo_gem_create_from_prime(winsys->bufmgr,
                fd, height * handle->stride);
       }
       break;
 #endif
    default:
+      bo = NULL;
       break;
    }
 
-   if (!bo->bo) {
-      FREE(bo);
+   if (!bo)
       return NULL;
-   }
 
-   err = drm_intel_bo_get_tiling(bo->bo, &real_tiling, &swizzle);
+   err = drm_intel_bo_get_tiling(bo, &real_tiling, &swizzle);
    if (err) {
-      drm_intel_bo_unreference(bo->bo);
-      FREE(bo);
+      drm_intel_bo_unreference(bo);
       return NULL;
    }
 
    *tiling = real_tiling;
    *pitch = handle->stride;
 
-   return bo;
+   return (struct intel_bo *) bo;
 }
 
 int
@@ -346,20 +300,20 @@ intel_winsys_export_handle(struct intel_winsys *winsys,
       {
          uint32_t name;
 
-         err = drm_intel_bo_flink(bo->bo, &name);
+         err = drm_intel_bo_flink((drm_intel_bo *) bo, &name);
          if (!err)
             handle->handle = name;
       }
       break;
    case DRM_API_HANDLE_TYPE_KMS:
-      handle->handle = bo->bo->handle;
+      handle->handle = ((drm_intel_bo *) bo)->handle;
       break;
 #if 0
-   case DRM_API_HANDLE_TYPE_PRIME:
+   case DRM_API_HANDLE_TYPE_FD:
       {
          int fd;
 
-         err = drm_intel_bo_gem_export_to_prime(bo->bo, &fd);
+         err = drm_intel_bo_gem_export_to_prime((drm_intel_bo *) bo, &fd);
          if (!err)
             handle->handle = fd;
       }
@@ -383,32 +337,8 @@ intel_winsys_check_aperture_space(struct intel_winsys *winsys,
                                   struct intel_bo **bo_array,
                                   int count)
 {
-   drm_intel_bo *drm_bo_array[8];
-   int i;
-
-   if (likely(count <= Elements(drm_bo_array))) {
-      for (i = 0; i < count; i++)
-         drm_bo_array[i] = bo_array[i]->bo;
-
-      return drm_intel_bufmgr_check_aperture_space(drm_bo_array, count);
-   }
-
-   /* resize bo array if necessary */
-   if (winsys->array_size < count) {
-      void *tmp = MALLOC(count * sizeof(*winsys->drm_bo_array));
-
-      if (!tmp)
-         return -1;
-
-      FREE(winsys->drm_bo_array);
-      winsys->drm_bo_array = tmp;
-      winsys->array_size = count;
-   }
-
-   for (i = 0; i < count; i++)
-      winsys->drm_bo_array[i] = bo_array[i]->bo;
-
-   return drm_intel_bufmgr_check_aperture_space(winsys->drm_bo_array, count);
+   return drm_intel_bufmgr_check_aperture_space((drm_intel_bo **) bo_array,
+                                                count);
 }
 
 void
@@ -426,7 +356,7 @@ intel_winsys_decode_commands(struct intel_winsys *winsys,
       drm_intel_decode_set_output_file(winsys->decode, stderr);
    }
 
-   err = drm_intel_bo_map(bo->bo, false);
+   err = intel_bo_map(bo, false);
    if (err) {
       debug_printf("failed to map buffer for decoding\n");
       return;
@@ -436,64 +366,59 @@ intel_winsys_decode_commands(struct intel_winsys *winsys,
    used /= 4;
 
    drm_intel_decode_set_batch_pointer(winsys->decode,
-         bo->bo->virtual,
-         bo->bo->offset,
-         used);
+         intel_bo_get_virtual(bo), intel_bo_get_offset(bo), used);
 
    drm_intel_decode(winsys->decode);
 
-   drm_intel_bo_unmap(bo->bo);
+   intel_bo_unmap(bo);
 }
 
 void
 intel_bo_reference(struct intel_bo *bo)
 {
-   pipe_reference(NULL, &bo->reference);
+   drm_intel_bo_reference((drm_intel_bo *) bo);
 }
 
 void
 intel_bo_unreference(struct intel_bo *bo)
 {
-   if (pipe_reference(&bo->reference, NULL)) {
-      drm_intel_bo_unreference(bo->bo);
-      FREE(bo);
-   }
+   drm_intel_bo_unreference((drm_intel_bo *) bo);
 }
 
 unsigned long
 intel_bo_get_size(const struct intel_bo *bo)
 {
-   return bo->bo->size;
+   return ((drm_intel_bo *) bo)->size;
 }
 
 unsigned long
 intel_bo_get_offset(const struct intel_bo *bo)
 {
-   return bo->bo->offset;
+   return ((drm_intel_bo *) bo)->offset;
 }
 
 void *
 intel_bo_get_virtual(const struct intel_bo *bo)
 {
-   return bo->bo->virtual;
+   return ((drm_intel_bo *) bo)->virtual;
 }
 
 int
 intel_bo_map(struct intel_bo *bo, bool write_enable)
 {
-   return drm_intel_bo_map(bo->bo, write_enable);
+   return drm_intel_bo_map((drm_intel_bo *) bo, write_enable);
 }
 
 int
 intel_bo_map_gtt(struct intel_bo *bo)
 {
-   return drm_intel_gem_bo_map_gtt(bo->bo);
+   return drm_intel_gem_bo_map_gtt((drm_intel_bo *) bo);
 }
 
 int
 intel_bo_map_unsynchronized(struct intel_bo *bo)
 {
-   return drm_intel_gem_bo_map_unsynchronized(bo->bo);
+   return drm_intel_gem_bo_map_unsynchronized((drm_intel_bo *) bo);
 }
 
 void
@@ -501,7 +426,7 @@ intel_bo_unmap(struct intel_bo *bo)
 {
    int err;
 
-   err = drm_intel_bo_unmap(bo->bo);
+   err = drm_intel_bo_unmap((drm_intel_bo *) bo);
    assert(!err);
 }
 
@@ -509,14 +434,14 @@ int
 intel_bo_pwrite(struct intel_bo *bo, unsigned long offset,
                 unsigned long size, const void *data)
 {
-   return drm_intel_bo_subdata(bo->bo, offset, size, data);
+   return drm_intel_bo_subdata((drm_intel_bo *) bo, offset, size, data);
 }
 
 int
 intel_bo_pread(struct intel_bo *bo, unsigned long offset,
                unsigned long size, void *data)
 {
-   return drm_intel_bo_get_subdata(bo->bo, offset, size, data);
+   return drm_intel_bo_get_subdata((drm_intel_bo *) bo, offset, size, data);
 }
 
 int
@@ -524,26 +449,28 @@ intel_bo_emit_reloc(struct intel_bo *bo, uint32_t offset,
                     struct intel_bo *target_bo, uint32_t target_offset,
                     uint32_t read_domains, uint32_t write_domain)
 {
-   return drm_intel_bo_emit_reloc(bo->bo, offset,
-         target_bo->bo, target_offset, read_domains, write_domain);
+   return drm_intel_bo_emit_reloc((drm_intel_bo *) bo, offset,
+         (drm_intel_bo *) target_bo, target_offset,
+         read_domains, write_domain);
 }
 
 int
 intel_bo_get_reloc_count(struct intel_bo *bo)
 {
-   return drm_intel_gem_bo_get_reloc_count(bo->bo);
+   return drm_intel_gem_bo_get_reloc_count((drm_intel_bo *) bo);
 }
 
 void
 intel_bo_clear_relocs(struct intel_bo *bo, int start)
 {
-   return drm_intel_gem_bo_clear_relocs(bo->bo, start);
+   return drm_intel_gem_bo_clear_relocs((drm_intel_bo *) bo, start);
 }
 
 bool
 intel_bo_references(struct intel_bo *bo, struct intel_bo *target_bo)
 {
-   return drm_intel_bo_references(bo->bo, target_bo->bo);
+   return drm_intel_bo_references((drm_intel_bo *) bo,
+         (drm_intel_bo *) target_bo);
 }
 
 int
@@ -551,11 +478,12 @@ intel_bo_exec(struct intel_bo *bo, int used,
               struct intel_context *ctx, unsigned long flags)
 {
    if (ctx) {
-      return drm_intel_gem_bo_context_exec(bo->bo,
+      return drm_intel_gem_bo_context_exec((drm_intel_bo *) bo,
             (drm_intel_context *) ctx, used, flags);
    }
    else {
-      return drm_intel_bo_mrb_exec(bo->bo, used, NULL, 0, 0, flags);
+      return drm_intel_bo_mrb_exec((drm_intel_bo *) bo,
+            used, NULL, 0, 0, flags);
    }
 }
 
@@ -564,7 +492,7 @@ intel_bo_wait(struct intel_bo *bo, int64_t timeout)
 {
    int err;
 
-   err = drm_intel_gem_bo_wait(bo->bo, timeout);
+   err = drm_intel_gem_bo_wait((drm_intel_bo *) bo, timeout);
    /* consider the bo idle on errors */
    if (err && err != -ETIME)
       err = 0;