Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Test cases for the drm_rect functions
0004  */
0005 
0006 #define pr_fmt(fmt) "drm_rect: " fmt
0007 
0008 #include <linux/limits.h>
0009 
0010 #include <drm/drm_rect.h>
0011 
0012 #include "test-drm_modeset_common.h"
0013 
0014 int igt_drm_rect_clip_scaled_div_by_zero(void *ignored)
0015 {
0016     struct drm_rect src, dst, clip;
0017     bool visible;
0018 
0019     /*
0020      * Make sure we don't divide by zero when dst
0021      * width/height is zero and dst and clip do not intersect.
0022      */
0023     drm_rect_init(&src, 0, 0, 0, 0);
0024     drm_rect_init(&dst, 0, 0, 0, 0);
0025     drm_rect_init(&clip, 1, 1, 1, 1);
0026     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0027     FAIL(visible, "Destination not be visible\n");
0028     FAIL(drm_rect_visible(&src), "Source should not be visible\n");
0029 
0030     drm_rect_init(&src, 0, 0, 0, 0);
0031     drm_rect_init(&dst, 3, 3, 0, 0);
0032     drm_rect_init(&clip, 1, 1, 1, 1);
0033     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0034     FAIL(visible, "Destination not be visible\n");
0035     FAIL(drm_rect_visible(&src), "Source should not be visible\n");
0036 
0037     return 0;
0038 }
0039 
0040 int igt_drm_rect_clip_scaled_not_clipped(void *ignored)
0041 {
0042     struct drm_rect src, dst, clip;
0043     bool visible;
0044 
0045     /* 1:1 scaling */
0046     drm_rect_init(&src, 0, 0, 1 << 16, 1 << 16);
0047     drm_rect_init(&dst, 0, 0, 1, 1);
0048     drm_rect_init(&clip, 0, 0, 1, 1);
0049 
0050     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0051 
0052     FAIL(src.x1 != 0 || src.x2 != 1 << 16 ||
0053          src.y1 != 0 || src.y2 != 1 << 16,
0054          "Source badly clipped\n");
0055     FAIL(dst.x1 != 0 || dst.x2 != 1 ||
0056          dst.y1 != 0 || dst.y2 != 1,
0057          "Destination badly clipped\n");
0058     FAIL(!visible, "Destination should be visible\n");
0059     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0060 
0061     /* 2:1 scaling */
0062     drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
0063     drm_rect_init(&dst, 0, 0, 1, 1);
0064     drm_rect_init(&clip, 0, 0, 1, 1);
0065 
0066     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0067 
0068     FAIL(src.x1 != 0 || src.x2 != 2 << 16 ||
0069          src.y1 != 0 || src.y2 != 2 << 16,
0070          "Source badly clipped\n");
0071     FAIL(dst.x1 != 0 || dst.x2 != 1 ||
0072          dst.y1 != 0 || dst.y2 != 1,
0073          "Destination badly clipped\n");
0074     FAIL(!visible, "Destination should be visible\n");
0075     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0076 
0077     /* 1:2 scaling */
0078     drm_rect_init(&src, 0, 0, 1 << 16, 1 << 16);
0079     drm_rect_init(&dst, 0, 0, 2, 2);
0080     drm_rect_init(&clip, 0, 0, 2, 2);
0081 
0082     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0083 
0084     FAIL(src.x1 != 0 || src.x2 != 1 << 16 ||
0085          src.y1 != 0 || src.y2 != 1 << 16,
0086          "Source badly clipped\n");
0087     FAIL(dst.x1 != 0 || dst.x2 != 2 ||
0088          dst.y1 != 0 || dst.y2 != 2,
0089          "Destination badly clipped\n");
0090     FAIL(!visible, "Destination should be visible\n");
0091     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0092 
0093     return 0;
0094 }
0095 
0096 int igt_drm_rect_clip_scaled_clipped(void *ignored)
0097 {
0098     struct drm_rect src, dst, clip;
0099     bool visible;
0100 
0101     /* 1:1 scaling top/left clip */
0102     drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
0103     drm_rect_init(&dst, 0, 0, 2, 2);
0104     drm_rect_init(&clip, 0, 0, 1, 1);
0105 
0106     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0107 
0108     FAIL(src.x1 != 0 || src.x2 != 1 << 16 ||
0109          src.y1 != 0 || src.y2 != 1 << 16,
0110          "Source badly clipped\n");
0111     FAIL(dst.x1 != 0 || dst.x2 != 1 ||
0112          dst.y1 != 0 || dst.y2 != 1,
0113          "Destination badly clipped\n");
0114     FAIL(!visible, "Destination should be visible\n");
0115     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0116 
0117     /* 1:1 scaling bottom/right clip */
0118     drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
0119     drm_rect_init(&dst, 0, 0, 2, 2);
0120     drm_rect_init(&clip, 1, 1, 1, 1);
0121 
0122     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0123 
0124     FAIL(src.x1 != 1 << 16 || src.x2 != 2 << 16 ||
0125          src.y1 != 1 << 16 || src.y2 != 2 << 16,
0126          "Source badly clipped\n");
0127     FAIL(dst.x1 != 1 || dst.x2 != 2 ||
0128          dst.y1 != 1 || dst.y2 != 2,
0129          "Destination badly clipped\n");
0130     FAIL(!visible, "Destination should be visible\n");
0131     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0132 
0133     /* 2:1 scaling top/left clip */
0134     drm_rect_init(&src, 0, 0, 4 << 16, 4 << 16);
0135     drm_rect_init(&dst, 0, 0, 2, 2);
0136     drm_rect_init(&clip, 0, 0, 1, 1);
0137 
0138     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0139 
0140     FAIL(src.x1 != 0 || src.x2 != 2 << 16 ||
0141          src.y1 != 0 || src.y2 != 2 << 16,
0142          "Source badly clipped\n");
0143     FAIL(dst.x1 != 0 || dst.x2 != 1 ||
0144          dst.y1 != 0 || dst.y2 != 1,
0145          "Destination badly clipped\n");
0146     FAIL(!visible, "Destination should be visible\n");
0147     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0148 
0149     /* 2:1 scaling bottom/right clip */
0150     drm_rect_init(&src, 0, 0, 4 << 16, 4 << 16);
0151     drm_rect_init(&dst, 0, 0, 2, 2);
0152     drm_rect_init(&clip, 1, 1, 1, 1);
0153 
0154     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0155 
0156     FAIL(src.x1 != 2 << 16 || src.x2 != 4 << 16 ||
0157          src.y1 != 2 << 16 || src.y2 != 4 << 16,
0158          "Source badly clipped\n");
0159     FAIL(dst.x1 != 1 || dst.x2 != 2 ||
0160          dst.y1 != 1 || dst.y2 != 2,
0161          "Destination badly clipped\n");
0162     FAIL(!visible, "Destination should be visible\n");
0163     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0164 
0165     /* 1:2 scaling top/left clip */
0166     drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
0167     drm_rect_init(&dst, 0, 0, 4, 4);
0168     drm_rect_init(&clip, 0, 0, 2, 2);
0169 
0170     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0171 
0172     FAIL(src.x1 != 0 || src.x2 != 1 << 16 ||
0173          src.y1 != 0 || src.y2 != 1 << 16,
0174          "Source badly clipped\n");
0175     FAIL(dst.x1 != 0 || dst.x2 != 2 ||
0176          dst.y1 != 0 || dst.y2 != 2,
0177          "Destination badly clipped\n");
0178     FAIL(!visible, "Destination should be visible\n");
0179     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0180 
0181     /* 1:2 scaling bottom/right clip */
0182     drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
0183     drm_rect_init(&dst, 0, 0, 4, 4);
0184     drm_rect_init(&clip, 2, 2, 2, 2);
0185 
0186     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0187 
0188     FAIL(src.x1 != 1 << 16 || src.x2 != 2 << 16 ||
0189          src.y1 != 1 << 16 || src.y2 != 2 << 16,
0190          "Source badly clipped\n");
0191     FAIL(dst.x1 != 2 || dst.x2 != 4 ||
0192          dst.y1 != 2 || dst.y2 != 4,
0193          "Destination badly clipped\n");
0194     FAIL(!visible, "Destination should be visible\n");
0195     FAIL(!drm_rect_visible(&src), "Source should be visible\n");
0196 
0197     return 0;
0198 }
0199 
0200 int igt_drm_rect_clip_scaled_signed_vs_unsigned(void *ignored)
0201 {
0202     struct drm_rect src, dst, clip;
0203     bool visible;
0204 
0205     /*
0206      * 'clip.x2 - dst.x1 >= dst width' could result a negative
0207      * src rectangle width which is no longer expected by the
0208      * code as it's using unsigned types. This could lead to
0209      * the clipped source rectangle appering visible when it
0210      * should have been fully clipped. Make sure both rectangles
0211      * end up invisible.
0212      */
0213     drm_rect_init(&src, 0, 0, INT_MAX, INT_MAX);
0214     drm_rect_init(&dst, 0, 0, 2, 2);
0215     drm_rect_init(&clip, 3, 3, 1, 1);
0216 
0217     visible = drm_rect_clip_scaled(&src, &dst, &clip);
0218 
0219     FAIL(visible, "Destination should not be visible\n");
0220     FAIL(drm_rect_visible(&src), "Source should not be visible\n");
0221 
0222     return 0;
0223 }