st/xa: Fix transformations when we have both source and mask samplers
authorThomas Hellstrom <thellstrom@vmware.com>
Tue, 13 Nov 2018 13:13:38 +0000 (14:13 +0100)
committerThomas Hellstrom <thellstrom@vmware.com>
Wed, 14 Nov 2018 12:12:09 +0000 (13:12 +0100)
In the case when we had both source and mask samplers, transformations were
typically not applied correctly.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
src/gallium/state_trackers/xa/xa_renderer.c

index 0cb75a8c968b7c1426bd9c07b5529aea7639fb3e..ac26c5508cfa36cebc65e66acefa5bd9f6269822 100644 (file)
@@ -192,47 +192,55 @@ add_vertex_2tex(struct xa_context *r,
 }
 
 static void
-add_vertex_data1(struct xa_context *r,
-                 float srcX, float srcY,  float dstX, float dstY,
-                 float width, float height,
-                 struct pipe_resource *src, const float *src_matrix)
+compute_src_coords(float sx, float sy, struct pipe_resource *src,
+                   const float *src_matrix,
+                   float width, float height,
+                   float tc0[2], float tc1[2], float tc2[2], float tc3[2])
 {
-    float s0, t0, s1, t1, s2, t2, s3, t3;
-    float pt0[2], pt1[2], pt2[2], pt3[2];
-
-    pt0[0] = srcX;
-    pt0[1] = srcY;
-    pt1[0] = (srcX + width);
-    pt1[1] = srcY;
-    pt2[0] = (srcX + width);
-    pt2[1] = (srcY + height);
-    pt3[0] = srcX;
-    pt3[1] = (srcY + height);
+    tc0[0] = sx;
+    tc0[1] = sy;
+    tc1[0] = (sx + width);
+    tc1[1] = sy;
+    tc2[0] = (sx + width);
+    tc2[1] = (sy + height);
+    tc3[0] = sx;
+    tc3[1] = (sy + height);
 
     if (src_matrix) {
-       map_point((float *)src_matrix, pt0[0], pt0[1], &pt0[0], &pt0[1]);
-       map_point((float *)src_matrix, pt1[0], pt1[1], &pt1[0], &pt1[1]);
-       map_point((float *)src_matrix, pt2[0], pt2[1], &pt2[0], &pt2[1]);
-       map_point((float *)src_matrix, pt3[0], pt3[1], &pt3[0], &pt3[1]);
+       map_point((float *)src_matrix, tc0[0], tc0[1], &tc0[0], &tc0[1]);
+       map_point((float *)src_matrix, tc1[0], tc1[1], &tc1[0], &tc1[1]);
+       map_point((float *)src_matrix, tc2[0], tc2[1], &tc2[0], &tc2[1]);
+       map_point((float *)src_matrix, tc3[0], tc3[1], &tc3[0], &tc3[1]);
     }
 
-    s0 =  pt0[0] / src->width0;
-    s1 =  pt1[0] / src->width0;
-    s2 =  pt2[0] / src->width0;
-    s3 =  pt3[0] / src->width0;
-    t0 =  pt0[1] / src->height0;
-    t1 =  pt1[1] / src->height0;
-    t2 =  pt2[1] / src->height0;
-    t3 =  pt3[1] / src->height0;
+    tc0[0] /= src->width0;
+    tc1[0] /= src->width0;
+    tc2[0] /= src->width0;
+    tc3[0] /= src->width0;
+    tc0[1] /= src->height0;
+    tc1[1] /= src->height0;
+    tc2[1] /= src->height0;
+    tc3[1] /= src->height0;
+}
 
+static void
+add_vertex_data1(struct xa_context *r,
+                 float srcX, float srcY,  float dstX, float dstY,
+                 float width, float height,
+                 struct pipe_resource *src, const float *src_matrix)
+{
+    float tc0[2], tc1[2], tc2[2], tc3[2];
+
+    compute_src_coords(srcX, srcY, src, src_matrix, width, height,
+                       tc0, tc1, tc2, tc3);
     /* 1st vertex */
-    add_vertex_1tex(r, dstX, dstY, s0, t0);
+    add_vertex_1tex(r, dstX, dstY, tc0[0], tc0[1]);
     /* 2nd vertex */
-    add_vertex_1tex(r, dstX + width, dstY, s1, t1);
+    add_vertex_1tex(r, dstX + width, dstY, tc1[0], tc1[1]);
     /* 3rd vertex */
-    add_vertex_1tex(r, dstX + width, dstY + height, s2, t2);
+    add_vertex_1tex(r, dstX + width, dstY + height, tc2[0], tc2[1]);
     /* 4th vertex */
-    add_vertex_1tex(r, dstX, dstY + height, s3, t3);
+    add_vertex_1tex(r, dstX, dstY + height, tc3[0], tc3[1]);
 }
 
 static void
@@ -243,53 +251,26 @@ add_vertex_data2(struct xa_context *r,
                  struct pipe_resource *mask,
                  const float *src_matrix, const float *mask_matrix)
 {
-    float src_s0, src_t0, src_s1, src_t1;
-    float mask_s0, mask_t0, mask_s1, mask_t1;
-    float spt0[2], spt1[2];
-    float mpt0[2], mpt1[2];
-
-    spt0[0] = srcX;
-    spt0[1] = srcY;
-    spt1[0] = srcX + width;
-    spt1[1] = srcY + height;
-
-    mpt0[0] = maskX;
-    mpt0[1] = maskY;
-    mpt1[0] = maskX + width;
-    mpt1[1] = maskY + height;
-
-    if (src_matrix) {
-       map_point((float *)src_matrix, spt0[0], spt0[1], &spt0[0], &spt0[1]);
-       map_point((float *)src_matrix, spt1[0], spt1[1], &spt1[0], &spt1[1]);
-    }
-
-    if (mask_matrix) {
-       map_point((float *)mask_matrix, mpt0[0], mpt0[1], &mpt0[0], &mpt0[1]);
-       map_point((float *)mask_matrix, mpt1[0], mpt1[1], &mpt1[0], &mpt1[1]);
-    }
-
-    src_s0 = spt0[0] / src->width0;
-    src_t0 = spt0[1] / src->height0;
-    src_s1 = spt1[0] / src->width0;
-    src_t1 = spt1[1] / src->height0;
+    float spt0[2], spt1[2], spt2[2], spt3[2];
+    float mpt0[2], mpt1[2], mpt2[2], mpt3[2];
 
-    mask_s0 = mpt0[0] / mask->width0;
-    mask_t0 = mpt0[1] / mask->height0;
-    mask_s1 = mpt1[0] / mask->width0;
-    mask_t1 = mpt1[1] / mask->height0;
+    compute_src_coords(srcX, srcY, src, src_matrix, width, height,
+                       spt0, spt1, spt2, spt3);
+    compute_src_coords(maskX, maskY, mask, mask_matrix, width, height,
+                       mpt0, mpt1, mpt2, mpt3);
 
     /* 1st vertex */
     add_vertex_2tex(r, dstX, dstY,
-                   src_s0, src_t0, mask_s0, mask_t0);
+                   spt0[0], spt0[1], mpt0[0], mpt0[1]);
     /* 2nd vertex */
     add_vertex_2tex(r, dstX + width, dstY,
-                   src_s1, src_t0, mask_s1, mask_t0);
+                   spt1[0], spt1[1], mpt1[0], mpt1[1]);
     /* 3rd vertex */
     add_vertex_2tex(r, dstX + width, dstY + height,
-                   src_s1, src_t1, mask_s1, mask_t1);
+                   spt2[0], spt2[1], mpt2[0], mpt2[1]);
     /* 4th vertex */
     add_vertex_2tex(r, dstX, dstY + height,
-                   src_s0, src_t1, mask_s0, mask_t1);
+                   spt3[0], spt3[1], mpt3[0], mpt3[1]);
 }
 
 static void