diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index 9c447481517..e8fe80a0647 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -852,7 +852,7 @@ d3d12_flush_frontbuffer(struct pipe_screen * pscreen, } #endif - winsys->displaytarget_display(winsys, res->dt, winsys_drawable_handle, sub_box); + winsys->displaytarget_display(winsys, res->dt, winsys_drawable_handle, nboxes, sub_box); } #ifndef _GAMING_XBOX diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index e09d036659a..329dbdf7d01 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -866,7 +866,7 @@ llvmpipe_flush_frontbuffer(struct pipe_screen *_screen, llvmpipe_flush_resource(_pipe, resource, 0, true, true, false, "frontbuffer"); winsys->displaytarget_display(winsys, texture->dt, - context_private, sub_box); + context_private, nboxes, sub_box); } } diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index 8af27ea85e4..4746b61c0cf 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c @@ -504,7 +504,7 @@ softpipe_flush_frontbuffer(struct pipe_screen *_screen, assert(texture->dt); if (texture->dt) - winsys->displaytarget_display(winsys, texture->dt, context_private, sub_box); + winsys->displaytarget_display(winsys, texture->dt, context_private, nboxes, sub_box); } static int diff --git a/src/gallium/include/frontend/sw_winsys.h b/src/gallium/include/frontend/sw_winsys.h index 1982ac5fd96..6f219d67293 100644 --- a/src/gallium/include/frontend/sw_winsys.h +++ b/src/gallium/include/frontend/sw_winsys.h @@ -132,6 +132,7 @@ struct sw_winsys (*displaytarget_display)( struct sw_winsys *ws, struct sw_displaytarget *dt, void *context_private, + unsigned nboxes, struct pipe_box *box ); void diff --git a/src/gallium/winsys/sw/dri/dri_sw_winsys.c b/src/gallium/winsys/sw/dri/dri_sw_winsys.c index 464caac7177..f65e2663f11 100644 --- a/src/gallium/winsys/sw/dri/dri_sw_winsys.c +++ b/src/gallium/winsys/sw/dri/dri_sw_winsys.c @@ -242,6 +242,7 @@ static void dri_sw_displaytarget_display(struct sw_winsys *ws, struct sw_displaytarget *dt, void *context_private, + unsigned nboxes, struct pipe_box *box) { struct dri_sw_winsys *dri_sw_ws = dri_sw_winsys(ws); @@ -257,7 +258,7 @@ dri_sw_displaytarget_display(struct sw_winsys *ws, * * PutImage correctly clips to the width of the dst drawable. */ - if (box) { + if (nboxes == 1) { offset = dri_sw_dt->stride * box->y; offset_x = box->x * blsize; data += offset; @@ -279,7 +280,7 @@ dri_sw_displaytarget_display(struct sw_winsys *ws, return; } - if (box) + if (nboxes == 1) dri_sw_ws->lf->put_image2(dri_drawable, data, x, y, width, height, dri_sw_dt->stride); else diff --git a/src/gallium/winsys/sw/gdi/gdi_sw_winsys.c b/src/gallium/winsys/sw/gdi/gdi_sw_winsys.c index 13224a6bd9e..3c433935e1a 100644 --- a/src/gallium/winsys/sw/gdi/gdi_sw_winsys.c +++ b/src/gallium/winsys/sw/gdi/gdi_sw_winsys.c @@ -252,6 +252,7 @@ static void gdi_sw_displaytarget_display(struct sw_winsys *_winsys, struct sw_displaytarget *dt, void *context_private, + unsigned nboxes, struct pipe_box *box) { struct gdi_sw_winsys *winsys = gdi_sw_winsys(_winsys); @@ -302,4 +303,4 @@ HDC gdi_sw_acquire_hdc_by_value(void *context_private) { void gdi_sw_release_hdc_by_value(void *context_private, HDC hdc) { // Nothing to do -}; \ No newline at end of file +}; diff --git a/src/gallium/winsys/sw/hgl/hgl_sw_winsys.cpp b/src/gallium/winsys/sw/hgl/hgl_sw_winsys.cpp index 2bc1b972fb1..0533483e360 100644 --- a/src/gallium/winsys/sw/hgl/hgl_sw_winsys.cpp +++ b/src/gallium/winsys/sw/hgl/hgl_sw_winsys.cpp @@ -211,7 +211,8 @@ hgl_winsys_displaytarget_unmap(struct sw_winsys* winsys, static void hgl_winsys_displaytarget_display(struct sw_winsys* winsys, struct sw_displaytarget* displayTarget, void* contextPrivate, - struct pipe_box *box) + unsigned nboxes, + struct pipe_box *box) { assert(contextPrivate); diff --git a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c index 206ec9090e7..9807c0f0f49 100644 --- a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c +++ b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c @@ -483,6 +483,7 @@ static void kms_sw_displaytarget_display(struct sw_winsys *ws, struct sw_displaytarget *dt, void *context_private, + unsigned nboxes, struct pipe_box *box) { /* This function should not be called, instead the dri2 loader should diff --git a/src/gallium/winsys/sw/null/null_sw_winsys.c b/src/gallium/winsys/sw/null/null_sw_winsys.c index 60d2a830421..4e705727b8c 100644 --- a/src/gallium/winsys/sw/null/null_sw_winsys.c +++ b/src/gallium/winsys/sw/null/null_sw_winsys.c @@ -116,6 +116,7 @@ static void null_sw_displaytarget_display(struct sw_winsys *winsys, struct sw_displaytarget *dt, void *context_private, + unsigned nboxes, struct pipe_box *box) { assert(0); diff --git a/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c b/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c index 4777ce8d917..9b257bcb184 100644 --- a/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c +++ b/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c @@ -297,6 +297,7 @@ xlib_displaytarget_destroy(struct sw_winsys *ws, static void xlib_sw_display(struct xlib_drawable *xlib_drawable, struct sw_displaytarget *dt, + unsigned nboxes, struct pipe_box *box) { static bool no_swap = false; @@ -314,7 +315,7 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable, if (no_swap) return; - if (!box) { + if (nboxes != 1) { _box.width = xlib_dt->width; _box.height = xlib_dt->height; box = &_box; @@ -390,10 +391,11 @@ static void xlib_displaytarget_display(struct sw_winsys *ws, struct sw_displaytarget *dt, void *context_private, + unsigned nboxes, struct pipe_box *box) { struct xlib_drawable *xlib_drawable = (struct xlib_drawable *)context_private; - xlib_sw_display(xlib_drawable, dt, box); + xlib_sw_display(xlib_drawable, dt, nboxes, box); } diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c index fb9daaa57e6..9696c811562 100644 --- a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c +++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c @@ -661,7 +661,7 @@ static void virgl_vtest_flush_frontbuffer(struct virgl_winsys *vws, level, true); vtws->sws->displaytarget_display(vtws->sws, res->dt, winsys_drawable_handle, - sub_box); + !!sub_box, sub_box); } static void