1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2013,2014 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker */
24*d83cc019SAndroid Build Coastguard Worker
25*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
26*d83cc019SAndroid Build Coastguard Worker #include <math.h>
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker
29*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("Test display plane scaling");
30*d83cc019SAndroid Build Coastguard Worker
31*d83cc019SAndroid Build Coastguard Worker typedef struct {
32*d83cc019SAndroid Build Coastguard Worker uint32_t devid;
33*d83cc019SAndroid Build Coastguard Worker int drm_fd;
34*d83cc019SAndroid Build Coastguard Worker igt_display_t display;
35*d83cc019SAndroid Build Coastguard Worker igt_crc_t ref_crc;
36*d83cc019SAndroid Build Coastguard Worker
37*d83cc019SAndroid Build Coastguard Worker int image_w;
38*d83cc019SAndroid Build Coastguard Worker int image_h;
39*d83cc019SAndroid Build Coastguard Worker
40*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb[4];
41*d83cc019SAndroid Build Coastguard Worker
42*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane1;
43*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane2;
44*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane3;
45*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane4;
46*d83cc019SAndroid Build Coastguard Worker } data_t;
47*d83cc019SAndroid Build Coastguard Worker
get_num_scalers(data_t * d,enum pipe pipe)48*d83cc019SAndroid Build Coastguard Worker static int get_num_scalers(data_t* d, enum pipe pipe)
49*d83cc019SAndroid Build Coastguard Worker {
50*d83cc019SAndroid Build Coastguard Worker if (!is_i915_device(d->drm_fd))
51*d83cc019SAndroid Build Coastguard Worker return 1;
52*d83cc019SAndroid Build Coastguard Worker
53*d83cc019SAndroid Build Coastguard Worker igt_require(intel_gen(d->devid) >= 9);
54*d83cc019SAndroid Build Coastguard Worker
55*d83cc019SAndroid Build Coastguard Worker if (intel_gen(d->devid) >= 10)
56*d83cc019SAndroid Build Coastguard Worker return 2;
57*d83cc019SAndroid Build Coastguard Worker else if (pipe != PIPE_C)
58*d83cc019SAndroid Build Coastguard Worker return 2;
59*d83cc019SAndroid Build Coastguard Worker else
60*d83cc019SAndroid Build Coastguard Worker return 1;
61*d83cc019SAndroid Build Coastguard Worker }
62*d83cc019SAndroid Build Coastguard Worker
is_planar_yuv_format(uint32_t pixelformat)63*d83cc019SAndroid Build Coastguard Worker static bool is_planar_yuv_format(uint32_t pixelformat)
64*d83cc019SAndroid Build Coastguard Worker {
65*d83cc019SAndroid Build Coastguard Worker switch (pixelformat) {
66*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_NV12:
67*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_P010:
68*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_P012:
69*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_P016:
70*d83cc019SAndroid Build Coastguard Worker return true;
71*d83cc019SAndroid Build Coastguard Worker default:
72*d83cc019SAndroid Build Coastguard Worker return false;
73*d83cc019SAndroid Build Coastguard Worker }
74*d83cc019SAndroid Build Coastguard Worker }
75*d83cc019SAndroid Build Coastguard Worker
cleanup_fbs(data_t * data)76*d83cc019SAndroid Build Coastguard Worker static void cleanup_fbs(data_t *data)
77*d83cc019SAndroid Build Coastguard Worker {
78*d83cc019SAndroid Build Coastguard Worker int i;
79*d83cc019SAndroid Build Coastguard Worker
80*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(data->fb); i++)
81*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(data->drm_fd, &data->fb[i]);
82*d83cc019SAndroid Build Coastguard Worker }
83*d83cc019SAndroid Build Coastguard Worker
cleanup_crtc(data_t * data)84*d83cc019SAndroid Build Coastguard Worker static void cleanup_crtc(data_t *data)
85*d83cc019SAndroid Build Coastguard Worker {
86*d83cc019SAndroid Build Coastguard Worker igt_display_reset(&data->display);
87*d83cc019SAndroid Build Coastguard Worker
88*d83cc019SAndroid Build Coastguard Worker cleanup_fbs(data);
89*d83cc019SAndroid Build Coastguard Worker }
90*d83cc019SAndroid Build Coastguard Worker
prepare_crtc(data_t * data,igt_output_t * output,enum pipe pipe,igt_plane_t * plane,drmModeModeInfo * mode)91*d83cc019SAndroid Build Coastguard Worker static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
92*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane, drmModeModeInfo *mode)
93*d83cc019SAndroid Build Coastguard Worker {
94*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &data->display;
95*d83cc019SAndroid Build Coastguard Worker uint64_t tiling = is_i915_device(data->drm_fd) ?
96*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_X_TILED : LOCAL_DRM_FORMAT_MOD_NONE;
97*d83cc019SAndroid Build Coastguard Worker
98*d83cc019SAndroid Build Coastguard Worker cleanup_crtc(data);
99*d83cc019SAndroid Build Coastguard Worker
100*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
101*d83cc019SAndroid Build Coastguard Worker
102*d83cc019SAndroid Build Coastguard Worker igt_skip_on(!igt_display_has_format_mod(display, DRM_FORMAT_XRGB8888,
103*d83cc019SAndroid Build Coastguard Worker tiling));
104*d83cc019SAndroid Build Coastguard Worker
105*d83cc019SAndroid Build Coastguard Worker /* allocate fb for plane 1 */
106*d83cc019SAndroid Build Coastguard Worker igt_create_pattern_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
107*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
108*d83cc019SAndroid Build Coastguard Worker tiling,
109*d83cc019SAndroid Build Coastguard Worker &data->fb[0]);
110*d83cc019SAndroid Build Coastguard Worker
111*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(plane, &data->fb[0]);
112*d83cc019SAndroid Build Coastguard Worker
113*d83cc019SAndroid Build Coastguard Worker if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
114*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary;
115*d83cc019SAndroid Build Coastguard Worker int ret;
116*d83cc019SAndroid Build Coastguard Worker
117*d83cc019SAndroid Build Coastguard Worker /* Do we succeed without enabling the primary plane? */
118*d83cc019SAndroid Build Coastguard Worker ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
119*d83cc019SAndroid Build Coastguard Worker if (!ret)
120*d83cc019SAndroid Build Coastguard Worker return;
121*d83cc019SAndroid Build Coastguard Worker
122*d83cc019SAndroid Build Coastguard Worker /*
123*d83cc019SAndroid Build Coastguard Worker * Fallback: set the primary plane to actually enable the pipe.
124*d83cc019SAndroid Build Coastguard Worker * Some drivers always require the primary plane to be enabled.
125*d83cc019SAndroid Build Coastguard Worker */
126*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
127*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &data->fb[0]);
128*d83cc019SAndroid Build Coastguard Worker }
129*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
130*d83cc019SAndroid Build Coastguard Worker }
131*d83cc019SAndroid Build Coastguard Worker
check_scaling_pipe_plane_rot(data_t * d,igt_plane_t * plane,uint32_t pixel_format,uint64_t tiling,enum pipe pipe,igt_output_t * output,igt_rotation_t rot)132*d83cc019SAndroid Build Coastguard Worker static void check_scaling_pipe_plane_rot(data_t *d, igt_plane_t *plane,
133*d83cc019SAndroid Build Coastguard Worker uint32_t pixel_format,
134*d83cc019SAndroid Build Coastguard Worker uint64_t tiling, enum pipe pipe,
135*d83cc019SAndroid Build Coastguard Worker igt_output_t *output,
136*d83cc019SAndroid Build Coastguard Worker igt_rotation_t rot)
137*d83cc019SAndroid Build Coastguard Worker {
138*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &d->display;
139*d83cc019SAndroid Build Coastguard Worker int width, height;
140*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
141*d83cc019SAndroid Build Coastguard Worker
142*d83cc019SAndroid Build Coastguard Worker cleanup_crtc(d);
143*d83cc019SAndroid Build Coastguard Worker
144*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
145*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker /* create buffer in the range of min and max source side limit.*/
148*d83cc019SAndroid Build Coastguard Worker width = height = 8;
149*d83cc019SAndroid Build Coastguard Worker if (is_i915_device(d->drm_fd) && is_planar_yuv_format(pixel_format))
150*d83cc019SAndroid Build Coastguard Worker width = height = 16;
151*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(display->drm_fd, width, height,
152*d83cc019SAndroid Build Coastguard Worker pixel_format, tiling, 0.0, 1.0, 0.0, &d->fb[0]);
153*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(plane, &d->fb[0]);
154*d83cc019SAndroid Build Coastguard Worker
155*d83cc019SAndroid Build Coastguard Worker /* Check min to full resolution upscaling */
156*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[0], plane, 0, 0);
157*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[0], plane, width, height);
158*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(plane, 0, 0);
159*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
160*d83cc019SAndroid Build Coastguard Worker igt_plane_set_rotation(plane, rot);
161*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
162*d83cc019SAndroid Build Coastguard Worker
163*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(plane, NULL);
164*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(plane, 0, 0);
165*d83cc019SAndroid Build Coastguard Worker }
166*d83cc019SAndroid Build Coastguard Worker
167*d83cc019SAndroid Build Coastguard Worker static const igt_rotation_t rotations[] = {
168*d83cc019SAndroid Build Coastguard Worker IGT_ROTATION_0,
169*d83cc019SAndroid Build Coastguard Worker IGT_ROTATION_90,
170*d83cc019SAndroid Build Coastguard Worker IGT_ROTATION_180,
171*d83cc019SAndroid Build Coastguard Worker IGT_ROTATION_270,
172*d83cc019SAndroid Build Coastguard Worker };
173*d83cc019SAndroid Build Coastguard Worker
can_rotate(data_t * d,unsigned format,uint64_t tiling,igt_rotation_t rot)174*d83cc019SAndroid Build Coastguard Worker static bool can_rotate(data_t *d, unsigned format, uint64_t tiling,
175*d83cc019SAndroid Build Coastguard Worker igt_rotation_t rot)
176*d83cc019SAndroid Build Coastguard Worker {
177*d83cc019SAndroid Build Coastguard Worker
178*d83cc019SAndroid Build Coastguard Worker if (!is_i915_device(d->drm_fd))
179*d83cc019SAndroid Build Coastguard Worker return true;
180*d83cc019SAndroid Build Coastguard Worker
181*d83cc019SAndroid Build Coastguard Worker switch (format) {
182*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_RGB565:
183*d83cc019SAndroid Build Coastguard Worker if (intel_gen(d->devid) >= 11)
184*d83cc019SAndroid Build Coastguard Worker break;
185*d83cc019SAndroid Build Coastguard Worker /* fall through */
186*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_C8:
187*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_XRGB16161616F:
188*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_XBGR16161616F:
189*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_ARGB16161616F:
190*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_ABGR16161616F:
191*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_Y210:
192*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_Y212:
193*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_Y216:
194*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_XVYU12_16161616:
195*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_XVYU16161616:
196*d83cc019SAndroid Build Coastguard Worker return false;
197*d83cc019SAndroid Build Coastguard Worker default:
198*d83cc019SAndroid Build Coastguard Worker break;
199*d83cc019SAndroid Build Coastguard Worker }
200*d83cc019SAndroid Build Coastguard Worker
201*d83cc019SAndroid Build Coastguard Worker return true;
202*d83cc019SAndroid Build Coastguard Worker }
203*d83cc019SAndroid Build Coastguard Worker
can_scale(data_t * d,unsigned format)204*d83cc019SAndroid Build Coastguard Worker static bool can_scale(data_t *d, unsigned format)
205*d83cc019SAndroid Build Coastguard Worker {
206*d83cc019SAndroid Build Coastguard Worker if (!is_i915_device(d->drm_fd))
207*d83cc019SAndroid Build Coastguard Worker return true;
208*d83cc019SAndroid Build Coastguard Worker
209*d83cc019SAndroid Build Coastguard Worker switch (format) {
210*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_XRGB16161616F:
211*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_XBGR16161616F:
212*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_ARGB16161616F:
213*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_ABGR16161616F:
214*d83cc019SAndroid Build Coastguard Worker if (intel_gen(d->devid) >= 11)
215*d83cc019SAndroid Build Coastguard Worker return true;
216*d83cc019SAndroid Build Coastguard Worker /* fall through */
217*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_C8:
218*d83cc019SAndroid Build Coastguard Worker return false;
219*d83cc019SAndroid Build Coastguard Worker default:
220*d83cc019SAndroid Build Coastguard Worker return true;
221*d83cc019SAndroid Build Coastguard Worker }
222*d83cc019SAndroid Build Coastguard Worker }
223*d83cc019SAndroid Build Coastguard Worker
test_scaler_with_rotation_pipe(data_t * d,enum pipe pipe,igt_output_t * output)224*d83cc019SAndroid Build Coastguard Worker static void test_scaler_with_rotation_pipe(data_t *d, enum pipe pipe,
225*d83cc019SAndroid Build Coastguard Worker igt_output_t *output)
226*d83cc019SAndroid Build Coastguard Worker {
227*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &d->display;
228*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane;
229*d83cc019SAndroid Build Coastguard Worker uint64_t tiling = is_i915_device(d->drm_fd) ?
230*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_Y_TILED : LOCAL_DRM_FORMAT_MOD_NONE;
231*d83cc019SAndroid Build Coastguard Worker
232*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
233*d83cc019SAndroid Build Coastguard Worker for_each_plane_on_pipe(display, pipe, plane) {
234*d83cc019SAndroid Build Coastguard Worker if (plane->type == DRM_PLANE_TYPE_CURSOR)
235*d83cc019SAndroid Build Coastguard Worker continue;
236*d83cc019SAndroid Build Coastguard Worker
237*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE(rotations); i++) {
238*d83cc019SAndroid Build Coastguard Worker igt_rotation_t rot = rotations[i];
239*d83cc019SAndroid Build Coastguard Worker for (int j = 0; j < plane->drm_plane->count_formats; j++) {
240*d83cc019SAndroid Build Coastguard Worker unsigned format = plane->drm_plane->formats[j];
241*d83cc019SAndroid Build Coastguard Worker
242*d83cc019SAndroid Build Coastguard Worker if (igt_fb_supported_format(format) &&
243*d83cc019SAndroid Build Coastguard Worker igt_plane_has_format_mod(plane, format, tiling) &&
244*d83cc019SAndroid Build Coastguard Worker can_rotate(d, format, tiling, rot) &&
245*d83cc019SAndroid Build Coastguard Worker can_scale(d, format))
246*d83cc019SAndroid Build Coastguard Worker check_scaling_pipe_plane_rot(d, plane, format,
247*d83cc019SAndroid Build Coastguard Worker tiling, pipe,
248*d83cc019SAndroid Build Coastguard Worker output, rot);
249*d83cc019SAndroid Build Coastguard Worker }
250*d83cc019SAndroid Build Coastguard Worker }
251*d83cc019SAndroid Build Coastguard Worker }
252*d83cc019SAndroid Build Coastguard Worker }
253*d83cc019SAndroid Build Coastguard Worker
254*d83cc019SAndroid Build Coastguard Worker static const uint64_t tilings[] = {
255*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
256*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_X_TILED,
257*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_Y_TILED,
258*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_Yf_TILED
259*d83cc019SAndroid Build Coastguard Worker };
260*d83cc019SAndroid Build Coastguard Worker
test_scaler_with_pixel_format_pipe(data_t * d,enum pipe pipe,igt_output_t * output)261*d83cc019SAndroid Build Coastguard Worker static void test_scaler_with_pixel_format_pipe(data_t *d, enum pipe pipe, igt_output_t *output)
262*d83cc019SAndroid Build Coastguard Worker {
263*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &d->display;
264*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane;
265*d83cc019SAndroid Build Coastguard Worker
266*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
267*d83cc019SAndroid Build Coastguard Worker
268*d83cc019SAndroid Build Coastguard Worker for_each_plane_on_pipe(display, pipe, plane) {
269*d83cc019SAndroid Build Coastguard Worker if (plane->type == DRM_PLANE_TYPE_CURSOR)
270*d83cc019SAndroid Build Coastguard Worker continue;
271*d83cc019SAndroid Build Coastguard Worker
272*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE(tilings); i++) {
273*d83cc019SAndroid Build Coastguard Worker uint64_t tiling = tilings[i];
274*d83cc019SAndroid Build Coastguard Worker
275*d83cc019SAndroid Build Coastguard Worker for (int j = 0; j < plane->drm_plane->count_formats; j++) {
276*d83cc019SAndroid Build Coastguard Worker uint32_t format = plane->drm_plane->formats[j];
277*d83cc019SAndroid Build Coastguard Worker
278*d83cc019SAndroid Build Coastguard Worker if (igt_fb_supported_format(format) &&
279*d83cc019SAndroid Build Coastguard Worker igt_plane_has_format_mod(plane, format, tiling) &&
280*d83cc019SAndroid Build Coastguard Worker can_scale(d, format))
281*d83cc019SAndroid Build Coastguard Worker check_scaling_pipe_plane_rot(d, plane,
282*d83cc019SAndroid Build Coastguard Worker format, tiling,
283*d83cc019SAndroid Build Coastguard Worker pipe, output, IGT_ROTATION_0);
284*d83cc019SAndroid Build Coastguard Worker }
285*d83cc019SAndroid Build Coastguard Worker }
286*d83cc019SAndroid Build Coastguard Worker }
287*d83cc019SAndroid Build Coastguard Worker }
288*d83cc019SAndroid Build Coastguard Worker
289*d83cc019SAndroid Build Coastguard Worker /* does iterative scaling on plane2 */
iterate_plane_scaling(data_t * d,drmModeModeInfo * mode)290*d83cc019SAndroid Build Coastguard Worker static void iterate_plane_scaling(data_t *d, drmModeModeInfo *mode)
291*d83cc019SAndroid Build Coastguard Worker {
292*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &d->display;
293*d83cc019SAndroid Build Coastguard Worker
294*d83cc019SAndroid Build Coastguard Worker if (mode->hdisplay >= d->fb[1].width) {
295*d83cc019SAndroid Build Coastguard Worker int w, h;
296*d83cc019SAndroid Build Coastguard Worker /* fixed fb */
297*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[1], d->plane2, 0, 0);
298*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[1], d->plane2, d->fb[1].width, d->fb[1].height);
299*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane2, 0, 0);
300*d83cc019SAndroid Build Coastguard Worker
301*d83cc019SAndroid Build Coastguard Worker /* adjust plane size */
302*d83cc019SAndroid Build Coastguard Worker for (w = d->fb[1].width; w <= mode->hdisplay; w+=10) {
303*d83cc019SAndroid Build Coastguard Worker h = w * d->fb[1].height / d->fb[1].width;
304*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2, w, h);
305*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
306*d83cc019SAndroid Build Coastguard Worker }
307*d83cc019SAndroid Build Coastguard Worker } else {
308*d83cc019SAndroid Build Coastguard Worker int w, h;
309*d83cc019SAndroid Build Coastguard Worker /* fixed plane */
310*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane2, 0, 0);
311*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2, mode->hdisplay, mode->vdisplay);
312*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[1], d->plane2, 0, 0);
313*d83cc019SAndroid Build Coastguard Worker
314*d83cc019SAndroid Build Coastguard Worker /* adjust fb size */
315*d83cc019SAndroid Build Coastguard Worker for (w = mode->hdisplay; w <= d->fb[1].width; w+=10) {
316*d83cc019SAndroid Build Coastguard Worker /* Source coordinates must not be clipped. */
317*d83cc019SAndroid Build Coastguard Worker h = min(w * mode->hdisplay / mode->vdisplay, d->fb[1].height);
318*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[1], d->plane2, w, h);
319*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
320*d83cc019SAndroid Build Coastguard Worker }
321*d83cc019SAndroid Build Coastguard Worker }
322*d83cc019SAndroid Build Coastguard Worker }
323*d83cc019SAndroid Build Coastguard Worker
324*d83cc019SAndroid Build Coastguard Worker static void
test_plane_scaling_on_pipe(data_t * d,enum pipe pipe,igt_output_t * output)325*d83cc019SAndroid Build Coastguard Worker test_plane_scaling_on_pipe(data_t *d, enum pipe pipe, igt_output_t *output)
326*d83cc019SAndroid Build Coastguard Worker {
327*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &d->display;
328*d83cc019SAndroid Build Coastguard Worker igt_pipe_t *pipe_obj = &display->pipes[pipe];
329*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
330*d83cc019SAndroid Build Coastguard Worker int primary_plane_scaling = 0; /* For now */
331*d83cc019SAndroid Build Coastguard Worker uint64_t tiling = is_i915_device(display->drm_fd) ?
332*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_X_TILED : LOCAL_DRM_FORMAT_MOD_NONE;
333*d83cc019SAndroid Build Coastguard Worker
334*d83cc019SAndroid Build Coastguard Worker igt_skip_on(!igt_display_has_format_mod(display, DRM_FORMAT_XRGB8888,
335*d83cc019SAndroid Build Coastguard Worker tiling));
336*d83cc019SAndroid Build Coastguard Worker
337*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
338*d83cc019SAndroid Build Coastguard Worker
339*d83cc019SAndroid Build Coastguard Worker /* Set up display with plane 1 */
340*d83cc019SAndroid Build Coastguard Worker d->plane1 = igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_PRIMARY);
341*d83cc019SAndroid Build Coastguard Worker prepare_crtc(d, output, pipe, d->plane1, mode);
342*d83cc019SAndroid Build Coastguard Worker
343*d83cc019SAndroid Build Coastguard Worker igt_create_color_pattern_fb(display->drm_fd, 600, 600,
344*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
345*d83cc019SAndroid Build Coastguard Worker tiling,
346*d83cc019SAndroid Build Coastguard Worker .5, .5, .5, &d->fb[1]);
347*d83cc019SAndroid Build Coastguard Worker
348*d83cc019SAndroid Build Coastguard Worker igt_create_pattern_fb(d->drm_fd,
349*d83cc019SAndroid Build Coastguard Worker mode->hdisplay, mode->vdisplay,
350*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
351*d83cc019SAndroid Build Coastguard Worker tiling,
352*d83cc019SAndroid Build Coastguard Worker &d->fb[2]);
353*d83cc019SAndroid Build Coastguard Worker
354*d83cc019SAndroid Build Coastguard Worker if (primary_plane_scaling) {
355*d83cc019SAndroid Build Coastguard Worker /* Primary plane upscaling */
356*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[0], d->plane1, 100, 100);
357*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[0], d->plane1, 500, 500);
358*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane1, 0, 0);
359*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
360*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
361*d83cc019SAndroid Build Coastguard Worker
362*d83cc019SAndroid Build Coastguard Worker /* Primary plane 1:1 no scaling */
363*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[0], d->plane1, 0, 0);
364*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[0], d->plane1, d->fb[0].width, d->fb[0].height);
365*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane1, 0, 0);
366*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
367*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
368*d83cc019SAndroid Build Coastguard Worker }
369*d83cc019SAndroid Build Coastguard Worker
370*d83cc019SAndroid Build Coastguard Worker /* Set up fb[1]->plane2 mapping. */
371*d83cc019SAndroid Build Coastguard Worker d->plane2 = igt_pipe_get_plane_type_index(pipe_obj,
372*d83cc019SAndroid Build Coastguard Worker DRM_PLANE_TYPE_OVERLAY, 0);
373*d83cc019SAndroid Build Coastguard Worker
374*d83cc019SAndroid Build Coastguard Worker if (!d->plane2) {
375*d83cc019SAndroid Build Coastguard Worker igt_debug("Plane-2 doesnt exist on pipe %s\n", kmstest_pipe_name(pipe));
376*d83cc019SAndroid Build Coastguard Worker return;
377*d83cc019SAndroid Build Coastguard Worker }
378*d83cc019SAndroid Build Coastguard Worker
379*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(d->plane2, &d->fb[1]);
380*d83cc019SAndroid Build Coastguard Worker
381*d83cc019SAndroid Build Coastguard Worker /* 2nd plane windowed */
382*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[1], d->plane2, 100, 100);
383*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[1], d->plane2, d->fb[1].width-200, d->fb[1].height-200);
384*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane2, 100, 100);
385*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2, mode->hdisplay-200, mode->vdisplay-200);
386*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
387*d83cc019SAndroid Build Coastguard Worker
388*d83cc019SAndroid Build Coastguard Worker iterate_plane_scaling(d, mode);
389*d83cc019SAndroid Build Coastguard Worker
390*d83cc019SAndroid Build Coastguard Worker /* 2nd plane up scaling */
391*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[1], d->plane2, 100, 100);
392*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[1], d->plane2, 500, 500);
393*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane2, 10, 10);
394*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2, mode->hdisplay-20, mode->vdisplay-20);
395*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
396*d83cc019SAndroid Build Coastguard Worker
397*d83cc019SAndroid Build Coastguard Worker /* 2nd plane downscaling */
398*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[1], d->plane2, 0, 0);
399*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[1], d->plane2, d->fb[1].width, d->fb[1].height);
400*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane2, 10, 10);
401*d83cc019SAndroid Build Coastguard Worker
402*d83cc019SAndroid Build Coastguard Worker /* Downscale (10/9)x of original image */
403*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2, (d->fb[1].width * 10)/9, (d->fb[1].height * 10)/9);
404*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
405*d83cc019SAndroid Build Coastguard Worker
406*d83cc019SAndroid Build Coastguard Worker if (primary_plane_scaling) {
407*d83cc019SAndroid Build Coastguard Worker /* Primary plane up scaling */
408*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[0], d->plane1, 100, 100);
409*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[0], d->plane1, 500, 500);
410*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane1, 0, 0);
411*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
412*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
413*d83cc019SAndroid Build Coastguard Worker }
414*d83cc019SAndroid Build Coastguard Worker
415*d83cc019SAndroid Build Coastguard Worker /* Set up fb[2]->plane3 mapping. */
416*d83cc019SAndroid Build Coastguard Worker d->plane3 = igt_pipe_get_plane_type_index(pipe_obj,
417*d83cc019SAndroid Build Coastguard Worker DRM_PLANE_TYPE_OVERLAY, 1);
418*d83cc019SAndroid Build Coastguard Worker if(!d->plane3) {
419*d83cc019SAndroid Build Coastguard Worker igt_debug("Plane-3 doesnt exist on pipe %s\n", kmstest_pipe_name(pipe));
420*d83cc019SAndroid Build Coastguard Worker return;
421*d83cc019SAndroid Build Coastguard Worker }
422*d83cc019SAndroid Build Coastguard Worker
423*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(d->plane3, &d->fb[2]);
424*d83cc019SAndroid Build Coastguard Worker
425*d83cc019SAndroid Build Coastguard Worker /* 3rd plane windowed - no scaling */
426*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[2], d->plane3, 100, 100);
427*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[2], d->plane3, d->fb[2].width-300, d->fb[2].height-300);
428*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane3, 100, 100);
429*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane3, mode->hdisplay-300, mode->vdisplay-300);
430*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
431*d83cc019SAndroid Build Coastguard Worker
432*d83cc019SAndroid Build Coastguard Worker /* Switch scaler from plane 2 to plane 3 */
433*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[1], d->plane2, 100, 100);
434*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[1], d->plane2, d->fb[1].width-200, d->fb[1].height-200);
435*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane2, 100, 100);
436*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2, d->fb[1].width-200, d->fb[1].height-200);
437*d83cc019SAndroid Build Coastguard Worker
438*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[2], d->plane3, 100, 100);
439*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[2], d->plane3, d->fb[2].width-400, d->fb[2].height-400);
440*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane3, 10, 10);
441*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane3, mode->hdisplay-300, mode->vdisplay-300);
442*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
443*d83cc019SAndroid Build Coastguard Worker
444*d83cc019SAndroid Build Coastguard Worker if (primary_plane_scaling) {
445*d83cc019SAndroid Build Coastguard Worker /* Switch scaler from plane 1 to plane 2 */
446*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[0], d->plane1, 0, 0);
447*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[0], d->plane1, d->fb[0].width, d->fb[0].height);
448*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane1, 0, 0);
449*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
450*d83cc019SAndroid Build Coastguard Worker
451*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[1], d->plane2, 100, 100);
452*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[1], d->plane2, d->fb[1].width-500,d->fb[1].height-500);
453*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane2, 100, 100);
454*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2, mode->hdisplay-200, mode->vdisplay-200);
455*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
456*d83cc019SAndroid Build Coastguard Worker }
457*d83cc019SAndroid Build Coastguard Worker }
458*d83cc019SAndroid Build Coastguard Worker
459*d83cc019SAndroid Build Coastguard Worker static void
__test_scaler_with_clipping_clamping_scenario(data_t * d,drmModeModeInfo * mode,uint32_t f1,uint32_t f2)460*d83cc019SAndroid Build Coastguard Worker __test_scaler_with_clipping_clamping_scenario(data_t *d, drmModeModeInfo *mode,
461*d83cc019SAndroid Build Coastguard Worker uint32_t f1, uint32_t f2)
462*d83cc019SAndroid Build Coastguard Worker {
463*d83cc019SAndroid Build Coastguard Worker cleanup_fbs(d);
464*d83cc019SAndroid Build Coastguard Worker
465*d83cc019SAndroid Build Coastguard Worker igt_create_pattern_fb(d->drm_fd,
466*d83cc019SAndroid Build Coastguard Worker mode->hdisplay, mode->vdisplay, f1,
467*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_X_TILED, &d->fb[1]);
468*d83cc019SAndroid Build Coastguard Worker
469*d83cc019SAndroid Build Coastguard Worker igt_create_pattern_fb(d->drm_fd,
470*d83cc019SAndroid Build Coastguard Worker mode->hdisplay, mode->vdisplay, f2,
471*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_Y_TILED, &d->fb[2]);
472*d83cc019SAndroid Build Coastguard Worker
473*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(d->plane1, &d->fb[1]);
474*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(d->plane2, &d->fb[2]);
475*d83cc019SAndroid Build Coastguard Worker
476*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[1], d->plane1, 0, 0);
477*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[1], d->plane1, 300, 300);
478*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane1, 100, 400);
479*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&d->fb[2], d->plane2, 0, 0);
480*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&d->fb[2], d->plane2, 400, 400);
481*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(d->plane2, 100, 100);
482*d83cc019SAndroid Build Coastguard Worker
483*d83cc019SAndroid Build Coastguard Worker /* scaled window size is outside the modeset area.*/
484*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane1, mode->hdisplay + 200,
485*d83cc019SAndroid Build Coastguard Worker mode->vdisplay + 200);
486*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2, mode->hdisplay + 100,
487*d83cc019SAndroid Build Coastguard Worker mode->vdisplay + 100);
488*d83cc019SAndroid Build Coastguard Worker
489*d83cc019SAndroid Build Coastguard Worker /*
490*d83cc019SAndroid Build Coastguard Worker * Can't guarantee that the clipped coordinates are
491*d83cc019SAndroid Build Coastguard Worker * suitably aligned for yuv. So allow the commit to fail.
492*d83cc019SAndroid Build Coastguard Worker */
493*d83cc019SAndroid Build Coastguard Worker if (igt_format_is_yuv(d->fb[1].drm_format) ||
494*d83cc019SAndroid Build Coastguard Worker igt_format_is_yuv(d->fb[2].drm_format))
495*d83cc019SAndroid Build Coastguard Worker igt_display_try_commit2(&d->display, COMMIT_ATOMIC);
496*d83cc019SAndroid Build Coastguard Worker else
497*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&d->display, COMMIT_ATOMIC);
498*d83cc019SAndroid Build Coastguard Worker }
499*d83cc019SAndroid Build Coastguard Worker
500*d83cc019SAndroid Build Coastguard Worker static void
test_scaler_with_clipping_clamping_scenario(data_t * d,enum pipe pipe,igt_output_t * output)501*d83cc019SAndroid Build Coastguard Worker test_scaler_with_clipping_clamping_scenario(data_t *d, enum pipe pipe, igt_output_t *output)
502*d83cc019SAndroid Build Coastguard Worker {
503*d83cc019SAndroid Build Coastguard Worker igt_pipe_t *pipe_obj = &d->display.pipes[pipe];
504*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
505*d83cc019SAndroid Build Coastguard Worker
506*d83cc019SAndroid Build Coastguard Worker igt_require(get_num_scalers(d, pipe) >= 2);
507*d83cc019SAndroid Build Coastguard Worker
508*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
509*d83cc019SAndroid Build Coastguard Worker d->plane1 = igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_PRIMARY);
510*d83cc019SAndroid Build Coastguard Worker d->plane2 = igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_OVERLAY);
511*d83cc019SAndroid Build Coastguard Worker prepare_crtc(d, output, pipe, d->plane1, mode);
512*d83cc019SAndroid Build Coastguard Worker
513*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < d->plane1->drm_plane->count_formats; i++) {
514*d83cc019SAndroid Build Coastguard Worker unsigned f1 = d->plane1->drm_plane->formats[i];
515*d83cc019SAndroid Build Coastguard Worker if (!igt_fb_supported_format(f1) ||
516*d83cc019SAndroid Build Coastguard Worker !can_scale(d, f1))
517*d83cc019SAndroid Build Coastguard Worker continue;
518*d83cc019SAndroid Build Coastguard Worker
519*d83cc019SAndroid Build Coastguard Worker for (int j = 0; j < d->plane2->drm_plane->count_formats; j++) {
520*d83cc019SAndroid Build Coastguard Worker unsigned f2 = d->plane2->drm_plane->formats[j];
521*d83cc019SAndroid Build Coastguard Worker
522*d83cc019SAndroid Build Coastguard Worker if (!igt_fb_supported_format(f2) ||
523*d83cc019SAndroid Build Coastguard Worker !can_scale(d, f2))
524*d83cc019SAndroid Build Coastguard Worker continue;
525*d83cc019SAndroid Build Coastguard Worker
526*d83cc019SAndroid Build Coastguard Worker __test_scaler_with_clipping_clamping_scenario(d, mode, f1, f2);
527*d83cc019SAndroid Build Coastguard Worker }
528*d83cc019SAndroid Build Coastguard Worker }
529*d83cc019SAndroid Build Coastguard Worker }
530*d83cc019SAndroid Build Coastguard Worker
find_connected_pipe(igt_display_t * display,bool second,enum pipe * pipe,igt_output_t ** output)531*d83cc019SAndroid Build Coastguard Worker static void find_connected_pipe(igt_display_t *display, bool second, enum pipe *pipe, igt_output_t **output)
532*d83cc019SAndroid Build Coastguard Worker {
533*d83cc019SAndroid Build Coastguard Worker enum pipe first = PIPE_NONE;
534*d83cc019SAndroid Build Coastguard Worker igt_output_t *first_output = NULL;
535*d83cc019SAndroid Build Coastguard Worker bool found = false;
536*d83cc019SAndroid Build Coastguard Worker
537*d83cc019SAndroid Build Coastguard Worker for_each_pipe_with_valid_output(display, *pipe, *output) {
538*d83cc019SAndroid Build Coastguard Worker if (first == *pipe || *output == first_output)
539*d83cc019SAndroid Build Coastguard Worker continue;
540*d83cc019SAndroid Build Coastguard Worker
541*d83cc019SAndroid Build Coastguard Worker if (second) {
542*d83cc019SAndroid Build Coastguard Worker first = *pipe;
543*d83cc019SAndroid Build Coastguard Worker first_output = *output;
544*d83cc019SAndroid Build Coastguard Worker second = false;
545*d83cc019SAndroid Build Coastguard Worker continue;
546*d83cc019SAndroid Build Coastguard Worker }
547*d83cc019SAndroid Build Coastguard Worker
548*d83cc019SAndroid Build Coastguard Worker return;
549*d83cc019SAndroid Build Coastguard Worker }
550*d83cc019SAndroid Build Coastguard Worker
551*d83cc019SAndroid Build Coastguard Worker if (first_output)
552*d83cc019SAndroid Build Coastguard Worker igt_require_f(found, "No second valid output found\n");
553*d83cc019SAndroid Build Coastguard Worker else
554*d83cc019SAndroid Build Coastguard Worker igt_require_f(found, "No valid outputs found\n");
555*d83cc019SAndroid Build Coastguard Worker }
556*d83cc019SAndroid Build Coastguard Worker
test_scaler_with_multi_pipe_plane(data_t * d)557*d83cc019SAndroid Build Coastguard Worker static void test_scaler_with_multi_pipe_plane(data_t *d)
558*d83cc019SAndroid Build Coastguard Worker {
559*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &d->display;
560*d83cc019SAndroid Build Coastguard Worker igt_output_t *output1, *output2;
561*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode1, *mode2;
562*d83cc019SAndroid Build Coastguard Worker enum pipe pipe1, pipe2;
563*d83cc019SAndroid Build Coastguard Worker uint64_t tiling = is_i915_device(display->drm_fd) ?
564*d83cc019SAndroid Build Coastguard Worker LOCAL_I915_FORMAT_MOD_Y_TILED : LOCAL_DRM_FORMAT_MOD_NONE;
565*d83cc019SAndroid Build Coastguard Worker
566*d83cc019SAndroid Build Coastguard Worker cleanup_crtc(d);
567*d83cc019SAndroid Build Coastguard Worker
568*d83cc019SAndroid Build Coastguard Worker find_connected_pipe(display, false, &pipe1, &output1);
569*d83cc019SAndroid Build Coastguard Worker find_connected_pipe(display, true, &pipe2, &output2);
570*d83cc019SAndroid Build Coastguard Worker
571*d83cc019SAndroid Build Coastguard Worker igt_skip_on(!output1 || !output2);
572*d83cc019SAndroid Build Coastguard Worker
573*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output1, pipe1);
574*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output2, pipe2);
575*d83cc019SAndroid Build Coastguard Worker
576*d83cc019SAndroid Build Coastguard Worker d->plane1 = igt_output_get_plane(output1, 0);
577*d83cc019SAndroid Build Coastguard Worker d->plane2 = get_num_scalers(d, pipe1) >= 2 ? igt_output_get_plane(output1, 1) : NULL;
578*d83cc019SAndroid Build Coastguard Worker d->plane3 = igt_output_get_plane(output2, 0);
579*d83cc019SAndroid Build Coastguard Worker d->plane4 = get_num_scalers(d, pipe2) >= 2 ? igt_output_get_plane(output2, 1) : NULL;
580*d83cc019SAndroid Build Coastguard Worker
581*d83cc019SAndroid Build Coastguard Worker mode1 = igt_output_get_mode(output1);
582*d83cc019SAndroid Build Coastguard Worker mode2 = igt_output_get_mode(output2);
583*d83cc019SAndroid Build Coastguard Worker
584*d83cc019SAndroid Build Coastguard Worker igt_skip_on(!igt_display_has_format_mod(display, DRM_FORMAT_XRGB8888,
585*d83cc019SAndroid Build Coastguard Worker tiling));
586*d83cc019SAndroid Build Coastguard Worker
587*d83cc019SAndroid Build Coastguard Worker igt_create_pattern_fb(d->drm_fd, 600, 600,
588*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
589*d83cc019SAndroid Build Coastguard Worker tiling, &d->fb[0]);
590*d83cc019SAndroid Build Coastguard Worker
591*d83cc019SAndroid Build Coastguard Worker igt_create_pattern_fb(d->drm_fd, 500, 500,
592*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
593*d83cc019SAndroid Build Coastguard Worker tiling, &d->fb[1]);
594*d83cc019SAndroid Build Coastguard Worker
595*d83cc019SAndroid Build Coastguard Worker igt_create_pattern_fb(d->drm_fd, 700, 700,
596*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
597*d83cc019SAndroid Build Coastguard Worker tiling, &d->fb[2]);
598*d83cc019SAndroid Build Coastguard Worker
599*d83cc019SAndroid Build Coastguard Worker igt_create_pattern_fb(d->drm_fd, 400, 400,
600*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
601*d83cc019SAndroid Build Coastguard Worker tiling, &d->fb[3]);
602*d83cc019SAndroid Build Coastguard Worker
603*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(d->plane1, &d->fb[0]);
604*d83cc019SAndroid Build Coastguard Worker if (d->plane2)
605*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(d->plane2, &d->fb[1]);
606*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(d->plane3, &d->fb[2]);
607*d83cc019SAndroid Build Coastguard Worker if (d->plane4)
608*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(d->plane4, &d->fb[3]);
609*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
610*d83cc019SAndroid Build Coastguard Worker
611*d83cc019SAndroid Build Coastguard Worker /* Upscaling Primary */
612*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane1, mode1->hdisplay, mode1->vdisplay);
613*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane3, mode2->hdisplay, mode2->vdisplay);
614*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
615*d83cc019SAndroid Build Coastguard Worker
616*d83cc019SAndroid Build Coastguard Worker /* Upscaling Sprites */
617*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane2 ?: d->plane1, mode1->hdisplay, mode1->vdisplay);
618*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(d->plane4 ?: d->plane3, mode2->hdisplay, mode2->vdisplay);
619*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_ATOMIC);
620*d83cc019SAndroid Build Coastguard Worker }
621*d83cc019SAndroid Build Coastguard Worker
622*d83cc019SAndroid Build Coastguard Worker igt_main
623*d83cc019SAndroid Build Coastguard Worker {
624*d83cc019SAndroid Build Coastguard Worker data_t data = {};
625*d83cc019SAndroid Build Coastguard Worker enum pipe pipe;
626*d83cc019SAndroid Build Coastguard Worker
627*d83cc019SAndroid Build Coastguard Worker igt_skip_on_simulation();
628*d83cc019SAndroid Build Coastguard Worker
629*d83cc019SAndroid Build Coastguard Worker igt_fixture {
630*d83cc019SAndroid Build Coastguard Worker data.drm_fd = drm_open_driver_master(DRIVER_ANY);
631*d83cc019SAndroid Build Coastguard Worker igt_display_require(&data.display, data.drm_fd);
632*d83cc019SAndroid Build Coastguard Worker data.devid = is_i915_device(data.drm_fd) ?
633*d83cc019SAndroid Build Coastguard Worker intel_get_drm_devid(data.drm_fd) : 0;
634*d83cc019SAndroid Build Coastguard Worker igt_require(data.display.is_atomic);
635*d83cc019SAndroid Build Coastguard Worker }
636*d83cc019SAndroid Build Coastguard Worker
for_each_pipe_static(pipe)637*d83cc019SAndroid Build Coastguard Worker for_each_pipe_static(pipe) igt_subtest_group {
638*d83cc019SAndroid Build Coastguard Worker igt_output_t *output;
639*d83cc019SAndroid Build Coastguard Worker
640*d83cc019SAndroid Build Coastguard Worker igt_fixture {
641*d83cc019SAndroid Build Coastguard Worker igt_display_require_output_on_pipe(&data.display, pipe);
642*d83cc019SAndroid Build Coastguard Worker
643*d83cc019SAndroid Build Coastguard Worker igt_require(get_num_scalers(&data, pipe) > 0);
644*d83cc019SAndroid Build Coastguard Worker }
645*d83cc019SAndroid Build Coastguard Worker
646*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("pipe-%s-plane-scaling", kmstest_pipe_name(pipe))
647*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data.display, pipe, output)
648*d83cc019SAndroid Build Coastguard Worker test_plane_scaling_on_pipe(&data, pipe, output);
649*d83cc019SAndroid Build Coastguard Worker
650*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("pipe-%s-scaler-with-pixel-format", kmstest_pipe_name(pipe))
651*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data.display, pipe, output)
652*d83cc019SAndroid Build Coastguard Worker test_scaler_with_pixel_format_pipe(&data, pipe, output);
653*d83cc019SAndroid Build Coastguard Worker
654*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("pipe-%s-scaler-with-rotation", kmstest_pipe_name(pipe))
655*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data.display, pipe, output)
656*d83cc019SAndroid Build Coastguard Worker test_scaler_with_rotation_pipe(&data, pipe, output);
657*d83cc019SAndroid Build Coastguard Worker
658*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("pipe-%s-scaler-with-clipping-clamping", kmstest_pipe_name(pipe))
659*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data.display, pipe, output)
660*d83cc019SAndroid Build Coastguard Worker test_scaler_with_clipping_clamping_scenario(&data, pipe, output);
661*d83cc019SAndroid Build Coastguard Worker }
662*d83cc019SAndroid Build Coastguard Worker
663*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("2x-scaler-multi-pipe")
664*d83cc019SAndroid Build Coastguard Worker test_scaler_with_multi_pipe_plane(&data);
665*d83cc019SAndroid Build Coastguard Worker
666*d83cc019SAndroid Build Coastguard Worker igt_fixture
667*d83cc019SAndroid Build Coastguard Worker igt_display_fini(&data.display);
668*d83cc019SAndroid Build Coastguard Worker }
669