summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/ilo/core/ilo_image.c29
-rw-r--r--src/gallium/drivers/ilo/core/ilo_image.h10
-rw-r--r--src/gallium/drivers/ilo/ilo_resource.c87
3 files changed, 66 insertions, 60 deletions
diff --git a/src/gallium/drivers/ilo/core/ilo_image.c b/src/gallium/drivers/ilo/core/ilo_image.c
index abfed69ba24..9c0f25aaefc 100644
--- a/src/gallium/drivers/ilo/core/ilo_image.c
+++ b/src/gallium/drivers/ilo/core/ilo_image.c
@@ -484,8 +484,6 @@ img_init_tiling(struct ilo_image *img,
preferred_tilings &= IMAGE_TILING_NONE;
}
- img->valid_tilings = params->valid_tilings;
-
/* prefer tiled over linear */
if (preferred_tilings & IMAGE_TILING_Y)
img->tiling = GEN6_TILING_Y;
@@ -1349,7 +1347,6 @@ img_init_for_transfer(struct ilo_image *img,
img->block_size = util_format_get_blocksize(templ->format);
img->walk = ILO_IMAGE_WALK_LOD;
- img->valid_tilings = IMAGE_TILING_NONE;
img->tiling = GEN6_TILING_NONE;
img->align_i = img->block_width;
@@ -1397,23 +1394,31 @@ void ilo_image_init(struct ilo_image *img,
img_init(img, &params);
}
-/**
- * Update the tiling mode and bo stride (for imported resources).
- */
bool
-ilo_image_update_for_imported_bo(struct ilo_image *img,
- enum gen_surface_tiling tiling,
- unsigned bo_stride)
+ilo_image_init_for_imported(struct ilo_image *img,
+ const struct ilo_dev *dev,
+ const struct pipe_resource *templ,
+ enum gen_surface_tiling tiling,
+ unsigned bo_stride)
{
- if (!(img->valid_tilings & (1 << tiling)))
- return false;
+ struct ilo_image_params params;
if ((tiling == GEN6_TILING_X && bo_stride % 512) ||
(tiling == GEN6_TILING_Y && bo_stride % 128) ||
(tiling == GEN8_TILING_W && bo_stride % 64))
return false;
- img->tiling = tiling;
+ memset(&params, 0, sizeof(params));
+ params.dev = dev;
+ params.templ = templ;
+ params.valid_tilings = 1 << tiling;
+
+ img_init(img, &params);
+
+ assert(img->tiling == tiling);
+ if (img->bo_stride > bo_stride)
+ return false;
+
img->bo_stride = bo_stride;
return true;
diff --git a/src/gallium/drivers/ilo/core/ilo_image.h b/src/gallium/drivers/ilo/core/ilo_image.h
index 50a78037575..0cdd8aec900 100644
--- a/src/gallium/drivers/ilo/core/ilo_image.h
+++ b/src/gallium/drivers/ilo/core/ilo_image.h
@@ -105,8 +105,6 @@ struct ilo_image {
enum ilo_image_walk_type walk;
bool interleaved_samples;
- /* bitmask of valid tilings */
- unsigned valid_tilings;
enum gen_surface_tiling tiling;
/* physical LOD slice alignments */
@@ -150,9 +148,11 @@ ilo_image_init(struct ilo_image *img,
const struct pipe_resource *templ);
bool
-ilo_image_update_for_imported_bo(struct ilo_image *img,
- enum gen_surface_tiling tiling,
- unsigned bo_stride);
+ilo_image_init_for_imported(struct ilo_image *img,
+ const struct ilo_dev *dev,
+ const struct pipe_resource *templ,
+ enum gen_surface_tiling tiling,
+ unsigned bo_stride);
static inline void
ilo_image_cleanup(struct ilo_image *img)
diff --git a/src/gallium/drivers/ilo/ilo_resource.c b/src/gallium/drivers/ilo/ilo_resource.c
index aafa37c4f26..2aa85085559 100644
--- a/src/gallium/drivers/ilo/ilo_resource.c
+++ b/src/gallium/drivers/ilo/ilo_resource.c
@@ -154,34 +154,6 @@ tex_alloc_slices(struct ilo_texture *tex)
}
static bool
-tex_import_handle(struct ilo_texture *tex,
- const struct winsys_handle *handle)
-{
- struct ilo_screen *is = ilo_screen(tex->base.screen);
- const char *name = resource_get_bo_name(&tex->base);
- enum intel_tiling_mode tiling;
- unsigned long pitch;
- struct intel_bo *bo;
-
- bo = intel_winsys_import_handle(is->dev.winsys, name, handle,
- tex->image.bo_height, &tiling, &pitch);
- 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(bo);
- return false;
- }
-
- ilo_image_set_bo(&tex->image, bo);
- intel_bo_unref(bo);
-
- return true;
-}
-
-static bool
tex_create_bo(struct ilo_texture *tex)
{
struct ilo_screen *is = ilo_screen(tex->base.screen);
@@ -302,18 +274,12 @@ tex_destroy(struct ilo_texture *tex)
}
static bool
-tex_alloc_bos(struct ilo_texture *tex,
- const struct winsys_handle *handle)
+tex_alloc_bos(struct ilo_texture *tex)
{
struct ilo_screen *is = ilo_screen(tex->base.screen);
- if (handle) {
- if (!tex_import_handle(tex, handle))
- return false;
- } else {
- if (!tex_create_bo(tex))
- return false;
- }
+ if (!tex->imported && !tex_create_bo(tex))
+ return false;
/* allocate separate stencil resource */
if (tex->image.separate_stencil && !tex_create_separate_stencil(tex))
@@ -340,13 +306,50 @@ tex_alloc_bos(struct ilo_texture *tex,
}
static bool
-tex_init_image(struct ilo_texture *tex)
+tex_import_handle(struct ilo_texture *tex,
+ const struct winsys_handle *handle)
+{
+ struct ilo_screen *is = ilo_screen(tex->base.screen);
+ const struct pipe_resource *templ = &tex->base;
+ const char *name = resource_get_bo_name(&tex->base);
+ enum intel_tiling_mode tiling;
+ unsigned long pitch;
+ struct intel_bo *bo;
+
+ bo = intel_winsys_import_handle(is->dev.winsys, name, handle,
+ tex->image.bo_height, &tiling, &pitch);
+ if (!bo)
+ return false;
+
+ if (!ilo_image_init_for_imported(&tex->image, &is->dev, templ,
+ winsys_to_surface_tiling(tiling), pitch)) {
+ ilo_err("failed to import handle for texture\n");
+ intel_bo_unref(bo);
+ return false;
+ }
+
+ ilo_image_set_bo(&tex->image, bo);
+ intel_bo_unref(bo);
+
+ tex->imported = true;
+
+ return true;
+}
+
+static bool
+tex_init_image(struct ilo_texture *tex,
+ const struct winsys_handle *handle)
{
struct ilo_screen *is = ilo_screen(tex->base.screen);
const struct pipe_resource *templ = &tex->base;
struct ilo_image *img = &tex->image;
- ilo_image_init(img, &is->dev, templ);
+ if (handle) {
+ if (!tex_import_handle(tex, handle))
+ return false;
+ } else {
+ ilo_image_init(img, &is->dev, templ);
+ }
if (img->bo_height > ilo_max_resource_size / img->bo_stride)
return false;
@@ -379,14 +382,12 @@ tex_create(struct pipe_screen *screen,
tex->base.screen = screen;
pipe_reference_init(&tex->base.reference, 1);
- tex->imported = (handle != NULL);
-
- if (!tex_init_image(tex)) {
+ if (!tex_init_image(tex, handle)) {
FREE(tex);
return NULL;
}
- if (!tex_alloc_bos(tex, handle)) {
+ if (!tex_alloc_bos(tex)) {
tex_destroy(tex);
return NULL;
}