st/xorg: Fix Xv cliprect scaling.
authorThomas Hellstrom <thellstrom@vmware.com>
Sat, 13 Mar 2010 19:25:29 +0000 (20:25 +0100)
committerJakob Bornecrantz <jakob@vmware.com>
Mon, 31 May 2010 17:33:09 +0000 (18:33 +0100)
Due to a quantization error, different cliprects of scaled video windows may
not have identical x / y scale.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
src/gallium/state_trackers/xorg/xorg_renderer.c
src/gallium/state_trackers/xorg/xorg_renderer.h
src/gallium/state_trackers/xorg/xorg_xv.c

index d4a3faf8aed904d92e98ee039b5517eedf2fa79d..92f1cc50653bf0ffec05b934a2b8eb2349b1ca7d 100644 (file)
@@ -601,7 +601,7 @@ void renderer_copy_pixmap(struct xorg_renderer *r,
 
 
 void renderer_draw_yuv(struct xorg_renderer *r,
-                       int src_x, int src_y, int src_w, int src_h,
+                       float src_x, float src_y, float src_w, float src_h,
                        int dst_x, int dst_y, int dst_w, int dst_h,
                        struct pipe_resource **textures)
 {
index 0454a6513d4b1440e2aa6558b21df2e206342bfb..fb09fabe156966dbdfdb60a54aa046e00e47ce6b 100644 (file)
@@ -54,7 +54,7 @@ void renderer_set_constants(struct xorg_renderer *r,
 
 
 void renderer_draw_yuv(struct xorg_renderer *r,
-                       int src_x, int src_y, int src_w, int src_h,
+                       float src_x, float src_y, float src_w, float src_h,
                        int dst_x, int dst_y, int dst_w, int dst_h,
                        struct pipe_resource **textures);
 
index a221594454e79baabf0358618fa897558d27c3a1..f98bd9390104018ba262ba37d75754a81bb849e9 100644 (file)
@@ -413,7 +413,7 @@ setup_fs_video_constants(struct xorg_renderer *r, boolean hdtv)
 
 static void
 draw_yuv(struct xorg_xv_port_priv *port,
-         int src_x, int src_y, int src_w, int src_h,
+         float src_x, float src_y, float src_w, float src_h,
          int dst_x, int dst_y, int dst_w, int dst_h)
 {
    struct pipe_resource **textures = port->yuv[port->current_set];
@@ -562,10 +562,10 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id,
       int box_y2 = pbox->y2;
       float diff_x = (float)src_w / (float)dst_w;
       float diff_y = (float)src_h / (float)dst_h;
-      int offset_x = box_x1 - dstX + pPixmap->screen_x;
-      int offset_y = box_y1 - dstY + pPixmap->screen_y;
-      int offset_w;
-      int offset_h;
+      float offset_x = box_x1 - dstX + pPixmap->screen_x;
+      float offset_y = box_y1 - dstY + pPixmap->screen_y;
+      float offset_w;
+      float offset_h;
 
       x = box_x1;
       y = box_y1;
@@ -576,8 +576,8 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id,
       offset_h = dst_h - h;
 
       draw_yuv(pPriv,
-               src_x + offset_x*diff_x, src_y + offset_y*diff_y,
-               src_w - offset_w*diff_x, src_h - offset_h*diff_y,
+               (float) src_x + offset_x*diff_x, (float) src_y + offset_y*diff_y,
+               (float) src_w - offset_w*diff_x, (float) src_h - offset_h*diff_y,
                x, y, w, h);
 
       pbox++;