summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2017-08-03 15:06:08 +0100
committerJonas Ã…dahl <jadahl@gmail.com>2018-01-24 11:39:01 +0800
commitc0d9b08ef9bf2be865aad9bf1bc74ba24c655d9f (patch)
tree91a17910025c129aa4b9aec3419f69cb6a5df8a4
parentd99cd279d2b5434c51e7a45fd11b46c6c83e7843 (diff)
downloadmutter-c0d9b08ef9bf2be865aad9bf1bc74ba24c655d9f.tar.gz
renderer/native: Use modifier-aware GBM API
Newer versions of GBM support buffer modifiers, including multi-plane buffers. Use this new API to explicitly pull the information from GBM, and feed it to drmModeAddFB2WithModifiers. https://bugzilla.gnome.org/show_bug.cgi?id=785779
-rw-r--r--configure.ac2
-rw-r--r--src/backends/native/meta-renderer-native.c47
2 files changed, 37 insertions, 12 deletions
diff --git a/configure.ac b/configure.ac
index 42348146c..7399f741a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -266,7 +266,7 @@ AC_SUBST(XWAYLAND_PATH)
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
-MUTTER_NATIVE_BACKEND_MODULES="libdrm >= 2.4.83 libsystemd libinput >= 1.4 gudev-1.0 gbm >= 10.3"
+MUTTER_NATIVE_BACKEND_MODULES="libdrm >= 2.4.83 libsystemd libinput >= 1.4 gudev-1.0 gbm >= 17.1"
AC_ARG_ENABLE(native-backend,
AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),,
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 968b9d44c..2e59161cc 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -1283,24 +1283,49 @@ gbm_get_next_fb_id (MetaGpuKms *gpu_kms,
uint32_t handles[4] = { 0, };
uint32_t strides[4] = { 0, };
uint32_t offsets[4] = { 0, };
+ uint64_t modifiers[4] = { 0, };
+ int i;
/* Now we need to set the CRTC to whatever is the front buffer */
next_bo = gbm_surface_lock_front_buffer (gbm_surface);
- strides[0] = gbm_bo_get_stride (next_bo);
- handles[0] = gbm_bo_get_handle (next_bo).u32;
+ for (i = 0; i < gbm_bo_get_plane_count (next_bo); i++)
+ {
+ strides[i] = gbm_bo_get_stride_for_plane (next_bo, i);
+ handles[i] = gbm_bo_get_handle_for_plane (next_bo, i).u32;
+ offsets[i] = gbm_bo_get_offset (next_bo, i);
+ modifiers[i] = gbm_bo_get_modifier (next_bo);
+ }
kms_fd = meta_gpu_kms_get_fd (gpu_kms);
- if (drmModeAddFB2 (kms_fd,
- gbm_bo_get_width (next_bo),
- gbm_bo_get_height (next_bo),
- gbm_bo_get_format (next_bo),
- handles,
- strides,
- offsets,
- &next_fb_id,
- 0))
+ if (modifiers[0] != DRM_FORMAT_MOD_INVALID)
+ {
+ if (drmModeAddFB2WithModifiers (kms_fd,
+ gbm_bo_get_width (next_bo),
+ gbm_bo_get_height (next_bo),
+ gbm_bo_get_format (next_bo),
+ handles,
+ strides,
+ offsets,
+ modifiers,
+ &next_fb_id,
+ DRM_MODE_FB_MODIFIERS))
+ {
+ g_warning ("Failed to create new back buffer handle: %m");
+ gbm_surface_release_buffer (gbm_surface, next_bo);
+ return FALSE;
+ }
+ }
+ else if (drmModeAddFB2 (kms_fd,
+ gbm_bo_get_width (next_bo),
+ gbm_bo_get_height (next_bo),
+ gbm_bo_get_format (next_bo),
+ handles,
+ strides,
+ offsets,
+ &next_fb_id,
+ 0))
{
if (drmModeAddFB (kms_fd,
gbm_bo_get_width (next_bo),