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

chris wwzbwwzb at 163.com
Tue Oct 25 00:27:32 PDT 2011


It seems that nv04_graph_mthd_page_flip() was called from isr , and  page_flip ioctl only send a NV_SW_PAGE_FLIP  pushbuffer bo to gem. If you don't want the screen show garbage you must make sure not to change frontbuffer or backbuffer in GPU when nv_set_crtc_base()  is called, and not  change the frontbuffer context when it is rendering, am I right?
At 2011-10-25 13:45:29,"Maarten Maathuis" <madman2003 at gmail.com> wrote:
>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