From 3afbeb115ab19164fb2e5bf8df88b6d03d39254b Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Wed, 25 Mar 2015 12:22:40 +0800 Subject: [PATCH] ilo: move BOs from ilo_texture to ilo_image We want to work with ilo_image instead of ilo_texture in core. --- src/gallium/drivers/ilo/core/ilo_image.h | 25 ++++++++++ src/gallium/drivers/ilo/ilo_blitter_blt.c | 8 ++-- src/gallium/drivers/ilo/ilo_resource.c | 48 ++++++++++--------- src/gallium/drivers/ilo/ilo_resource.h | 7 +-- src/gallium/drivers/ilo/ilo_state_3d_bottom.c | 6 +-- src/gallium/drivers/ilo/ilo_state_3d_top.c | 2 +- src/gallium/drivers/ilo/ilo_transfer.c | 6 +-- 7 files changed, 63 insertions(+), 39 deletions(-) diff --git a/src/gallium/drivers/ilo/core/ilo_image.h b/src/gallium/drivers/ilo/core/ilo_image.h index 722a666991d..2ca48b7960f 100644 --- a/src/gallium/drivers/ilo/core/ilo_image.h +++ b/src/gallium/drivers/ilo/core/ilo_image.h @@ -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. */ diff --git a/src/gallium/drivers/ilo/ilo_blitter_blt.c b/src/gallium/drivers/ilo/ilo_blitter_blt.c index 5e67198adb1..965f7f2b748 100644 --- a/src/gallium/drivers/ilo/ilo_blitter_blt.c +++ b/src/gallium/drivers/ilo/ilo_blitter_blt.c @@ -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; diff --git a/src/gallium/drivers/ilo/ilo_resource.c b/src/gallium/drivers/ilo/ilo_resource.c index f5038952f43..7e8d70083cb 100644 --- a/src/gallium/drivers/ilo/ilo_resource.c +++ b/src/gallium/drivers/ilo/ilo_resource.c @@ -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); } diff --git a/src/gallium/drivers/ilo/ilo_resource.h b/src/gallium/drivers/ilo/ilo_resource.h index 3b520aa5b27..b5be9b5300d 100644 --- a/src/gallium/drivers/ilo/ilo_resource.h +++ b/src/gallium/drivers/ilo/ilo_resource.h @@ -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 */ diff --git a/src/gallium/drivers/ilo/ilo_state_3d_bottom.c b/src/gallium/drivers/ilo/ilo_state_3d_bottom.c index f4a850634f7..13c1a7feead 100644 --- a/src/gallium/drivers/ilo/ilo_state_3d_bottom.c +++ b/src/gallium/drivers/ilo/ilo_state_3d_bottom.c @@ -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); diff --git a/src/gallium/drivers/ilo/ilo_state_3d_top.c b/src/gallium/drivers/ilo/ilo_state_3d_top.c index 79cd8b5c3b0..f022972414e 100644 --- a/src/gallium/drivers/ilo/ilo_state_3d_top.c +++ b/src/gallium/drivers/ilo/ilo_state_3d_top.c @@ -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) || diff --git a/src/gallium/drivers/ilo/ilo_transfer.c b/src/gallium/drivers/ilo/ilo_transfer.c index e80ed8bda9c..4ee33523753 100644 --- a/src/gallium/drivers/ilo/ilo_transfer.c +++ b/src/gallium/drivers/ilo/ilo_transfer.c @@ -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