summaryrefslogtreecommitdiff
path: root/src/gallium/winsys
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2021-02-17 15:55:26 -0500
committerMarge Bot <eric+marge@anholt.net>2021-02-23 18:57:57 +0000
commit292d45497ff918037a1e12773b99b0e04c6bd9ff (patch)
treea564910daf5c247d833973383df74c73c0264302 /src/gallium/winsys
parent6635a470381b79240d0d2a423a099ee4b9ff7bf2 (diff)
gallium/xlib: Partial fix for glXCopySubBufferMESA
xmesa_copy_st_framebuffer would attempt to flush from the front buffer to the display, but we don't actually have an attachment for the front buffer (just the back) so nothing would happen. Fix this by flushing fron the back to the display, threading the dirty box through so we don't update more than we were told to. This has the virtue of displaying correctly, but glx-copy-sub-buffer still fails since there is no real front buffer, reads from GL_FRONT actually read from the back buffer. The test does: clear to red, swap, clear to green, copy sub-buffer, expect a green square inside of a red one from the front buffer. Since you're really reading from the back you instead get solid green. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9140>
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r--src/gallium/winsys/sw/xlib/xlib_sw_winsys.c18
1 files changed, 14 insertions, 4 deletions
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);
}