From: Nanley Chery Date: Fri, 15 Nov 2019 17:17:23 +0000 (-0800) Subject: iris: Fix import of multi-planar surfaces with modifiers X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=21376cffb37018160ad3eef38b5a640ba1675a4f;p=mesa.git iris: Fix import of multi-planar surfaces with modifiers Multi-planar surfaces are allowed to have modifiers. Don't require DRM_FORMAT_MOD_INVALID in order to create a surface for each plane defined by the format. Fixes: 246eebba4a8 ("iris: Export and import surfaces with modifiers that have aux data") Reviewed-by: Kenneth Graunke --- diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c index 296d99ed810..4d1f22f5793 100644 --- a/src/gallium/drivers/iris/iris_resource.c +++ b/src/gallium/drivers/iris/iris_resource.c @@ -994,6 +994,7 @@ iris_resource_from_handle(struct pipe_screen *pscreen, } assert(mod_inf); + res->external_format = whandle->format; res->mod_info = mod_inf; isl_surf_usage_flags_t isl_usage = pipe_bind_to_isl_usage(templ->bind); @@ -1005,7 +1006,8 @@ iris_resource_from_handle(struct pipe_screen *pscreen, if (templ->target == PIPE_BUFFER) { res->surf.tiling = ISL_TILING_LINEAR; } else { - if (whandle->modifier == DRM_FORMAT_MOD_INVALID || whandle->plane == 0) { + /* Create a surface for each plane specified by the external format. */ + if (whandle->plane < util_format_get_num_planes(whandle->format)) { UNUSED const bool isl_surf_created_successfully = isl_surf_init(&screen->isl_dev, &res->surf, .dim = target_to_isl_surf_dim(templ->target), @@ -1183,6 +1185,8 @@ iris_resource_get_handle(struct pipe_screen *pscreen, whandle->stride = res->surf.row_pitch_B; bo = res->bo; } + + whandle->format = res->external_format; whandle->modifier = res->mod_info ? res->mod_info->modifier : tiling_to_modifier(res->bo->tiling_mode); diff --git a/src/gallium/drivers/iris/iris_resource.h b/src/gallium/drivers/iris/iris_resource.h index f477daa946f..65809d8a40d 100644 --- a/src/gallium/drivers/iris/iris_resource.h +++ b/src/gallium/drivers/iris/iris_resource.h @@ -162,6 +162,13 @@ struct iris_resource { uint16_t has_hiz; } aux; + /** + * For external surfaces, this is format that was used to create or import + * the surface. For internal surfaces, this will always be + * PIPE_FORMAT_NONE. + */ + enum pipe_format external_format; + /** * For external surfaces, this is DRM format modifier that was used to * create or import the surface. For internal surfaces, this will always