iris: let isl set tiling mode for external resources

Patch sets memory object external format (which is otherwise
PIPE_FORMAT_NONE for memory objects) before main surface gets
configured. With this we can add a check that when dealing
with external resource that has no modifier set, we let isl
figure out the tiling mode.

Fixes memobj tests on DG2:
   piglit.spec.ext_external_objects.vk-image-display-muliple-textures
   piglit.spec.ext_external_objects.vk-image-display-overwrite
   piglit.spec.ext_external_objects.vk-depth-display
   piglit.spec.ext_external_objects.vk-image-display
   piglit.spec.ext_external_objects.vk-stencil-display

v2: add assert and comment on tiling decision (Ken)

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7684
Cc: mesa-stable
Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Simon Zeni <simon@bl4ckb0ne.ca>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20473>
(cherry picked from commit 319d485679)
This commit is contained in:
Tapani Pälli 2023-01-02 11:00:26 +02:00 committed by Eric Engestrom
parent 888bb9c380
commit 859e2de1f3
2 changed files with 14 additions and 6 deletions

View file

@ -1165,7 +1165,7 @@
"description": "iris: let isl set tiling mode for external resources",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View file

@ -674,6 +674,14 @@ iris_resource_configure_main(const struct iris_screen *screen,
} else if (templ->usage == PIPE_USAGE_STAGING ||
templ->bind & (PIPE_BIND_LINEAR | PIPE_BIND_CURSOR)) {
tiling_flags = ISL_TILING_LINEAR_BIT;
} else if (res->external_format != PIPE_FORMAT_NONE) {
/* This came from iris_resource_from_memobj and didn't have
* PIPE_BIND_LINEAR set, so "optimal" tiling is desired. Let isl
* select the tiling. The implicit contract is that both drivers
* will arrive at the same tiling by using the same code to decide.
*/
assert(modifier == DRM_FORMAT_MOD_INVALID);
tiling_flags = ISL_TILING_ANY_MASK;
} else if (!screen->devinfo.has_tiling_uapi &&
(templ->bind & (PIPE_BIND_SCANOUT | PIPE_BIND_SHARED))) {
tiling_flags = ISL_TILING_LINEAR_BIT;
@ -1461,17 +1469,17 @@ iris_resource_from_memobj(struct pipe_screen *pscreen,
if (!res)
return NULL;
res->bo = memobj->bo;
res->offset = offset;
res->external_format = templ->format;
res->internal_format = templ->format;
if (templ->flags & PIPE_RESOURCE_FLAG_TEXTURING_MORE_LIKELY) {
UNUSED const bool isl_surf_created_successfully =
iris_resource_configure_main(screen, res, templ, DRM_FORMAT_MOD_INVALID, 0);
assert(isl_surf_created_successfully);
}
res->bo = memobj->bo;
res->offset = offset;
res->external_format = memobj->format;
res->internal_format = templ->format;
iris_bo_reference(memobj->bo);
return &res->base.b;