[Mesa-dev] [PATCH kmscube] atomic: Use normal rendering loop for modeset

Daniel Stone daniels at collabora.com
Tue May 2 14:04:08 UTC 2017


The initial pattern of:
    initial_modeset();
    while (1) {
        pageflip();
    }

was relying on getting a buffer despite not having rendered anything. It
would also show undefined content. Replace this with just using the
pageflip loop for the initial modeset as well.

Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 drm-atomic.c | 35 ++++++++++-------------------------
 1 file changed, 10 insertions(+), 25 deletions(-)

diff --git a/drm-atomic.c b/drm-atomic.c
index 65caacd..65a2b29 100644
--- a/drm-atomic.c
+++ b/drm-atomic.c
@@ -175,33 +175,14 @@ static EGLSyncKHR create_fence(const struct egl *egl, int fd)
 
 static int atomic_run(const struct gbm *gbm, const struct egl *egl)
 {
-	struct gbm_bo *bo;
+	struct gbm_bo *bo = NULL;
 	struct drm_fb *fb;
 	uint32_t i = 0;
+	uint32_t flags = DRM_MODE_ATOMIC_NONBLOCK;
 	int ret;
 
-	if (!egl->eglDupNativeFenceFDANDROID) {
-		printf("no eglDupNativeFenceFDANDROID\n");
-		return -1;
-	}
-
-	eglSwapBuffers(egl->display, egl->surface);
-	bo = gbm_surface_lock_front_buffer(gbm->surface);
-	fb = drm_fb_get_from_bo(bo);
-	if (!fb) {
-		printf("Failed to get a new framebuffer BO\n");
-		return -1;
-	}
-
-
-	drm.kms_in_fence_fd = -1;
-
-	/* set mode: */
-	ret = drm_atomic_commit(fb->fb_id, DRM_MODE_ATOMIC_ALLOW_MODESET);
-	if (ret) {
-		printf("failed to commit modeset: %s\n", strerror(errno));
-		return ret;
-	}
+	/* Allow a modeset change for the first commit only. */
+	flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
 
 	while (1) {
 		struct gbm_bo *next_bo;
@@ -269,15 +250,19 @@ static int atomic_run(const struct gbm *gbm, const struct egl *egl)
 		 * Here you could also update drm plane layers if you want
 		 * hw composition
 		 */
-		ret = drm_atomic_commit(fb->fb_id, DRM_MODE_ATOMIC_NONBLOCK);
+		ret = drm_atomic_commit(fb->fb_id, flags);
 		if (ret) {
 			printf("failed to commit: %s\n", strerror(errno));
 			return -1;
 		}
 
 		/* release last buffer to render on again: */
-		gbm_surface_release_buffer(gbm->surface, bo);
+		if (bo)
+			gbm_surface_release_buffer(gbm->surface, bo);
 		bo = next_bo;
+
+		/* Allow a modeset change for the first commit only. */
+		flags &= ~(DRM_MODE_ATOMIC_ALLOW_MODESET);
 	}
 
 	return ret;
-- 
2.12.2



More information about the mesa-dev mailing list