1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 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 * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Damien Lespiau <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker */
26*d83cc019SAndroid Build Coastguard Worker
27*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
28*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
29*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
30*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
31*d83cc019SAndroid Build Coastguard Worker #include <string.h>
32*d83cc019SAndroid Build Coastguard Worker
33*d83cc019SAndroid Build Coastguard Worker /*
34*d83cc019SAndroid Build Coastguard Worker * Throw away enough lsbs in pixel formats tests
35*d83cc019SAndroid Build Coastguard Worker * to get a match despite some differences between
36*d83cc019SAndroid Build Coastguard Worker * the software and hardware YCbCr<->RGB conversion
37*d83cc019SAndroid Build Coastguard Worker * routines.
38*d83cc019SAndroid Build Coastguard Worker */
39*d83cc019SAndroid Build Coastguard Worker #define LUT_MASK 0xf800
40*d83cc019SAndroid Build Coastguard Worker
41*d83cc019SAndroid Build Coastguard Worker typedef struct {
42*d83cc019SAndroid Build Coastguard Worker float red;
43*d83cc019SAndroid Build Coastguard Worker float green;
44*d83cc019SAndroid Build Coastguard Worker float blue;
45*d83cc019SAndroid Build Coastguard Worker } color_t;
46*d83cc019SAndroid Build Coastguard Worker
47*d83cc019SAndroid Build Coastguard Worker typedef struct {
48*d83cc019SAndroid Build Coastguard Worker int drm_fd;
49*d83cc019SAndroid Build Coastguard Worker igt_display_t display;
50*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_t *pipe_crc;
51*d83cc019SAndroid Build Coastguard Worker uint32_t crop;
52*d83cc019SAndroid Build Coastguard Worker } data_t;
53*d83cc019SAndroid Build Coastguard Worker
54*d83cc019SAndroid Build Coastguard Worker static color_t red = { 1.0f, 0.0f, 0.0f };
55*d83cc019SAndroid Build Coastguard Worker static color_t green = { 0.0f, 1.0f, 0.0f };
56*d83cc019SAndroid Build Coastguard Worker static color_t blue = { 0.0f, 0.0f, 1.0f };
57*d83cc019SAndroid Build Coastguard Worker
58*d83cc019SAndroid Build Coastguard Worker /*
59*d83cc019SAndroid Build Coastguard Worker * Common code across all tests, acting on data_t
60*d83cc019SAndroid Build Coastguard Worker */
test_init(data_t * data,enum pipe pipe)61*d83cc019SAndroid Build Coastguard Worker static void test_init(data_t *data, enum pipe pipe)
62*d83cc019SAndroid Build Coastguard Worker {
63*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
64*d83cc019SAndroid Build Coastguard Worker data->pipe_crc = igt_pipe_crc_new(data->drm_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
65*d83cc019SAndroid Build Coastguard Worker #endif
66*d83cc019SAndroid Build Coastguard Worker }
67*d83cc019SAndroid Build Coastguard Worker
test_fini(data_t * data)68*d83cc019SAndroid Build Coastguard Worker static void test_fini(data_t *data)
69*d83cc019SAndroid Build Coastguard Worker {
70*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
71*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_free(data->pipe_crc);
72*d83cc019SAndroid Build Coastguard Worker #endif
73*d83cc019SAndroid Build Coastguard Worker }
74*d83cc019SAndroid Build Coastguard Worker
75*d83cc019SAndroid Build Coastguard Worker static void
test_grab_crc(data_t * data,igt_output_t * output,enum pipe pipe,color_t * fb_color,igt_crc_t * crc)76*d83cc019SAndroid Build Coastguard Worker test_grab_crc(data_t *data, igt_output_t *output, enum pipe pipe,
77*d83cc019SAndroid Build Coastguard Worker color_t *fb_color, igt_crc_t *crc /* out */)
78*d83cc019SAndroid Build Coastguard Worker {
79*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb;
80*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
81*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary;
82*d83cc019SAndroid Build Coastguard Worker char *crc_str;
83*d83cc019SAndroid Build Coastguard Worker int ret;
84*d83cc019SAndroid Build Coastguard Worker
85*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
86*d83cc019SAndroid Build Coastguard Worker
87*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane(output, 0);
88*d83cc019SAndroid Build Coastguard Worker
89*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
90*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
91*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
92*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
93*d83cc019SAndroid Build Coastguard Worker fb_color->red, fb_color->green, fb_color->blue,
94*d83cc019SAndroid Build Coastguard Worker &fb);
95*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &fb);
96*d83cc019SAndroid Build Coastguard Worker
97*d83cc019SAndroid Build Coastguard Worker ret = igt_display_try_commit2(&data->display, COMMIT_LEGACY);
98*d83cc019SAndroid Build Coastguard Worker igt_skip_on(ret != 0);
99*d83cc019SAndroid Build Coastguard Worker
100*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
101*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(data->pipe_crc, crc);
102*d83cc019SAndroid Build Coastguard Worker #endif
103*d83cc019SAndroid Build Coastguard Worker
104*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
105*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&data->display);
106*d83cc019SAndroid Build Coastguard Worker
107*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(data->drm_fd, &fb);
108*d83cc019SAndroid Build Coastguard Worker
109*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
110*d83cc019SAndroid Build Coastguard Worker crc_str = igt_crc_to_string(crc);
111*d83cc019SAndroid Build Coastguard Worker igt_debug("CRC for a (%.02f,%.02f,%.02f) fb: %s\n", fb_color->red,
112*d83cc019SAndroid Build Coastguard Worker fb_color->green, fb_color->blue, crc_str);
113*d83cc019SAndroid Build Coastguard Worker free(crc_str);
114*d83cc019SAndroid Build Coastguard Worker #endif
115*d83cc019SAndroid Build Coastguard Worker }
116*d83cc019SAndroid Build Coastguard Worker
117*d83cc019SAndroid Build Coastguard Worker /*
118*d83cc019SAndroid Build Coastguard Worker * Plane position test.
119*d83cc019SAndroid Build Coastguard Worker * - We start by grabbing a reference CRC of a full green fb being scanned
120*d83cc019SAndroid Build Coastguard Worker * out on the primary plane
121*d83cc019SAndroid Build Coastguard Worker * - Then we scannout 2 planes:
122*d83cc019SAndroid Build Coastguard Worker * - the primary plane uses a green fb with a black rectangle
123*d83cc019SAndroid Build Coastguard Worker * - a plane, on top of the primary plane, with a green fb that is set-up
124*d83cc019SAndroid Build Coastguard Worker * to cover the black rectangle of the primary plane fb
125*d83cc019SAndroid Build Coastguard Worker * The resulting CRC should be identical to the reference CRC
126*d83cc019SAndroid Build Coastguard Worker */
127*d83cc019SAndroid Build Coastguard Worker
128*d83cc019SAndroid Build Coastguard Worker typedef struct {
129*d83cc019SAndroid Build Coastguard Worker data_t *data;
130*d83cc019SAndroid Build Coastguard Worker igt_crc_t reference_crc;
131*d83cc019SAndroid Build Coastguard Worker } test_position_t;
132*d83cc019SAndroid Build Coastguard Worker
133*d83cc019SAndroid Build Coastguard Worker /*
134*d83cc019SAndroid Build Coastguard Worker * create a green fb with a black rectangle at (rect_x,rect_y) and of size
135*d83cc019SAndroid Build Coastguard Worker * (rect_w,rect_h)
136*d83cc019SAndroid Build Coastguard Worker */
137*d83cc019SAndroid Build Coastguard Worker static void
create_fb_for_mode__position(data_t * data,drmModeModeInfo * mode,double rect_x,double rect_y,double rect_w,double rect_h,struct igt_fb * fb)138*d83cc019SAndroid Build Coastguard Worker create_fb_for_mode__position(data_t *data, drmModeModeInfo *mode,
139*d83cc019SAndroid Build Coastguard Worker double rect_x, double rect_y,
140*d83cc019SAndroid Build Coastguard Worker double rect_w, double rect_h,
141*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb /* out */)
142*d83cc019SAndroid Build Coastguard Worker {
143*d83cc019SAndroid Build Coastguard Worker unsigned int fb_id;
144*d83cc019SAndroid Build Coastguard Worker cairo_t *cr;
145*d83cc019SAndroid Build Coastguard Worker
146*d83cc019SAndroid Build Coastguard Worker fb_id = igt_create_fb(data->drm_fd,
147*d83cc019SAndroid Build Coastguard Worker mode->hdisplay, mode->vdisplay,
148*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
149*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
150*d83cc019SAndroid Build Coastguard Worker fb);
151*d83cc019SAndroid Build Coastguard Worker igt_assert(fb_id);
152*d83cc019SAndroid Build Coastguard Worker
153*d83cc019SAndroid Build Coastguard Worker cr = igt_get_cairo_ctx(data->drm_fd, fb);
154*d83cc019SAndroid Build Coastguard Worker igt_paint_color(cr, 0, 0, mode->hdisplay, mode->vdisplay,
155*d83cc019SAndroid Build Coastguard Worker 0.0, 1.0, 0.0);
156*d83cc019SAndroid Build Coastguard Worker igt_paint_color(cr, rect_x, rect_y, rect_w, rect_h, 0.0, 0.0, 0.0);
157*d83cc019SAndroid Build Coastguard Worker igt_put_cairo_ctx(data->drm_fd, fb, cr);
158*d83cc019SAndroid Build Coastguard Worker }
159*d83cc019SAndroid Build Coastguard Worker
160*d83cc019SAndroid Build Coastguard Worker enum {
161*d83cc019SAndroid Build Coastguard Worker TEST_POSITION_FULLY_COVERED = 1 << 0,
162*d83cc019SAndroid Build Coastguard Worker TEST_DPMS = 1 << 1,
163*d83cc019SAndroid Build Coastguard Worker };
164*d83cc019SAndroid Build Coastguard Worker
165*d83cc019SAndroid Build Coastguard Worker static void
test_plane_position_with_output(data_t * data,enum pipe pipe,int plane,igt_output_t * output,igt_crc_t * reference_crc,unsigned int flags)166*d83cc019SAndroid Build Coastguard Worker test_plane_position_with_output(data_t *data,
167*d83cc019SAndroid Build Coastguard Worker enum pipe pipe,
168*d83cc019SAndroid Build Coastguard Worker int plane,
169*d83cc019SAndroid Build Coastguard Worker igt_output_t *output,
170*d83cc019SAndroid Build Coastguard Worker igt_crc_t *reference_crc,
171*d83cc019SAndroid Build Coastguard Worker unsigned int flags)
172*d83cc019SAndroid Build Coastguard Worker {
173*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary, *sprite;
174*d83cc019SAndroid Build Coastguard Worker struct igt_fb primary_fb, sprite_fb;
175*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
176*d83cc019SAndroid Build Coastguard Worker igt_crc_t crc, crc2;
177*d83cc019SAndroid Build Coastguard Worker
178*d83cc019SAndroid Build Coastguard Worker igt_info("Testing connector %s using pipe %s plane %d\n",
179*d83cc019SAndroid Build Coastguard Worker igt_output_name(output), kmstest_pipe_name(pipe), plane);
180*d83cc019SAndroid Build Coastguard Worker
181*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
182*d83cc019SAndroid Build Coastguard Worker
183*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
184*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
185*d83cc019SAndroid Build Coastguard Worker sprite = igt_output_get_plane(output, plane);
186*d83cc019SAndroid Build Coastguard Worker
187*d83cc019SAndroid Build Coastguard Worker /* Primary planes can't be windowed when using a legacy commit */
188*d83cc019SAndroid Build Coastguard Worker if (sprite->type == DRM_PLANE_TYPE_PRIMARY) {
189*d83cc019SAndroid Build Coastguard Worker return;
190*d83cc019SAndroid Build Coastguard Worker }
191*d83cc019SAndroid Build Coastguard Worker
192*d83cc019SAndroid Build Coastguard Worker create_fb_for_mode__position(data, mode, 100, 100, 64, 64,
193*d83cc019SAndroid Build Coastguard Worker &primary_fb);
194*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &primary_fb);
195*d83cc019SAndroid Build Coastguard Worker
196*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd,
197*d83cc019SAndroid Build Coastguard Worker 64, 64, /* width, height */
198*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
199*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
200*d83cc019SAndroid Build Coastguard Worker 0.0, 1.0, 0.0,
201*d83cc019SAndroid Build Coastguard Worker &sprite_fb);
202*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, &sprite_fb);
203*d83cc019SAndroid Build Coastguard Worker
204*d83cc019SAndroid Build Coastguard Worker if (flags & TEST_POSITION_FULLY_COVERED)
205*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(sprite, 100, 100);
206*d83cc019SAndroid Build Coastguard Worker else
207*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(sprite, 132, 132);
208*d83cc019SAndroid Build Coastguard Worker
209*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&data->display);
210*d83cc019SAndroid Build Coastguard Worker
211*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
212*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(data->pipe_crc, &crc);
213*d83cc019SAndroid Build Coastguard Worker #endif
214*d83cc019SAndroid Build Coastguard Worker
215*d83cc019SAndroid Build Coastguard Worker if (flags & TEST_DPMS) {
216*d83cc019SAndroid Build Coastguard Worker kmstest_set_connector_dpms(data->drm_fd,
217*d83cc019SAndroid Build Coastguard Worker output->config.connector,
218*d83cc019SAndroid Build Coastguard Worker DRM_MODE_DPMS_OFF);
219*d83cc019SAndroid Build Coastguard Worker kmstest_set_connector_dpms(data->drm_fd,
220*d83cc019SAndroid Build Coastguard Worker output->config.connector,
221*d83cc019SAndroid Build Coastguard Worker DRM_MODE_DPMS_ON);
222*d83cc019SAndroid Build Coastguard Worker }
223*d83cc019SAndroid Build Coastguard Worker
224*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
225*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(data->pipe_crc, &crc2);
226*d83cc019SAndroid Build Coastguard Worker
227*d83cc019SAndroid Build Coastguard Worker if (flags & TEST_POSITION_FULLY_COVERED)
228*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(reference_crc, &crc);
229*d83cc019SAndroid Build Coastguard Worker else {
230*d83cc019SAndroid Build Coastguard Worker ;/* FIXME: missing reference CRCs */
231*d83cc019SAndroid Build Coastguard Worker }
232*d83cc019SAndroid Build Coastguard Worker
233*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&crc, &crc2);
234*d83cc019SAndroid Build Coastguard Worker #endif
235*d83cc019SAndroid Build Coastguard Worker
236*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
237*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, NULL);
238*d83cc019SAndroid Build Coastguard Worker
239*d83cc019SAndroid Build Coastguard Worker /* reset the constraint on the pipe */
240*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, PIPE_ANY);
241*d83cc019SAndroid Build Coastguard Worker }
242*d83cc019SAndroid Build Coastguard Worker
243*d83cc019SAndroid Build Coastguard Worker static void
test_plane_position(data_t * data,enum pipe pipe,unsigned int flags)244*d83cc019SAndroid Build Coastguard Worker test_plane_position(data_t *data, enum pipe pipe, unsigned int flags)
245*d83cc019SAndroid Build Coastguard Worker {
246*d83cc019SAndroid Build Coastguard Worker int n_planes = data->display.pipes[pipe].n_planes;
247*d83cc019SAndroid Build Coastguard Worker igt_output_t *output;
248*d83cc019SAndroid Build Coastguard Worker igt_crc_t reference_crc;
249*d83cc019SAndroid Build Coastguard Worker
250*d83cc019SAndroid Build Coastguard Worker output = igt_get_single_output_for_pipe(&data->display, pipe);
251*d83cc019SAndroid Build Coastguard Worker igt_require(output);
252*d83cc019SAndroid Build Coastguard Worker
253*d83cc019SAndroid Build Coastguard Worker test_init(data, pipe);
254*d83cc019SAndroid Build Coastguard Worker
255*d83cc019SAndroid Build Coastguard Worker test_grab_crc(data, output, pipe, &green, &reference_crc);
256*d83cc019SAndroid Build Coastguard Worker
257*d83cc019SAndroid Build Coastguard Worker for (int plane = 1; plane < n_planes; plane++)
258*d83cc019SAndroid Build Coastguard Worker test_plane_position_with_output(data, pipe, plane,
259*d83cc019SAndroid Build Coastguard Worker output, &reference_crc,
260*d83cc019SAndroid Build Coastguard Worker flags);
261*d83cc019SAndroid Build Coastguard Worker
262*d83cc019SAndroid Build Coastguard Worker test_fini(data);
263*d83cc019SAndroid Build Coastguard Worker }
264*d83cc019SAndroid Build Coastguard Worker
265*d83cc019SAndroid Build Coastguard Worker /*
266*d83cc019SAndroid Build Coastguard Worker * Plane panning test.
267*d83cc019SAndroid Build Coastguard Worker * - We start by grabbing reference CRCs of a full red and a full blue fb
268*d83cc019SAndroid Build Coastguard Worker * being scanned out on the primary plane
269*d83cc019SAndroid Build Coastguard Worker * - Then we create a big fb, sized (2 * hdisplay, 2 * vdisplay) and:
270*d83cc019SAndroid Build Coastguard Worker * - fill the top left quarter with red
271*d83cc019SAndroid Build Coastguard Worker * - fill the bottom right quarter with blue
272*d83cc019SAndroid Build Coastguard Worker * - The TEST_PANNING_TOP_LEFT test makes sure that with panning at (0, 0)
273*d83cc019SAndroid Build Coastguard Worker * we do get the same CRC than the full red fb.
274*d83cc019SAndroid Build Coastguard Worker * - The TEST_PANNING_BOTTOM_RIGHT test makes sure that with panning at
275*d83cc019SAndroid Build Coastguard Worker * (vdisplay, hdisplay) we do get the same CRC than the full blue fb.
276*d83cc019SAndroid Build Coastguard Worker */
277*d83cc019SAndroid Build Coastguard Worker static void
create_fb_for_mode__panning(data_t * data,drmModeModeInfo * mode,struct igt_fb * fb)278*d83cc019SAndroid Build Coastguard Worker create_fb_for_mode__panning(data_t *data, drmModeModeInfo *mode,
279*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb /* out */)
280*d83cc019SAndroid Build Coastguard Worker {
281*d83cc019SAndroid Build Coastguard Worker unsigned int fb_id;
282*d83cc019SAndroid Build Coastguard Worker cairo_t *cr;
283*d83cc019SAndroid Build Coastguard Worker
284*d83cc019SAndroid Build Coastguard Worker fb_id = igt_create_fb(data->drm_fd,
285*d83cc019SAndroid Build Coastguard Worker mode->hdisplay * 2, mode->vdisplay * 2,
286*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
287*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
288*d83cc019SAndroid Build Coastguard Worker fb);
289*d83cc019SAndroid Build Coastguard Worker igt_assert(fb_id);
290*d83cc019SAndroid Build Coastguard Worker
291*d83cc019SAndroid Build Coastguard Worker cr = igt_get_cairo_ctx(data->drm_fd, fb);
292*d83cc019SAndroid Build Coastguard Worker
293*d83cc019SAndroid Build Coastguard Worker igt_paint_color(cr, 0, 0, mode->hdisplay, mode->vdisplay,
294*d83cc019SAndroid Build Coastguard Worker 1.0, 0.0, 0.0);
295*d83cc019SAndroid Build Coastguard Worker
296*d83cc019SAndroid Build Coastguard Worker igt_paint_color(cr,
297*d83cc019SAndroid Build Coastguard Worker mode->hdisplay, mode->vdisplay,
298*d83cc019SAndroid Build Coastguard Worker mode->hdisplay, mode->vdisplay,
299*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 1.0);
300*d83cc019SAndroid Build Coastguard Worker
301*d83cc019SAndroid Build Coastguard Worker igt_put_cairo_ctx(data->drm_fd, fb, cr);
302*d83cc019SAndroid Build Coastguard Worker }
303*d83cc019SAndroid Build Coastguard Worker
304*d83cc019SAndroid Build Coastguard Worker enum {
305*d83cc019SAndroid Build Coastguard Worker TEST_PANNING_TOP_LEFT = 1 << 0,
306*d83cc019SAndroid Build Coastguard Worker TEST_PANNING_BOTTOM_RIGHT = 1 << 1,
307*d83cc019SAndroid Build Coastguard Worker TEST_SUSPEND_RESUME = 1 << 2,
308*d83cc019SAndroid Build Coastguard Worker };
309*d83cc019SAndroid Build Coastguard Worker
310*d83cc019SAndroid Build Coastguard Worker static void
test_plane_panning_with_output(data_t * data,enum pipe pipe,int plane,igt_output_t * output,igt_crc_t * red_crc,igt_crc_t * blue_crc,unsigned int flags)311*d83cc019SAndroid Build Coastguard Worker test_plane_panning_with_output(data_t *data,
312*d83cc019SAndroid Build Coastguard Worker enum pipe pipe,
313*d83cc019SAndroid Build Coastguard Worker int plane,
314*d83cc019SAndroid Build Coastguard Worker igt_output_t *output,
315*d83cc019SAndroid Build Coastguard Worker igt_crc_t *red_crc, igt_crc_t *blue_crc,
316*d83cc019SAndroid Build Coastguard Worker unsigned int flags)
317*d83cc019SAndroid Build Coastguard Worker {
318*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary;
319*d83cc019SAndroid Build Coastguard Worker struct igt_fb primary_fb;
320*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
321*d83cc019SAndroid Build Coastguard Worker igt_crc_t crc;
322*d83cc019SAndroid Build Coastguard Worker
323*d83cc019SAndroid Build Coastguard Worker igt_info("Testing connector %s using pipe %s plane %d\n",
324*d83cc019SAndroid Build Coastguard Worker igt_output_name(output), kmstest_pipe_name(pipe), plane);
325*d83cc019SAndroid Build Coastguard Worker
326*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
327*d83cc019SAndroid Build Coastguard Worker
328*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
329*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane(output, 0);
330*d83cc019SAndroid Build Coastguard Worker
331*d83cc019SAndroid Build Coastguard Worker create_fb_for_mode__panning(data, mode, &primary_fb);
332*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &primary_fb);
333*d83cc019SAndroid Build Coastguard Worker
334*d83cc019SAndroid Build Coastguard Worker if (flags & TEST_PANNING_TOP_LEFT)
335*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&primary_fb, primary, 0, 0);
336*d83cc019SAndroid Build Coastguard Worker else
337*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&primary_fb, primary, mode->hdisplay, mode->vdisplay);
338*d83cc019SAndroid Build Coastguard Worker
339*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&data->display);
340*d83cc019SAndroid Build Coastguard Worker
341*d83cc019SAndroid Build Coastguard Worker if (flags & TEST_SUSPEND_RESUME)
342*d83cc019SAndroid Build Coastguard Worker igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
343*d83cc019SAndroid Build Coastguard Worker SUSPEND_TEST_NONE);
344*d83cc019SAndroid Build Coastguard Worker
345*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
346*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(data->pipe_crc, &crc);
347*d83cc019SAndroid Build Coastguard Worker
348*d83cc019SAndroid Build Coastguard Worker if (flags & TEST_PANNING_TOP_LEFT)
349*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(red_crc, &crc);
350*d83cc019SAndroid Build Coastguard Worker else
351*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(blue_crc, &crc);
352*d83cc019SAndroid Build Coastguard Worker #endif
353*d83cc019SAndroid Build Coastguard Worker
354*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
355*d83cc019SAndroid Build Coastguard Worker
356*d83cc019SAndroid Build Coastguard Worker /* reset states to neutral values, assumed by other tests */
357*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, PIPE_ANY);
358*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&primary_fb, primary, 0, 0);
359*d83cc019SAndroid Build Coastguard Worker }
360*d83cc019SAndroid Build Coastguard Worker
361*d83cc019SAndroid Build Coastguard Worker static void
test_plane_panning(data_t * data,enum pipe pipe,unsigned int flags)362*d83cc019SAndroid Build Coastguard Worker test_plane_panning(data_t *data, enum pipe pipe, unsigned int flags)
363*d83cc019SAndroid Build Coastguard Worker {
364*d83cc019SAndroid Build Coastguard Worker int n_planes = data->display.pipes[pipe].n_planes;
365*d83cc019SAndroid Build Coastguard Worker igt_output_t *output;
366*d83cc019SAndroid Build Coastguard Worker igt_crc_t red_crc;
367*d83cc019SAndroid Build Coastguard Worker igt_crc_t blue_crc;
368*d83cc019SAndroid Build Coastguard Worker
369*d83cc019SAndroid Build Coastguard Worker output = igt_get_single_output_for_pipe(&data->display, pipe);
370*d83cc019SAndroid Build Coastguard Worker igt_require(output);
371*d83cc019SAndroid Build Coastguard Worker
372*d83cc019SAndroid Build Coastguard Worker test_init(data, pipe);
373*d83cc019SAndroid Build Coastguard Worker
374*d83cc019SAndroid Build Coastguard Worker test_grab_crc(data, output, pipe, &red, &red_crc);
375*d83cc019SAndroid Build Coastguard Worker test_grab_crc(data, output, pipe, &blue, &blue_crc);
376*d83cc019SAndroid Build Coastguard Worker
377*d83cc019SAndroid Build Coastguard Worker for (int plane = 1; plane < n_planes; plane++)
378*d83cc019SAndroid Build Coastguard Worker test_plane_panning_with_output(data, pipe, plane, output,
379*d83cc019SAndroid Build Coastguard Worker &red_crc, &blue_crc, flags);
380*d83cc019SAndroid Build Coastguard Worker
381*d83cc019SAndroid Build Coastguard Worker test_fini(data);
382*d83cc019SAndroid Build Coastguard Worker }
383*d83cc019SAndroid Build Coastguard Worker
384*d83cc019SAndroid Build Coastguard Worker static const color_t colors[] = {
385*d83cc019SAndroid Build Coastguard Worker { 1.0f, 0.0f, 0.0f, },
386*d83cc019SAndroid Build Coastguard Worker { 0.0f, 1.0f, 0.0f, },
387*d83cc019SAndroid Build Coastguard Worker { 0.0f, 0.0f, 1.0f, },
388*d83cc019SAndroid Build Coastguard Worker { 1.0f, 1.0f, 1.0f, },
389*d83cc019SAndroid Build Coastguard Worker { 0.0f, 0.0f, 0.0f, },
390*d83cc019SAndroid Build Coastguard Worker { 0.0f, 1.0f, 1.0f, },
391*d83cc019SAndroid Build Coastguard Worker { 1.0f, 0.0f, 1.0f, },
392*d83cc019SAndroid Build Coastguard Worker { 1.0f, 1.0f, 0.0f, },
393*d83cc019SAndroid Build Coastguard Worker };
394*d83cc019SAndroid Build Coastguard Worker
set_legacy_lut(data_t * data,enum pipe pipe,uint16_t mask)395*d83cc019SAndroid Build Coastguard Worker static void set_legacy_lut(data_t *data, enum pipe pipe,
396*d83cc019SAndroid Build Coastguard Worker uint16_t mask)
397*d83cc019SAndroid Build Coastguard Worker {
398*d83cc019SAndroid Build Coastguard Worker igt_pipe_t *pipe_obj = &data->display.pipes[pipe];
399*d83cc019SAndroid Build Coastguard Worker drmModeCrtc *crtc;
400*d83cc019SAndroid Build Coastguard Worker uint16_t *lut;
401*d83cc019SAndroid Build Coastguard Worker int i, lut_size, ret;
402*d83cc019SAndroid Build Coastguard Worker
403*d83cc019SAndroid Build Coastguard Worker crtc = drmModeGetCrtc(data->drm_fd, pipe_obj->crtc_id);
404*d83cc019SAndroid Build Coastguard Worker lut_size = crtc->gamma_size;
405*d83cc019SAndroid Build Coastguard Worker drmModeFreeCrtc(crtc);
406*d83cc019SAndroid Build Coastguard Worker
407*d83cc019SAndroid Build Coastguard Worker lut = malloc(sizeof(uint16_t) * lut_size);
408*d83cc019SAndroid Build Coastguard Worker
409*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < lut_size; i++)
410*d83cc019SAndroid Build Coastguard Worker lut[i] = (i * 0xffff / (lut_size - 1)) & mask;
411*d83cc019SAndroid Build Coastguard Worker
412*d83cc019SAndroid Build Coastguard Worker /* DRM driver might not implemented this and return ENOSYS .*/
413*d83cc019SAndroid Build Coastguard Worker ret = drmModeCrtcSetGamma(data->drm_fd, pipe_obj->crtc_id,
414*d83cc019SAndroid Build Coastguard Worker lut_size, lut, lut, lut);
415*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0 || ret == -ENOSYS);
416*d83cc019SAndroid Build Coastguard Worker
417*d83cc019SAndroid Build Coastguard Worker free(lut);
418*d83cc019SAndroid Build Coastguard Worker }
419*d83cc019SAndroid Build Coastguard Worker
set_c8_legacy_lut(data_t * data,enum pipe pipe,uint16_t mask)420*d83cc019SAndroid Build Coastguard Worker static bool set_c8_legacy_lut(data_t *data, enum pipe pipe,
421*d83cc019SAndroid Build Coastguard Worker uint16_t mask)
422*d83cc019SAndroid Build Coastguard Worker {
423*d83cc019SAndroid Build Coastguard Worker igt_pipe_t *pipe_obj = &data->display.pipes[pipe];
424*d83cc019SAndroid Build Coastguard Worker drmModeCrtc *crtc;
425*d83cc019SAndroid Build Coastguard Worker uint16_t *r, *g, *b;
426*d83cc019SAndroid Build Coastguard Worker int i, lut_size;
427*d83cc019SAndroid Build Coastguard Worker
428*d83cc019SAndroid Build Coastguard Worker crtc = drmModeGetCrtc(data->drm_fd, pipe_obj->crtc_id);
429*d83cc019SAndroid Build Coastguard Worker lut_size = crtc->gamma_size;
430*d83cc019SAndroid Build Coastguard Worker drmModeFreeCrtc(crtc);
431*d83cc019SAndroid Build Coastguard Worker
432*d83cc019SAndroid Build Coastguard Worker if (lut_size != 256)
433*d83cc019SAndroid Build Coastguard Worker return false;
434*d83cc019SAndroid Build Coastguard Worker
435*d83cc019SAndroid Build Coastguard Worker r = malloc(sizeof(uint16_t) * 3 * lut_size);
436*d83cc019SAndroid Build Coastguard Worker g = r + lut_size;
437*d83cc019SAndroid Build Coastguard Worker b = g + lut_size;
438*d83cc019SAndroid Build Coastguard Worker
439*d83cc019SAndroid Build Coastguard Worker /* igt_fb uses RGB332 for C8 */
440*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < lut_size; i++) {
441*d83cc019SAndroid Build Coastguard Worker r[i] = (((i & 0xe0) >> 5) * 0xffff / 0x7) & mask;
442*d83cc019SAndroid Build Coastguard Worker g[i] = (((i & 0x1c) >> 2) * 0xffff / 0x7) & mask;
443*d83cc019SAndroid Build Coastguard Worker b[i] = (((i & 0x03) >> 0) * 0xffff / 0x3) & mask;
444*d83cc019SAndroid Build Coastguard Worker }
445*d83cc019SAndroid Build Coastguard Worker
446*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(drmModeCrtcSetGamma(data->drm_fd, pipe_obj->crtc_id,
447*d83cc019SAndroid Build Coastguard Worker lut_size, r, g, b), 0);
448*d83cc019SAndroid Build Coastguard Worker
449*d83cc019SAndroid Build Coastguard Worker free(r);
450*d83cc019SAndroid Build Coastguard Worker
451*d83cc019SAndroid Build Coastguard Worker return true;
452*d83cc019SAndroid Build Coastguard Worker }
453*d83cc019SAndroid Build Coastguard Worker
test_format_plane_color(data_t * data,enum pipe pipe,igt_plane_t * plane,uint32_t format,uint64_t modifier,int width,int height,enum igt_color_encoding color_encoding,enum igt_color_range color_range,int color,igt_crc_t * crc,struct igt_fb * fb)454*d83cc019SAndroid Build Coastguard Worker static void test_format_plane_color(data_t *data, enum pipe pipe,
455*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane,
456*d83cc019SAndroid Build Coastguard Worker uint32_t format, uint64_t modifier,
457*d83cc019SAndroid Build Coastguard Worker int width, int height,
458*d83cc019SAndroid Build Coastguard Worker enum igt_color_encoding color_encoding,
459*d83cc019SAndroid Build Coastguard Worker enum igt_color_range color_range,
460*d83cc019SAndroid Build Coastguard Worker int color, igt_crc_t *crc, struct igt_fb *fb)
461*d83cc019SAndroid Build Coastguard Worker {
462*d83cc019SAndroid Build Coastguard Worker const color_t *c = &colors[color];
463*d83cc019SAndroid Build Coastguard Worker struct igt_fb old_fb = *fb;
464*d83cc019SAndroid Build Coastguard Worker cairo_t *cr;
465*d83cc019SAndroid Build Coastguard Worker
466*d83cc019SAndroid Build Coastguard Worker if (data->crop == 0 || format == DRM_FORMAT_XRGB8888) {
467*d83cc019SAndroid Build Coastguard Worker igt_create_fb_with_bo_size(data->drm_fd, width, height,
468*d83cc019SAndroid Build Coastguard Worker format, modifier, color_encoding,
469*d83cc019SAndroid Build Coastguard Worker color_range, fb, 0, 0);
470*d83cc019SAndroid Build Coastguard Worker
471*d83cc019SAndroid Build Coastguard Worker cr = igt_get_cairo_ctx(data->drm_fd, fb);
472*d83cc019SAndroid Build Coastguard Worker
473*d83cc019SAndroid Build Coastguard Worker igt_paint_color(cr, 0, 0, width, height,
474*d83cc019SAndroid Build Coastguard Worker c->red, c->green, c->blue);
475*d83cc019SAndroid Build Coastguard Worker
476*d83cc019SAndroid Build Coastguard Worker igt_put_cairo_ctx(data->drm_fd, fb, cr);
477*d83cc019SAndroid Build Coastguard Worker } else {
478*d83cc019SAndroid Build Coastguard Worker igt_create_fb_with_bo_size(data->drm_fd,
479*d83cc019SAndroid Build Coastguard Worker width + data->crop * 2,
480*d83cc019SAndroid Build Coastguard Worker height + data->crop * 2,
481*d83cc019SAndroid Build Coastguard Worker format, modifier, color_encoding,
482*d83cc019SAndroid Build Coastguard Worker color_range, fb, 0, 0);
483*d83cc019SAndroid Build Coastguard Worker
484*d83cc019SAndroid Build Coastguard Worker /*
485*d83cc019SAndroid Build Coastguard Worker * paint border in inverted color, then visible area in middle
486*d83cc019SAndroid Build Coastguard Worker * with correct color for clamping test
487*d83cc019SAndroid Build Coastguard Worker */
488*d83cc019SAndroid Build Coastguard Worker cr = igt_get_cairo_ctx(data->drm_fd, fb);
489*d83cc019SAndroid Build Coastguard Worker
490*d83cc019SAndroid Build Coastguard Worker igt_paint_color(cr, 0, 0,
491*d83cc019SAndroid Build Coastguard Worker width + data->crop * 2,
492*d83cc019SAndroid Build Coastguard Worker height + data->crop * 2,
493*d83cc019SAndroid Build Coastguard Worker 1.0f - c->red,
494*d83cc019SAndroid Build Coastguard Worker 1.0f - c->green,
495*d83cc019SAndroid Build Coastguard Worker 1.0f - c->blue);
496*d83cc019SAndroid Build Coastguard Worker
497*d83cc019SAndroid Build Coastguard Worker igt_paint_color(cr, data->crop, data->crop,
498*d83cc019SAndroid Build Coastguard Worker width, height,
499*d83cc019SAndroid Build Coastguard Worker c->red, c->green, c->blue);
500*d83cc019SAndroid Build Coastguard Worker
501*d83cc019SAndroid Build Coastguard Worker igt_put_cairo_ctx(data->drm_fd, fb, cr);
502*d83cc019SAndroid Build Coastguard Worker }
503*d83cc019SAndroid Build Coastguard Worker
504*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(plane, fb);
505*d83cc019SAndroid Build Coastguard Worker
506*d83cc019SAndroid Build Coastguard Worker /*
507*d83cc019SAndroid Build Coastguard Worker * if clamping test. DRM_FORMAT_XRGB8888 is used for reference color.
508*d83cc019SAndroid Build Coastguard Worker */
509*d83cc019SAndroid Build Coastguard Worker if (data->crop != 0 && format != DRM_FORMAT_XRGB8888) {
510*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(fb, plane, data->crop, data->crop);
511*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(fb, plane, width, height);
512*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(plane, width, height);
513*d83cc019SAndroid Build Coastguard Worker }
514*d83cc019SAndroid Build Coastguard Worker
515*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_UNIVERSAL);
516*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
517*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_get_current(data->display.drm_fd, data->pipe_crc, crc);
518*d83cc019SAndroid Build Coastguard Worker #endif
519*d83cc019SAndroid Build Coastguard Worker
520*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(data->drm_fd, &old_fb);
521*d83cc019SAndroid Build Coastguard Worker }
522*d83cc019SAndroid Build Coastguard Worker
523*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
num_unique_crcs(const igt_crc_t crc[],int num_crc)524*d83cc019SAndroid Build Coastguard Worker static int num_unique_crcs(const igt_crc_t crc[], int num_crc)
525*d83cc019SAndroid Build Coastguard Worker {
526*d83cc019SAndroid Build Coastguard Worker int num_unique_crc = 0;
527*d83cc019SAndroid Build Coastguard Worker
528*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < num_crc; i++) {
529*d83cc019SAndroid Build Coastguard Worker int j;
530*d83cc019SAndroid Build Coastguard Worker
531*d83cc019SAndroid Build Coastguard Worker for (j = i + 1; j < num_crc; j++) {
532*d83cc019SAndroid Build Coastguard Worker if (igt_check_crc_equal(&crc[i], &crc[j]))
533*d83cc019SAndroid Build Coastguard Worker break;
534*d83cc019SAndroid Build Coastguard Worker }
535*d83cc019SAndroid Build Coastguard Worker
536*d83cc019SAndroid Build Coastguard Worker if (j == num_crc)
537*d83cc019SAndroid Build Coastguard Worker num_unique_crc++;
538*d83cc019SAndroid Build Coastguard Worker }
539*d83cc019SAndroid Build Coastguard Worker
540*d83cc019SAndroid Build Coastguard Worker return num_unique_crc;
541*d83cc019SAndroid Build Coastguard Worker }
542*d83cc019SAndroid Build Coastguard Worker #endif
543*d83cc019SAndroid Build Coastguard Worker
test_format_plane_colors(data_t * data,enum pipe pipe,igt_plane_t * plane,uint32_t format,uint64_t modifier,int width,int height,enum igt_color_encoding encoding,enum igt_color_range range,igt_crc_t ref_crc[ARRAY_SIZE (colors)],struct igt_fb * fb)544*d83cc019SAndroid Build Coastguard Worker static bool test_format_plane_colors(data_t *data, enum pipe pipe,
545*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane,
546*d83cc019SAndroid Build Coastguard Worker uint32_t format, uint64_t modifier,
547*d83cc019SAndroid Build Coastguard Worker int width, int height,
548*d83cc019SAndroid Build Coastguard Worker enum igt_color_encoding encoding,
549*d83cc019SAndroid Build Coastguard Worker enum igt_color_range range,
550*d83cc019SAndroid Build Coastguard Worker igt_crc_t ref_crc[ARRAY_SIZE(colors)],
551*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb)
552*d83cc019SAndroid Build Coastguard Worker {
553*d83cc019SAndroid Build Coastguard Worker int crc_mismatch_count = 0;
554*d83cc019SAndroid Build Coastguard Worker unsigned int crc_mismatch_mask = 0;
555*d83cc019SAndroid Build Coastguard Worker bool result = true;
556*d83cc019SAndroid Build Coastguard Worker
557*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE(colors); i++) {
558*d83cc019SAndroid Build Coastguard Worker igt_crc_t crc;
559*d83cc019SAndroid Build Coastguard Worker
560*d83cc019SAndroid Build Coastguard Worker test_format_plane_color(data, pipe, plane,
561*d83cc019SAndroid Build Coastguard Worker format, modifier,
562*d83cc019SAndroid Build Coastguard Worker width, height,
563*d83cc019SAndroid Build Coastguard Worker encoding, range,
564*d83cc019SAndroid Build Coastguard Worker i, &crc, fb);
565*d83cc019SAndroid Build Coastguard Worker
566*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
567*d83cc019SAndroid Build Coastguard Worker if (!igt_check_crc_equal(&crc, &ref_crc[i])) {
568*d83cc019SAndroid Build Coastguard Worker crc_mismatch_count++;
569*d83cc019SAndroid Build Coastguard Worker crc_mismatch_mask |= (1 << i);
570*d83cc019SAndroid Build Coastguard Worker result = false;
571*d83cc019SAndroid Build Coastguard Worker }
572*d83cc019SAndroid Build Coastguard Worker #endif
573*d83cc019SAndroid Build Coastguard Worker }
574*d83cc019SAndroid Build Coastguard Worker
575*d83cc019SAndroid Build Coastguard Worker if (crc_mismatch_count)
576*d83cc019SAndroid Build Coastguard Worker igt_warn("CRC mismatches with format " IGT_FORMAT_FMT " on %s.%u with %d/%d solid colors tested (0x%X)\n",
577*d83cc019SAndroid Build Coastguard Worker IGT_FORMAT_ARGS(format), kmstest_pipe_name(pipe),
578*d83cc019SAndroid Build Coastguard Worker plane->index, crc_mismatch_count, (int)ARRAY_SIZE(colors), crc_mismatch_mask);
579*d83cc019SAndroid Build Coastguard Worker
580*d83cc019SAndroid Build Coastguard Worker return result;
581*d83cc019SAndroid Build Coastguard Worker }
582*d83cc019SAndroid Build Coastguard Worker
test_format_plane_rgb(data_t * data,enum pipe pipe,igt_plane_t * plane,uint32_t format,uint64_t modifier,int width,int height,igt_crc_t ref_crc[ARRAY_SIZE (colors)],struct igt_fb * fb)583*d83cc019SAndroid Build Coastguard Worker static bool test_format_plane_rgb(data_t *data, enum pipe pipe,
584*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane,
585*d83cc019SAndroid Build Coastguard Worker uint32_t format, uint64_t modifier,
586*d83cc019SAndroid Build Coastguard Worker int width, int height,
587*d83cc019SAndroid Build Coastguard Worker igt_crc_t ref_crc[ARRAY_SIZE(colors)],
588*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb)
589*d83cc019SAndroid Build Coastguard Worker {
590*d83cc019SAndroid Build Coastguard Worker igt_info("Testing format " IGT_FORMAT_FMT " / modifier 0x%" PRIx64 " on %s.%u\n",
591*d83cc019SAndroid Build Coastguard Worker IGT_FORMAT_ARGS(format), modifier,
592*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe), plane->index);
593*d83cc019SAndroid Build Coastguard Worker
594*d83cc019SAndroid Build Coastguard Worker return test_format_plane_colors(data, pipe, plane,
595*d83cc019SAndroid Build Coastguard Worker format, modifier,
596*d83cc019SAndroid Build Coastguard Worker width, height,
597*d83cc019SAndroid Build Coastguard Worker IGT_COLOR_YCBCR_BT601,
598*d83cc019SAndroid Build Coastguard Worker IGT_COLOR_YCBCR_LIMITED_RANGE,
599*d83cc019SAndroid Build Coastguard Worker ref_crc, fb);
600*d83cc019SAndroid Build Coastguard Worker }
601*d83cc019SAndroid Build Coastguard Worker
test_format_plane_yuv(data_t * data,enum pipe pipe,igt_plane_t * plane,uint32_t format,uint64_t modifier,int width,int height,igt_crc_t ref_crc[ARRAY_SIZE (colors)],struct igt_fb * fb)602*d83cc019SAndroid Build Coastguard Worker static bool test_format_plane_yuv(data_t *data, enum pipe pipe,
603*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane,
604*d83cc019SAndroid Build Coastguard Worker uint32_t format, uint64_t modifier,
605*d83cc019SAndroid Build Coastguard Worker int width, int height,
606*d83cc019SAndroid Build Coastguard Worker igt_crc_t ref_crc[ARRAY_SIZE(colors)],
607*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb)
608*d83cc019SAndroid Build Coastguard Worker {
609*d83cc019SAndroid Build Coastguard Worker bool result = true;
610*d83cc019SAndroid Build Coastguard Worker
611*d83cc019SAndroid Build Coastguard Worker if (!igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
612*d83cc019SAndroid Build Coastguard Worker return true;
613*d83cc019SAndroid Build Coastguard Worker if (!igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
614*d83cc019SAndroid Build Coastguard Worker return true;
615*d83cc019SAndroid Build Coastguard Worker
616*d83cc019SAndroid Build Coastguard Worker for (enum igt_color_encoding e = 0; e < IGT_NUM_COLOR_ENCODINGS; e++) {
617*d83cc019SAndroid Build Coastguard Worker if (!igt_plane_try_prop_enum(plane,
618*d83cc019SAndroid Build Coastguard Worker IGT_PLANE_COLOR_ENCODING,
619*d83cc019SAndroid Build Coastguard Worker igt_color_encoding_to_str(e)))
620*d83cc019SAndroid Build Coastguard Worker continue;
621*d83cc019SAndroid Build Coastguard Worker
622*d83cc019SAndroid Build Coastguard Worker for (enum igt_color_range r = 0; r < IGT_NUM_COLOR_RANGES; r++) {
623*d83cc019SAndroid Build Coastguard Worker if (!igt_plane_try_prop_enum(plane,
624*d83cc019SAndroid Build Coastguard Worker IGT_PLANE_COLOR_RANGE,
625*d83cc019SAndroid Build Coastguard Worker igt_color_range_to_str(r)))
626*d83cc019SAndroid Build Coastguard Worker continue;
627*d83cc019SAndroid Build Coastguard Worker
628*d83cc019SAndroid Build Coastguard Worker igt_info("Testing format " IGT_FORMAT_FMT " / modifier 0x%" PRIx64 " (%s, %s) on %s.%u\n",
629*d83cc019SAndroid Build Coastguard Worker IGT_FORMAT_ARGS(format), modifier,
630*d83cc019SAndroid Build Coastguard Worker igt_color_encoding_to_str(e),
631*d83cc019SAndroid Build Coastguard Worker igt_color_range_to_str(r),
632*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe), plane->index);
633*d83cc019SAndroid Build Coastguard Worker
634*d83cc019SAndroid Build Coastguard Worker result &= test_format_plane_colors(data, pipe, plane,
635*d83cc019SAndroid Build Coastguard Worker format, modifier,
636*d83cc019SAndroid Build Coastguard Worker width, height,
637*d83cc019SAndroid Build Coastguard Worker e, r, ref_crc, fb);
638*d83cc019SAndroid Build Coastguard Worker }
639*d83cc019SAndroid Build Coastguard Worker }
640*d83cc019SAndroid Build Coastguard Worker
641*d83cc019SAndroid Build Coastguard Worker return result;
642*d83cc019SAndroid Build Coastguard Worker }
643*d83cc019SAndroid Build Coastguard Worker
test_format_plane(data_t * data,enum pipe pipe,igt_output_t * output,igt_plane_t * plane)644*d83cc019SAndroid Build Coastguard Worker static bool test_format_plane(data_t *data, enum pipe pipe,
645*d83cc019SAndroid Build Coastguard Worker igt_output_t *output, igt_plane_t *plane)
646*d83cc019SAndroid Build Coastguard Worker {
647*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb = {};
648*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
649*d83cc019SAndroid Build Coastguard Worker uint32_t format, ref_format;
650*d83cc019SAndroid Build Coastguard Worker uint64_t modifier, ref_modifier;
651*d83cc019SAndroid Build Coastguard Worker uint64_t width, height;
652*d83cc019SAndroid Build Coastguard Worker igt_crc_t ref_crc[ARRAY_SIZE(colors)];
653*d83cc019SAndroid Build Coastguard Worker bool result = true;
654*d83cc019SAndroid Build Coastguard Worker
655*d83cc019SAndroid Build Coastguard Worker /*
656*d83cc019SAndroid Build Coastguard Worker * No clamping test for cursor plane
657*d83cc019SAndroid Build Coastguard Worker */
658*d83cc019SAndroid Build Coastguard Worker if (data->crop != 0 && plane->type == DRM_PLANE_TYPE_CURSOR)
659*d83cc019SAndroid Build Coastguard Worker return true;
660*d83cc019SAndroid Build Coastguard Worker
661*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
662*d83cc019SAndroid Build Coastguard Worker if (plane->type != DRM_PLANE_TYPE_CURSOR) {
663*d83cc019SAndroid Build Coastguard Worker width = mode->hdisplay;
664*d83cc019SAndroid Build Coastguard Worker height = mode->vdisplay;
665*d83cc019SAndroid Build Coastguard Worker ref_format = format = DRM_FORMAT_XRGB8888;
666*d83cc019SAndroid Build Coastguard Worker ref_modifier = modifier = DRM_FORMAT_MOD_NONE;
667*d83cc019SAndroid Build Coastguard Worker } else {
668*d83cc019SAndroid Build Coastguard Worker if (!plane->drm_plane) {
669*d83cc019SAndroid Build Coastguard Worker igt_debug("Only legacy cursor ioctl supported, skipping cursor plane\n");
670*d83cc019SAndroid Build Coastguard Worker return true;
671*d83cc019SAndroid Build Coastguard Worker }
672*d83cc019SAndroid Build Coastguard Worker do_or_die(drmGetCap(data->drm_fd, DRM_CAP_CURSOR_WIDTH, &width));
673*d83cc019SAndroid Build Coastguard Worker do_or_die(drmGetCap(data->drm_fd, DRM_CAP_CURSOR_HEIGHT, &height));
674*d83cc019SAndroid Build Coastguard Worker ref_format = format = DRM_FORMAT_ARGB8888;
675*d83cc019SAndroid Build Coastguard Worker ref_modifier = modifier = DRM_FORMAT_MOD_NONE;
676*d83cc019SAndroid Build Coastguard Worker }
677*d83cc019SAndroid Build Coastguard Worker
678*d83cc019SAndroid Build Coastguard Worker igt_debug("Testing connector %s on %s plane %s.%u\n",
679*d83cc019SAndroid Build Coastguard Worker igt_output_name(output), kmstest_plane_type_name(plane->type),
680*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe), plane->index);
681*d83cc019SAndroid Build Coastguard Worker
682*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
683*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_start(data->pipe_crc);
684*d83cc019SAndroid Build Coastguard Worker #endif
685*d83cc019SAndroid Build Coastguard Worker
686*d83cc019SAndroid Build Coastguard Worker igt_info("Testing format " IGT_FORMAT_FMT " / modifier 0x%" PRIx64 " on %s.%u\n",
687*d83cc019SAndroid Build Coastguard Worker IGT_FORMAT_ARGS(format), modifier,
688*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe), plane->index);
689*d83cc019SAndroid Build Coastguard Worker
690*d83cc019SAndroid Build Coastguard Worker if (data->display.is_atomic) {
691*d83cc019SAndroid Build Coastguard Worker struct igt_fb test_fb;
692*d83cc019SAndroid Build Coastguard Worker int ret;
693*d83cc019SAndroid Build Coastguard Worker
694*d83cc019SAndroid Build Coastguard Worker igt_create_fb(data->drm_fd, 64, 64, format,
695*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE, &test_fb);
696*d83cc019SAndroid Build Coastguard Worker
697*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(plane, &test_fb);
698*d83cc019SAndroid Build Coastguard Worker
699*d83cc019SAndroid Build Coastguard Worker ret = igt_display_try_commit_atomic(&data->display, DRM_MODE_ATOMIC_TEST_ONLY, NULL);
700*d83cc019SAndroid Build Coastguard Worker
701*d83cc019SAndroid Build Coastguard Worker if (!ret) {
702*d83cc019SAndroid Build Coastguard Worker width = test_fb.width;
703*d83cc019SAndroid Build Coastguard Worker height = test_fb.height;
704*d83cc019SAndroid Build Coastguard Worker }
705*d83cc019SAndroid Build Coastguard Worker
706*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(plane, NULL);
707*d83cc019SAndroid Build Coastguard Worker
708*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(data->drm_fd, &test_fb);
709*d83cc019SAndroid Build Coastguard Worker }
710*d83cc019SAndroid Build Coastguard Worker
711*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE(colors); i++) {
712*d83cc019SAndroid Build Coastguard Worker test_format_plane_color(data, pipe, plane,
713*d83cc019SAndroid Build Coastguard Worker format, modifier,
714*d83cc019SAndroid Build Coastguard Worker width, height,
715*d83cc019SAndroid Build Coastguard Worker IGT_COLOR_YCBCR_BT709,
716*d83cc019SAndroid Build Coastguard Worker IGT_COLOR_YCBCR_LIMITED_RANGE,
717*d83cc019SAndroid Build Coastguard Worker i, &ref_crc[i], &fb);
718*d83cc019SAndroid Build Coastguard Worker }
719*d83cc019SAndroid Build Coastguard Worker
720*d83cc019SAndroid Build Coastguard Worker /*
721*d83cc019SAndroid Build Coastguard Worker * Make sure we have some difference between the colors. This
722*d83cc019SAndroid Build Coastguard Worker * at least avoids claiming success when everything is just
723*d83cc019SAndroid Build Coastguard Worker * black all the time (eg. if the plane is never even on).
724*d83cc019SAndroid Build Coastguard Worker */
725*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
726*d83cc019SAndroid Build Coastguard Worker igt_require(num_unique_crcs(ref_crc, ARRAY_SIZE(colors)) > 1);
727*d83cc019SAndroid Build Coastguard Worker #endif
728*d83cc019SAndroid Build Coastguard Worker
729*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < plane->format_mod_count; i++) {
730*d83cc019SAndroid Build Coastguard Worker format = plane->formats[i];
731*d83cc019SAndroid Build Coastguard Worker modifier = plane->modifiers[i];
732*d83cc019SAndroid Build Coastguard Worker
733*d83cc019SAndroid Build Coastguard Worker if (format == ref_format &&
734*d83cc019SAndroid Build Coastguard Worker modifier == ref_modifier)
735*d83cc019SAndroid Build Coastguard Worker continue;
736*d83cc019SAndroid Build Coastguard Worker
737*d83cc019SAndroid Build Coastguard Worker if (format == DRM_FORMAT_C8) {
738*d83cc019SAndroid Build Coastguard Worker if (!set_c8_legacy_lut(data, pipe, LUT_MASK))
739*d83cc019SAndroid Build Coastguard Worker continue;
740*d83cc019SAndroid Build Coastguard Worker } else {
741*d83cc019SAndroid Build Coastguard Worker if (!igt_fb_supported_format(format))
742*d83cc019SAndroid Build Coastguard Worker continue;
743*d83cc019SAndroid Build Coastguard Worker }
744*d83cc019SAndroid Build Coastguard Worker
745*d83cc019SAndroid Build Coastguard Worker if (igt_format_is_yuv(format))
746*d83cc019SAndroid Build Coastguard Worker result &= test_format_plane_yuv(data, pipe, plane,
747*d83cc019SAndroid Build Coastguard Worker format, modifier,
748*d83cc019SAndroid Build Coastguard Worker width, height,
749*d83cc019SAndroid Build Coastguard Worker ref_crc, &fb);
750*d83cc019SAndroid Build Coastguard Worker else
751*d83cc019SAndroid Build Coastguard Worker result &= test_format_plane_rgb(data, pipe, plane,
752*d83cc019SAndroid Build Coastguard Worker format, modifier,
753*d83cc019SAndroid Build Coastguard Worker width, height,
754*d83cc019SAndroid Build Coastguard Worker ref_crc, &fb);
755*d83cc019SAndroid Build Coastguard Worker
756*d83cc019SAndroid Build Coastguard Worker if (format == DRM_FORMAT_C8)
757*d83cc019SAndroid Build Coastguard Worker set_legacy_lut(data, pipe, LUT_MASK);
758*d83cc019SAndroid Build Coastguard Worker }
759*d83cc019SAndroid Build Coastguard Worker
760*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
761*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_stop(data->pipe_crc);
762*d83cc019SAndroid Build Coastguard Worker #endif
763*d83cc019SAndroid Build Coastguard Worker
764*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(plane, NULL);
765*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(data->drm_fd, &fb);
766*d83cc019SAndroid Build Coastguard Worker
767*d83cc019SAndroid Build Coastguard Worker return result;
768*d83cc019SAndroid Build Coastguard Worker }
769*d83cc019SAndroid Build Coastguard Worker
770*d83cc019SAndroid Build Coastguard Worker static void
test_pixel_formats(data_t * data,enum pipe pipe)771*d83cc019SAndroid Build Coastguard Worker test_pixel_formats(data_t *data, enum pipe pipe)
772*d83cc019SAndroid Build Coastguard Worker {
773*d83cc019SAndroid Build Coastguard Worker struct igt_fb primary_fb;
774*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary;
775*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
776*d83cc019SAndroid Build Coastguard Worker bool result;
777*d83cc019SAndroid Build Coastguard Worker igt_output_t *output;
778*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane;
779*d83cc019SAndroid Build Coastguard Worker
780*d83cc019SAndroid Build Coastguard Worker output = igt_get_single_output_for_pipe(&data->display, pipe);
781*d83cc019SAndroid Build Coastguard Worker igt_require(output);
782*d83cc019SAndroid Build Coastguard Worker
783*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
784*d83cc019SAndroid Build Coastguard Worker
785*d83cc019SAndroid Build Coastguard Worker igt_create_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
786*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888, LOCAL_DRM_FORMAT_MOD_NONE, &primary_fb);
787*d83cc019SAndroid Build Coastguard Worker
788*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
789*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
790*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &primary_fb);
791*d83cc019SAndroid Build Coastguard Worker
792*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
793*d83cc019SAndroid Build Coastguard Worker
794*d83cc019SAndroid Build Coastguard Worker set_legacy_lut(data, pipe, LUT_MASK);
795*d83cc019SAndroid Build Coastguard Worker
796*d83cc019SAndroid Build Coastguard Worker test_init(data, pipe);
797*d83cc019SAndroid Build Coastguard Worker
798*d83cc019SAndroid Build Coastguard Worker result = true;
799*d83cc019SAndroid Build Coastguard Worker for_each_plane_on_pipe(&data->display, pipe, plane)
800*d83cc019SAndroid Build Coastguard Worker result &= test_format_plane(data, pipe, output, plane);
801*d83cc019SAndroid Build Coastguard Worker
802*d83cc019SAndroid Build Coastguard Worker test_fini(data);
803*d83cc019SAndroid Build Coastguard Worker
804*d83cc019SAndroid Build Coastguard Worker set_legacy_lut(data, pipe, 0xffff);
805*d83cc019SAndroid Build Coastguard Worker
806*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
807*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, PIPE_NONE);
808*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
809*d83cc019SAndroid Build Coastguard Worker
810*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(data->drm_fd, &primary_fb);
811*d83cc019SAndroid Build Coastguard Worker
812*d83cc019SAndroid Build Coastguard Worker igt_assert_f(result, "At least one CRC mismatch happened\n");
813*d83cc019SAndroid Build Coastguard Worker }
814*d83cc019SAndroid Build Coastguard Worker
815*d83cc019SAndroid Build Coastguard Worker static void
run_tests_for_pipe_plane(data_t * data,enum pipe pipe)816*d83cc019SAndroid Build Coastguard Worker run_tests_for_pipe_plane(data_t *data, enum pipe pipe)
817*d83cc019SAndroid Build Coastguard Worker {
818*d83cc019SAndroid Build Coastguard Worker igt_fixture {
819*d83cc019SAndroid Build Coastguard Worker igt_skip_on(pipe >= data->display.n_pipes);
820*d83cc019SAndroid Build Coastguard Worker igt_require(data->display.pipes[pipe].n_planes > 0);
821*d83cc019SAndroid Build Coastguard Worker }
822*d83cc019SAndroid Build Coastguard Worker
823*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("pixel-format-pipe-%s-planes",
824*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
825*d83cc019SAndroid Build Coastguard Worker test_pixel_formats(data, pipe);
826*d83cc019SAndroid Build Coastguard Worker
827*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("pixel-format-pipe-%s-planes-source-clamping",
828*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe)) {
829*d83cc019SAndroid Build Coastguard Worker data->crop = 4;
830*d83cc019SAndroid Build Coastguard Worker test_pixel_formats(data, pipe);
831*d83cc019SAndroid Build Coastguard Worker }
832*d83cc019SAndroid Build Coastguard Worker
833*d83cc019SAndroid Build Coastguard Worker data->crop = 0;
834*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("plane-position-covered-pipe-%s-planes",
835*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
836*d83cc019SAndroid Build Coastguard Worker test_plane_position(data, pipe, TEST_POSITION_FULLY_COVERED);
837*d83cc019SAndroid Build Coastguard Worker
838*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("plane-position-hole-pipe-%s-planes",
839*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
840*d83cc019SAndroid Build Coastguard Worker test_plane_position(data, pipe, 0);
841*d83cc019SAndroid Build Coastguard Worker
842*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("plane-position-hole-dpms-pipe-%s-planes",
843*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
844*d83cc019SAndroid Build Coastguard Worker test_plane_position(data, pipe, TEST_DPMS);
845*d83cc019SAndroid Build Coastguard Worker
846*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("plane-panning-top-left-pipe-%s-planes",
847*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
848*d83cc019SAndroid Build Coastguard Worker test_plane_panning(data, pipe, TEST_PANNING_TOP_LEFT);
849*d83cc019SAndroid Build Coastguard Worker
850*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("plane-panning-bottom-right-pipe-%s-planes",
851*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
852*d83cc019SAndroid Build Coastguard Worker test_plane_panning(data, pipe, TEST_PANNING_BOTTOM_RIGHT);
853*d83cc019SAndroid Build Coastguard Worker
854*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("plane-panning-bottom-right-suspend-pipe-%s-planes",
855*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
856*d83cc019SAndroid Build Coastguard Worker test_plane_panning(data, pipe, TEST_PANNING_BOTTOM_RIGHT |
857*d83cc019SAndroid Build Coastguard Worker TEST_SUSPEND_RESUME);
858*d83cc019SAndroid Build Coastguard Worker }
859*d83cc019SAndroid Build Coastguard Worker
860*d83cc019SAndroid Build Coastguard Worker
861*d83cc019SAndroid Build Coastguard Worker static data_t data;
862*d83cc019SAndroid Build Coastguard Worker
863*d83cc019SAndroid Build Coastguard Worker igt_main
864*d83cc019SAndroid Build Coastguard Worker {
865*d83cc019SAndroid Build Coastguard Worker enum pipe pipe;
866*d83cc019SAndroid Build Coastguard Worker
867*d83cc019SAndroid Build Coastguard Worker igt_skip_on_simulation();
868*d83cc019SAndroid Build Coastguard Worker
869*d83cc019SAndroid Build Coastguard Worker igt_fixture {
870*d83cc019SAndroid Build Coastguard Worker data.drm_fd = drm_open_driver_master(DRIVER_ANY);
871*d83cc019SAndroid Build Coastguard Worker
872*d83cc019SAndroid Build Coastguard Worker kmstest_set_vt_graphics_mode();
873*d83cc019SAndroid Build Coastguard Worker
874*d83cc019SAndroid Build Coastguard Worker #if defined (USE_CRC)
875*d83cc019SAndroid Build Coastguard Worker igt_require_pipe_crc(data.drm_fd);
876*d83cc019SAndroid Build Coastguard Worker #endif
877*d83cc019SAndroid Build Coastguard Worker igt_display_require(&data.display, data.drm_fd);
878*d83cc019SAndroid Build Coastguard Worker }
879*d83cc019SAndroid Build Coastguard Worker
880*d83cc019SAndroid Build Coastguard Worker for_each_pipe_static(pipe)
881*d83cc019SAndroid Build Coastguard Worker run_tests_for_pipe_plane(&data, pipe);
882*d83cc019SAndroid Build Coastguard Worker
883*d83cc019SAndroid Build Coastguard Worker igt_fixture {
884*d83cc019SAndroid Build Coastguard Worker igt_display_fini(&data.display);
885*d83cc019SAndroid Build Coastguard Worker }
886*d83cc019SAndroid Build Coastguard Worker }
887