Deepak Rawat
2018-09-06 00:18:15 UTC
Not all drivers support fb2 modifiers so read the capability before
using drmModeAddFB2WithModifiers.
Signed-off-by: Deepak Rawat <***@vmware.com>
---
libweston/compositor-drm.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 38911763..6a87a296 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -302,6 +302,8 @@ struct drm_backend {
bool shutting_down;
bool aspect_ratio_supported;
+
+ bool fb_modifiers;
};
struct drm_mode {
@@ -903,7 +905,7 @@ drm_fb_destroy_gbm(struct gbm_bo *bo, void *data)
}
static int
-drm_fb_addfb(struct drm_fb *fb)
+drm_fb_addfb(struct drm_fb *fb, bool fb_modifiers)
{
int ret = -EINVAL;
#ifdef HAVE_DRM_ADDFB2_MODIFIERS
@@ -913,7 +915,7 @@ drm_fb_addfb(struct drm_fb *fb)
/* If we have a modifier set, we must only use the WithModifiers
* entrypoint; we cannot import it through legacy ioctls. */
- if (fb->modifier != DRM_FORMAT_MOD_INVALID) {
+ if (fb_modifiers && fb->modifier != DRM_FORMAT_MOD_INVALID) {
/* KMS demands that if a modifier is set, it must be the same
* for all planes. */
#ifdef HAVE_DRM_ADDFB2_MODIFIERS
@@ -996,7 +998,7 @@ drm_fb_create_dumb(struct drm_backend *b, int width, int height,
fb->height = height;
fb->fd = b->drm.fd;
- if (drm_fb_addfb(fb) != 0) {
+ if (drm_fb_addfb(fb, b->fb_modifiers) != 0) {
weston_log("failed to create kms fb: %m\n");
goto err_bo;
}
@@ -1168,7 +1170,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
goto err_free;
}
- if (drm_fb_addfb(fb) != 0)
+ if (drm_fb_addfb(fb, backend->fb_modifiers) != 0)
goto err_free;
return fb;
@@ -1239,7 +1241,7 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
goto err_free;
}
- if (drm_fb_addfb(fb) != 0) {
+ if (drm_fb_addfb(fb, backend->fb_modifiers) != 0) {
if (type == BUFFER_GBM_SURFACE)
weston_log("failed to create kms fb: %m\n");
goto err_free;
@@ -3822,6 +3824,14 @@ init_kms_caps(struct drm_backend *b)
weston_log("DRM: %s atomic modesetting\n",
b->atomic_modeset ? "supports" : "does not support");
+#ifdef HAVE_DRM_ADDFB2_MODIFIERS
+ ret = drmGetCap(b->drm.fd, DRM_CAP_ADDFB2_MODIFIERS, &cap);
+ if (ret == 0)
+ b->fb_modifiers = cap;
+ else
+#endif
+ b->fb_modifiers = 0;
+
/*
* KMS support for hardware planes cannot properly synchronize
* without nuclear page flip. Without nuclear/atomic, hw plane
using drmModeAddFB2WithModifiers.
Signed-off-by: Deepak Rawat <***@vmware.com>
---
libweston/compositor-drm.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 38911763..6a87a296 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -302,6 +302,8 @@ struct drm_backend {
bool shutting_down;
bool aspect_ratio_supported;
+
+ bool fb_modifiers;
};
struct drm_mode {
@@ -903,7 +905,7 @@ drm_fb_destroy_gbm(struct gbm_bo *bo, void *data)
}
static int
-drm_fb_addfb(struct drm_fb *fb)
+drm_fb_addfb(struct drm_fb *fb, bool fb_modifiers)
{
int ret = -EINVAL;
#ifdef HAVE_DRM_ADDFB2_MODIFIERS
@@ -913,7 +915,7 @@ drm_fb_addfb(struct drm_fb *fb)
/* If we have a modifier set, we must only use the WithModifiers
* entrypoint; we cannot import it through legacy ioctls. */
- if (fb->modifier != DRM_FORMAT_MOD_INVALID) {
+ if (fb_modifiers && fb->modifier != DRM_FORMAT_MOD_INVALID) {
/* KMS demands that if a modifier is set, it must be the same
* for all planes. */
#ifdef HAVE_DRM_ADDFB2_MODIFIERS
@@ -996,7 +998,7 @@ drm_fb_create_dumb(struct drm_backend *b, int width, int height,
fb->height = height;
fb->fd = b->drm.fd;
- if (drm_fb_addfb(fb) != 0) {
+ if (drm_fb_addfb(fb, b->fb_modifiers) != 0) {
weston_log("failed to create kms fb: %m\n");
goto err_bo;
}
@@ -1168,7 +1170,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
goto err_free;
}
- if (drm_fb_addfb(fb) != 0)
+ if (drm_fb_addfb(fb, backend->fb_modifiers) != 0)
goto err_free;
return fb;
@@ -1239,7 +1241,7 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
goto err_free;
}
- if (drm_fb_addfb(fb) != 0) {
+ if (drm_fb_addfb(fb, backend->fb_modifiers) != 0) {
if (type == BUFFER_GBM_SURFACE)
weston_log("failed to create kms fb: %m\n");
goto err_free;
@@ -3822,6 +3824,14 @@ init_kms_caps(struct drm_backend *b)
weston_log("DRM: %s atomic modesetting\n",
b->atomic_modeset ? "supports" : "does not support");
+#ifdef HAVE_DRM_ADDFB2_MODIFIERS
+ ret = drmGetCap(b->drm.fd, DRM_CAP_ADDFB2_MODIFIERS, &cap);
+ if (ret == 0)
+ b->fb_modifiers = cap;
+ else
+#endif
+ b->fb_modifiers = 0;
+
/*
* KMS support for hardware planes cannot properly synchronize
* without nuclear page flip. Without nuclear/atomic, hw plane
--
2.17.1
2.17.1