broadcom/vc4: Don't advertise tiled dmabuf modifiers if we can't use them
authorDerek Foreman <derekf@osg.samsung.com>
Thu, 5 Oct 2017 17:41:08 +0000 (12:41 -0500)
committerEric Anholt <eric@anholt.net>
Thu, 5 Oct 2017 18:26:14 +0000 (11:26 -0700)
If the DRM_VC4_GET_TILING ioctl isn't present then we can't tell
if a dmabuf bo is tiled or linear, so will always assume it's
linear.

By not advertising tiled formats in this situation we ensure the
assumption is correct.

This fixes a bug where most attempts to render a gl wayland client
under weston will result in a client side abort.

Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Acked-by: Daniel Stone <daniels@collabora.com> (on irc)
src/gallium/drivers/vc4/vc4_screen.c

index 5743e13045fc3655f83b5e94a371e352ebc039d7..b39cc744e6f66358589c6c6f6a6933f529fb8649 100644 (file)
@@ -549,25 +549,30 @@ vc4_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen,
                                   unsigned int *external_only,
                                   int *count)
 {
+        int m, i;
+        uint64_t available_modifiers[] = {
+                DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED,
+                DRM_FORMAT_MOD_LINEAR,
+        };
+        struct vc4_screen *screen = vc4_screen(pscreen);
+        int num_modifiers = screen->has_tiling_ioctl ? 2 : 1;
+
         if (!modifiers) {
-                *count = 2;
+                *count = num_modifiers;
                 return;
         }
 
-        *count = MIN2(max, 2);
-
+        *count = MIN2(max, num_modifiers);
+        m = screen->has_tiling_ioctl ? 0 : 1;
         /* We support both modifiers (tiled and linear) for all sampler
-         * formats.
+         * formats, but if we don't have the DRM_VC4_GET_TILING ioctl
+         * we shouldn't advertise the tiled formats.
          */
-        modifiers[0] = DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED;
-        if (external_only)
-                external_only[0] = false;
-        if (max < 2)
-                return;
-
-        modifiers[1] = DRM_FORMAT_MOD_LINEAR;
-        if (external_only)
-                external_only[1] = false;
+        for (i = 0; i < *count; i++) {
+                modifiers[i] = available_modifiers[m++];
+                if (external_only)
+                        external_only[i] = false;
+       }
 }
 
 #define PTR_TO_UINT(x) ((unsigned)((intptr_t)(x)))