xwayland: allow using linux-dmabuf with DRM_FORMAT_MOD_INVALID
When the linux-dmabuf protocol is available, prefer it over the old wl_drm protocol. Previously wl_drm was used when modifiers aren't supported, however linux-dmabuf supports formats without modifiers too. In this case, linux-dmabuf will send a DRM_FORMAT_MOD_INVALID modifier for each supported format [1]. This allows compositors to better handle these buffers, getting a DMA-BUF and implementing features like direct scan-out. A similar logic has been implemented for EGL [2]. DRM_FORMAT_MOD_INVALID is now stored in the xwl_screen->formats list. glamor_get_modifiers still returns FALSE with zero modifiers if the only advertised modifier is DRM_FORMAT_MOD_INVALID. [1]:fb9b2a8731
[2]:c376865f5e
Signed-off-by: Simon Ser <contact@emersion.fr> Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
This commit is contained in:
parent
c0e13cbf5a
commit
d6558477d7
|
@ -668,7 +668,9 @@ glamor_get_modifiers(ScreenPtr screen, uint32_t format,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!xwl_format)
|
if (!xwl_format ||
|
||||||
|
(xwl_format->num_modifiers == 1 &&
|
||||||
|
xwl_format->modifiers[0] == DRM_FORMAT_MOD_INVALID))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
*modifiers = calloc(xwl_format->num_modifiers, sizeof(uint64_t));
|
*modifiers = calloc(xwl_format->num_modifiers, sizeof(uint64_t));
|
||||||
|
@ -832,10 +834,6 @@ xwl_dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
|
||||||
struct xwl_format *xwl_format = NULL;
|
struct xwl_format *xwl_format = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (modifier_hi == (DRM_FORMAT_MOD_INVALID >> 32) &&
|
|
||||||
modifier_lo == (DRM_FORMAT_MOD_INVALID & 0xffffffff))
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < xwl_screen->num_formats; i++) {
|
for (i = 0; i < xwl_screen->num_formats; i++) {
|
||||||
if (xwl_screen->formats[i].format == format) {
|
if (xwl_screen->formats[i].format == format) {
|
||||||
xwl_format = &xwl_screen->formats[i];
|
xwl_format = &xwl_screen->formats[i];
|
||||||
|
|
Loading…
Reference in New Issue