diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-05-31 17:23:36 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-05-31 18:00:11 +0100 |
commit | cd38b705be84901a38380dc2a1b90889b553d565 (patch) | |
tree | 7e3f647b1cbf7e9bda7297fda95d04f6aa139cf7 /uxa/uxa-accel.c | |
parent | 5fff430046db2030f89e49beb66c6476dc3fcd4c (diff) |
Disable acceleration if we detect a hardware error.
This is wildly optimistic, but it should work in a surprising number of
error situations and some output in those cases will be hopefully be
better than none...
If we submit a batchbuffer and the kernel reports the GPU is hung (which
will be caused by an earlier execbuffer, and so the kernel should have
had enough time to determine whether or not it could reset the GPU) then
disable any further attempt to accelerate gfx and force fallbacks to map
the buffers and use the CPU. We cannot normally map any more buffers if
the GPU is hung, so only those already mapped prior to the hang can be
written to, or those allocated in system memory. However, we can expect
that the framebuffer is already mapped, and so have a reasonable
expectation to continue to see the display update.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'uxa/uxa-accel.c')
-rw-r--r-- | uxa/uxa-accel.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c index d4475c6a..6ac3e88d 100644 --- a/uxa/uxa-accel.c +++ b/uxa/uxa-accel.c @@ -70,7 +70,7 @@ uxa_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int n, PicturePtr dst, src; int error; - if (uxa_screen->swappedOut) + if (uxa_screen->swappedOut || uxa_screen->force_fallback) goto fallback; if (pGC->fillStyle != FillSolid) @@ -287,16 +287,18 @@ uxa_do_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, if (format != ZPixmap || bpp < 8) return FALSE; - /* Only accelerate copies: no rop or planemask. */ - if (!UXA_PM_IS_SOLID(pDrawable, pGC->planemask) || pGC->alu != GXcopy) + if (uxa_screen->swappedOut || uxa_screen->force_fallback) return FALSE; - if (uxa_screen->swappedOut) + if (!uxa_screen->info->put_image) return FALSE; - pPix = uxa_get_offscreen_pixmap(pDrawable, &xoff, &yoff); + /* Only accelerate copies: no rop or planemask. */ + if (!UXA_PM_IS_SOLID(pDrawable, pGC->planemask) || pGC->alu != GXcopy) + return FALSE; - if (!pPix || !uxa_screen->info->put_image) + pPix = uxa_get_offscreen_pixmap(pDrawable, &xoff, &yoff); + if (!pPix) return FALSE; x += pDrawable->x; @@ -694,7 +696,7 @@ uxa_copy_area(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, { uxa_screen_t *uxa_screen = uxa_get_screen(pDstDrawable->pScreen); - if (uxa_screen->swappedOut) { + if (uxa_screen->swappedOut || uxa_screen->force_fallback) { return uxa_check_copy_area(pSrcDrawable, pDstDrawable, pGC, srcx, srcy, width, height, dstx, dsty); @@ -884,7 +886,7 @@ uxa_poly_fill_rect(DrawablePtr pDrawable, if (!REGION_NUM_RECTS(pReg)) goto out; - if (uxa_screen->swappedOut) + if (uxa_screen->swappedOut || uxa_screen->force_fallback) goto fallback; pPixmap = uxa_get_offscreen_pixmap (pDrawable, &xoff, &yoff); @@ -1297,7 +1299,7 @@ uxa_get_image(DrawablePtr pDrawable, int x, int y, int w, int h, Box.x2 = Box.x1 + w; Box.y2 = Box.y1 + h; - if (uxa_screen->swappedOut) + if (uxa_screen->swappedOut || uxa_screen->force_fallback) goto fallback; pPix = uxa_get_offscreen_pixmap(pDrawable, &xoff, &yoff); |