Keeping it in VRAM wastes CPU time, because cursor_set ioctl reads handed BO back to RAM, just to write it to actual cursor BO. Here (nv92/core i7), this patch decreases overall cpu usage of drmmode_load_cursor_argb from 4.6ms to ~90us and lets nv50_crtc_cursor_set disappear from perf traces. --- I considered accelerating kernel-side copying with GPU, but it turns out that: - it's slower (120-150us), with frequent bursts (up to 5ms) - not applicable to <nv50 hw, which needs to transform cursor data Putting cursor BO in GART does not conflict with accelarating kernel side copying - times do not change, so it's safe to apply it. --- src/drmmode_display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 4d2d09d..ee0805d 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -567,7 +567,7 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num) drmmode->mode_res->crtcs[num]); drmmode_crtc->drmmode = drmmode; - ret = nouveau_bo_new(pNv->dev, NOUVEAU_BO_VRAM | NOUVEAU_BO_MAP, 0, + ret = nouveau_bo_new(pNv->dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, 64*64*4, NULL, &drmmode_crtc->cursor); assert(ret == 0); --
On Mon, Jan 21, 2013 at 12:15:38AM +0100, Marcin Slusarz wrote:> Keeping it in VRAM wastes CPU time, because cursor_set ioctl reads > handed BO back to RAM, just to write it to actual cursor BO. > > Here (nv92/core i7), this patch decreases overall cpu usage of > drmmode_load_cursor_argb from 4.6ms to ~90us and lets nv50_crtc_cursor_set > disappear from perf traces. > --- > I considered accelerating kernel-side copying with GPU, but it turns out that: > - it's slower (120-150us), with frequent bursts (up to 5ms) > - not applicable to <nv50 hw, which needs to transform cursor data > > Putting cursor BO in GART does not conflict with accelarating kernel side > copying - times do not change, so it's safe to apply it.Pushed, thanks!> --- > src/drmmode_display.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/src/drmmode_display.c b/src/drmmode_display.c > index 4d2d09d..ee0805d 100644 > --- a/src/drmmode_display.c > +++ b/src/drmmode_display.c > @@ -567,7 +567,7 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num) > drmmode->mode_res->crtcs[num]); > drmmode_crtc->drmmode = drmmode; > > - ret = nouveau_bo_new(pNv->dev, NOUVEAU_BO_VRAM | NOUVEAU_BO_MAP, 0, > + ret = nouveau_bo_new(pNv->dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, > 64*64*4, NULL, &drmmode_crtc->cursor); > assert(ret == 0); > > -- > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/nouveau
Reasonably Related Threads
- [PATCH xf86-video-nouveau] Properly cleanup fb for reverse-prime-offload
- TV-out modesetting DDX patches
- [PATCH] adapt to HAS_DIRTYTRACKING_DRAWABLE_SRC changes
- [PATCH] Take shift in crtc positions for ZaphodHeads configs into account.
- [PATCH] drmmode: update logic for dynamic connectors, paths, and tiles