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

Eric Engestrom eric.engestrom at imgtec.com
Tue May 2 17:05:43 UTC 2017


On Tuesday, 2017-05-02 15:04:08 +0100, Daniel Stone wrote:
> 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;
> -	}

This hunk is still needed, isn't it?
With this restored, the patch is:
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>

> -
> -	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