ilo: move BOs from ilo_texture to ilo_image
authorChia-I Wu <olvaffe@gmail.com>
Wed, 25 Mar 2015 04:22:40 +0000 (12:22 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Sat, 2 May 2015 14:14:06 +0000 (22:14 +0800)
We want to work with ilo_image instead of ilo_texture in core.

src/gallium/drivers/ilo/core/ilo_image.h
src/gallium/drivers/ilo/ilo_blitter_blt.c
src/gallium/drivers/ilo/ilo_resource.c
src/gallium/drivers/ilo/ilo_resource.h
src/gallium/drivers/ilo/ilo_state_3d_bottom.c
src/gallium/drivers/ilo/ilo_state_3d_top.c
src/gallium/drivers/ilo/ilo_transfer.c

index 722a666991d12f36ba4e71d8f21cfe2c6572d625..2ca48b7960f05d444ceceefbe7b26b6b0dacd091 100644 (file)
@@ -29,6 +29,7 @@
 #define ILO_IMAGE_H
 
 #include "genhw/genhw.h"
+#include "intel_winsys.h"
 
 #include "ilo_core.h"
 #include "ilo_dev.h"
@@ -122,6 +123,9 @@ struct ilo_image {
    unsigned aux_layer_height;
    unsigned aux_stride;
    unsigned aux_height;
+
+   struct intel_bo *bo;
+   struct intel_bo *aux_bo;
 };
 
 void
@@ -134,6 +138,27 @@ ilo_image_update_for_imported_bo(struct ilo_image *img,
                                  enum gen_surface_tiling tiling,
                                  unsigned bo_stride);
 
+static inline void
+ilo_image_cleanup(struct ilo_image *img)
+{
+   intel_bo_unref(img->bo);
+   intel_bo_unref(img->aux_bo);
+}
+
+static inline void
+ilo_image_set_bo(struct ilo_image *img, struct intel_bo *bo)
+{
+   intel_bo_unref(img->bo);
+   img->bo = intel_bo_ref(bo);
+}
+
+static inline void
+ilo_image_set_aux_bo(struct ilo_image *img, struct intel_bo *bo)
+{
+   intel_bo_unref(img->aux_bo);
+   img->aux_bo = intel_bo_ref(bo);
+}
+
 /**
  * Convert from pixel position to 2D memory offset.
  */
index 5e67198adb19e794ac831ce9f63e3c691c105276..965f7f2b748562f7eaab84fa6c9ddbeb2cea239b 100644 (file)
@@ -258,14 +258,14 @@ tex_clear_region(struct ilo_blitter *blitter,
    if (dst_box->width * cpp > gen6_blt_max_bytes_per_scanline)
       return false;
 
-   dst.bo = dst_tex->bo;
+   dst.bo = dst_tex->image.bo;
    dst.offset = 0;
    dst.pitch = dst_tex->image.bo_stride;
    dst.tiling = dst_tex->image.tiling;
 
    swctrl = ilo_blitter_blt_begin(blitter,
          GEN6_XY_COLOR_BLT__SIZE * dst_box->depth,
-         dst_tex->bo, dst_tex->image.tiling, NULL, GEN6_TILING_NONE);
+         dst_tex->image.bo, dst_tex->image.tiling, NULL, GEN6_TILING_NONE);
 
    for (slice = 0; slice < dst_box->depth; slice++) {
       unsigned x, y;
@@ -347,12 +347,12 @@ tex_copy_region(struct ilo_blitter *blitter,
       break;
    }
 
-   dst.bo = dst_tex->bo;
+   dst.bo = dst_tex->image.bo;
    dst.offset = 0;
    dst.pitch = dst_tex->image.bo_stride;
    dst.tiling = dst_tex->image.tiling;
 
-   src.bo = src_tex->bo;
+   src.bo = src_tex->image.bo;
    src.offset = 0;
    src.pitch = src_tex->image.bo_stride;
    src.tiling = src_tex->image.tiling;
index f5038952f4373ecc7283a1a7269137dbad29cf13..7e8d70083cbe20302f235c81020e363b78e08239 100644 (file)
@@ -161,20 +161,23 @@ tex_import_handle(struct ilo_texture *tex,
    const char *name = resource_get_bo_name(&tex->base);
    enum intel_tiling_mode tiling;
    unsigned long pitch;
+   struct intel_bo *bo;
 
-   tex->bo = intel_winsys_import_handle(is->dev.winsys, name, handle,
+   bo = intel_winsys_import_handle(is->dev.winsys, name, handle,
          tex->image.bo_height, &tiling, &pitch);
-   if (!tex->bo)
+   if (!bo)
       return false;
 
    if (!ilo_image_update_for_imported_bo(&tex->image,
             winsys_to_surface_tiling(tiling), pitch)) {
       ilo_err("imported handle has incompatible tiling/pitch\n");
-      intel_bo_unref(tex->bo);
-      tex->bo = NULL;
+      intel_bo_unref(bo);
       return false;
    }
 
+   ilo_image_set_bo(&tex->image, bo);
+   intel_bo_unref(bo);
+
    return true;
 }
 
@@ -200,10 +203,13 @@ tex_create_bo(struct ilo_texture *tex)
          bo = NULL;
       }
    }
+   if (!bo)
+      return false;
 
-   tex->bo = bo;
+   ilo_image_set_bo(&tex->image, bo);
+   intel_bo_unref(bo);
 
-   return (tex->bo != NULL);
+   return true;
 }
 
 static bool
@@ -238,13 +244,16 @@ tex_create_hiz(struct ilo_texture *tex)
 {
    const struct pipe_resource *templ = &tex->base;
    struct ilo_screen *is = ilo_screen(tex->base.screen);
+   struct intel_bo *bo;
    unsigned lv;
 
-   tex->aux_bo = intel_winsys_alloc_bo(is->dev.winsys, "hiz texture",
+   bo = intel_winsys_alloc_bo(is->dev.winsys, "hiz texture",
          tex->image.aux_stride * tex->image.aux_height, false);
-   if (!tex->aux_bo)
+   if (!bo)
       return false;
 
+   ilo_image_set_aux_bo(&tex->image, bo);
+
    for (lv = 0; lv <= templ->last_level; lv++) {
       if (tex->image.aux_enables & (1 << lv)) {
          const unsigned num_slices = (templ->target == PIPE_TEXTURE_3D) ?
@@ -266,14 +275,17 @@ static bool
 tex_create_mcs(struct ilo_texture *tex)
 {
    struct ilo_screen *is = ilo_screen(tex->base.screen);
+   struct intel_bo *bo;
 
    assert(tex->image.aux_enables == (1 << (tex->base.last_level + 1)) - 1);
 
-   tex->aux_bo = intel_winsys_alloc_bo(is->dev.winsys, "mcs texture",
+   bo = intel_winsys_alloc_bo(is->dev.winsys, "mcs texture",
          tex->image.aux_stride * tex->image.aux_height, false);
-   if (!tex->aux_bo)
+   if (!bo)
       return false;
 
+   ilo_image_set_aux_bo(&tex->image, bo);
+
    return true;
 }
 
@@ -283,8 +295,7 @@ tex_destroy(struct ilo_texture *tex)
    if (tex->separate_s8)
       tex_destroy(tex->separate_s8);
 
-   intel_bo_unref(tex->aux_bo);
-   intel_bo_unref(tex->bo);
+   ilo_image_cleanup(&tex->image);
 
    tex_free_slices(tex);
    FREE(tex);
@@ -396,7 +407,7 @@ tex_get_handle(struct ilo_texture *tex, struct winsys_handle *handle)
    else
       tiling = surface_to_winsys_tiling(tex->image.tiling);
 
-   err = intel_winsys_export_handle(is->dev.winsys, tex->bo, tiling,
+   err = intel_winsys_export_handle(is->dev.winsys, tex->image.bo, tiling,
          tex->image.bo_stride, tex->image.bo_height, handle);
 
    return !err;
@@ -565,18 +576,9 @@ ilo_buffer_rename_bo(struct ilo_buffer *buf)
 bool
 ilo_texture_rename_bo(struct ilo_texture *tex)
 {
-   struct intel_bo *old_bo = tex->bo;
-
    /* an imported texture cannot be renamed */
    if (tex->imported)
       return false;
 
-   if (tex_create_bo(tex)) {
-      intel_bo_unref(old_bo);
-      return true;
-   }
-   else {
-      tex->bo = old_bo;
-      return false;
-   }
+   return tex_create_bo(tex);
 }
index 3b520aa5b27a78db5cdac26d213e5d65b632e01e..b5be9b5300d3c16fa8fda97705165bba2a9650ee 100644 (file)
@@ -111,11 +111,8 @@ struct ilo_texture {
    struct ilo_image image;
 
    /* XXX thread-safety */
-   struct intel_bo *bo;
    struct ilo_texture_slice *slices[PIPE_MAX_TEXTURE_LEVELS];
 
-   struct intel_bo *aux_bo;
-
    struct ilo_texture *separate_s8;
 };
 
@@ -149,7 +146,7 @@ static inline struct intel_bo *
 ilo_resource_get_bo(struct pipe_resource *res)
 {
    return (res->target == PIPE_BUFFER) ?
-      ilo_buffer(res)->bo : ilo_texture(res)->bo;
+      ilo_buffer(res)->bo : ilo_texture(res)->image.bo;
 }
 
 static inline struct ilo_texture_slice *
@@ -206,7 +203,7 @@ ilo_texture_can_enable_hiz(const struct ilo_texture *tex, unsigned level,
    const struct ilo_texture_slice *slice =
       ilo_texture_get_slice(tex, level, 0);
 
-   return (tex->aux_bo && (slice->flags & ILO_TEXTURE_HIZ));
+   return (tex->image.aux_bo && (slice->flags & ILO_TEXTURE_HIZ));
 }
 
 #endif /* ILO_RESOURCE_H */
index f4a850634f71dc1fabfaba7869beff0f381433d7..13c1a7feead1aeb968066ab0895026f077263b17 100644 (file)
@@ -1031,7 +1031,7 @@ zs_init_info(const struct ilo_dev *dev,
    }
 
    if (format != PIPE_FORMAT_S8_UINT) {
-      info->zs.bo = tex->bo;
+      info->zs.bo = tex->image.bo;
       info->zs.stride = tex->image.bo_stride;
 
       assert(tex->image.layer_height % 4 == 0);
@@ -1045,7 +1045,7 @@ zs_init_info(const struct ilo_dev *dev,
       const struct ilo_texture *s8_tex =
          (tex->separate_s8) ? tex->separate_s8 : tex;
 
-      info->stencil.bo = s8_tex->bo;
+      info->stencil.bo = s8_tex->image.bo;
 
       /*
        * From the Sandy Bridge PRM, volume 2 part 1, page 329:
@@ -1076,7 +1076,7 @@ zs_init_info(const struct ilo_dev *dev,
    }
 
    if (ilo_texture_can_enable_hiz(tex, level, first_layer, num_layers)) {
-      info->hiz.bo = tex->aux_bo;
+      info->hiz.bo = tex->image.aux_bo;
       info->hiz.stride = tex->image.aux_stride;
 
       assert(tex->image.aux_layer_height % 4 == 0);
index 79cd8b5c3b042f7d8c2944421cddee7ac6ca0f1c..f022972414e01cc5d601348f93433564b54f782d 100644 (file)
@@ -1246,7 +1246,7 @@ ilo_gpe_init_view_surface_for_texture(const struct ilo_dev *dev,
    }
 
    /* do not increment reference count */
-   surf->bo = tex->bo;
+   surf->bo = tex->image.bo;
 
    /* assume imported RTs are scanouts */
    surf->scanout = ((tex->base.bind & PIPE_BIND_SCANOUT) ||
index e80ed8bda9ca8b5fca1de0f8686a65a4c4d02b5f..4ee3352375381b4baab314b6b69c5baa41ef23ae 100644 (file)
@@ -553,9 +553,9 @@ tex_staging_sys_map_bo(struct ilo_texture *tex,
 
    if (prefer_cpu && (tex->image.tiling == GEN6_TILING_NONE ||
                       !linear_view))
-      ptr = intel_bo_map(tex->bo, !for_read_back);
+      ptr = intel_bo_map(tex->image.bo, !for_read_back);
    else
-      ptr = intel_bo_map_gtt(tex->bo);
+      ptr = intel_bo_map_gtt(tex->image.bo);
 
    return ptr;
 }
@@ -563,7 +563,7 @@ tex_staging_sys_map_bo(struct ilo_texture *tex,
 static void
 tex_staging_sys_unmap_bo(struct ilo_texture *tex)
 {
-   intel_bo_unmap(tex->bo);
+   intel_bo_unmap(tex->image.bo);
 }
 
 static bool