From: Derek Foreman Date: Thu, 5 Oct 2017 17:41:08 +0000 (-0500) Subject: broadcom/vc4: Don't advertise tiled dmabuf modifiers if we can't use them X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=17d78ece36a08d79b95182e36ed99cb65de905ce;p=mesa.git broadcom/vc4: Don't advertise tiled dmabuf modifiers if we can't use them 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 Reviewed-by: Eric Anholt Acked-by: Daniel Stone (on irc) --- diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c index 5743e13045f..b39cc744e6f 100644 --- a/src/gallium/drivers/vc4/vc4_screen.c +++ b/src/gallium/drivers/vc4/vc4_screen.c @@ -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)))