ilo: move BOs from ilo_texture to ilo_image
We want to work with ilo_image instead of ilo_texture in core.
This commit is contained in:
parent
ac47563cb4
commit
3afbeb115a
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) ||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue