Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932339AbcCWSry (ORCPT ); Wed, 23 Mar 2016 14:47:54 -0400 Received: from mail-yw0-f177.google.com ([209.85.161.177]:35809 "EHLO mail-yw0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756046AbcCWSru (ORCPT ); Wed, 23 Mar 2016 14:47:50 -0400 From: Gustavo Padovan To: dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, Daniel Stone , =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= , Riley Andrews , Daniel Vetter , Rob Clark , Greg Hackmann , John Harrison , Maarten Lankhorst , Gustavo Padovan Subject: [RFC 6/6] drm/fence: support fence_collection on atomic commit Date: Wed, 23 Mar 2016 15:47:27 -0300 Message-Id: <1458758847-21170-7-git-send-email-gustavo@padovan.org> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1458758847-21170-1-git-send-email-gustavo@padovan.org> References: <1458758847-21170-1-git-send-email-gustavo@padovan.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2489 Lines: 85 From: Gustavo Padovan Let atomic_commit() wait on a collection of fences before proceed with the scanout. Signed-off-by: Gustavo Padovan --- drivers/gpu/drm/drm_atomic.c | 9 +++++++++ drivers/gpu/drm/drm_atomic_helper.c | 9 +++++---- include/drm/drm_crtc.h | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 8bc364c..28a65d1 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -29,6 +29,7 @@ #include #include #include +#include /** * drm_atomic_state_default_release - @@ -795,6 +796,14 @@ static int drm_atomic_plane_check(struct drm_plane *plane, return -EINVAL; } +#ifdef CONFIG_SYNC_FILE + if (state->fence_fd >= 0) { + state->fences = sync_file_fences_get(state->fence_fd); + if (!state->fences) + return -EINVAL; + } +#endif + return 0; } diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 4f91f84..a6e34b6 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -977,14 +977,12 @@ static void wait_for_fences(struct drm_device *dev, int i; for_each_plane_in_state(state, plane, plane_state, i) { - if (!plane->state->fence) + if (!plane->state->fences) continue; WARN_ON(!plane->state->fb); - fence_wait(plane->state->fence, false); - fence_put(plane->state->fence); - plane->state->fence = NULL; + fence_collection_wait(plane->state->fences); } } @@ -2654,6 +2652,9 @@ void __drm_atomic_helper_plane_destroy_state(struct drm_plane *plane, { if (state->fb) drm_framebuffer_unreference(state->fb); + + if (state->fences) + fence_collection_put(state->fences); } EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state); diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index a8f6ec0..c221c28 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1257,7 +1257,7 @@ struct drm_plane_state { struct drm_crtc *crtc; /* do not write directly, use drm_atomic_set_crtc_for_plane() */ struct drm_framebuffer *fb; /* do not write directly, use drm_atomic_set_fb_for_plane() */ - struct fence *fence; + struct fence_collection *fences; int fence_fd; /* Signed dest location allows it to be partially off screen */ -- 2.5.0