diff options
-rw-r--r-- | src/gallium/frontends/glx/xlib/xm_st.c | 20 | ||||
-rw-r--r-- | src/gallium/winsys/sw/xlib/xlib_sw_winsys.c | 18 |
2 files changed, 28 insertions, 10 deletions
diff --git a/src/gallium/frontends/glx/xlib/xm_st.c b/src/gallium/frontends/glx/xlib/xm_st.c index 04068a62656..b14f9acc90e 100644 --- a/src/gallium/frontends/glx/xlib/xm_st.c +++ b/src/gallium/frontends/glx/xlib/xm_st.c @@ -60,7 +60,8 @@ xmesa_st_framebuffer(struct st_framebuffer_iface *stfbi) static bool xmesa_st_framebuffer_display(struct st_framebuffer_iface *stfbi, struct st_context_iface *stctx, - enum st_attachment_type statt) + enum st_attachment_type statt, + struct pipe_box *box) { struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi); struct pipe_resource *ptex = xstfb->textures[statt]; @@ -77,7 +78,7 @@ xmesa_st_framebuffer_display(struct st_framebuffer_iface *stfbi, pres = xstfb->display_resource; } - xstfb->screen->flush_frontbuffer(xstfb->screen, pctx, pres, 0, 0, &xstfb->buffer->ws, NULL); + xstfb->screen->flush_frontbuffer(xstfb->screen, pctx, pres, 0, 0, &xstfb->buffer->ws, box); return true; } @@ -267,7 +268,7 @@ xmesa_st_framebuffer_flush_front(struct st_context_iface *stctx, struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi); bool ret; - ret = xmesa_st_framebuffer_display(stfbi, stctx, statt); + ret = xmesa_st_framebuffer_display(stfbi, stctx, statt, NULL); if (ret && xmesa_strict_invalidate) xmesa_check_buffer_size(xstfb->buffer); @@ -349,7 +350,7 @@ xmesa_swap_st_framebuffer(struct st_framebuffer_iface *stfbi) struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi); bool ret; - ret = xmesa_st_framebuffer_display(stfbi, NULL, ST_ATTACHMENT_BACK_LEFT); + ret = xmesa_st_framebuffer_display(stfbi, NULL, ST_ATTACHMENT_BACK_LEFT, NULL); if (ret) { struct pipe_resource **front, **back, *tmp; @@ -379,8 +380,15 @@ xmesa_copy_st_framebuffer(struct st_framebuffer_iface *stfbi, int x, int y, int w, int h) { xmesa_st_framebuffer_copy_textures(stfbi, src, dst, x, y, w, h); - if (dst == ST_ATTACHMENT_FRONT_LEFT) - xmesa_st_framebuffer_display(stfbi, NULL, dst); + if (dst == ST_ATTACHMENT_FRONT_LEFT) { + struct pipe_box box = {}; + + box.x = x; + box.y = y; + box.width = w; + box.height = h; + xmesa_st_framebuffer_display(stfbi, NULL, src, &box); + } } diff --git a/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c b/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c index 0eea71b7523..57e13084037 100644 --- a/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c +++ b/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c @@ -295,13 +295,15 @@ xlib_displaytarget_destroy(struct sw_winsys *ws, */ static void xlib_sw_display(struct xlib_drawable *xlib_drawable, - struct sw_displaytarget *dt) + struct sw_displaytarget *dt, + struct pipe_box *box) { static bool no_swap = false; static bool firsttime = true; struct xlib_displaytarget *xlib_dt = xlib_displaytarget(dt); Display *display = xlib_dt->display; XImage *ximage; + struct pipe_box _box = {}; if (firsttime) { no_swap = getenv("SP_NO_RAST") != NULL; @@ -311,6 +313,12 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable, if (no_swap) return; + if (!box) { + _box.width = xlib_dt->width; + _box.height = xlib_dt->height; + box = &_box; + } + if (xlib_dt->drawable != xlib_drawable->drawable) { if (xlib_dt->gc) { XFreeGC(display, xlib_dt->gc); @@ -346,7 +354,8 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable, /* _debug_printf("XSHM\n"); */ XShmPutImage(xlib_dt->display, xlib_drawable->drawable, xlib_dt->gc, - ximage, 0, 0, 0, 0, xlib_dt->width, xlib_dt->height, False); + ximage, box->x, box->y, box->x, box->y, + box->width, box->height, False); } else { /* display image in Window */ @@ -364,7 +373,8 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable, /* _debug_printf("XPUT\n"); */ XPutImage(xlib_dt->display, xlib_drawable->drawable, xlib_dt->gc, - ximage, 0, 0, 0, 0, xlib_dt->width, xlib_dt->height); + ximage, box->x, box->y, box->x, box->y, + box->width, box->height); } XFlush(xlib_dt->display); @@ -382,7 +392,7 @@ xlib_displaytarget_display(struct sw_winsys *ws, struct pipe_box *box) { struct xlib_drawable *xlib_drawable = (struct xlib_drawable *)context_private; - xlib_sw_display(xlib_drawable, dt); + xlib_sw_display(xlib_drawable, dt, box); } |