Merge branch 'mesa_7_6_branch' into mesa_7_7_branch
[mesa.git] / src / gallium / state_trackers / xorg / xorg_driver.c
index 22db8bb3c89f6a2668938343247e2958bb3e89c5..8a24aa10a3cf7b08397d31a1ad1f0eeaca73c691 100644 (file)
@@ -480,7 +480,7 @@ static void drv_block_handler(int i, pointer blockData, pointer pTimeout,
        if (num_cliprects) {
            drmModeClip *clip = alloca(num_cliprects * sizeof(drmModeClip));
            BoxPtr rect = REGION_RECTS(dirty);
-           int i;
+           int i, ret;
 
            /* XXX no need for copy? */
            for (i = 0; i < num_cliprects; i++, rect++) {
@@ -491,7 +491,11 @@ static void drv_block_handler(int i, pointer blockData, pointer pTimeout,
            }
 
            /* TODO query connector property to see if this is needed */
-           drmModeDirtyFB(ms->fd, ms->fb_id, clip, num_cliprects);
+           ret = drmModeDirtyFB(ms->fd, ms->fb_id, clip, num_cliprects);
+           if (ret) {
+               debug_printf("%s: failed to send dirty (%i, %s)\n",
+                            __func__, ret, strerror(-ret));
+           }
 
            DamageEmpty(ms->damage);
        }
@@ -687,6 +691,9 @@ drv_leave_vt(int scrnIndex, int flags)
     xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
     int o;
 
+    if (ms->winsys_leave_vt)
+       ms->winsys_leave_vt(pScrn);
+
     for (o = 0; o < config->num_crtc; o++) {
        xf86CrtcPtr crtc = config->crtc[o];
 
@@ -749,6 +756,9 @@ drv_enter_vt(int scrnIndex, int flags)
     if (!xf86SetDesiredModes(pScrn))
        return FALSE;
 
+    if (ms->winsys_enter_vt)
+       ms->winsys_enter_vt(pScrn);
+
     return TRUE;
 }
 
@@ -831,6 +841,7 @@ drv_create_front_buffer_ga3d(ScrnInfoPtr pScrn)
     modesettingPtr ms = modesettingPTR(pScrn);
     unsigned handle, stride;
     struct pipe_texture *tex;
+    int ret;
 
     ms->noEvict = TRUE;
 
@@ -844,16 +855,21 @@ drv_create_front_buffer_ga3d(ScrnInfoPtr pScrn)
                                            tex,
                                            &stride,
                                            &handle))
-       return FALSE;
+       goto err_destroy;
 
-    drmModeAddFB(ms->fd,
-                pScrn->virtualX,
-                pScrn->virtualY,
-                pScrn->depth,
-                pScrn->bitsPerPixel,
-                stride,
-                handle,
-                 &ms->fb_id);
+    ret = drmModeAddFB(ms->fd,
+                      pScrn->virtualX,
+                      pScrn->virtualY,
+                      pScrn->depth,
+                      pScrn->bitsPerPixel,
+                      stride,
+                      handle,
+                      &ms->fb_id);
+    if (ret) {
+       debug_printf("%s: failed to create framebuffer (%i, %s)",
+                    __func__, ret, strerror(-ret));
+       goto err_destroy;
+    }
 
     pScrn->frameX0 = 0;
     pScrn->frameY0 = 0;
@@ -863,6 +879,10 @@ drv_create_front_buffer_ga3d(ScrnInfoPtr pScrn)
     pipe_texture_reference(&tex, NULL);
 
     return TRUE;
+
+err_destroy:
+    pipe_texture_reference(&tex, NULL);
+    return FALSE;
 }
 
 static Bool
@@ -892,6 +912,8 @@ static Bool
 drv_destroy_front_buffer_kms(ScrnInfoPtr pScrn)
 {
     modesettingPtr ms = modesettingPTR(pScrn);
+    ScreenPtr pScreen = pScrn->pScreen;
+    PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
 
     if (!ms->root_bo)
        return TRUE;
@@ -908,6 +930,7 @@ drv_create_front_buffer_kms(ScrnInfoPtr pScrn)
     unsigned handle, stride;
     struct kms_bo *bo;
     unsigned attr[8];
+    int ret;
 
     attr[0] = KMS_BO_TYPE;
     attr[1] = KMS_BO_TYPE_SCANOUT;
@@ -926,14 +949,19 @@ drv_create_front_buffer_kms(ScrnInfoPtr pScrn)
     if (kms_bo_get_prop(bo, KMS_HANDLE, &handle))
        goto err_destroy;
 
-    drmModeAddFB(ms->fd,
-                pScrn->virtualX,
-                pScrn->virtualY,
-                pScrn->depth,
-                pScrn->bitsPerPixel,
-                stride,
-                handle,
-                 &ms->fb_id);
+    ret = drmModeAddFB(ms->fd,
+                      pScrn->virtualX,
+                      pScrn->virtualY,
+                      pScrn->depth,
+                      pScrn->bitsPerPixel,
+                      stride,
+                      handle,
+                      &ms->fb_id);
+    if (ret) {
+       debug_printf("%s: failed to create framebuffer (%i, %s)",
+                    __func__, ret, strerror(-ret));
+       goto err_destroy;
+    }
 
     pScrn->frameX0 = 0;
     pScrn->frameY0 = 0;
@@ -960,7 +988,7 @@ drv_bind_front_buffer_kms(ScrnInfoPtr pScrn)
        return FALSE;
 
     if (kms_bo_map(ms->root_bo, &ptr))
-       return FALSE;
+       goto err_destroy;
 
     pScreen->ModifyPixmapHeader(rootPixmap,
                                pScreen->width,
@@ -970,6 +998,10 @@ drv_bind_front_buffer_kms(ScrnInfoPtr pScrn)
                                stride,
                                ptr);
     return TRUE;
+
+err_destroy:
+    kms_bo_destroy(&ms->root_bo);
+    return FALSE;
 }
 #endif /* HAVE_LIBKMS */