From e27f87b549cf2d4cfef97958ff175862fdf494b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6nig?= Date: Mon, 29 Apr 2013 17:43:04 +0200 Subject: [PATCH] vl/compositor: cleanup background clearing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an extra parameter to specify if we should clear the render target. Signed-off-by: Christian König --- src/gallium/auxiliary/vl/vl_compositor.c | 7 ++++--- src/gallium/auxiliary/vl/vl_compositor.h | 3 ++- src/gallium/state_trackers/vdpau/device.c | 2 +- src/gallium/state_trackers/vdpau/mixer.c | 2 +- src/gallium/state_trackers/vdpau/output.c | 12 ++++-------- src/gallium/state_trackers/vdpau/presentation.c | 2 +- src/gallium/state_trackers/xvmc/surface.c | 2 +- 7 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index 0df2b570d00..1c393a99de6 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -986,7 +986,8 @@ void vl_compositor_render(struct vl_compositor_state *s, struct vl_compositor *c, struct pipe_surface *dst_surface, - struct u_rect *dirty_area) + struct u_rect *dirty_area, + bool clear_dirty) { assert(c); assert(dst_surface); @@ -1004,8 +1005,8 @@ vl_compositor_render(struct vl_compositor_state *s, gen_vertex_data(c, s, dirty_area); - if (dirty_area && (dirty_area->x0 < dirty_area->x1 || - dirty_area->y0 < dirty_area->y1)) { + if (clear_dirty && dirty_area && + (dirty_area->x0 < dirty_area->x1 || dirty_area->y0 < dirty_area->y1)) { c->pipe->clear_render_target(c->pipe, dst_surface, &s->clear_color, 0, 0, dst_surface->width, dst_surface->height); diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index 6de6ca06521..2a1f66cfb16 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -224,7 +224,8 @@ void vl_compositor_render(struct vl_compositor_state *state, struct vl_compositor *compositor, struct pipe_surface *dst_surface, - struct u_rect *dirty_area); + struct u_rect *dirty_area, + bool clear_dirty); /** * destroy this compositor diff --git a/src/gallium/state_trackers/vdpau/device.c b/src/gallium/state_trackers/vdpau/device.c index dd586f52856..c530f431644 100644 --- a/src/gallium/state_trackers/vdpau/device.c +++ b/src/gallium/state_trackers/vdpau/device.c @@ -279,7 +279,7 @@ vlVdpResolveDelayedRendering(vlVdpDevice *dev, struct pipe_surface *surface, str dirty_area = &vlsurface->dirty_area; } - vl_compositor_render(cstate, &dev->compositor, surface, dirty_area); + vl_compositor_render(cstate, &dev->compositor, surface, dirty_area, true); dev->delayed_rendering.surface = VDP_INVALID_HANDLE; dev->delayed_rendering.cstate = NULL; diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index 81a5c293685..1d2ae497b07 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -312,7 +312,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, if (!vmixer->noise_reduction.filter && !vmixer->sharpness.filter) vlVdpSave4DelayedRendering(vmixer->device, destination_surface, &vmixer->cstate); else { - vl_compositor_render(&vmixer->cstate, compositor, dst->surface, &dst->dirty_area); + vl_compositor_render(&vmixer->cstate, compositor, dst->surface, &dst->dirty_area, true); /* applying the noise reduction after scaling is actually not very clever, but currently we should avoid to copy around the image diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c index df0f45856f9..7266cdb8afa 100644 --- a/src/gallium/state_trackers/vdpau/output.c +++ b/src/gallium/state_trackers/vdpau/output.c @@ -382,8 +382,7 @@ vlVdpOutputSurfacePutBitsIndexed(VdpOutputSurface surface, vl_compositor_clear_layers(cstate); vl_compositor_set_palette_layer(cstate, compositor, 0, sv_idx, sv_tbl, NULL, NULL, false); vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect)); - vl_compositor_render(cstate, compositor, vlsurface->surface, NULL); - vl_compositor_reset_dirty_area(&vlsurface->dirty_area); + vl_compositor_render(cstate, compositor, vlsurface->surface, &vlsurface->dirty_area, false); pipe_sampler_view_reference(&sv_idx, NULL); pipe_sampler_view_reference(&sv_tbl, NULL); @@ -489,8 +488,7 @@ vlVdpOutputSurfacePutBitsYCbCr(VdpOutputSurface surface, vl_compositor_clear_layers(cstate); vl_compositor_set_buffer_layer(cstate, compositor, 0, vbuffer, NULL, NULL, VL_COMPOSITOR_WEAVE); vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect)); - vl_compositor_render(cstate, compositor, vlsurface->surface, NULL); - vl_compositor_reset_dirty_area(&vlsurface->dirty_area); + vl_compositor_render(cstate, compositor, vlsurface->surface, &vlsurface->dirty_area, false); vbuffer->destroy(vbuffer); pipe_mutex_unlock(vlsurface->device->mutex); @@ -660,8 +658,7 @@ vlVdpOutputSurfaceRenderOutputSurface(VdpOutputSurface destination_surface, RectToPipe(source_rect, &src_rect), NULL, ColorsToPipe(colors, flags, vlcolors)); vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect)); - vl_compositor_render(cstate, compositor, dst_vlsurface->surface, NULL); - vl_compositor_reset_dirty_area(&dst_vlsurface->dirty_area); + vl_compositor_render(cstate, compositor, dst_vlsurface->surface, &dst_vlsurface->dirty_area, false); context->delete_blend_state(context, blend); pipe_mutex_unlock(dst_vlsurface->device->mutex); @@ -720,8 +717,7 @@ vlVdpOutputSurfaceRenderBitmapSurface(VdpOutputSurface destination_surface, RectToPipe(source_rect, &src_rect), NULL, ColorsToPipe(colors, flags, vlcolors)); vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect)); - vl_compositor_render(cstate, compositor, dst_vlsurface->surface, NULL); - vl_compositor_reset_dirty_area(&dst_vlsurface->dirty_area); + vl_compositor_render(cstate, compositor, dst_vlsurface->surface, &dst_vlsurface->dirty_area, false); context->delete_blend_state(context, blend); pipe_mutex_unlock(dst_vlsurface->device->mutex); diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index 3dd7f05375e..a5466cd378a 100644 --- a/src/gallium/state_trackers/vdpau/presentation.c +++ b/src/gallium/state_trackers/vdpau/presentation.c @@ -264,7 +264,7 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, vl_compositor_clear_layers(cstate); vl_compositor_set_rgba_layer(cstate, compositor, 0, surf->sampler_view, &src_rect, NULL, NULL); vl_compositor_set_dst_clip(cstate, &dst_clip); - vl_compositor_render(cstate, compositor, surf_draw, dirty_area); + vl_compositor_render(cstate, compositor, surf_draw, dirty_area, true); } vl_screen_set_next_timestamp(pq->device->vscreen, earliest_presentation_time); diff --git a/src/gallium/state_trackers/xvmc/surface.c b/src/gallium/state_trackers/xvmc/surface.c index 99d2d7072a1..6a895aaed6b 100644 --- a/src/gallium/state_trackers/xvmc/surface.c +++ b/src/gallium/state_trackers/xvmc/surface.c @@ -432,7 +432,7 @@ Status XvMCPutSurface(Display *dpy, XvMCSurface *surface, Drawable drawable, vl_compositor_set_layer_dst_area(cstate, 0, &dst_rect); vl_compositor_set_layer_dst_area(cstate, 1, &dst_rect); - vl_compositor_render(cstate, compositor, surf, dirty_area); + vl_compositor_render(cstate, compositor, surf, dirty_area, true); pipe->flush(pipe, &surface_priv->fence, 0);