summaryrefslogtreecommitdiff
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2018-03-15 21:59:02 +0100
committerThierry Reding <treding@nvidia.com>2018-05-29 16:48:34 +0200
commit9603d81df05105857b676f20dff964ef3ab0ecff (patch)
tree52ce134ff73bd91e184a0578e39aadcdfcaa51ec /src/gallium/drivers
parentbd3e97e5aad7800b8e17ed10d34a070926691945 (diff)
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 <daniel@octaforge.org> Cc: mesa-stable@lists.freedesktop.org Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/tegra/tegra_screen.c19
1 files changed, 18 insertions, 1 deletions
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;