diff --git a/src/egl/drivers/haiku/egl_haiku.cpp b/src/egl/drivers/haiku/egl_haiku.cpp index fcdeb32311f..e83656b53da 100644 --- a/src/egl/drivers/haiku/egl_haiku.cpp +++ b/src/egl/drivers/haiku/egl_haiku.cpp @@ -220,7 +220,7 @@ haiku_swap_buffers(_EGLDisplay *disp, _EGLSurface *surf) // flush back buffer and swap buffers if double buffering is used if (backBuffer != NULL) { screen->flush_frontbuffer(screen, st->pipe, backBuffer, 0, 0, - buffer->winsysContext, NULL); + buffer->winsysContext, 1, NULL); std::swap(frontBuffer, backBuffer); p_atomic_inc(&buffer->base.stamp); } diff --git a/src/gallium/auxiliary/driver_ddebug/dd_screen.c b/src/gallium/auxiliary/driver_ddebug/dd_screen.c index a4e56da95ac..fe742d86906 100644 --- a/src/gallium/auxiliary/driver_ddebug/dd_screen.c +++ b/src/gallium/auxiliary/driver_ddebug/dd_screen.c @@ -171,13 +171,14 @@ dd_screen_flush_frontbuffer(struct pipe_screen *_screen, struct pipe_resource *resource, unsigned level, unsigned layer, void *context_private, + unsigned nboxes, struct pipe_box *sub_box) { struct pipe_screen *screen = dd_screen(_screen)->screen; struct pipe_context *pipe = _pipe ? dd_context(_pipe)->pipe : NULL; screen->flush_frontbuffer(screen, pipe, resource, level, layer, context_private, - sub_box); + nboxes, sub_box); } static int diff --git a/src/gallium/auxiliary/driver_noop/noop_pipe.c b/src/gallium/auxiliary/driver_noop/noop_pipe.c index d61a7c6540d..1e657144c6e 100644 --- a/src/gallium/auxiliary/driver_noop/noop_pipe.c +++ b/src/gallium/auxiliary/driver_noop/noop_pipe.c @@ -477,7 +477,7 @@ static void noop_flush_frontbuffer(struct pipe_screen *_screen, struct pipe_context *ctx, struct pipe_resource *resource, unsigned level, unsigned layer, - void *context_private, struct pipe_box *box) + void *context_private, unsigned nboxes, struct pipe_box *box) { } diff --git a/src/gallium/auxiliary/driver_trace/tr_screen.c b/src/gallium/auxiliary/driver_trace/tr_screen.c index dc72112495e..bcacb1abac6 100644 --- a/src/gallium/auxiliary/driver_trace/tr_screen.c +++ b/src/gallium/auxiliary/driver_trace/tr_screen.c @@ -483,6 +483,7 @@ trace_screen_flush_frontbuffer(struct pipe_screen *_screen, struct pipe_resource *resource, unsigned level, unsigned layer, void *context_private, + unsigned nboxes, struct pipe_box *sub_box) { struct trace_screen *tr_scr = trace_screen(_screen); @@ -501,7 +502,7 @@ trace_screen_flush_frontbuffer(struct pipe_screen *_screen, trace_dump_call_end(); - screen->flush_frontbuffer(screen, pipe, resource, level, layer, context_private, sub_box); + screen->flush_frontbuffer(screen, pipe, resource, level, layer, context_private, nboxes, sub_box); } diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri.c b/src/gallium/auxiliary/vl/vl_winsys_dri.c index 0abc90a13a7..fb3bd089d1f 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_dri.c +++ b/src/gallium/auxiliary/vl/vl_winsys_dri.c @@ -123,7 +123,7 @@ vl_dri2_flush_frontbuffer(struct pipe_screen *screen, struct pipe_context *pipe, struct pipe_resource *resource, unsigned level, unsigned layer, - void *context_private, struct pipe_box *sub_box) + void *context_private, unsigned nboxes, struct pipe_box *sub_box) { struct vl_dri_screen *scrn = (struct vl_dri_screen *)context_private; uint32_t msc_hi, msc_lo; diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri3.c b/src/gallium/auxiliary/vl/vl_winsys_dri3.c index af851fa5ee0..6d0f6bf03e0 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_dri3.c +++ b/src/gallium/auxiliary/vl/vl_winsys_dri3.c @@ -571,7 +571,7 @@ vl_dri3_flush_frontbuffer(struct pipe_screen *screen, struct pipe_context *pipe, struct pipe_resource *resource, unsigned level, unsigned layer, - void *context_private, struct pipe_box *sub_box) + void *context_private, unsigned nboxes, struct pipe_box *sub_box) { struct vl_dri3_screen *scrn = (struct vl_dri3_screen *)context_private; uint32_t options = XCB_PRESENT_OPTION_NONE; diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index 57e1d348480..9c447481517 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -790,6 +790,7 @@ d3d12_flush_frontbuffer(struct pipe_screen * pscreen, struct pipe_resource *pres, unsigned level, unsigned layer, void *winsys_drawable_handle, + unsigned nboxes, struct pipe_box *sub_box) { struct d3d12_screen *screen = d3d12_screen(pscreen); diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index ad3d66424e1..e09d036659a 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -852,6 +852,7 @@ llvmpipe_flush_frontbuffer(struct pipe_screen *_screen, struct pipe_resource *resource, unsigned level, unsigned layer, void *context_private, + unsigned nboxes, struct pipe_box *sub_box) { struct llvmpipe_screen *screen = llvmpipe_screen(_screen); diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index cc76e6b5c6a..8af27ea85e4 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c @@ -495,6 +495,7 @@ softpipe_flush_frontbuffer(struct pipe_screen *_screen, struct pipe_resource *resource, unsigned level, unsigned layer, void *context_private, + unsigned nboxes, struct pipe_box *sub_box) { struct softpipe_screen *screen = softpipe_screen(_screen); diff --git a/src/gallium/drivers/tegra/tegra_screen.c b/src/gallium/drivers/tegra/tegra_screen.c index 31539bc5e3f..bfe05dfbd12 100644 --- a/src/gallium/drivers/tegra/tegra_screen.c +++ b/src/gallium/drivers/tegra/tegra_screen.c @@ -369,15 +369,17 @@ tegra_screen_flush_frontbuffer(struct pipe_screen *pscreen, unsigned int level, unsigned int layer, void *winsys_drawable_handle, + unsigned nboxes, struct pipe_box *box) { struct tegra_screen *screen = to_tegra_screen(pscreen); struct tegra_context *context = to_tegra_context(pcontext); + /* TODO: maybe rejigger for damage regions */ screen->gpu->flush_frontbuffer(screen->gpu, context ? context->gpu : NULL, resource, level, layer, - winsys_drawable_handle, box); + winsys_drawable_handle, nboxes, box); } static void diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index 6599f5f5c4c..a841e171540 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -927,7 +927,7 @@ static void virgl_flush_frontbuffer(struct pipe_screen *screen, struct pipe_context *ctx, struct pipe_resource *res, unsigned level, unsigned layer, - void *winsys_drawable_handle, struct pipe_box *sub_box) + void *winsys_drawable_handle, unsigned nboxes, struct pipe_box *sub_box) { struct virgl_screen *vscreen = virgl_screen(screen); struct virgl_winsys *vws = vscreen->vws; @@ -937,7 +937,7 @@ static void virgl_flush_frontbuffer(struct pipe_screen *screen, if (vws->flush_frontbuffer) { virgl_flush_eq(vctx, vctx, NULL); vws->flush_frontbuffer(vws, vctx->cbuf, vres->hw_res, level, layer, winsys_drawable_handle, - sub_box); + nboxes == 1 ? sub_box : NULL); } } diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index b66ac5c95be..fe62962964a 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1792,6 +1792,7 @@ zink_flush_frontbuffer(struct pipe_screen *pscreen, struct pipe_resource *pres, unsigned level, unsigned layer, void *winsys_drawable_handle, + unsigned nboxes, struct pipe_box *sub_box) { struct zink_screen *screen = zink_screen(pscreen); diff --git a/src/gallium/frontends/d3d10umd/DxgiFns.cpp b/src/gallium/frontends/d3d10umd/DxgiFns.cpp index 5ac63fd9f64..731a0298713 100644 --- a/src/gallium/frontends/d3d10umd/DxgiFns.cpp +++ b/src/gallium/frontends/d3d10umd/DxgiFns.cpp @@ -62,7 +62,7 @@ _Present(DXGI_DDI_ARG_PRESENT *pPresentData) Resource *pSrcResource = CastResource(pPresentData->hSurfaceToPresent); device->pipe->screen->flush_frontbuffer(device->pipe->screen, device->pipe, - pSrcResource->resource, 0, 0, pPresentData->pDXGIContext, NULL); + pSrcResource->resource, 0, 0, pPresentData->pDXGIContext, 0, NULL); return S_OK; } diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index 460014baf1c..1297744f720 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -193,7 +193,7 @@ drisw_present_texture(struct pipe_context *pipe, struct dri_drawable *drawable, if (screen->swrast_no_present) return; - screen->base.screen->flush_frontbuffer(screen->base.screen, pipe, ptex, 0, 0, drawable, sub_box); + screen->base.screen->flush_frontbuffer(screen->base.screen, pipe, ptex, 0, 0, drawable, !!sub_box, sub_box); } static inline void diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index 69536d1c81d..99171dc2467 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -603,11 +603,11 @@ kopper_update_drawable_info(struct dri_drawable *drawable) static inline void kopper_present_texture(struct pipe_context *pipe, struct dri_drawable *drawable, - struct pipe_resource *ptex, struct pipe_box *sub_box) + struct pipe_resource *ptex, unsigned nboxes, struct pipe_box *sub_box) { struct dri_screen *screen = drawable->screen; - screen->base.screen->flush_frontbuffer(screen->base.screen, pipe, ptex, 0, 0, drawable, sub_box); + screen->base.screen->flush_frontbuffer(screen->base.screen, pipe, ptex, 0, 0, drawable, nboxes, sub_box); } static inline void @@ -615,7 +615,7 @@ kopper_copy_to_front(struct pipe_context *pipe, struct dri_drawable *drawable, struct pipe_resource *ptex) { - kopper_present_texture(pipe, drawable, ptex, NULL); + kopper_present_texture(pipe, drawable, ptex, 0, NULL); kopper_invalidate_drawable(opaque_dri_drawable(drawable)); } diff --git a/src/gallium/frontends/glx/xlib/xm_st.c b/src/gallium/frontends/glx/xlib/xm_st.c index ca0687bc233..a1c3391569b 100644 --- a/src/gallium/frontends/glx/xlib/xm_st.c +++ b/src/gallium/frontends/glx/xlib/xm_st.c @@ -65,6 +65,7 @@ static bool xmesa_st_framebuffer_display(struct pipe_frontend_drawable *drawable, struct st_context *st, enum st_attachment_type statt, + unsigned nboxes, struct pipe_box *box) { struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(drawable); @@ -82,7 +83,7 @@ xmesa_st_framebuffer_display(struct pipe_frontend_drawable *drawable, pres = xstfb->display_resource; } - xstfb->screen->flush_frontbuffer(xstfb->screen, pctx, pres, 0, 0, &xstfb->buffer->ws, box); + xstfb->screen->flush_frontbuffer(xstfb->screen, pctx, pres, 0, 0, &xstfb->buffer->ws, nboxes, box); return true; } @@ -282,7 +283,7 @@ xmesa_st_framebuffer_flush_front(struct st_context *st, if (statt != ST_ATTACHMENT_FRONT_LEFT) return false; - ret = xmesa_st_framebuffer_display(drawable, st, statt, NULL); + ret = xmesa_st_framebuffer_display(drawable, st, statt, 0, NULL); if (ret && xmesa_strict_invalidate()) xmesa_check_buffer_size(xstfb->buffer); @@ -359,7 +360,7 @@ xmesa_swap_st_framebuffer(struct pipe_frontend_drawable *drawable) struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(drawable); bool ret; - ret = xmesa_st_framebuffer_display(drawable, NULL, ST_ATTACHMENT_BACK_LEFT, NULL); + ret = xmesa_st_framebuffer_display(drawable, NULL, ST_ATTACHMENT_BACK_LEFT, 0, NULL); if (ret) { struct pipe_resource **front, **back, *tmp; @@ -396,7 +397,7 @@ xmesa_copy_st_framebuffer(struct pipe_frontend_drawable *drawable, box.y = y; box.width = w; box.height = h; - xmesa_st_framebuffer_display(drawable, NULL, src, &box); + xmesa_st_framebuffer_display(drawable, NULL, src, 1, &box); } } diff --git a/src/gallium/frontends/hgl/hgl.c b/src/gallium/frontends/hgl/hgl.c index 7997b4b7c66..4096503700e 100644 --- a/src/gallium/frontends/hgl/hgl.c +++ b/src/gallium/frontends/hgl/hgl.c @@ -70,7 +70,7 @@ hgl_st_framebuffer_flush_front(struct st_context *st, // TODO: pipe_context here??? Might be needed for hw renderers buffer->screen->flush_frontbuffer(buffer->screen, NULL, ptex, 0, 0, - buffer->winsysContext, NULL); + buffer->winsysContext, 0, NULL); return true; } diff --git a/src/gallium/frontends/va/surface.c b/src/gallium/frontends/va/surface.c index 72cd4d6eea6..f40c0af231a 100644 --- a/src/gallium/frontends/va/surface.c +++ b/src/gallium/frontends/va/surface.c @@ -499,7 +499,7 @@ vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface_id, void* draw, short s drv->pipe->flush(drv->pipe, NULL, 0); screen->flush_frontbuffer(screen, drv->pipe, tex, 0, 0, - vscreen->get_private(vscreen), NULL); + vscreen->get_private(vscreen), 0, NULL); pipe_resource_reference(&tex, NULL); diff --git a/src/gallium/frontends/vdpau/presentation.c b/src/gallium/frontends/vdpau/presentation.c index 030b96666da..ad2baf2ff82 100644 --- a/src/gallium/frontends/vdpau/presentation.c +++ b/src/gallium/frontends/vdpau/presentation.c @@ -269,7 +269,7 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, pipe->screen->fence_reference(pipe->screen, &surf->fence, NULL); pipe->flush(pipe, &surf->fence, 0); pipe->screen->flush_frontbuffer(pipe->screen, pipe, tex, 0, 0, - vscreen->get_private(vscreen), NULL); + vscreen->get_private(vscreen), 0, NULL); pq->last_surf = surf; diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 6eeb308780d..d6a24f6abc6 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -384,13 +384,15 @@ struct pipe_screen { * displayed, eg copy fake frontbuffer. * \param winsys_drawable_handle an opaque handle that the calling context * gets out-of-band - * \param subbox an optional sub region to flush + * \param nboxes the number of sub regions to flush + * \param subbox an array of optional sub regions to flush */ void (*flush_frontbuffer)(struct pipe_screen *screen, struct pipe_context *ctx, struct pipe_resource *resource, unsigned level, unsigned layer, void *winsys_drawable_handle, + unsigned nboxes, struct pipe_box *subbox); /** Set ptr = fence, with reference counting */ diff --git a/src/gallium/targets/wgl/wgl.c b/src/gallium/targets/wgl/wgl.c index 5e895ef3100..7a7c571e2ce 100644 --- a/src/gallium/targets/wgl/wgl.c +++ b/src/gallium/targets/wgl/wgl.c @@ -193,7 +193,7 @@ wgl_present(struct pipe_screen *screen, #ifdef GALLIUM_ZINK if (use_zink) { - screen->flush_frontbuffer(screen, ctx, res, 0, 0, hDC, NULL); + screen->flush_frontbuffer(screen, ctx, res, 0, 0, hDC, 0, NULL); return; } #endif diff --git a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_winsys.c b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_winsys.c index 65a7be01bbb..0bc011d6d8c 100644 --- a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_winsys.c +++ b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_winsys.c @@ -47,7 +47,7 @@ d3d12_wgl_present(struct pipe_screen *screen, struct pipe_resource *res, HDC hDC) { - screen->flush_frontbuffer(screen, ctx, res, 0, 0, hDC, NULL); + screen->flush_frontbuffer(screen, ctx, res, 0, 0, hDC, 0, NULL); } unsigned