summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-02-17 16:48:24 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2011-02-17 16:52:58 +0000
commit4c66b28870b050493ad96f7b0fe2d70d7ee539c7 (patch)
tree21d22626518fc9cdc1e999abe0c9a00004995029
parent23f9b14df7c102c1036134835dd5d1a508059858 (diff)
downloadxf86-video-intel-4c66b28870b050493ad96f7b0fe2d70d7ee539c7.tar.gz
xf86-video-intel-4c66b28870b050493ad96f7b0fe2d70d7ee539c7.tar.bz2
xf86-video-intel-4c66b28870b050493ad96f7b0fe2d70d7ee539c7.zip
uxa: Fallback if the temporary is too large
If the render operation requires a temporary source Picture and the operation is large, larger than the maximum permitted bo, then we will fail to allocate the bo. In this case, we need to fallback and perform the operation on the CPU rather than dereference a NULL bo. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=34399 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--uxa/uxa-render.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/uxa/uxa-render.c b/uxa/uxa-render.c
index 0f06e822a..b26be8022 100644
--- a/uxa/uxa-render.c
+++ b/uxa/uxa-render.c
@@ -460,12 +460,12 @@ uxa_try_driver_solid_fill(PicturePtr pSrc,
}
static PicturePtr
-uxa_picture_for_pixman_format(ScreenPtr pScreen,
+uxa_picture_for_pixman_format(ScreenPtr screen,
pixman_format_code_t format,
int width, int height)
{
- PicturePtr pPicture;
- PixmapPtr pPixmap;
+ PicturePtr picture;
+ PixmapPtr pixmap;
int error;
if (format == PIXMAN_a1)
@@ -475,24 +475,29 @@ uxa_picture_for_pixman_format(ScreenPtr pScreen,
if (PIXMAN_FORMAT_A(format) == 0)
format = PIXMAN_a8r8g8b8;
- pPixmap = (*pScreen->CreatePixmap)(pScreen, width, height,
- PIXMAN_FORMAT_DEPTH(format),
- UXA_CREATE_PIXMAP_FOR_MAP);
- if (!pPixmap)
+ pixmap = screen->CreatePixmap(screen, width, height,
+ PIXMAN_FORMAT_DEPTH(format),
+ UXA_CREATE_PIXMAP_FOR_MAP);
+ if (!pixmap)
return 0;
- pPicture = CreatePicture(0, &pPixmap->drawable,
- PictureMatchFormat(pScreen,
- PIXMAN_FORMAT_DEPTH(format),
- format),
- 0, 0, serverClient, &error);
- (*pScreen->DestroyPixmap) (pPixmap);
- if (!pPicture)
+ if (!uxa_pixmap_is_offscreen(pixmap)) {
+ screen->DestroyPixmap(pixmap);
+ return 0;
+ }
+
+ picture = CreatePicture(0, &pixmap->drawable,
+ PictureMatchFormat(screen,
+ PIXMAN_FORMAT_DEPTH(format),
+ format),
+ 0, 0, serverClient, &error);
+ screen->DestroyPixmap(pixmap);
+ if (!picture)
return 0;
- ValidatePicture(pPicture);
+ ValidatePicture(picture);
- return pPicture;
+ return picture;
}
static PicturePtr