nouveau page_flip function implement not wait vblank, which cause screen garbage

Maarten Maathuis madman2003 at gmail.com
Mon Oct 24 22:45:29 PDT 2011


2011/10/25 chris <wwzbwwzb at 163.com>:
> Can anyone give a suggestion, is wait-vblank fully implemented in
> page_flip() for nouveau drm driver?
>
>
> At 2011-10-24 14:30:55,chris <wwzbwwzb at 163.com> wrote:
>
> Dear,
>
> I use NVidia Geforce 7300GT graphics card in my PC, and Linux 3.1rc4 kernel
> code, git drm 2.4.36.
>   When I run the vbltest program, it prints  "60HZ"  which indicated the
> implementation of drmWaitVBlank() and drm_vblank_wait()  is correct.
>   But when I run modetest with option " -v -s 12:1280x1024" , it prints high
> fresh rate up to "150 HZ" .  I examing the code , and found that no waiting
> vblank operation is processed in nouveau_crtc_ page_flip() function. The
> screen  produced lots of garbage and blink very much.
>  int
> nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
>                struct drm_pending_vblank_event *event)
> {
> ......
> }
> I study the i915 intel_crtc_page_flip implementation.
> static int intel_crtc_page_flip(stru ct drm_crtc *crtc,
>                 struct drm_framebuffer *fb,
>                 struct drm_pending_vblank_event *event)
> {
> ......
>
>     ret = drm_vblank_get(dev, intel_crtc->pipe);
>     if (ret)
>         goto cleanup_objs;
>
>     work->pending_flip_obj = obj;
>
>     work->enable_stall_check = true;
>
>     /* Block clients from rendering to the new back buffer until
>      * the flip occurs and the object is no longer visible.
>      */
>     atomic_add(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip);
>
>     ret = dev_priv->display.queue_flip(dev, crtc, fb, obj);
>  &am p;nb sp;  if (ret)
>         goto cleanup_pending;
> ......
> }
>
> after vblank irq acquired, the interrupt isr will wakup the runqueue.
> 6159 static void do_intel_finish_page_flip(struct drm_device *dev,
> 6160                       struct drm_crtc *crtc)
> 6161 {
> ......
> 6211         list_add_tail(&e->base.link,
> 6212                   &e->base.file_priv->event_list);
> 6213         wake_up_interruptible(&e->base.file_priv->event_wait);
> 6214     }
> 6215
> 6216     drm_vblank_put(dev, intel_crtc->pipe);
> 6217
>
>
> Is there anyone use the same  driver and foun d this issues can tell me "is
> it a bug"?
>
> Thanks!
>
>
>
>
>
>
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
>

It seems to be, the actual page flipping is done by software method
(see nv04_graph_mthd_page_flip). There is one thing i'm unsure about
and that is that we wait for the rendering to be done to the current
frontbuffer and not the current backbuffer (this is only done if the
page flip channel is different than the rendering channel). Maybe
someone else can comment on that.

-- 
Far away from the primal instinct, the song seems to fade away, the
river get wider between your thoughts and the things we do and say.


More information about the dri-devel mailing list