summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2014-06-20 09:20:37 +1000
committerBen Skeggs <bskeggs@redhat.com>2014-06-20 14:28:39 +1000
commit60b876eab3708f1c277027addb5514974452644c (patch)
tree11d094727554022d16d2c4b4e41d71e479f373b8
parent36dda1341008dd87a6b5459f0616776097d11d9f (diff)
downloadxorg-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.c46
-rw-r--r--src/nv_proto.h3
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);