[RFC xserver v4 12/14] glamor: Implement GetSupportedModifiers
Michel Dänzer
michel at daenzer.net
Tue Oct 17 16:16:18 UTC 2017
On 16/10/17 07:02 AM, Louis-Francis Ratté-Boulianne wrote:
> Implement function added in DRI3 v1.1.
>
> A newest version of libepoxy (>= 1.4.4) is required as earlier
> versions use a problematic version of Khronos
> EXT_image_dma_buf_import_modifiers spec.
It might be better to split the Present, modesetting and Xwayland
changes into separate patches.
> v4: Only send scanout-supported modifiers if flipping is possible
What's the reason for that? Scanout compatible tiling is probably
better than linear even if the buffer isn't scanned out directly,
isn't it?
> +_X_EXPORT Bool
> +glamor_get_drawable_modifiers(DrawablePtr draw, CARD32 format,
> + CARD32 *num_modifiers, uint64_t **modifiers)
> +{
> + struct glamor_screen_private *glamor_priv =
> + glamor_get_screen_private(draw->pScreen);
> +
> + if (glamor_priv->get_drawable_modifiers) {
> + return glamor_priv->get_drawable_modifiers(draw, format,
> + num_modifiers, modifiers);
> + }
> + *num_modifiers = 0;
> + return TRUE;
> +}
I think the logic would be clearer as:
if (!glamor_priv->get_drawable_modifiers) {
*num_modifiers = 0;
return TRUE;
}
return glamor_priv->get_drawable_modifiers(draw, format,
num_modifiers, modifiers);
}
> diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
> index cb1f03dc9..4e60569a1 100644
> --- a/glamor/glamor_egl.c
> +++ b/glamor/glamor_egl.c
> @@ -488,6 +488,95 @@ glamor_pixmap_from_fds(ScreenPtr screen,
> return pixmap;
> }
>
> +_X_EXPORT Bool
> +glamor_get_formats(ScreenPtr screen,
> + CARD32 *num_formats, CARD32 **formats)
> +{
> +#ifdef GLAMOR_HAS_EGL_QUERY_DMABUF
> + struct glamor_egl_screen_private *glamor_egl;
> + EGLint num;
> +
> + glamor_egl = glamor_egl_get_screen_private(xf86ScreenToScrn(screen));
> +
> + if (!glamor_egl->dmabuf_capable)
> + return FALSE;
> +
> + if (!eglQueryDmaBufFormatsEXT(glamor_egl->display, 0, NULL, &num)) {
> + *num_formats = 0;
> + return FALSE;
> + }
> +
> + if (num == 0) {
> + *num_formats = 0;
> + return TRUE;
> + }
> +
> + *formats = calloc(num, sizeof(CARD32));
> + if (*formats == NULL) {
> + *num_formats = 0;
> + return FALSE;
> + }
> +
> + if (!eglQueryDmaBufFormatsEXT(glamor_egl->display, num,
> + (EGLint *) *formats, &num)) {
> + *num_formats = 0;
> + free(*formats);
> + return FALSE;
> + }
> +
> + *num_formats = num;
> + return TRUE;
> +#else
> + *num_formats = 0;
> + return TRUE;
> +#endif
> +}
Seems weird to return TRUE from glamor_get_formats/modifiers when
GLAMOR_HAS_EGL_QUERY_DMABUF isn't defined. It would probably be better
not to set those hooks in dri3_screen_info_rec in the first place in that
case.
> diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
> index 3053e53f1..f11c545e2 100644
> --- a/hw/xfree86/common/xf86Mode.c
> +++ b/hw/xfree86/common/xf86Mode.c
> @@ -86,6 +86,7 @@
>
> #include <X11/X.h>
> #include "xf86Modes.h"
> +#include "xf86Crtc.h"
> #include "os.h"
> #include "servermd.h"
> #include "globals.h"
It's odd to add this #include without any other changes in this file.
Why is it needed?
> diff --git a/present/present.c b/present/present.c
> index 4d38d2d84..3efae348b 100644
> --- a/present/present.c
> +++ b/present/present.c
> @@ -611,6 +611,44 @@ present_check_flip_window (WindowPtr window)
> }
> }
>
> +Bool
> +present_can_window_flip(WindowPtr window)
> +{
> + ScreenPtr screen = window->drawable.pScreen;
> + PixmapPtr window_pixmap;
> + WindowPtr root = screen->root;
> + present_screen_priv_ptr screen_priv = present_screen_priv(screen);
> +
> + if (!screen_priv)
> + return FALSE;
> +
> + if (!screen_priv->info)
> + return FALSE;
> +
> + /* Check to see if the driver supports flips at all */
> + if (!screen_priv->info->flip)
> + return FALSE;
> +
> + /* Make sure the window hasn't been redirected with Composite */
> + window_pixmap = screen->GetWindowPixmap(window);
> + if (window_pixmap != screen->GetScreenPixmap(screen) &&
> + window_pixmap != screen_priv->flip_pixmap &&
> + window_pixmap != present_flip_pending_pixmap(screen))
> + return FALSE;
Could short-cut this a little if the window is already flipping:
window_pixmap = screen->GetWindowPixmap(window);
if (window_pixmap == screen_priv->flip_pixmap ||
window_pixmap == present_flip_pending_pixmap(screen))
return TRUE;
if (window_pixmap != screen->GetScreenPixmap(screen))
return FALSE;
[...]
--
Earthling Michel Dänzer | http://www.amd.com
Libre software enthusiast | Mesa and X developer
More information about the xorg-devel
mailing list