From da92f6db5bf0d3ac42732df556eb4f96619c9047 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 9 Mar 2010 12:36:34 +0800 Subject: winsys/xlib: Fix a segfault when USE_XSHM is not defined. --- src/gallium/winsys/xlib/xlib_sw_winsys.c | 41 ++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'src/gallium') diff --git a/src/gallium/winsys/xlib/xlib_sw_winsys.c b/src/gallium/winsys/xlib/xlib_sw_winsys.c index 3e8fefb5824..9a4ae39aeb9 100644 --- a/src/gallium/winsys/xlib/xlib_sw_winsys.c +++ b/src/gallium/winsys/xlib/xlib_sw_winsys.c @@ -193,6 +193,26 @@ alloc_shm_ximage(struct xm_displaytarget *xm_dt, #endif /* USE_XSHM */ +static void +alloc_ximage(struct xm_displaytarget *xm_dt, + struct xlib_drawable *xmb, + unsigned width, unsigned height) +{ +#ifdef USE_XSHM + if (xm_dt->shm) { + alloc_shm_ximage(xm_dt, xmb, width, height); + return; + } +#endif + + xm_dt->tempImage = XCreateImage(xm_dt->display, + xmb->visual, + xmb->depth, + ZPixmap, 0, + NULL, width, height, + 8, 0); +} + static boolean xm_is_displaytarget_format_supported( struct sw_winsys *ws, enum pipe_format format ) @@ -265,19 +285,20 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable, if (no_swap) return; + if (xm_dt->tempImage == NULL) + { + assert(util_format_get_blockwidth(xm_dt->format) == 1); + assert(util_format_get_blockheight(xm_dt->format) == 1); + alloc_ximage(xm_dt, xlib_drawable, + xm_dt->stride / util_format_get_blocksize(xm_dt->format), + xm_dt->height); + if (!xm_dt->tempImage) + return; + } + #ifdef USE_XSHM if (xm_dt->shm) { - if (xm_dt->tempImage == NULL) - { - assert(util_format_get_blockwidth(xm_dt->format) == 1); - assert(util_format_get_blockheight(xm_dt->format) == 1); - alloc_shm_ximage(xm_dt, - xlib_drawable, - xm_dt->stride / util_format_get_blocksize(xm_dt->format), - xm_dt->height); - } - ximage = xm_dt->tempImage; ximage->data = xm_dt->data; -- cgit v1.2.3