0001
0002
0003
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
0021
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
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
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
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
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
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
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
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
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
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
0207
0208
0209
0210
0211
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 }