summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/ilo/ilo_resource.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/ilo/ilo_resource.c')
-rw-r--r--src/gallium/drivers/ilo/ilo_resource.c48
1 files changed, 25 insertions, 23 deletions
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);
}