xref: /aosp_15_r20/external/igt-gpu-tools/tests/kms_ccs.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2016 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 
27*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("Test render compression (RC), in which the main surface "
28*d83cc019SAndroid Build Coastguard Worker 		     "is complemented by a color control surface (CCS) that "
29*d83cc019SAndroid Build Coastguard Worker 		     "the display uses to interpret the compressed data.");
30*d83cc019SAndroid Build Coastguard Worker 
31*d83cc019SAndroid Build Coastguard Worker enum test_flags {
32*d83cc019SAndroid Build Coastguard Worker 	TEST_CRC			= 1 << 1,
33*d83cc019SAndroid Build Coastguard Worker 	TEST_ROTATE_180			= 1 << 2,
34*d83cc019SAndroid Build Coastguard Worker 	TEST_BAD_PIXEL_FORMAT		= 1 << 3,
35*d83cc019SAndroid Build Coastguard Worker 	TEST_BAD_ROTATION_90		= 1 << 4,
36*d83cc019SAndroid Build Coastguard Worker 	TEST_NO_AUX_BUFFER		= 1 << 5,
37*d83cc019SAndroid Build Coastguard Worker 	TEST_BAD_CCS_HANDLE		= 1 << 6,
38*d83cc019SAndroid Build Coastguard Worker 	TEST_BAD_AUX_STRIDE		= 1 << 7,
39*d83cc019SAndroid Build Coastguard Worker };
40*d83cc019SAndroid Build Coastguard Worker 
41*d83cc019SAndroid Build Coastguard Worker #define TEST_FAIL_ON_ADDFB2 \
42*d83cc019SAndroid Build Coastguard Worker 	(TEST_BAD_PIXEL_FORMAT | TEST_NO_AUX_BUFFER | TEST_BAD_CCS_HANDLE | \
43*d83cc019SAndroid Build Coastguard Worker 	 TEST_BAD_AUX_STRIDE)
44*d83cc019SAndroid Build Coastguard Worker 
45*d83cc019SAndroid Build Coastguard Worker enum test_fb_flags {
46*d83cc019SAndroid Build Coastguard Worker 	FB_COMPRESSED			= 1 << 0,
47*d83cc019SAndroid Build Coastguard Worker 	FB_HAS_PLANE			= 1 << 1,
48*d83cc019SAndroid Build Coastguard Worker 	FB_MISALIGN_AUX_STRIDE		= 1 << 2,
49*d83cc019SAndroid Build Coastguard Worker 	FB_SMALL_AUX_STRIDE		= 1 << 3,
50*d83cc019SAndroid Build Coastguard Worker 	FB_ZERO_AUX_STRIDE		= 1 << 4,
51*d83cc019SAndroid Build Coastguard Worker };
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker typedef struct {
54*d83cc019SAndroid Build Coastguard Worker 	int drm_fd;
55*d83cc019SAndroid Build Coastguard Worker 	igt_display_t display;
56*d83cc019SAndroid Build Coastguard Worker 	igt_output_t *output;
57*d83cc019SAndroid Build Coastguard Worker 	enum pipe pipe;
58*d83cc019SAndroid Build Coastguard Worker 	enum test_flags flags;
59*d83cc019SAndroid Build Coastguard Worker 	igt_plane_t *plane;
60*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_crc_t *pipe_crc;
61*d83cc019SAndroid Build Coastguard Worker 	uint64_t ccs_modifier;
62*d83cc019SAndroid Build Coastguard Worker } data_t;
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker static const struct {
65*d83cc019SAndroid Build Coastguard Worker 	double r;
66*d83cc019SAndroid Build Coastguard Worker 	double g;
67*d83cc019SAndroid Build Coastguard Worker 	double b;
68*d83cc019SAndroid Build Coastguard Worker } colors[2] = {
69*d83cc019SAndroid Build Coastguard Worker 	{1.0, 0.0, 0.0},
70*d83cc019SAndroid Build Coastguard Worker 	{0.0, 1.0, 0.0}
71*d83cc019SAndroid Build Coastguard Worker };
72*d83cc019SAndroid Build Coastguard Worker 
73*d83cc019SAndroid Build Coastguard Worker static const uint64_t ccs_modifiers[] = {
74*d83cc019SAndroid Build Coastguard Worker 	LOCAL_I915_FORMAT_MOD_Y_TILED_CCS,
75*d83cc019SAndroid Build Coastguard Worker 	LOCAL_I915_FORMAT_MOD_Yf_TILED_CCS,
76*d83cc019SAndroid Build Coastguard Worker };
77*d83cc019SAndroid Build Coastguard Worker 
78*d83cc019SAndroid Build Coastguard Worker /*
79*d83cc019SAndroid Build Coastguard Worker  * Limit maximum used sprite plane width so this test will not mistakenly
80*d83cc019SAndroid Build Coastguard Worker  * fail on hardware limitations which are not interesting to this test.
81*d83cc019SAndroid Build Coastguard Worker  * On this test too wide sprite plane may fail during creation with dmesg
82*d83cc019SAndroid Build Coastguard Worker  * comment saying:
83*d83cc019SAndroid Build Coastguard Worker  * "Requested display configuration exceeds system watermark limitations"
84*d83cc019SAndroid Build Coastguard Worker  */
85*d83cc019SAndroid Build Coastguard Worker #define MAX_SPRITE_PLANE_WIDTH 2000
86*d83cc019SAndroid Build Coastguard Worker 
addfb_init(struct igt_fb * fb,struct drm_mode_fb_cmd2 * f)87*d83cc019SAndroid Build Coastguard Worker static void addfb_init(struct igt_fb *fb, struct drm_mode_fb_cmd2 *f)
88*d83cc019SAndroid Build Coastguard Worker {
89*d83cc019SAndroid Build Coastguard Worker 	int i;
90*d83cc019SAndroid Build Coastguard Worker 
91*d83cc019SAndroid Build Coastguard Worker 	f->width = fb->width;
92*d83cc019SAndroid Build Coastguard Worker 	f->height = fb->height;
93*d83cc019SAndroid Build Coastguard Worker 	f->pixel_format = fb->drm_format;
94*d83cc019SAndroid Build Coastguard Worker 	f->flags = LOCAL_DRM_MODE_FB_MODIFIERS;
95*d83cc019SAndroid Build Coastguard Worker 
96*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < fb->num_planes; i++) {
97*d83cc019SAndroid Build Coastguard Worker 		f->handles[i] = fb->gem_handle;
98*d83cc019SAndroid Build Coastguard Worker 		f->modifier[i] = fb->modifier;
99*d83cc019SAndroid Build Coastguard Worker 		f->pitches[i] = fb->strides[i];
100*d83cc019SAndroid Build Coastguard Worker 		f->offsets[i] = fb->offsets[i];
101*d83cc019SAndroid Build Coastguard Worker 	}
102*d83cc019SAndroid Build Coastguard Worker }
103*d83cc019SAndroid Build Coastguard Worker 
generate_fb(data_t * data,struct igt_fb * fb,int width,int height,enum test_fb_flags fb_flags)104*d83cc019SAndroid Build Coastguard Worker static void generate_fb(data_t *data, struct igt_fb *fb,
105*d83cc019SAndroid Build Coastguard Worker 			int width, int height,
106*d83cc019SAndroid Build Coastguard Worker 			enum test_fb_flags fb_flags)
107*d83cc019SAndroid Build Coastguard Worker {
108*d83cc019SAndroid Build Coastguard Worker 	struct drm_mode_fb_cmd2 f = {0};
109*d83cc019SAndroid Build Coastguard Worker 	uint32_t format;
110*d83cc019SAndroid Build Coastguard Worker 	uint64_t modifier;
111*d83cc019SAndroid Build Coastguard Worker 	cairo_t *cr;
112*d83cc019SAndroid Build Coastguard Worker 	int ret;
113*d83cc019SAndroid Build Coastguard Worker 
114*d83cc019SAndroid Build Coastguard Worker 	/* Use either compressed or Y-tiled to test. However, given the lack of
115*d83cc019SAndroid Build Coastguard Worker 	 * available bandwidth, we use linear for the primary plane when
116*d83cc019SAndroid Build Coastguard Worker 	 * testing sprites, since we cannot fit two CCS planes into the
117*d83cc019SAndroid Build Coastguard Worker 	 * available FIFO configurations.
118*d83cc019SAndroid Build Coastguard Worker 	 */
119*d83cc019SAndroid Build Coastguard Worker 	if (fb_flags & FB_COMPRESSED)
120*d83cc019SAndroid Build Coastguard Worker 		modifier = data->ccs_modifier;
121*d83cc019SAndroid Build Coastguard Worker 	else if (!(fb_flags & FB_HAS_PLANE))
122*d83cc019SAndroid Build Coastguard Worker 		modifier = LOCAL_I915_FORMAT_MOD_Y_TILED;
123*d83cc019SAndroid Build Coastguard Worker 	else
124*d83cc019SAndroid Build Coastguard Worker 		modifier = 0;
125*d83cc019SAndroid Build Coastguard Worker 
126*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_BAD_PIXEL_FORMAT)
127*d83cc019SAndroid Build Coastguard Worker 		format = DRM_FORMAT_RGB565;
128*d83cc019SAndroid Build Coastguard Worker 	else
129*d83cc019SAndroid Build Coastguard Worker 		format = DRM_FORMAT_XRGB8888;
130*d83cc019SAndroid Build Coastguard Worker 
131*d83cc019SAndroid Build Coastguard Worker 	igt_create_bo_for_fb(data->drm_fd, width, height, format, modifier, fb);
132*d83cc019SAndroid Build Coastguard Worker 	igt_assert(fb->gem_handle > 0);
133*d83cc019SAndroid Build Coastguard Worker 
134*d83cc019SAndroid Build Coastguard Worker 	addfb_init(fb, &f);
135*d83cc019SAndroid Build Coastguard Worker 
136*d83cc019SAndroid Build Coastguard Worker 	if (fb_flags & FB_COMPRESSED) {
137*d83cc019SAndroid Build Coastguard Worker 		if (fb_flags & FB_MISALIGN_AUX_STRIDE) {
138*d83cc019SAndroid Build Coastguard Worker 			igt_skip_on_f(width <= 1024,
139*d83cc019SAndroid Build Coastguard Worker 				      "FB already has the smallest possible stride\n");
140*d83cc019SAndroid Build Coastguard Worker 			f.pitches[1] -= 64;
141*d83cc019SAndroid Build Coastguard Worker 		}
142*d83cc019SAndroid Build Coastguard Worker 
143*d83cc019SAndroid Build Coastguard Worker 		if (fb_flags & FB_SMALL_AUX_STRIDE) {
144*d83cc019SAndroid Build Coastguard Worker 			igt_skip_on_f(width <= 1024,
145*d83cc019SAndroid Build Coastguard Worker 				      "FB already has the smallest possible stride\n");
146*d83cc019SAndroid Build Coastguard Worker 			f.pitches[1] = ALIGN(f.pitches[1]/2, 128);
147*d83cc019SAndroid Build Coastguard Worker 		}
148*d83cc019SAndroid Build Coastguard Worker 
149*d83cc019SAndroid Build Coastguard Worker 		if (fb_flags & FB_ZERO_AUX_STRIDE)
150*d83cc019SAndroid Build Coastguard Worker 			f.pitches[1] = 0;
151*d83cc019SAndroid Build Coastguard Worker 
152*d83cc019SAndroid Build Coastguard Worker 		/* Put the CCS buffer on a different BO. */
153*d83cc019SAndroid Build Coastguard Worker 		if (data->flags & TEST_BAD_CCS_HANDLE)
154*d83cc019SAndroid Build Coastguard Worker 			f.handles[1] = gem_create(data->drm_fd, fb->size);
155*d83cc019SAndroid Build Coastguard Worker 
156*d83cc019SAndroid Build Coastguard Worker 		if (data->flags & TEST_NO_AUX_BUFFER) {
157*d83cc019SAndroid Build Coastguard Worker 			f.handles[1] = 0;
158*d83cc019SAndroid Build Coastguard Worker 			f.modifier[1] = 0;
159*d83cc019SAndroid Build Coastguard Worker 			f.pitches[1] = 0;
160*d83cc019SAndroid Build Coastguard Worker 			f.offsets[1] = 0;
161*d83cc019SAndroid Build Coastguard Worker 		}
162*d83cc019SAndroid Build Coastguard Worker 	}
163*d83cc019SAndroid Build Coastguard Worker 
164*d83cc019SAndroid Build Coastguard Worker 	if (!(data->flags & TEST_BAD_PIXEL_FORMAT)) {
165*d83cc019SAndroid Build Coastguard Worker 		int c = !!data->plane;
166*d83cc019SAndroid Build Coastguard Worker 
167*d83cc019SAndroid Build Coastguard Worker 		cr = igt_get_cairo_ctx(data->drm_fd, fb);
168*d83cc019SAndroid Build Coastguard Worker 		igt_paint_color(cr, 0, 0, width, height,
169*d83cc019SAndroid Build Coastguard Worker 				colors[c].r, colors[c].g, colors[c].b);
170*d83cc019SAndroid Build Coastguard Worker 		igt_put_cairo_ctx(data->drm_fd, fb, cr);
171*d83cc019SAndroid Build Coastguard Worker 	}
172*d83cc019SAndroid Build Coastguard Worker 
173*d83cc019SAndroid Build Coastguard Worker 	ret = drmIoctl(data->drm_fd, LOCAL_DRM_IOCTL_MODE_ADDFB2, &f);
174*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_FAIL_ON_ADDFB2) {
175*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(ret, -1);
176*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(errno, EINVAL);
177*d83cc019SAndroid Build Coastguard Worker 		return;
178*d83cc019SAndroid Build Coastguard Worker 	} else
179*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(ret, 0);
180*d83cc019SAndroid Build Coastguard Worker 
181*d83cc019SAndroid Build Coastguard Worker 	fb->fb_id = f.fb_id;
182*d83cc019SAndroid Build Coastguard Worker }
183*d83cc019SAndroid Build Coastguard Worker 
try_config(data_t * data,enum test_fb_flags fb_flags,igt_crc_t * crc)184*d83cc019SAndroid Build Coastguard Worker static bool try_config(data_t *data, enum test_fb_flags fb_flags,
185*d83cc019SAndroid Build Coastguard Worker 		       igt_crc_t *crc)
186*d83cc019SAndroid Build Coastguard Worker {
187*d83cc019SAndroid Build Coastguard Worker 	igt_display_t *display = &data->display;
188*d83cc019SAndroid Build Coastguard Worker 	igt_plane_t *primary;
189*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo *drm_mode = igt_output_get_mode(data->output);
190*d83cc019SAndroid Build Coastguard Worker 	enum igt_commit_style commit;
191*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb, fb_sprite;
192*d83cc019SAndroid Build Coastguard Worker 	int ret;
193*d83cc019SAndroid Build Coastguard Worker 
194*d83cc019SAndroid Build Coastguard Worker 	if (data->display.is_atomic)
195*d83cc019SAndroid Build Coastguard Worker 		commit = COMMIT_ATOMIC;
196*d83cc019SAndroid Build Coastguard Worker 	else
197*d83cc019SAndroid Build Coastguard Worker 		commit = COMMIT_UNIVERSAL;
198*d83cc019SAndroid Build Coastguard Worker 
199*d83cc019SAndroid Build Coastguard Worker 	primary = igt_output_get_plane_type(data->output,
200*d83cc019SAndroid Build Coastguard Worker 					    DRM_PLANE_TYPE_PRIMARY);
201*d83cc019SAndroid Build Coastguard Worker 	if (!igt_plane_has_format_mod(primary, DRM_FORMAT_XRGB8888,
202*d83cc019SAndroid Build Coastguard Worker 				      data->ccs_modifier))
203*d83cc019SAndroid Build Coastguard Worker 		return false;
204*d83cc019SAndroid Build Coastguard Worker 
205*d83cc019SAndroid Build Coastguard Worker 	if (data->plane && fb_flags & FB_COMPRESSED) {
206*d83cc019SAndroid Build Coastguard Worker 		if (!igt_plane_has_format_mod(data->plane, DRM_FORMAT_XRGB8888,
207*d83cc019SAndroid Build Coastguard Worker 					      data->ccs_modifier))
208*d83cc019SAndroid Build Coastguard Worker 			return false;
209*d83cc019SAndroid Build Coastguard Worker 
210*d83cc019SAndroid Build Coastguard Worker 		generate_fb(data, &fb, min(MAX_SPRITE_PLANE_WIDTH, drm_mode->hdisplay),
211*d83cc019SAndroid Build Coastguard Worker 			    drm_mode->vdisplay,
212*d83cc019SAndroid Build Coastguard Worker 			    (fb_flags & ~FB_COMPRESSED) | FB_HAS_PLANE);
213*d83cc019SAndroid Build Coastguard Worker 		generate_fb(data, &fb_sprite, 256, 256, fb_flags);
214*d83cc019SAndroid Build Coastguard Worker 	} else {
215*d83cc019SAndroid Build Coastguard Worker 		generate_fb(data, &fb, min(MAX_SPRITE_PLANE_WIDTH, drm_mode->hdisplay),
216*d83cc019SAndroid Build Coastguard Worker 			    drm_mode->vdisplay, fb_flags);
217*d83cc019SAndroid Build Coastguard Worker 	}
218*d83cc019SAndroid Build Coastguard Worker 
219*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_FAIL_ON_ADDFB2)
220*d83cc019SAndroid Build Coastguard Worker 		return true;
221*d83cc019SAndroid Build Coastguard Worker 
222*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(primary, 0, 0);
223*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_size(primary, drm_mode->hdisplay, drm_mode->vdisplay);
224*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(primary, &fb);
225*d83cc019SAndroid Build Coastguard Worker 
226*d83cc019SAndroid Build Coastguard Worker 	if (data->plane && fb_flags & FB_COMPRESSED) {
227*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_position(data->plane, 0, 0);
228*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_size(data->plane, 256, 256);
229*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_fb(data->plane, &fb_sprite);
230*d83cc019SAndroid Build Coastguard Worker 	}
231*d83cc019SAndroid Build Coastguard Worker 
232*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_ROTATE_180)
233*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_rotation(primary, IGT_ROTATION_180);
234*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_BAD_ROTATION_90)
235*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_rotation(primary, IGT_ROTATION_90);
236*d83cc019SAndroid Build Coastguard Worker 
237*d83cc019SAndroid Build Coastguard Worker 	ret = igt_display_try_commit2(display, commit);
238*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_BAD_ROTATION_90) {
239*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(ret, -EINVAL);
240*d83cc019SAndroid Build Coastguard Worker 	} else {
241*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(ret, 0);
242*d83cc019SAndroid Build Coastguard Worker 
243*d83cc019SAndroid Build Coastguard Worker 		if (crc)
244*d83cc019SAndroid Build Coastguard Worker 			igt_pipe_crc_collect_crc(data->pipe_crc, crc);
245*d83cc019SAndroid Build Coastguard Worker 	}
246*d83cc019SAndroid Build Coastguard Worker 
247*d83cc019SAndroid Build Coastguard Worker 	igt_debug_wait_for_keypress("ccs");
248*d83cc019SAndroid Build Coastguard Worker 
249*d83cc019SAndroid Build Coastguard Worker 	if (data->plane && fb_flags & FB_COMPRESSED) {
250*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_position(data->plane, 0, 0);
251*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_size(data->plane, 0, 0);
252*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_fb(data->plane, NULL);
253*d83cc019SAndroid Build Coastguard Worker 		igt_remove_fb(display->drm_fd, &fb_sprite);
254*d83cc019SAndroid Build Coastguard Worker 	}
255*d83cc019SAndroid Build Coastguard Worker 
256*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(primary, NULL);
257*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_rotation(primary, IGT_ROTATION_0);
258*d83cc019SAndroid Build Coastguard Worker 	igt_display_commit2(display, commit);
259*d83cc019SAndroid Build Coastguard Worker 
260*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_CRC)
261*d83cc019SAndroid Build Coastguard Worker 		igt_remove_fb(data->drm_fd, &fb);
262*d83cc019SAndroid Build Coastguard Worker 
263*d83cc019SAndroid Build Coastguard Worker 	return true;
264*d83cc019SAndroid Build Coastguard Worker }
265*d83cc019SAndroid Build Coastguard Worker 
test_ccs(data_t * data)266*d83cc019SAndroid Build Coastguard Worker static int test_ccs(data_t *data)
267*d83cc019SAndroid Build Coastguard Worker {	int valid_tests = 0;
268*d83cc019SAndroid Build Coastguard Worker 	igt_crc_t crc, ref_crc;
269*d83cc019SAndroid Build Coastguard Worker 	enum test_fb_flags fb_flags = 0;
270*d83cc019SAndroid Build Coastguard Worker 
271*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_CRC) {
272*d83cc019SAndroid Build Coastguard Worker 		data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
273*d83cc019SAndroid Build Coastguard Worker 
274*d83cc019SAndroid Build Coastguard Worker 		if (try_config(data, fb_flags | FB_COMPRESSED, &ref_crc) &&
275*d83cc019SAndroid Build Coastguard Worker 		    try_config(data, fb_flags, &crc)) {
276*d83cc019SAndroid Build Coastguard Worker 			igt_assert_crc_equal(&crc, &ref_crc);
277*d83cc019SAndroid Build Coastguard Worker 			valid_tests++;
278*d83cc019SAndroid Build Coastguard Worker 		}
279*d83cc019SAndroid Build Coastguard Worker 
280*d83cc019SAndroid Build Coastguard Worker 		igt_pipe_crc_free(data->pipe_crc);
281*d83cc019SAndroid Build Coastguard Worker 		data->pipe_crc = NULL;
282*d83cc019SAndroid Build Coastguard Worker 	}
283*d83cc019SAndroid Build Coastguard Worker 
284*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_BAD_PIXEL_FORMAT ||
285*d83cc019SAndroid Build Coastguard Worker 	    data->flags & TEST_BAD_ROTATION_90 ||
286*d83cc019SAndroid Build Coastguard Worker 	    data->flags & TEST_NO_AUX_BUFFER ||
287*d83cc019SAndroid Build Coastguard Worker 	    data->flags & TEST_BAD_CCS_HANDLE) {
288*d83cc019SAndroid Build Coastguard Worker 		valid_tests += try_config(data, fb_flags | FB_COMPRESSED, NULL);
289*d83cc019SAndroid Build Coastguard Worker 	}
290*d83cc019SAndroid Build Coastguard Worker 
291*d83cc019SAndroid Build Coastguard Worker 	if (data->flags & TEST_BAD_AUX_STRIDE) {
292*d83cc019SAndroid Build Coastguard Worker 		valid_tests += try_config(data, fb_flags | FB_COMPRESSED | FB_MISALIGN_AUX_STRIDE , NULL);
293*d83cc019SAndroid Build Coastguard Worker 		valid_tests += try_config(data, fb_flags | FB_COMPRESSED | FB_SMALL_AUX_STRIDE , NULL);
294*d83cc019SAndroid Build Coastguard Worker 		valid_tests += try_config(data, fb_flags | FB_COMPRESSED | FB_ZERO_AUX_STRIDE , NULL);
295*d83cc019SAndroid Build Coastguard Worker 	}
296*d83cc019SAndroid Build Coastguard Worker 
297*d83cc019SAndroid Build Coastguard Worker 	return valid_tests;
298*d83cc019SAndroid Build Coastguard Worker }
299*d83cc019SAndroid Build Coastguard Worker 
__test_output(data_t * data)300*d83cc019SAndroid Build Coastguard Worker static int __test_output(data_t *data)
301*d83cc019SAndroid Build Coastguard Worker {
302*d83cc019SAndroid Build Coastguard Worker 	igt_display_t *display = &data->display;
303*d83cc019SAndroid Build Coastguard Worker 	int i, valid_tests = 0;
304*d83cc019SAndroid Build Coastguard Worker 
305*d83cc019SAndroid Build Coastguard Worker 	data->output = igt_get_single_output_for_pipe(display, data->pipe);
306*d83cc019SAndroid Build Coastguard Worker 	igt_require(data->output);
307*d83cc019SAndroid Build Coastguard Worker 
308*d83cc019SAndroid Build Coastguard Worker 	igt_output_set_pipe(data->output, data->pipe);
309*d83cc019SAndroid Build Coastguard Worker 
310*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(ccs_modifiers); i++) {
311*d83cc019SAndroid Build Coastguard Worker 		data->ccs_modifier = ccs_modifiers[i];
312*d83cc019SAndroid Build Coastguard Worker 		valid_tests += test_ccs(data);
313*d83cc019SAndroid Build Coastguard Worker 	}
314*d83cc019SAndroid Build Coastguard Worker 
315*d83cc019SAndroid Build Coastguard Worker 	igt_output_set_pipe(data->output, PIPE_NONE);
316*d83cc019SAndroid Build Coastguard Worker 	igt_display_commit2(display, display->is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
317*d83cc019SAndroid Build Coastguard Worker 
318*d83cc019SAndroid Build Coastguard Worker 	return valid_tests;
319*d83cc019SAndroid Build Coastguard Worker }
320*d83cc019SAndroid Build Coastguard Worker 
test_output(data_t * data)321*d83cc019SAndroid Build Coastguard Worker static void test_output(data_t *data)
322*d83cc019SAndroid Build Coastguard Worker {
323*d83cc019SAndroid Build Coastguard Worker 	int valid_tests = __test_output(data);
324*d83cc019SAndroid Build Coastguard Worker 	igt_require_f(valid_tests > 0, "CCS not supported, skipping\n");
325*d83cc019SAndroid Build Coastguard Worker }
326*d83cc019SAndroid Build Coastguard Worker 
327*d83cc019SAndroid Build Coastguard Worker static data_t data;
328*d83cc019SAndroid Build Coastguard Worker 
329*d83cc019SAndroid Build Coastguard Worker igt_main
330*d83cc019SAndroid Build Coastguard Worker {
331*d83cc019SAndroid Build Coastguard Worker 	enum pipe pipe;
332*d83cc019SAndroid Build Coastguard Worker 
333*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
334*d83cc019SAndroid Build Coastguard Worker 		data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
335*d83cc019SAndroid Build Coastguard Worker 
336*d83cc019SAndroid Build Coastguard Worker 		igt_require(intel_gen(intel_get_drm_devid(data.drm_fd)) >= 9);
337*d83cc019SAndroid Build Coastguard Worker 		kmstest_set_vt_graphics_mode();
338*d83cc019SAndroid Build Coastguard Worker 		igt_require_pipe_crc(data.drm_fd);
339*d83cc019SAndroid Build Coastguard Worker 
340*d83cc019SAndroid Build Coastguard Worker 		igt_display_require(&data.display, data.drm_fd);
341*d83cc019SAndroid Build Coastguard Worker 	}
342*d83cc019SAndroid Build Coastguard Worker 
for_each_pipe_static(pipe)343*d83cc019SAndroid Build Coastguard Worker 	for_each_pipe_static(pipe) {
344*d83cc019SAndroid Build Coastguard Worker 		const char *pipe_name = kmstest_pipe_name(pipe);
345*d83cc019SAndroid Build Coastguard Worker 
346*d83cc019SAndroid Build Coastguard Worker 		data.pipe = pipe;
347*d83cc019SAndroid Build Coastguard Worker 
348*d83cc019SAndroid Build Coastguard Worker 		data.flags = TEST_BAD_PIXEL_FORMAT;
349*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("pipe-%s-bad-pixel-format", pipe_name)
350*d83cc019SAndroid Build Coastguard Worker 			test_output(&data);
351*d83cc019SAndroid Build Coastguard Worker 
352*d83cc019SAndroid Build Coastguard Worker 		data.flags = TEST_BAD_ROTATION_90;
353*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("pipe-%s-bad-rotation-90", pipe_name)
354*d83cc019SAndroid Build Coastguard Worker 			test_output(&data);
355*d83cc019SAndroid Build Coastguard Worker 
356*d83cc019SAndroid Build Coastguard Worker 		data.flags = TEST_CRC;
357*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("pipe-%s-crc-primary-basic", pipe_name)
358*d83cc019SAndroid Build Coastguard Worker 			test_output(&data);
359*d83cc019SAndroid Build Coastguard Worker 
360*d83cc019SAndroid Build Coastguard Worker 		data.flags = TEST_CRC | TEST_ROTATE_180;
361*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("pipe-%s-crc-primary-rotation-180", pipe_name)
362*d83cc019SAndroid Build Coastguard Worker 			test_output(&data);
363*d83cc019SAndroid Build Coastguard Worker 
364*d83cc019SAndroid Build Coastguard Worker 		data.flags = TEST_CRC;
365*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("pipe-%s-crc-sprite-planes-basic", pipe_name) {
366*d83cc019SAndroid Build Coastguard Worker 			int valid_tests = 0;
367*d83cc019SAndroid Build Coastguard Worker 
368*d83cc019SAndroid Build Coastguard Worker 			igt_display_require_output_on_pipe(&data.display, data.pipe);
369*d83cc019SAndroid Build Coastguard Worker 
370*d83cc019SAndroid Build Coastguard Worker 			for_each_plane_on_pipe(&data.display, data.pipe, data.plane) {
371*d83cc019SAndroid Build Coastguard Worker 				if (data.plane->type == DRM_PLANE_TYPE_PRIMARY)
372*d83cc019SAndroid Build Coastguard Worker 					continue;
373*d83cc019SAndroid Build Coastguard Worker 				valid_tests += __test_output(&data);
374*d83cc019SAndroid Build Coastguard Worker 			}
375*d83cc019SAndroid Build Coastguard Worker 
376*d83cc019SAndroid Build Coastguard Worker 			igt_require_f(valid_tests > 0,
377*d83cc019SAndroid Build Coastguard Worker 				      "CCS not supported, skipping\n");
378*d83cc019SAndroid Build Coastguard Worker 		}
379*d83cc019SAndroid Build Coastguard Worker 
380*d83cc019SAndroid Build Coastguard Worker 		data.plane = NULL;
381*d83cc019SAndroid Build Coastguard Worker 
382*d83cc019SAndroid Build Coastguard Worker 		data.flags = TEST_NO_AUX_BUFFER;
383*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("pipe-%s-missing-ccs-buffer", pipe_name)
384*d83cc019SAndroid Build Coastguard Worker 			test_output(&data);
385*d83cc019SAndroid Build Coastguard Worker 
386*d83cc019SAndroid Build Coastguard Worker 		data.flags = TEST_BAD_CCS_HANDLE;
387*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("pipe-%s-ccs-on-another-bo", pipe_name)
388*d83cc019SAndroid Build Coastguard Worker 			test_output(&data);
389*d83cc019SAndroid Build Coastguard Worker 
390*d83cc019SAndroid Build Coastguard Worker 		data.flags = TEST_BAD_AUX_STRIDE;
391*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("pipe-%s-bad-aux-stride", pipe_name)
392*d83cc019SAndroid Build Coastguard Worker 			test_output(&data);
393*d83cc019SAndroid Build Coastguard Worker 	}
394*d83cc019SAndroid Build Coastguard Worker 
395*d83cc019SAndroid Build Coastguard Worker 	igt_fixture
396*d83cc019SAndroid Build Coastguard Worker 		igt_display_fini(&data.display);
397*d83cc019SAndroid Build Coastguard Worker }
398