From: Thierry Reding Date: Thu, 15 Mar 2018 20:59:02 +0000 (+0100) Subject: tegra: Fix scanout resources without modifiers X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9603d81df05105857b676f20dff964ef3ab0ecff;p=mesa.git tegra: Fix scanout resources without modifiers Resources created for scanout but without modifiers need to be treated as pitch-linear. This is because applications that don't use modifiers to create resources must be assumed to not understand modifiers and in turn won't be able to create a DRM framebuffer and passing along which modifiers were picked by the implementation. Tested-by: Daniel Kolesa Cc: mesa-stable@lists.freedesktop.org Signed-off-by: Thierry Reding --- diff --git a/src/gallium/drivers/tegra/tegra_screen.c b/src/gallium/drivers/tegra/tegra_screen.c index 41bf2052f94..8b61c090160 100644 --- a/src/gallium/drivers/tegra/tegra_screen.c +++ b/src/gallium/drivers/tegra/tegra_screen.c @@ -260,6 +260,7 @@ tegra_screen_resource_create(struct pipe_screen *pscreen, const struct pipe_resource *template) { struct tegra_screen *screen = to_tegra_screen(pscreen); + uint64_t modifier = DRM_FORMAT_MOD_INVALID; struct tegra_resource *resource; int err; @@ -267,7 +268,23 @@ tegra_screen_resource_create(struct pipe_screen *pscreen, if (!resource) return NULL; - resource->gpu = screen->gpu->resource_create(screen->gpu, template); + /* + * Applications that create scanout resources without modifiers are very + * unlikely to support modifiers at all. In that case the resources need + * to be created with a pitch-linear layout so that they can be properly + * shared with scanout hardware. + * + * Technically it is possible for applications to create resources without + * specifying a modifier but still query the modifier associated with the + * resource (e.g. using gbm_bo_get_modifier()) before handing it to the + * framebuffer creation API (such as the DRM_IOCTL_MODE_ADDFB2 IOCTL). + */ + if (template->bind & PIPE_BIND_SCANOUT) + modifier = DRM_FORMAT_MOD_LINEAR; + + resource->gpu = screen->gpu->resource_create_with_modifiers(screen->gpu, + template, + &modifier, 1); if (!resource->gpu) goto free;