diff options
author | Derek Foreman <[email protected]> | 2017-10-05 12:41:08 -0500 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2017-10-05 11:26:14 -0700 |
commit | 17d78ece36a08d79b95182e36ed99cb65de905ce (patch) | |
tree | 59e299095ec891cd3c5c59b113d869a3f4df391f /src | |
parent | b174a1ae720cb404738cd57c431f5769d677957d (diff) |
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 <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Acked-by: Daniel Stone <[email protected]> (on irc)
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_screen.c | 31 |
1 files changed, 18 insertions, 13 deletions
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))) |