2011/10/25 chris wwzbwwzb@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@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@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.