From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: Re: [PATCH 1/2] radeon: Don't generate new fence for page flip. Date: Tue, 12 Jul 2011 10:45:20 -0400 Message-ID: References: <1310470787-20490-1-git-send-email-michel@daenzer.net> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: Received: from mail-iw0-f177.google.com (mail-iw0-f177.google.com [209.85.214.177]) by gabe.freedesktop.org (Postfix) with ESMTP id 884219F6CE for ; Tue, 12 Jul 2011 07:45:20 -0700 (PDT) Received: by iwn35 with SMTP id 35so5471712iwn.36 for ; Tue, 12 Jul 2011 07:45:20 -0700 (PDT) In-Reply-To: <1310470787-20490-1-git-send-email-michel@daenzer.net> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: =?ISO-8859-1?Q?Michel_D=E4nzer?= Cc: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org 2011/7/12 Michel D=E4nzer : > From: Michel D=E4nzer > > Use the fence of the new frontbuffer, if any. > > Generating a new fence could cause us to wait for completely unrelated > rendering to finish before performing the flip. > > Signed-off-by: Michel D=E4nzer Reviewed-by: Alex Deucher > --- > =A0drivers/gpu/drm/radeon/radeon_display.c | =A0 33 ++++-----------------= --------- > =A01 files changed, 5 insertions(+), 28 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/ra= deon/radeon_display.c > index 0671934..71a4840 100644 > --- a/drivers/gpu/drm/radeon/radeon_display.c > +++ b/drivers/gpu/drm/radeon/radeon_display.c > @@ -280,7 +280,7 @@ void radeon_crtc_handle_flip(struct radeon_device *rd= ev, int crtc_id) > =A0 =A0 =A0 =A0spin_lock_irqsave(&rdev->ddev->event_lock, flags); > =A0 =A0 =A0 =A0work =3D radeon_crtc->unpin_work; > =A0 =A0 =A0 =A0if (work =3D=3D NULL || > - =A0 =A0 =A0 =A0 =A0 !radeon_fence_signaled(work->fence)) { > + =A0 =A0 =A0 =A0 =A0 (work->fence && !radeon_fence_signaled(work->fence)= )) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0spin_unlock_irqrestore(&rdev->ddev->event_= lock, flags); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return; > =A0 =A0 =A0 =A0} > @@ -346,7 +346,6 @@ static int radeon_crtc_page_flip(struct drm_crtc *crt= c, > =A0 =A0 =A0 =A0struct radeon_framebuffer *new_radeon_fb; > =A0 =A0 =A0 =A0struct drm_gem_object *obj; > =A0 =A0 =A0 =A0struct radeon_bo *rbo; > - =A0 =A0 =A0 struct radeon_fence *fence; > =A0 =A0 =A0 =A0struct radeon_unpin_work *work; > =A0 =A0 =A0 =A0unsigned long flags; > =A0 =A0 =A0 =A0u32 tiling_flags, pitch_pixels; > @@ -357,22 +356,19 @@ static int radeon_crtc_page_flip(struct drm_crtc *c= rtc, > =A0 =A0 =A0 =A0if (work =3D=3D NULL) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENOMEM; > > - =A0 =A0 =A0 r =3D radeon_fence_create(rdev, &fence); > - =A0 =A0 =A0 if (unlikely(r !=3D 0)) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 kfree(work); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 DRM_ERROR("flip queue: failed to create fen= ce.\n"); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -ENOMEM; > - =A0 =A0 =A0 } > =A0 =A0 =A0 =A0work->event =3D event; > =A0 =A0 =A0 =A0work->rdev =3D rdev; > =A0 =A0 =A0 =A0work->crtc_id =3D radeon_crtc->crtc_id; > - =A0 =A0 =A0 work->fence =3D radeon_fence_ref(fence); > =A0 =A0 =A0 =A0old_radeon_fb =3D to_radeon_framebuffer(crtc->fb); > =A0 =A0 =A0 =A0new_radeon_fb =3D to_radeon_framebuffer(fb); > =A0 =A0 =A0 =A0/* schedule unpin of the old buffer */ > =A0 =A0 =A0 =A0obj =3D old_radeon_fb->obj; > =A0 =A0 =A0 =A0rbo =3D gem_to_radeon_bo(obj); > =A0 =A0 =A0 =A0work->old_rbo =3D rbo; > + =A0 =A0 =A0 obj =3D new_radeon_fb->obj; > + =A0 =A0 =A0 rbo =3D gem_to_radeon_bo(obj); > + =A0 =A0 =A0 if (rbo->tbo.sync_obj) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 work->fence =3D radeon_fence_ref(rbo->tbo.s= ync_obj); > =A0 =A0 =A0 =A0INIT_WORK(&work->work, radeon_unpin_work_func); > > =A0 =A0 =A0 =A0/* We borrow the event spin lock for protecting unpin_work= */ > @@ -380,7 +376,6 @@ static int radeon_crtc_page_flip(struct drm_crtc *crt= c, > =A0 =A0 =A0 =A0if (radeon_crtc->unpin_work) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0spin_unlock_irqrestore(&dev->event_lock, f= lags); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0kfree(work); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 radeon_fence_unref(&fence); > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0DRM_DEBUG_DRIVER("flip queue: crtc already= busy\n"); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -EBUSY; > @@ -390,9 +385,6 @@ static int radeon_crtc_page_flip(struct drm_crtc *crt= c, > =A0 =A0 =A0 =A0spin_unlock_irqrestore(&dev->event_lock, flags); > > =A0 =A0 =A0 =A0/* pin the new buffer */ > - =A0 =A0 =A0 obj =3D new_radeon_fb->obj; > - =A0 =A0 =A0 rbo =3D gem_to_radeon_bo(obj); > - > =A0 =A0 =A0 =A0DRM_DEBUG_DRIVER("flip-ioctl() cur_fbo =3D %p, cur_bbo =3D= %p\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 work->old_rbo, rbo); > > @@ -460,25 +452,11 @@ static int radeon_crtc_page_flip(struct drm_crtc *c= rtc, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto pflip_cleanup1; > =A0 =A0 =A0 =A0} > > - =A0 =A0 =A0 /* 32 ought to cover us */ > - =A0 =A0 =A0 r =3D radeon_ring_lock(rdev, 32); > - =A0 =A0 =A0 if (r) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 DRM_ERROR("failed to lock the ring before f= lip\n"); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto pflip_cleanup2; > - =A0 =A0 =A0 } > - > - =A0 =A0 =A0 /* emit the fence */ > - =A0 =A0 =A0 radeon_fence_emit(rdev, fence); > =A0 =A0 =A0 =A0/* set the proper interrupt */ > =A0 =A0 =A0 =A0radeon_pre_page_flip(rdev, radeon_crtc->crtc_id); > - =A0 =A0 =A0 /* fire the ring */ > - =A0 =A0 =A0 radeon_ring_unlock_commit(rdev); > > =A0 =A0 =A0 =A0return 0; > > -pflip_cleanup2: > - =A0 =A0 =A0 drm_vblank_put(dev, radeon_crtc->crtc_id); > - > =A0pflip_cleanup1: > =A0 =A0 =A0 =A0r =3D radeon_bo_reserve(rbo, false); > =A0 =A0 =A0 =A0if (unlikely(r !=3D 0)) { > @@ -498,7 +476,6 @@ pflip_cleanup: > =A0 =A0 =A0 =A0spin_lock_irqsave(&dev->event_lock, flags); > =A0 =A0 =A0 =A0radeon_crtc->unpin_work =3D NULL; > =A0 =A0 =A0 =A0spin_unlock_irqrestore(&dev->event_lock, flags); > - =A0 =A0 =A0 radeon_fence_unref(&fence); > =A0 =A0 =A0 =A0kfree(work); > > =A0 =A0 =A0 =A0return r; > -- > 1.7.5.4 > > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel >