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