From 2cbf532ae13513c3cbc7dad8ae41beeff931529e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20K=C3=B6nig?= Date: Fri, 15 Jul 2011 17:20:55 +0200 Subject: [PATCH] g3dvl: correctly distinct dst area and clip area in the compositor Otherwise xine won't scale correctly. --- src/gallium/auxiliary/vl/vl_compositor.c | 28 ++++++++++++------- src/gallium/auxiliary/vl/vl_compositor.h | 1 + src/gallium/state_trackers/vdpau/mixer.c | 2 +- .../state_trackers/vdpau/presentation.c | 2 +- .../state_trackers/xorg/xvmc/surface.c | 3 +- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index 0bd1baef41e..8018d061d54 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -239,8 +239,6 @@ init_pipe_state(struct vl_compositor *c) c->viewport.scale[2] = 1; c->viewport.scale[3] = 1; - c->viewport.translate[0] = 0; - c->viewport.translate[1] = 0; c->viewport.translate[2] = 0; c->viewport.translate[3] = 0; @@ -653,6 +651,7 @@ vl_compositor_render(struct vl_compositor *c, enum pipe_mpeg12_picture_type picture_type, struct pipe_surface *dst_surface, struct pipe_video_rect *dst_area, + struct pipe_video_rect *dst_clip, struct pipe_fence_handle **fence) { struct pipe_scissor_state scissor; @@ -663,15 +662,24 @@ vl_compositor_render(struct vl_compositor *c, c->fb_state.width = dst_surface->width; c->fb_state.height = dst_surface->height; c->fb_state.cbufs[0] = dst_surface; - - c->viewport.scale[0] = dst_surface->width; - c->viewport.scale[1] = dst_surface->height; - + if (dst_area) { - scissor.minx = dst_area->x; - scissor.miny = dst_area->y; - scissor.maxx = dst_area->x + dst_area->w; - scissor.maxy = dst_area->y + dst_area->h; + c->viewport.scale[0] = dst_area->w; + c->viewport.scale[1] = dst_area->h; + c->viewport.translate[0] = dst_area->x; + c->viewport.translate[1] = dst_area->y; + } else { + c->viewport.scale[0] = dst_surface->width; + c->viewport.scale[1] = dst_surface->height; + c->viewport.translate[0] = 0; + c->viewport.translate[1] = 0; + } + + if (dst_clip) { + scissor.minx = dst_clip->x; + scissor.miny = dst_clip->y; + scissor.maxx = dst_clip->x + dst_clip->w; + scissor.maxy = dst_clip->y + dst_clip->h; } else { scissor.minx = 0; scissor.miny = 0; diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index df662db4d91..08ddc672b3b 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -158,6 +158,7 @@ vl_compositor_render(struct vl_compositor *compositor, enum pipe_mpeg12_picture_type picture_type, struct pipe_surface *dst_surface, struct pipe_video_rect *dst_area, + struct pipe_video_rect *dst_clip, struct pipe_fence_handle **fence); /** diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index d5187006bfc..b85b1f287af 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -158,7 +158,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, vl_compositor_clear_layers(&vmixer->compositor); vl_compositor_set_buffer_layer(&vmixer->compositor, 0, surf->video_buffer, NULL, NULL); vl_compositor_render(&vmixer->compositor, PIPE_MPEG12_PICTURE_TYPE_FRAME, - dst->surface, NULL, NULL); + dst->surface, NULL, NULL, NULL); return VDP_STATUS_OK; } diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index 1176c7a30b7..fe93741ed0d 100644 --- a/src/gallium/state_trackers/vdpau/presentation.c +++ b/src/gallium/state_trackers/vdpau/presentation.c @@ -170,7 +170,7 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, vl_compositor_clear_layers(&pq->compositor); vl_compositor_set_rgba_layer(&pq->compositor, 0, surf->sampler_view, NULL, NULL); vl_compositor_render(&pq->compositor, PIPE_MPEG12_PICTURE_TYPE_FRAME, - drawable_surface, NULL, NULL); + drawable_surface, NULL, NULL, NULL); pq->device->context->pipe->screen->flush_frontbuffer ( diff --git a/src/gallium/state_trackers/xorg/xvmc/surface.c b/src/gallium/state_trackers/xorg/xvmc/surface.c index aef1eff2bb3..0e8b4f8f2be 100644 --- a/src/gallium/state_trackers/xorg/xvmc/surface.c +++ b/src/gallium/state_trackers/xorg/xvmc/surface.c @@ -567,7 +567,8 @@ Status XvMCPutSurface(Display *dpy, XvMCSurface *surface, Drawable drawable, // Workaround for r600g, there seems to be a bug in the fence refcounting code pipe->screen->fence_reference(pipe->screen, &surface_priv->fence, NULL); - vl_compositor_render(compositor, PictureToPipe(flags), context_priv->drawable_surface, &dst_rect, &surface_priv->fence); + vl_compositor_render(compositor, PictureToPipe(flags), context_priv->drawable_surface, + &dst_rect, NULL, &surface_priv->fence); XVMC_MSG(XVMC_TRACE, "[XvMC] Submitted surface %p for display. Pushing to front buffer.\n", surface); -- 2.30.2