Merge "libdrm: add freeze last frame function [1/1]"
diff --git a/meson/meson_drm_kms.c b/meson/meson_drm_kms.c
index 67ed569..edfed63 100644
--- a/meson/meson_drm_kms.c
+++ b/meson/meson_drm_kms.c
@@ -129,7 +129,15 @@
         close(buf->fd[i]);
 
     fd = drm_disp->alloc_only ? drm_disp->dev->render_fd : drm_disp->dev->fd;
-    drmModeRmFB(drm_disp->drm_fd, buf->fb_id);
+    if (drm_disp->freeze) {
+        ret = drmIoctl(drm_disp->drm_fd, DRM_IOCTL_MESON_RMFB, &buf->fb_id);
+        if (ret < 0) {
+            fprintf(stderr, "Unable to rmfb: %s\n",
+                    strerror(errno));
+        }
+    } else {
+        drmModeRmFB(drm_disp->drm_fd, buf->fb_id);
+    }
     memset(&destroy_dumb, 0, sizeof(destroy_dumb));
 
     for ( i = 0; i < buf->nbo; i++) {
@@ -808,6 +816,7 @@
     base->free_buf = kms_free_buf;
     base->post_buf = kms_post_buf;
     base->alloc_only = 0;
+    base->freeze = 0;
 
     ret = drm_kms_init_resource(display);
     if (ret) {
diff --git a/meson/meson_drm_util.h b/meson/meson_drm_util.h
index 758fca7..f623104 100644
--- a/meson/meson_drm_util.h
+++ b/meson/meson_drm_util.h
@@ -67,7 +67,8 @@
 
     size_t nbuf;
     struct drm_buf *bufs;
-	int alloc_only;
+    int alloc_only;
+    int freeze;
 
     void (*destroy_display)(struct drm_display *disp);
     int (*alloc_bufs)(struct drm_display *disp, int num, struct drm_buf_metadata *info);
diff --git a/meson_drm.h b/meson_drm.h
index 7a8c7a8..ec05b1e 100644
--- a/meson_drm.h
+++ b/meson_drm.h
@@ -41,6 +41,8 @@
 /*Memory related.*/
 #define DRM_IOCTL_MESON_GEM_CREATE		DRM_IOWR(DRM_COMMAND_BASE + \
 		0x00, struct drm_meson_gem_create)
+#define DRM_IOCTL_MESON_RMFB		DRM_IOWR(DRM_COMMAND_BASE + \
+		0x01, unsigned int)
 
 /*KMS related.*/
 #define DRM_IOCTL_MESON_ASYNC_ATOMIC	DRM_IOWR(DRM_COMMAND_BASE + \