diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2014-06-20 09:20:37 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2014-06-20 14:28:39 +1000 |
commit | 60b876eab3708f1c277027addb5514974452644c (patch) | |
tree | 11d094727554022d16d2c4b4e41d71e479f373b8 | |
parent | 36dda1341008dd87a6b5459f0616776097d11d9f (diff) | |
download | xorg-driver-xf86-video-nouveau-60b876eab3708f1c277027addb5514974452644c.tar.gz |
dri2: move away from directly touching drmmode on page flips
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | src/drmmode_display.c | 46 | ||||
-rw-r--r-- | src/nv_proto.h | 3 |
2 files changed, 31 insertions, 18 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 04ce40e..cae7355 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -88,7 +88,7 @@ typedef struct { } drmmode_output_private_rec, *drmmode_output_private_ptr; typedef struct { - drmmode_ptr drmmode; + int fd; unsigned old_fb_id; int flip_count; void *event_data; @@ -126,6 +126,21 @@ drmmode_pixmap(PixmapPtr ppix) return nouveau_pixmap(ppix); } +int +drmmode_head(xf86CrtcPtr crtc) +{ + drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; + return drmmode_crtc->mode_crtc->crtc_id; +} + +void +drmmode_swap(ScrnInfoPtr scrn, uint32_t next, uint32_t *prev) +{ + drmmode_ptr drmmode = drmmode_from_scrn(scrn); + *prev = drmmode->fb_id; + drmmode->fb_id = next; +} + static PixmapPtr drmmode_pixmap_wrap(ScreenPtr pScreen, int width, int height, int depth, int bpp, int pitch, struct nouveau_bo *bo, void *data) @@ -1382,18 +1397,17 @@ drmmode_page_flip(DrawablePtr draw, PixmapPtr back, void *priv, { ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); - drmmode_crtc_private_ptr crtc = config->crtc[0]->driver_private; - drmmode_ptr mode = crtc->drmmode; - int ret, i, old_fb_id; + NVPtr pNv = NVPTR(scrn); + uint32_t next_fb; int emitted = 0; + int ret, i; drmmode_flipdata_ptr flipdata; drmmode_flipevtcarrier_ptr flipcarrier; - old_fb_id = mode->fb_id; - ret = drmModeAddFB(mode->fd, scrn->virtualX, scrn->virtualY, + ret = drmModeAddFB(pNv->dev->fd, scrn->virtualX, scrn->virtualY, scrn->depth, scrn->bitsPerPixel, scrn->displayWidth * scrn->bitsPerPixel / 8, - drmmode_pixmap(back)->bo->handle, &mode->fb_id); + nouveau_pixmap(back)->bo->handle, &next_fb); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "add fb failed: %s\n", strerror(errno)); @@ -1408,10 +1422,10 @@ drmmode_page_flip(DrawablePtr draw, PixmapPtr back, void *priv, } flipdata->event_data = priv; - flipdata->drmmode = mode; + flipdata->fd = pNv->dev->fd; for (i = 0; i < config->num_crtc; i++) { - crtc = config->crtc[i]->driver_private; + int head = drmmode_head(config->crtc[i]); if (!config->crtc[i]->enabled) continue; @@ -1433,9 +1447,8 @@ drmmode_page_flip(DrawablePtr draw, PixmapPtr back, void *priv, flipcarrier->dispatch_me = ((1 << i) == ref_crtc_hw_id); flipcarrier->flipdata = flipdata; - ret = drmModePageFlip(mode->fd, crtc->mode_crtc->crtc_id, - mode->fb_id, DRM_MODE_PAGE_FLIP_EVENT, - flipcarrier); + ret = drmModePageFlip(pNv->dev->fd, head, next_fb, + DRM_MODE_PAGE_FLIP_EVENT, flipcarrier); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "flip queue failed: %s\n", strerror(errno)); @@ -1450,13 +1463,11 @@ drmmode_page_flip(DrawablePtr draw, PixmapPtr back, void *priv, } /* Will release old fb after all crtc's completed flip. */ - flipdata->old_fb_id = old_fb_id; - + drmmode_swap(scrn, next_fb, &flipdata->old_fb_id); return TRUE; error_undo: - drmModeRmFB(mode->fd, mode->fb_id); - mode->fb_id = old_fb_id; + drmModeRmFB(pNv->dev->fd, next_fb); return FALSE; } @@ -1529,7 +1540,6 @@ drmmode_flip_handler(int fd, unsigned int frame, unsigned int tv_sec, { drmmode_flipevtcarrier_ptr flipcarrier = event_data; drmmode_flipdata_ptr flipdata = flipcarrier->flipdata; - drmmode_ptr drmmode = flipdata->drmmode; /* Is this the event whose info shall be delivered to higher level? */ if (flipcarrier->dispatch_me) { @@ -1546,7 +1556,7 @@ drmmode_flip_handler(int fd, unsigned int frame, unsigned int tv_sec, return; /* Release framebuffer */ - drmModeRmFB(drmmode->fd, flipdata->old_fb_id); + drmModeRmFB(flipdata->fd, flipdata->old_fb_id); if (flipdata->event_data == NULL) { free(flipdata); diff --git a/src/nv_proto.h b/src/nv_proto.h index 0b16812..c2c66c7 100644 --- a/src/nv_proto.h +++ b/src/nv_proto.h @@ -12,6 +12,9 @@ Bool drmmode_page_flip(DrawablePtr draw, PixmapPtr back, void *priv, void drmmode_screen_init(ScreenPtr pScreen); void drmmode_screen_fini(ScreenPtr pScreen); +int drmmode_head(xf86CrtcPtr crtc); +void drmmode_swap(ScrnInfoPtr, uint32_t, uint32_t *); + /* in nv_accel_common.c */ Bool NVAccelCommonInit(ScrnInfoPtr pScrn); void NVAccelCommonFini(ScrnInfoPtr pScrn); |