* [PATCH i-g-t v2 0/4] New rotation test
@ 2024-03-13 17:09 Louis Chauvet
2024-03-13 17:09 ` [PATCH i-g-t v2 1/4] lib/igt_kms: Add reflection name and mask Louis Chauvet
` (7 more replies)
0 siblings, 8 replies; 17+ messages in thread
From: Louis Chauvet @ 2024-03-13 17:09 UTC (permalink / raw)
To: igt-dev
Cc: miquel.raynal, jeremie.dautheribes, thomas.petazzoni,
arthurgrillo, Louis Chauvet
The actual kms_rotation_crc test does not test all the rotation with all
the formats. Create the test kms_rotation, which only test "full plane
rotation", but for all the formats, plane and rotations configuration.
This new test allows to detect issues in [1], where the YUV rotation is
faulty for reflect_x and reflect_y cases.
[1]: https://lore.kernel.org/dri-devel/20240304-yuv-v4-11-76beac8e9793@bootlin.com/
To: igt-dev@lists.freedesktop.org
Cc: miquel.raynal@bootlin.com
Cc: jeremie.dautheribes@bootlin.com
Cc: thomas.petazzoni@bootlin.com
Cc: arthurgrillo@riseup.net
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
Changes in v2:
- Fix a typo in documentation
- Fix a bug when using subsampling with non compatible sizes
- Fix a bug I found when using different color count.
- Add cli options to set specific plane size
- Link to v1: https://lore.kernel.org/r/20240312-new_rotation-v1-0-ed9fe82589df@bootlin.com
---
Louis Chauvet (4):
lib/igt_kms: Add reflection name and mask
lib/igt_fb: Expose lookup_drm_format to access format properties in tests
tests/kms_rotation: Add extensive rotation test
tests/kms_rotation: Add command line option to reduce the number of tests
lib/igt_fb.c | 15 +-
lib/igt_fb.h | 29 +++
lib/igt_kms.c | 23 +++
lib/igt_kms.h | 3 +
tests/kms_rotation.c | 550 +++++++++++++++++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
6 files changed, 608 insertions(+), 13 deletions(-)
---
base-commit: a44ebfe43edc96acab22a19b6a8850eef9202eea
change-id: 20240312-new_rotation-c034a68b3b9d
Best regards,
--
Louis Chauvet <louis.chauvet@bootlin.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH i-g-t v2 1/4] lib/igt_kms: Add reflection name and mask
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
@ 2024-03-13 17:09 ` Louis Chauvet
2024-03-13 20:00 ` Arthur Grillo
2024-03-13 17:09 ` [PATCH i-g-t v2 2/4] lib/igt_fb: Expose lookup_drm_format to access format properties in tests Louis Chauvet
` (6 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Louis Chauvet @ 2024-03-13 17:09 UTC (permalink / raw)
To: igt-dev
Cc: miquel.raynal, jeremie.dautheribes, thomas.petazzoni,
arthurgrillo, Louis Chauvet
As for IGT_ROTATION_MASK and igt_plane_rotation_name, create the mask
IGT_REFLECT_MASK and the function igt_plane_reflect_name.
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
lib/igt_kms.c | 23 +++++++++++++++++++++++
lib/igt_kms.h | 3 +++
2 files changed, 26 insertions(+)
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index e18f6fe59882..85d278f3cae3 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -5142,6 +5142,29 @@ const char *igt_plane_rotation_name(igt_rotation_t rotation)
}
}
+
+/**
+ * igt_plane_reflect_name:
+ * @reflect: Plane reflection value (x, y)
+ *
+ * Returns: Plane reflection value as a string
+ */
+const char *igt_plane_reflect_name(igt_rotation_t reflect)
+{
+ switch (reflect & IGT_REFLECT_MASK) {
+ case 0:
+ return "none";
+ case IGT_REFLECT_X:
+ return "X";
+ case IGT_REFLECT_Y:
+ return "Y";
+ case IGT_REFLECT_X | IGT_REFLECT_Y:
+ return "XY";
+ default:
+ igt_assert(0);
+ }
+}
+
/**
* igt_plane_set_rotation:
* @plane: Plane pointer for which rotation is to be set
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index b3882808b42f..4760394428f3 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -371,6 +371,8 @@ typedef enum {
#define IGT_ROTATION_MASK \
(IGT_ROTATION_0 | IGT_ROTATION_90 | IGT_ROTATION_180 | IGT_ROTATION_270)
+#define IGT_REFLECT_MASK \
+ (IGT_REFLECT_X | IGT_REFLECT_Y)
/**
* igt_rotation_90_or_270:
@@ -562,6 +564,7 @@ static inline bool igt_plane_has_rotation(igt_plane_t *plane, igt_rotation_t rot
return (plane->rotations & rotation) == rotation;
}
const char *igt_plane_rotation_name(igt_rotation_t rotation);
+const char *igt_plane_reflect_name(igt_rotation_t reflect);
void igt_wait_for_vblank(int drm_fd, int crtc_offset);
void igt_wait_for_vblank_count(int drm_fd, int crtc_offset, int count);
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH i-g-t v2 2/4] lib/igt_fb: Expose lookup_drm_format to access format properties in tests
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
2024-03-13 17:09 ` [PATCH i-g-t v2 1/4] lib/igt_kms: Add reflection name and mask Louis Chauvet
@ 2024-03-13 17:09 ` Louis Chauvet
2024-03-13 17:09 ` [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test Louis Chauvet
` (5 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Louis Chauvet @ 2024-03-13 17:09 UTC (permalink / raw)
To: igt-dev
Cc: miquel.raynal, jeremie.dautheribes, thomas.petazzoni,
arthurgrillo, Louis Chauvet
Members of this struct are useful to configure tests when formats are discovered at runtime.
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
lib/igt_fb.c | 15 ++-------------
lib/igt_fb.h | 29 +++++++++++++++++++++++++++++
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index cc70cb91cef9..6cd299374d31 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -103,18 +103,7 @@
#endif
/* drm fourcc/cairo format maps */
-static const struct format_desc_struct {
- const char *name;
- uint32_t drm_id;
- cairo_format_t cairo_id;
- pixman_format_code_t pixman_id;
- int depth;
- int num_planes;
- int plane_bpp[4];
- uint8_t hsub;
- uint8_t vsub;
- bool convert;
-} format_desc[] = {
+static const struct format_desc_struct format_desc[] = {
{ .name = "ARGB1555", .depth = -1, .drm_id = DRM_FORMAT_ARGB1555,
.cairo_id = CAIRO_FORMAT_ARGB32, .convert = true,
.pixman_id = PIXMAN_a1r5g5b5,
@@ -371,7 +360,7 @@ static const struct format_desc_struct {
#define for_each_format(f) \
for (f = format_desc; f - format_desc < ARRAY_SIZE(format_desc); f++)
-static const struct format_desc_struct *lookup_drm_format(uint32_t drm_format)
+const struct format_desc_struct *lookup_drm_format(uint32_t drm_format)
{
const struct format_desc_struct *format;
diff --git a/lib/igt_fb.h b/lib/igt_fb.h
index 834aaef54dea..28c18b355d94 100644
--- a/lib/igt_fb.h
+++ b/lib/igt_fb.h
@@ -30,6 +30,7 @@
#define __IGT_FB_H__
#include <cairo.h>
+#include <pixman.h>
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
@@ -123,6 +124,32 @@ enum igt_text_align {
align_hcenter = 0x08,
};
+/**
+ * struct format_desc_struct - Description of a format in igt
+ *
+ * @name: Name of a format, used for lookup and printing
+ * @drm_id: Id of this format in DRM.
+ * @cairo_id: Id of the format used by IGT for software rendering. It can be different from @drm_id, the colors will be converted when writing to the DRM framebuffer.
+ * @pixman_id: When set, the conversion from @cairo_id to @drm_id will be done with pixman and this format. It should correspond to @drm_id.
+ * @depth: Number of bits used to represent a pixel
+ * @num_planes: Number of planes in this format
+ * @plane_bpp: Number of bit per pixels, per plane
+ * @hsub, @vsub: Subsampling of this format
+ * @convert: When set, the format must be converted using either pixman or a custom conversion function before writing to the DRM framebuffer.
+ */
+struct format_desc_struct {
+ const char *name;
+ uint32_t drm_id;
+ cairo_format_t cairo_id;
+ pixman_format_code_t pixman_id;
+ int depth;
+ int num_planes;
+ int plane_bpp[4];
+ uint8_t hsub;
+ uint8_t vsub;
+ bool convert;
+};
+
void igt_get_fb_tile_size(int fd, uint64_t modifier, int fb_bpp,
unsigned *width_ret, unsigned *height_ret);
void igt_calc_fb_size(int fd, int width, int height, uint32_t format, uint64_t modifier,
@@ -215,6 +242,8 @@ const char *igt_format_str(uint32_t drm_format);
bool igt_fb_supported_format(uint32_t drm_format);
bool igt_format_is_yuv(uint32_t drm_format);
bool igt_format_is_yuv_semiplanar(uint32_t format);
+const struct format_desc_struct *lookup_drm_format(uint32_t drm_format);
+
uint32_t igt_drm_format_str_to_format(const char *drm_format);
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
2024-03-13 17:09 ` [PATCH i-g-t v2 1/4] lib/igt_kms: Add reflection name and mask Louis Chauvet
2024-03-13 17:09 ` [PATCH i-g-t v2 2/4] lib/igt_fb: Expose lookup_drm_format to access format properties in tests Louis Chauvet
@ 2024-03-13 17:09 ` Louis Chauvet
2024-03-14 17:06 ` Kamil Konieczny
` (2 more replies)
2024-03-13 17:09 ` [PATCH i-g-t v2 4/4] tests/kms_rotation: Add command line option to reduce the number of tests Louis Chauvet
` (4 subsequent siblings)
7 siblings, 3 replies; 17+ messages in thread
From: Louis Chauvet @ 2024-03-13 17:09 UTC (permalink / raw)
To: igt-dev
Cc: miquel.raynal, jeremie.dautheribes, thomas.petazzoni,
arthurgrillo, Louis Chauvet
The actual kms_rotation_crc test does not tes all the rotation with all
the formats. Create the test kms_rotation, which only test "full plane
rotation", but for all formats, planes and rotations.
This allow the detection of issues like in [1], where the YUV rotation is
not working for specific rotations.
[1]: https://lore.kernel.org/dri-devel/20240304-yuv-v4-11-76beac8e9793@bootlin.com/
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
tests/kms_rotation.c | 444 +++++++++++++++++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
2 files changed, 445 insertions(+)
diff --git a/tests/kms_rotation.c b/tests/kms_rotation.c
new file mode 100644
index 000000000000..333485619541
--- /dev/null
+++ b/tests/kms_rotation.c
@@ -0,0 +1,444 @@
+#include "igt.h"
+
+/**
+ * TEST: kms_rotation
+ * Category: Display
+ * Description: Tests all rotations for all planes and formats.
+ * Driver requirement: none
+ * Functionality: plane, rotation
+ * Mega feature: General Display Features
+ * Test category: functionality test
+ */
+
+/**
+ * SUBTEST: rotations
+ * Description: Test for all rotations, planes and formats.
+ */
+
+/**
+ * struct data_t - Stores the test configuration
+ *
+ * @fd: file descriptor for the current drm device
+ * @display: display used for the tests
+ * @width, @height: Size of the CRTC used for this test
+ */
+struct data_t {
+ int fd;
+ igt_display_t display;
+ uint32_t width;
+ uint32_t height;
+};
+
+/**
+ * colors - List of colors used to put things on the plane
+ *
+ * Those colors are used to create a color pattern on the plane, which is not invariant by rotation or reflexion.
+ *
+ * At least black and white must be in this list to properly test black and white formats.
+ */
+static const struct igt_vec4 colors[] = {
+ {{1.0f, 0.0f, 0.0f, 0.0f}},
+ {{1.0f, 1.0f, 1.0f, 0.0f}},
+ {{0.0f, 0.0f, 0.0f, 0.0f}},
+ {{0.0f, 1.0f, 1.0f, 0.0f}},
+ {{0.0f, 0.0f, 0.0f, 0.0f}},
+};
+
+/**
+ * tested_rotation - List of all tested rotation configuration
+ */
+static uint32_t tested_rotation[] = {
+ IGT_ROTATION_0,
+ IGT_ROTATION_0 | IGT_REFLECT_X,
+ IGT_ROTATION_0 | IGT_REFLECT_Y,
+ IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y,
+ IGT_ROTATION_90,
+ IGT_ROTATION_90 | IGT_REFLECT_X,
+ IGT_ROTATION_90 | IGT_REFLECT_Y,
+ IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y,
+ IGT_ROTATION_180,
+ IGT_ROTATION_180 | IGT_REFLECT_X,
+ IGT_ROTATION_180 | IGT_REFLECT_Y,
+ IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y,
+ IGT_ROTATION_270,
+ IGT_ROTATION_270 | IGT_REFLECT_X,
+ IGT_ROTATION_270 | IGT_REFLECT_Y,
+ IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y,
+};
+
+/**
+ * non_equals_crc() - Check if at least one CRC is different
+ *
+ * Check if at least one CRC is different, so we can verify that the rendering is working.
+ *
+ * @crcs: List of all tested crcs
+ * @crc_count: Number of crcs in the list
+ */
+static bool non_equals_crc(igt_crc_t crcs[], int crc_count)
+{
+ if (!crc_count) {
+ return true;
+ }
+ for (int i = 0; i < crc_count; i++)
+ if (!igt_check_crc_equal(&crcs[i], &crcs[0]))
+ return true;
+ return false;
+}
+
+/**
+ * create_fb() - Create a framebuffer
+ *
+ * This create a framebuffer and fill it with a pattern. This pattern is not invariant by rotation and reflection.
+ *
+ * The @width and @height parameters are automaticaly inverted according to @rotation if needed. If the requested plane
+ * is 1024*768 with IGT_ROTATION_90, the returned plane will have the size 768*1024.
+ *
+ * @data: Current test configuration
+ * @rotation: Rotation to apply to the pattern
+ * @format: Format of the requested plane
+ * @modifier: Modifier for the requested plane
+ * @width, @height: Size of the plane to use (without rotation)
+ * @width: Width of the requested plane
+ * @height: Height of the requested plane
+ * @fb: Place to store the created framebuffer
+ */
+static void create_fb(struct data_t *data, igt_rotation_t rotation, uint32_t format, uint64_t modifier, int width,
+ int height, igt_fb_t *fb)
+{
+ int step_x, step_y, color_index, current_n, current_m;
+ int offset_x, offset_y;
+ cairo_t *cr;
+
+ switch (rotation & IGT_ROTATION_MASK) {
+ case IGT_ROTATION_90:
+ case IGT_ROTATION_270:
+ igt_swap(width, height);
+ break;
+ case IGT_ROTATION_0:
+ case IGT_ROTATION_180:
+ default:
+ break;
+ }
+
+ igt_create_fb(data->fd, width, height, format, modifier, fb);
+ cr = igt_get_cairo_ctx(data->fd, fb);
+
+ step_x = (width) / ARRAY_SIZE(colors);
+ step_y = (height) / ARRAY_SIZE(colors);
+
+ /*
+ * This pair of offset is used to ensure that a software rotated plane is the same as a hardware rotated plane.
+ */
+ switch ((int)rotation) {
+ case IGT_ROTATION_0:
+ case IGT_ROTATION_0 | IGT_REFLECT_Y:
+ case IGT_ROTATION_90:
+ case IGT_ROTATION_90 | IGT_REFLECT_X:
+ case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
+ case IGT_ROTATION_180 | IGT_REFLECT_X:
+ case IGT_ROTATION_270 | IGT_REFLECT_Y:
+ case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
+ offset_x = 0;
+ break;
+ case IGT_ROTATION_0 | IGT_REFLECT_X:
+ case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
+ case IGT_ROTATION_90 | IGT_REFLECT_Y:
+ case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
+ case IGT_ROTATION_180:
+ case IGT_ROTATION_180 | IGT_REFLECT_Y:
+ case IGT_ROTATION_270:
+ case IGT_ROTATION_270 | IGT_REFLECT_X:
+ offset_x = width % step_x;
+ break;
+ }
+ switch ((int)rotation) {
+ case IGT_ROTATION_0:
+ case IGT_ROTATION_0 | IGT_REFLECT_X:
+ case IGT_ROTATION_90 | IGT_REFLECT_X:
+ case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
+ case IGT_ROTATION_180 | IGT_REFLECT_Y:
+ case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
+ case IGT_ROTATION_270:
+ case IGT_ROTATION_270 | IGT_REFLECT_Y:
+ offset_y = 0;
+ break;
+ case IGT_ROTATION_0 | IGT_REFLECT_Y:
+ case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
+ case IGT_ROTATION_90:
+ case IGT_ROTATION_90 | IGT_REFLECT_Y:
+ case IGT_ROTATION_180:
+ case IGT_ROTATION_180 | IGT_REFLECT_X:
+ case IGT_ROTATION_270 | IGT_REFLECT_X:
+ case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
+ offset_y = height % step_y;
+ break;
+ }
+
+ /* Iterate over all colors in x and y direction. The pattern is a colored chessboard */
+ for (int n = 0; n < ARRAY_SIZE(colors); n++) {
+ for (int m = 0; m < ARRAY_SIZE(colors); m++) {
+ color_index = (n + m) % ARRAY_SIZE(colors);
+ current_n = n;
+ current_m = m;
+
+ /*
+ * If a reflexion and a rotation is requested, apply this to the pattern rendering
+ * If a reflexion is given, it must be applied before the rotation.
+ */
+ switch (rotation & IGT_REFLECT_MASK) {
+ case IGT_REFLECT_X:
+ current_n = ARRAY_SIZE(colors) - 1 - current_n;
+ break;
+ case IGT_REFLECT_Y:
+ current_m = ARRAY_SIZE(colors) - 1 - current_m;
+ break;
+ case IGT_REFLECT_X | IGT_REFLECT_Y:
+ current_n = ARRAY_SIZE(colors) - 1 - current_n;
+ current_m = ARRAY_SIZE(colors) - 1 - current_m;
+ break;
+ }
+ switch (rotation & IGT_ROTATION_MASK) {
+ case IGT_ROTATION_0:
+ break;
+ case IGT_ROTATION_90:
+ igt_swap(current_n, current_m);
+ current_m = ARRAY_SIZE(colors) - 1 - current_m;
+ break;
+ case IGT_ROTATION_180:
+ current_n = ARRAY_SIZE(colors) - 1 - current_n;
+ current_m = ARRAY_SIZE(colors) - 1 - current_m;
+ break;
+ case IGT_ROTATION_270:
+ igt_swap(current_n, current_m);
+ current_n = ARRAY_SIZE(colors) - 1 - current_n;
+ break;
+ }
+
+ igt_paint_color(cr,
+ offset_x + current_n * step_x,
+ offset_y + current_m * step_y,
+ step_x,
+ step_y,
+ colors[color_index].d[0],
+ colors[color_index].d[1],
+ colors[color_index].d[2]);
+ }
+ }
+
+ igt_put_cairo_ctx(cr);
+}
+
+/**
+ * get_ref_crcs() - Compute the reference CRC for a specific format
+ *
+ * The rotation are done by create_fb in software.
+ *
+ * @data: Test configuration
+ * @output, @pipe, @plane: Plane to use for the test
+ * @width, @height: Size of the plane to use (without rotation)
+ * @format, @modifier: Format description to test
+ * @ref_crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
+ */
+static void get_ref_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
+ int height, uint32_t format, uint64_t modifier, igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)])
+{
+ drmModeModeInfo *mode;
+ igt_pipe_crc_t *pipe_crc;
+ igt_fb_t fb;
+
+ igt_display_reset(&data->display);
+ igt_output_set_pipe(output, pipe);
+
+
+ for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
+ int rotation = tested_rotation[r];
+ igt_debug("Computing reference CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
+ igt_plane_reflect_name(rotation));
+ /* Configure the pipe for reference frame */
+ igt_display_reset(&data->display);
+
+ mode = igt_output_get_mode(output);
+ mode->hdisplay = width;
+ mode->vdisplay = height;
+ igt_output_override_mode(output, mode);
+ mode = igt_output_get_mode(output);
+
+ igt_output_set_pipe(output, pipe);
+ igt_plane_set_rotation(plane, IGT_ROTATION_0);
+ igt_display_commit2(&data->display, COMMIT_ATOMIC);
+
+ /* Start the CRC */
+ pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
+ igt_pipe_crc_start(pipe_crc);
+
+ create_fb(data, rotation, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
+ igt_plane_set_fb(plane, &fb);
+ igt_display_commit2(&data->display, COMMIT_ATOMIC);
+
+ igt_pipe_crc_get_current(
+ data->display.drm_fd, pipe_crc,
+ &ref_crc[r]);
+
+ igt_pipe_crc_stop(pipe_crc);
+ igt_pipe_crc_free(pipe_crc);
+ igt_remove_fb(data->fd, &fb);
+ }
+}
+
+/**
+ * get_crcs() - Compute the CRC for a specific format
+ *
+ * @data: Test configuration
+ * @output, @pipe, @plane: Plane to use for the test
+ * @width, @height: Size of the plane to use (without rotation)
+ * @format, @modifier: Format description to test
+ * @crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
+ */
+static void get_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
+ int height, uint32_t format, uint64_t modifier, igt_crc_t crc[ARRAY_SIZE(tested_rotation)])
+{
+ drmModeModeInfo *mode;
+ igt_pipe_crc_t *pipe_crc;
+ igt_fb_t fb;
+
+ igt_display_reset(&data->display);
+ igt_output_set_pipe(output, pipe);
+
+ for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
+ int rotation = tested_rotation[r];
+ igt_debug("Computing CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
+ igt_plane_reflect_name(rotation));
+ /* Configure the pipe for reference frame */
+ igt_display_reset(&data->display);
+
+ mode = igt_output_get_mode(output);
+ mode->hdisplay = width;
+ mode->vdisplay = height;
+ igt_output_override_mode(output, mode);
+ mode = igt_output_get_mode(output);
+
+ igt_output_set_pipe(output, pipe);
+ igt_plane_set_rotation(plane, rotation);
+
+ if (!igt_plane_has_rotation(plane, rotation))
+ continue;
+
+ igt_display_commit2(&data->display, COMMIT_ATOMIC);
+
+ /* Start the CRC */
+ pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
+ igt_pipe_crc_start(pipe_crc);
+
+ create_fb(data, IGT_ROTATION_0, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
+ igt_plane_set_fb(plane, &fb);
+ if (igt_rotation_90_or_270(rotation))
+ igt_plane_set_size(plane, fb.height, fb.width);
+ igt_display_commit2(&data->display, COMMIT_ATOMIC);
+
+ igt_pipe_crc_get_current(
+ data->display.drm_fd, pipe_crc,
+ &crc[r]);
+
+ igt_pipe_crc_stop(pipe_crc);
+ igt_pipe_crc_free(pipe_crc);
+ igt_remove_fb(data->fd, &fb);
+ }
+}
+
+/**
+ * run_test() - Run the subtests for a specific plane
+ *
+ * @data: Test configuration
+ * @output, @pipe, @plane: Plane to use for the test
+ * @format, @modifier: Format description to test
+ */
+static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, uint32_t format,
+ uint64_t modifier)
+{
+ int width, height;
+ const struct format_desc_struct *format_description;
+ igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)];
+ igt_crc_t crc[ARRAY_SIZE(tested_rotation)];
+
+ igt_display_reset(&data->display);
+ igt_output_set_pipe(output, pipe);
+ /* Check that the rotation is supported */
+ igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
+ format_description = lookup_drm_format(format);
+ width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
+ height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
+
+ /* Generate reference CRC with software rotation */
+ get_ref_crcs(data, output, pipe, plane, width, height, format, modifier, ref_crc);
+ igt_assert_f(non_equals_crc(ref_crc, ARRAY_SIZE(tested_rotation)), "All the reference CRC are equals.");
+
+ /* Generate CRC with hardware rotation */
+ get_crcs(data, output, pipe, plane, width, height, format, modifier, crc);
+
+ for (int c = 0; c < ARRAY_SIZE(tested_rotation); c++) {
+ int rotation = tested_rotation[c];
+ igt_dynamic_f("pipe-%s-format-%s-modifier-%s-rotation-%s-reflect-%s", kmstest_pipe_name(pipe),
+ igt_format_str(format),
+ igt_fb_modifier_name(modifier), igt_plane_rotation_name(rotation),
+ igt_plane_reflect_name(rotation)) {
+ igt_assert_crc_equal(&ref_crc[c], &crc[c]);
+ }
+ }
+}
+
+/**
+ * test_all_formats() - Run all the tests for all planes
+ *
+ * @data: Test configuration
+ */
+static void test_all_formats(struct data_t *data)
+{
+ enum pipe pipe;
+ struct igt_plane *plane;
+ igt_output_t *output;
+ for_each_pipe_with_single_output(&data->display, pipe, output) {
+ for_each_plane_on_pipe(&data->display, pipe, plane) {
+ for (int f = 0; f < plane->format_mod_count; f++) {
+ uint32_t format = plane->formats[f];
+ uint32_t modifier = plane->modifiers[f];
+
+ if (!igt_fb_supported_format(format))
+ continue;
+ run_test(data, output, pipe, plane, format, modifier);
+ }
+ }
+ }
+}
+
+static int opt_handler(int opt, int opt_index, void *void_data)
+{
+ return IGT_OPT_HANDLER_SUCCESS;
+}
+
+static const struct option long_opts[] = {
+ {}
+};
+
+static const char help_str[] = "";
+
+static struct data_t global_data;
+
+igt_main_args("", long_opts, help_str, opt_handler, &global_data)
+{
+ igt_fixture {
+ global_data.fd = drm_open_driver_master(DRIVER_ANY);
+
+ kmstest_set_vt_graphics_mode();
+
+ igt_display_require(&global_data.display, global_data.fd);
+ igt_require(global_data.display.is_atomic);
+ igt_display_require_output(&global_data.display);
+ igt_display_reset(&global_data.display);
+ }
+
+ igt_describe("Testing different rotation and reflexions for different formats");
+ igt_subtest_with_dynamic_f("rotations") {
+ test_all_formats(&global_data);
+ }
+
+}
\ No newline at end of file
diff --git a/tests/meson.build b/tests/meson.build
index a856510fcea7..71b628b86e96 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -82,6 +82,7 @@ test_progs = [
'tools_test',
'vgem_basic',
'vgem_slow',
+ 'kms_rotation',
]
intel_i915_xe_progs = [
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH i-g-t v2 4/4] tests/kms_rotation: Add command line option to reduce the number of tests
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
` (2 preceding siblings ...)
2024-03-13 17:09 ` [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test Louis Chauvet
@ 2024-03-13 17:09 ` Louis Chauvet
2024-03-13 17:49 ` ✓ CI.xeBAT: success for New rotation test (rev2) Patchwork
` (3 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Louis Chauvet @ 2024-03-13 17:09 UTC (permalink / raw)
To: igt-dev
Cc: miquel.raynal, jeremie.dautheribes, thomas.petazzoni,
arthurgrillo, Louis Chauvet
As it is often needed to reduce the number of tests (for example during
development), add few command line options to reduce the number of
subtests.
Also add command line option to set a specific plane size.
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
tests/kms_rotation.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 111 insertions(+), 5 deletions(-)
diff --git a/tests/kms_rotation.c b/tests/kms_rotation.c
index 333485619541..4d168f66abef 100644
--- a/tests/kms_rotation.c
+++ b/tests/kms_rotation.c
@@ -21,12 +21,19 @@
* @fd: file descriptor for the current drm device
* @display: display used for the tests
* @width, @height: Size of the CRTC used for this test
+ * @format: If not zero, the format to test
+ * @rotation_mask: A mask of IGT_ROTATION_* / IGT_REFLECT_*. This allows running only the subtests where all the values
+ * in this mask are used. So for example:
+ * IGT_ROTATION_0 | IGT_REFLECT_X will run rot_0, rot_0+reflect_x, rot_0+reflect_x+reflect_y
+ * IGT_ROTATION_180 | IGT_ROTATION_90 will not run anything, it's not possible to rotate by 90 and 180 simultaneously
*/
struct data_t {
int fd;
igt_display_t display;
uint32_t width;
uint32_t height;
+ uint32_t format;
+ uint32_t rotation_mask;
};
/**
@@ -66,6 +73,19 @@ static uint32_t tested_rotation[] = {
IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y,
};
+/**
+ * should_skip() - Returns true if a specific rotation must be skipped
+ *
+ * Check if a rotation mus be skipped by comparing it to @data->rotation_mask. See @data->rotation_mask for the expected behavior.
+ *
+ * @data: Test configuration
+ * @rotation: Rotation to check for skipping
+ */
+static bool should_skip(struct data_t *data, uint32_t rotation)
+{
+ return (rotation & data->rotation_mask) != data->rotation_mask;
+}
+
/**
* non_equals_crc() - Check if at least one CRC is different
*
@@ -252,6 +272,8 @@ static void get_ref_crcs(struct data_t *data, igt_output_t *output, enum pipe pi
for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
int rotation = tested_rotation[r];
+ if (should_skip(data, rotation))
+ continue;
igt_debug("Computing reference CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
igt_plane_reflect_name(rotation));
/* Configure the pipe for reference frame */
@@ -306,6 +328,8 @@ static void get_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe,
for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
int rotation = tested_rotation[r];
+ if (should_skip(data, rotation))
+ continue;
igt_debug("Computing CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
igt_plane_reflect_name(rotation));
/* Configure the pipe for reference frame */
@@ -364,9 +388,36 @@ static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe,
igt_output_set_pipe(output, pipe);
/* Check that the rotation is supported */
igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
+
+ /* Get and ensure that the used crtc sizes are compatible with the current format */
format_description = lookup_drm_format(format);
- width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
- height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
+ if (data->width) {
+ width = data->width;
+ if (format_description->hsub > 1 || format_description->vsub > 1)
+ if (width % ARRAY_SIZE(colors) || width % format_description->hsub ||
+ width % format_description->vsub) {
+ igt_warn("The requested width (%d) is not compatible with the format %s.\n"
+ "The test will probably fail because of this.\n"
+ "To avoid issues with subsampling and rotations, the size must be a multiple of %lu, %d and %d\n",
+ width, igt_format_str(format), ARRAY_SIZE(colors), format_description->hsub,
+ format_description->vsub);
+ }
+ } else {
+ width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
+ }
+ if (data->height) {
+ height = data->height;
+ if (format_description->hsub > 1 || format_description->vsub > 1)
+ if (height % format_description->hsub || height % format_description->vsub) {
+ igt_warn("The requested height (%d) is not compatible with the format %s.\n"
+ "The test will probably fail because of this.\n"
+ "To avoid issues with subsampling and rotations, the size must be a multiple of %lu, %d and %d\n",
+ height, igt_format_str(format), ARRAY_SIZE(colors), format_description->hsub,
+ format_description->vsub);
+ }
+ } else {
+ height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
+ }
/* Generate reference CRC with software rotation */
get_ref_crcs(data, output, pipe, plane, width, height, format, modifier, ref_crc);
@@ -377,6 +428,8 @@ static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe,
for (int c = 0; c < ARRAY_SIZE(tested_rotation); c++) {
int rotation = tested_rotation[c];
+ if (should_skip(data, rotation))
+ continue;
igt_dynamic_f("pipe-%s-format-%s-modifier-%s-rotation-%s-reflect-%s", kmstest_pipe_name(pipe),
igt_format_str(format),
igt_fb_modifier_name(modifier), igt_plane_rotation_name(rotation),
@@ -402,6 +455,9 @@ static void test_all_formats(struct data_t *data)
uint32_t format = plane->formats[f];
uint32_t modifier = plane->modifiers[f];
+ if (data->format != 0 && data->format != format)
+ continue;
+
if (!igt_fb_supported_format(format))
continue;
run_test(data, output, pipe, plane, format, modifier);
@@ -412,15 +468,65 @@ static void test_all_formats(struct data_t *data)
static int opt_handler(int opt, int opt_index, void *void_data)
{
- return IGT_OPT_HANDLER_SUCCESS;
+ struct data_t *data = void_data;
+ switch (opt) {
+ case 'f': /* --format */
+ data->format = igt_drm_format_str_to_format(optarg);
+ return IGT_OPT_HANDLER_SUCCESS;
+ case 'x': /* --reflect_x */
+ data->rotation_mask |= IGT_REFLECT_X;
+ return IGT_OPT_HANDLER_SUCCESS;
+ case 'y': /* --reflect_y */
+ data->rotation_mask |= IGT_REFLECT_Y;
+ return IGT_OPT_HANDLER_SUCCESS;
+ case '0': /* --rot_0 */
+ data->rotation_mask |= IGT_ROTATION_0;
+ return IGT_OPT_HANDLER_SUCCESS;
+ case '9': /* --rot_90 */
+ data->rotation_mask |= IGT_ROTATION_90;
+ return IGT_OPT_HANDLER_SUCCESS;
+ case '1': /* --rot_180 */
+ data->rotation_mask |= IGT_ROTATION_180;
+ return IGT_OPT_HANDLER_SUCCESS;
+ case '2': /* --rot_270 */
+ data->rotation_mask |= IGT_ROTATION_270;
+ return IGT_OPT_HANDLER_SUCCESS;
+ case 's': /* --size_x */
+ data->width = strtoul(optarg, NULL, 0);
+ return IGT_OPT_HANDLER_SUCCESS;
+ case 't': /* --size_y */
+ data->height = strtoul(optarg, NULL, 0);
+ return IGT_OPT_HANDLER_SUCCESS;
+ default:
+ return IGT_OPT_HANDLER_ERROR;
+ }
}
static const struct option long_opts[] = {
+ { .name = "format", .has_arg = true, .val = 'f'},
+ { .name = "reflect_x", .has_arg = false, .val = 'x'},
+ { .name = "reflect_y", .has_arg = false, .val = 'y'},
+ { .name = "rot_0", .has_arg = false, .val = '0'},
+ { .name = "rot_90", .has_arg = false, .val = '9'},
+ { .name = "rot_180", .has_arg = false, .val = '1'},
+ { .name = "rot_270", .has_arg = false, .val = '2'},
+ { .name = "size_x", .has_arg = true, .val = 's'},
+ { .name = "size_y", .has_arg = true, .val = 't'},
{}
};
-static const char help_str[] = "";
-
+static const char help_str[] = ""
+ " --format <fmt>\tSet a specific format to test\n"
+ " --size_x <x>\tSet a specific x size for the crtc\n"
+ " --size_y <y>\tSet a specific y size for the crtc\n"
+ "All the following options are used to select a specific rotation to test\n"
+ "For example --reflect_x --rot_0 will test all rotation involving reflect_x AND rot_0\n"
+ " --reflect_x\tOnly test cases where X-reflexion is involved\n"
+ " --reflect_y\tOnly test cases where Y-reflexion is involved\n"
+ " --rot_0\tOnly test cases where a 0° rotation is involved\n"
+ " --rot_90\tOnly test cases where a 90° rotation is involved\n"
+ " --rot_180\tOnly test cases where a 180° rotation is involved\n"
+ " --rot_270\tOnly test cases where a 270° rotation is involved\n";
static struct data_t global_data;
igt_main_args("", long_opts, help_str, opt_handler, &global_data)
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* ✓ CI.xeBAT: success for New rotation test (rev2)
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
` (3 preceding siblings ...)
2024-03-13 17:09 ` [PATCH i-g-t v2 4/4] tests/kms_rotation: Add command line option to reduce the number of tests Louis Chauvet
@ 2024-03-13 17:49 ` Patchwork
2024-03-13 18:05 ` ✓ Fi.CI.BAT: " Patchwork
` (2 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2024-03-13 17:49 UTC (permalink / raw)
To: Louis Chauvet; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 953 bytes --]
== Series Details ==
Series: New rotation test (rev2)
URL : https://patchwork.freedesktop.org/series/131011/
State : success
== Summary ==
CI Bug Log - changes from XEIGT_7759_BAT -> XEIGTPW_10825_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (4 -> 4)
------------------------------
No changes in participating hosts
Changes
-------
No changes found
Build changes
-------------
* IGT: IGT_7759 -> IGTPW_10825
* Linux: xe-932-8762453258673794e13e4d59cb9df1042b97ba01 -> xe-935-72f447f984cf5526e6ad32a6e2770124c67d59d3
IGTPW_10825: 10825
IGT_7759: 7759
xe-932-8762453258673794e13e4d59cb9df1042b97ba01: 8762453258673794e13e4d59cb9df1042b97ba01
xe-935-72f447f984cf5526e6ad32a6e2770124c67d59d3: 72f447f984cf5526e6ad32a6e2770124c67d59d3
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_10825/index.html
[-- Attachment #2: Type: text/html, Size: 1512 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread
* ✓ Fi.CI.BAT: success for New rotation test (rev2)
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
` (4 preceding siblings ...)
2024-03-13 17:49 ` ✓ CI.xeBAT: success for New rotation test (rev2) Patchwork
@ 2024-03-13 18:05 ` Patchwork
2024-03-14 0:31 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-03-18 8:26 ` [PATCH i-g-t v2 0/4] New rotation test Modem, Bhanuprakash
7 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2024-03-13 18:05 UTC (permalink / raw)
To: Louis Chauvet; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 2409 bytes --]
== Series Details ==
Series: New rotation test (rev2)
URL : https://patchwork.freedesktop.org/series/131011/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_14426 -> IGTPW_10825
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/index.html
Participating hosts (35 -> 30)
------------------------------
Additional (1): bat-kbl-2
Missing (6): bat-dg1-7 fi-snb-2520m fi-glk-j4005 bat-adln-1 bat-jsl-1 bat-arls-2
Known issues
------------
Here are the changes found in IGTPW_10825 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@fbdev@info:
- bat-kbl-2: NOTRUN -> [SKIP][1] ([i915#1849])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/bat-kbl-2/igt@fbdev@info.html
* igt@gem_lmem_swapping@parallel-random-engines:
- bat-kbl-2: NOTRUN -> [SKIP][2] +39 other tests skip
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/bat-kbl-2/igt@gem_lmem_swapping@parallel-random-engines.html
* igt@i915_selftest@live@coherency:
- bat-dg2-9: [PASS][3] -> [ABORT][4] ([i915#10366])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/bat-dg2-9/igt@i915_selftest@live@coherency.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/bat-dg2-9/igt@i915_selftest@live@coherency.html
* igt@i915_selftest@live@hangcheck:
- bat-rpls-3: [PASS][5] -> [DMESG-WARN][6] ([i915#5591])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/bat-rpls-3/igt@i915_selftest@live@hangcheck.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/bat-rpls-3/igt@i915_selftest@live@hangcheck.html
[i915#10366]: https://gitlab.freedesktop.org/drm/intel/issues/10366
[i915#1849]: https://gitlab.freedesktop.org/drm/intel/issues/1849
[i915#5591]: https://gitlab.freedesktop.org/drm/intel/issues/5591
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_7759 -> IGTPW_10825
CI-20190529: 20190529
CI_DRM_14426: 72f447f984cf5526e6ad32a6e2770124c67d59d3 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_10825: 10825
IGT_7759: 7759
Testlist changes
----------------
+igt@kms_rotation@rotations
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/index.html
[-- Attachment #2: Type: text/html, Size: 3094 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 1/4] lib/igt_kms: Add reflection name and mask
2024-03-13 17:09 ` [PATCH i-g-t v2 1/4] lib/igt_kms: Add reflection name and mask Louis Chauvet
@ 2024-03-13 20:00 ` Arthur Grillo
2024-03-15 16:11 ` Louis Chauvet
0 siblings, 1 reply; 17+ messages in thread
From: Arthur Grillo @ 2024-03-13 20:00 UTC (permalink / raw)
To: Louis Chauvet, igt-dev
Cc: miquel.raynal, jeremie.dautheribes, thomas.petazzoni
On 13/03/24 14:09, Louis Chauvet wrote:
> As for IGT_ROTATION_MASK and igt_plane_rotation_name, create the mask
> IGT_REFLECT_MASK and the function igt_plane_reflect_name.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> lib/igt_kms.c | 23 +++++++++++++++++++++++
> lib/igt_kms.h | 3 +++
> 2 files changed, 26 insertions(+)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index e18f6fe59882..85d278f3cae3 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -5142,6 +5142,29 @@ const char *igt_plane_rotation_name(igt_rotation_t rotation)
> }
> }
>
> +
> +/**
> + * igt_plane_reflect_name:
> + * @reflect: Plane reflection value (x, y)
> + *
> + * Returns: Plane reflection value as a string
> + */
> +const char *igt_plane_reflect_name(igt_rotation_t reflect)
> +{
> + switch (reflect & IGT_REFLECT_MASK) {
> + case 0:
> + return "none";
> + case IGT_REFLECT_X:
> + return "X";
> + case IGT_REFLECT_Y:
> + return "Y";
> + case IGT_REFLECT_X | IGT_REFLECT_Y:
> + return "XY";
> + default:
> + igt_assert(0);
> + }
> +}
I think it would be good to call this on igt_plane_set_rotation(), like
igt_plane_rotation_name() is, for debug purposes.
Best Regards,
~Arthur Grillo
> +
> /**
> * igt_plane_set_rotation:
> * @plane: Plane pointer for which rotation is to be set
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index b3882808b42f..4760394428f3 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -371,6 +371,8 @@ typedef enum {
>
> #define IGT_ROTATION_MASK \
> (IGT_ROTATION_0 | IGT_ROTATION_90 | IGT_ROTATION_180 | IGT_ROTATION_270)
> +#define IGT_REFLECT_MASK \
> + (IGT_REFLECT_X | IGT_REFLECT_Y)
>
> /**
> * igt_rotation_90_or_270:
> @@ -562,6 +564,7 @@ static inline bool igt_plane_has_rotation(igt_plane_t *plane, igt_rotation_t rot
> return (plane->rotations & rotation) == rotation;
> }
> const char *igt_plane_rotation_name(igt_rotation_t rotation);
> +const char *igt_plane_reflect_name(igt_rotation_t reflect);
>
> void igt_wait_for_vblank(int drm_fd, int crtc_offset);
> void igt_wait_for_vblank_count(int drm_fd, int crtc_offset, int count);
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* ✗ Fi.CI.IGT: failure for New rotation test (rev2)
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
` (5 preceding siblings ...)
2024-03-13 18:05 ` ✓ Fi.CI.BAT: " Patchwork
@ 2024-03-14 0:31 ` Patchwork
2024-03-18 8:26 ` [PATCH i-g-t v2 0/4] New rotation test Modem, Bhanuprakash
7 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2024-03-14 0:31 UTC (permalink / raw)
To: Louis Chauvet; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 95673 bytes --]
== Series Details ==
Series: New rotation test (rev2)
URL : https://patchwork.freedesktop.org/series/131011/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_14426_full -> IGTPW_10825_full
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with IGTPW_10825_full absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_10825_full, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/index.html
Participating hosts (8 -> 9)
------------------------------
Additional (1): shard-dg2-4
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_10825_full:
### IGT changes ###
#### Possible regressions ####
* igt@gem_lmem_swapping@parallel-multi@lmem0:
- shard-dg2: [PASS][1] -> [INCOMPLETE][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-10/igt@gem_lmem_swapping@parallel-multi@lmem0.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-10/igt@gem_lmem_swapping@parallel-multi@lmem0.html
* igt@kms_cursor_legacy@cursor-vs-flip-atomic-transitions:
- shard-dg1: NOTRUN -> [INCOMPLETE][3]
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-15/igt@kms_cursor_legacy@cursor-vs-flip-atomic-transitions.html
* igt@kms_flip@flip-vs-absolute-wf_vblank@b-hdmi-a1:
- shard-rkl: [PASS][4] -> [FAIL][5] +1 other test fail
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-7/igt@kms_flip@flip-vs-absolute-wf_vblank@b-hdmi-a1.html
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-7/igt@kms_flip@flip-vs-absolute-wf_vblank@b-hdmi-a1.html
* igt@kms_pipe_crc_basic@suspend-read-crc@pipe-b-hdmi-a-3:
- shard-dg2: [PASS][6] -> [FAIL][7]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-5/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-b-hdmi-a-3.html
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-b-hdmi-a-3.html
* igt@kms_plane_alpha_blend@constant-alpha-mid@pipe-d-edp-1:
- shard-mtlp: [PASS][8] -> [FAIL][9] +1 other test fail
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-mtlp-7/igt@kms_plane_alpha_blend@constant-alpha-mid@pipe-d-edp-1.html
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-2/igt@kms_plane_alpha_blend@constant-alpha-mid@pipe-d-edp-1.html
* {igt@kms_rotation@rotations} (NEW):
- shard-mtlp: NOTRUN -> [INCOMPLETE][10]
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-2/igt@kms_rotation@rotations.html
- shard-rkl: NOTRUN -> [INCOMPLETE][11]
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_rotation@rotations.html
- shard-snb: NOTRUN -> [INCOMPLETE][12]
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-snb2/igt@kms_rotation@rotations.html
- shard-glk: NOTRUN -> [INCOMPLETE][13]
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk6/igt@kms_rotation@rotations.html
#### Warnings ####
* igt@prime_mmap@test_aperture_limit@test_aperture_limit-smem:
- shard-dg2: [INCOMPLETE][14] ([i915#5493]) -> [INCOMPLETE][15]
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-10/igt@prime_mmap@test_aperture_limit@test_aperture_limit-smem.html
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@prime_mmap@test_aperture_limit@test_aperture_limit-smem.html
#### Suppressed ####
The following results come from untrusted machines, tests, or statuses.
They do not affect the overall result.
* igt@drm_fdinfo@busy-hang@ccs1:
- {shard-dg2-4}: NOTRUN -> [SKIP][16] +155 other tests skip
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-4/igt@drm_fdinfo@busy-hang@ccs1.html
* igt@gem_lmem_swapping@smem-oom@lmem0:
- {shard-dg2-4}: NOTRUN -> [TIMEOUT][17]
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-4/igt@gem_lmem_swapping@smem-oom@lmem0.html
New tests
---------
New tests have been introduced between CI_DRM_14426_full and IGTPW_10825_full:
### New IGT tests (1) ###
* igt@kms_rotation@rotations:
- Statuses : 4 incomplete(s)
- Exec time: [0.0] s
Known issues
------------
Here are the changes found in IGTPW_10825_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@api_intel_bb@object-reloc-purge-cache:
- shard-mtlp: NOTRUN -> [SKIP][18] ([i915#8411])
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@api_intel_bb@object-reloc-purge-cache.html
- shard-dg2: NOTRUN -> [SKIP][19] ([i915#8411]) +1 other test skip
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@api_intel_bb@object-reloc-purge-cache.html
- shard-rkl: NOTRUN -> [SKIP][20] ([i915#8411])
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-7/igt@api_intel_bb@object-reloc-purge-cache.html
- shard-dg1: NOTRUN -> [SKIP][21] ([i915#8411])
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@api_intel_bb@object-reloc-purge-cache.html
* igt@device_reset@unbind-cold-reset-rebind:
- shard-mtlp: NOTRUN -> [SKIP][22] ([i915#7701])
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@device_reset@unbind-cold-reset-rebind.html
* igt@drm_fdinfo@busy-check-all@bcs0:
- shard-dg1: NOTRUN -> [SKIP][23] ([i915#8414]) +5 other tests skip
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-13/igt@drm_fdinfo@busy-check-all@bcs0.html
* igt@drm_fdinfo@busy@rcs0:
- shard-dg2: NOTRUN -> [SKIP][24] ([i915#8414]) +20 other tests skip
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@drm_fdinfo@busy@rcs0.html
* igt@drm_fdinfo@virtual-busy:
- shard-mtlp: NOTRUN -> [SKIP][25] ([i915#8414])
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@drm_fdinfo@virtual-busy.html
* igt@gem_caching@read-writes:
- shard-mtlp: NOTRUN -> [SKIP][26] ([i915#4873])
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@gem_caching@read-writes.html
* igt@gem_ccs@block-multicopy-compressed:
- shard-tglu: NOTRUN -> [SKIP][27] ([i915#9323])
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-5/igt@gem_ccs@block-multicopy-compressed.html
* igt@gem_ccs@suspend-resume:
- shard-mtlp: NOTRUN -> [SKIP][28] ([i915#9323])
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-4/igt@gem_ccs@suspend-resume.html
* igt@gem_close_race@multigpu-basic-threads:
- shard-dg2: NOTRUN -> [SKIP][29] ([i915#7697])
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-2/igt@gem_close_race@multigpu-basic-threads.html
* igt@gem_compute@compute-square:
- shard-mtlp: NOTRUN -> [SKIP][30] ([i915#9310])
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@gem_compute@compute-square.html
* igt@gem_create@create-ext-cpu-access-big:
- shard-tglu: NOTRUN -> [SKIP][31] ([i915#6335])
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-3/igt@gem_create@create-ext-cpu-access-big.html
* igt@gem_ctx_persistence@heartbeat-hang:
- shard-dg1: NOTRUN -> [SKIP][32] ([i915#8555]) +1 other test skip
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@gem_ctx_persistence@heartbeat-hang.html
* igt@gem_ctx_persistence@heartbeat-many:
- shard-dg2: NOTRUN -> [SKIP][33] ([i915#8555])
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@gem_ctx_persistence@heartbeat-many.html
* igt@gem_ctx_sseu@mmap-args:
- shard-dg1: NOTRUN -> [SKIP][34] ([i915#280])
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@gem_ctx_sseu@mmap-args.html
* igt@gem_exec_balancer@bonded-pair:
- shard-mtlp: NOTRUN -> [SKIP][35] ([i915#4771])
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@gem_exec_balancer@bonded-pair.html
- shard-dg2: NOTRUN -> [SKIP][36] ([i915#4771])
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-10/igt@gem_exec_balancer@bonded-pair.html
- shard-dg1: NOTRUN -> [SKIP][37] ([i915#4771])
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@gem_exec_balancer@bonded-pair.html
* igt@gem_exec_balancer@invalid-bonds:
- shard-dg1: NOTRUN -> [SKIP][38] ([i915#4036])
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-12/igt@gem_exec_balancer@invalid-bonds.html
* igt@gem_exec_balancer@parallel-ordering:
- shard-tglu: NOTRUN -> [FAIL][39] ([i915#6117])
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-6/igt@gem_exec_balancer@parallel-ordering.html
* igt@gem_exec_balancer@sliced:
- shard-dg2: NOTRUN -> [SKIP][40] ([i915#4812])
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@gem_exec_balancer@sliced.html
- shard-mtlp: NOTRUN -> [SKIP][41] ([i915#4812])
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@gem_exec_balancer@sliced.html
* igt@gem_exec_capture@capture-invisible@lmem0:
- shard-dg1: NOTRUN -> [SKIP][42] ([i915#6334]) +1 other test skip
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@gem_exec_capture@capture-invisible@lmem0.html
* igt@gem_exec_capture@capture-recoverable:
- shard-tglu: NOTRUN -> [SKIP][43] ([i915#6344])
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-4/igt@gem_exec_capture@capture-recoverable.html
* igt@gem_exec_capture@many-4k-incremental:
- shard-dg2: NOTRUN -> [FAIL][44] ([i915#9606])
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-11/igt@gem_exec_capture@many-4k-incremental.html
* igt@gem_exec_fair@basic-deadline:
- shard-rkl: [PASS][45] -> [FAIL][46] ([i915#2846])
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-1/igt@gem_exec_fair@basic-deadline.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@gem_exec_fair@basic-deadline.html
- shard-glk: NOTRUN -> [FAIL][47] ([i915#2846])
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk6/igt@gem_exec_fair@basic-deadline.html
* igt@gem_exec_fair@basic-none-rrul:
- shard-dg2: NOTRUN -> [SKIP][48] ([i915#3539] / [i915#4852]) +1 other test skip
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@gem_exec_fair@basic-none-rrul.html
* igt@gem_exec_fair@basic-none-rrul@rcs0:
- shard-glk: NOTRUN -> [FAIL][49] ([i915#2842]) +3 other tests fail
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk4/igt@gem_exec_fair@basic-none-rrul@rcs0.html
* igt@gem_exec_fair@basic-pace@rcs0:
- shard-rkl: [PASS][50] -> [FAIL][51] ([i915#2842]) +2 other tests fail
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-1/igt@gem_exec_fair@basic-pace@rcs0.html
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-7/igt@gem_exec_fair@basic-pace@rcs0.html
* igt@gem_exec_fair@basic-sync:
- shard-mtlp: NOTRUN -> [SKIP][52] ([i915#4473] / [i915#4771])
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@gem_exec_fair@basic-sync.html
- shard-dg2: NOTRUN -> [SKIP][53] ([i915#3539]) +1 other test skip
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@gem_exec_fair@basic-sync.html
* igt@gem_exec_flush@basic-wb-rw-before-default:
- shard-dg1: NOTRUN -> [SKIP][54] ([i915#3539] / [i915#4852]) +3 other tests skip
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@gem_exec_flush@basic-wb-rw-before-default.html
* igt@gem_exec_gttfill@multigpu-basic:
- shard-mtlp: NOTRUN -> [SKIP][55] ([i915#7697])
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@gem_exec_gttfill@multigpu-basic.html
* igt@gem_exec_params@rsvd2-dirt:
- shard-dg2: NOTRUN -> [SKIP][56] ([i915#5107])
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-11/igt@gem_exec_params@rsvd2-dirt.html
* igt@gem_exec_reloc@basic-cpu-gtt-noreloc:
- shard-dg2: NOTRUN -> [SKIP][57] ([i915#3281]) +9 other tests skip
[57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@gem_exec_reloc@basic-cpu-gtt-noreloc.html
* igt@gem_exec_reloc@basic-cpu-wc:
- shard-dg1: NOTRUN -> [SKIP][58] ([i915#3281]) +8 other tests skip
[58]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@gem_exec_reloc@basic-cpu-wc.html
* igt@gem_exec_reloc@basic-gtt-wc-noreloc:
- shard-rkl: NOTRUN -> [SKIP][59] ([i915#3281]) +5 other tests skip
[59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@gem_exec_reloc@basic-gtt-wc-noreloc.html
* igt@gem_exec_schedule@preempt-queue-chain:
- shard-dg2: NOTRUN -> [SKIP][60] ([i915#4537] / [i915#4812])
[60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@gem_exec_schedule@preempt-queue-chain.html
* igt@gem_exec_schedule@semaphore-power:
- shard-dg1: NOTRUN -> [SKIP][61] ([i915#4812]) +2 other tests skip
[61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@gem_exec_schedule@semaphore-power.html
* igt@gem_fenced_exec_thrash@too-many-fences:
- shard-mtlp: NOTRUN -> [SKIP][62] ([i915#4860])
[62]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-3/igt@gem_fenced_exec_thrash@too-many-fences.html
- shard-dg2: NOTRUN -> [SKIP][63] ([i915#4860])
[63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@gem_fenced_exec_thrash@too-many-fences.html
* igt@gem_huc_copy@huc-copy:
- shard-glk: NOTRUN -> [SKIP][64] ([i915#2190])
[64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk7/igt@gem_huc_copy@huc-copy.html
* igt@gem_lmem_swapping@heavy-random@lmem0:
- shard-dg2: [PASS][65] -> [FAIL][66] ([i915#10378])
[65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-10/igt@gem_lmem_swapping@heavy-random@lmem0.html
[66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@gem_lmem_swapping@heavy-random@lmem0.html
* igt@gem_lmem_swapping@heavy-verify-multi-ccs:
- shard-mtlp: NOTRUN -> [SKIP][67] ([i915#4613]) +1 other test skip
[67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@gem_lmem_swapping@heavy-verify-multi-ccs.html
* igt@gem_lmem_swapping@heavy-verify-multi-ccs@lmem0:
- shard-dg1: NOTRUN -> [SKIP][68] ([i915#4565])
[68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-15/igt@gem_lmem_swapping@heavy-verify-multi-ccs@lmem0.html
* igt@gem_lmem_swapping@parallel-random:
- shard-tglu: NOTRUN -> [SKIP][69] ([i915#4613]) +1 other test skip
[69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-6/igt@gem_lmem_swapping@parallel-random.html
* igt@gem_lmem_swapping@verify-ccs:
- shard-glk: NOTRUN -> [SKIP][70] ([i915#4613]) +8 other tests skip
[70]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk7/igt@gem_lmem_swapping@verify-ccs.html
* igt@gem_mmap@basic-small-bo:
- shard-mtlp: NOTRUN -> [SKIP][71] ([i915#4083])
[71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@gem_mmap@basic-small-bo.html
* igt@gem_mmap@pf-nonblock:
- shard-dg1: NOTRUN -> [SKIP][72] ([i915#4083]) +2 other tests skip
[72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@gem_mmap@pf-nonblock.html
* igt@gem_mmap_gtt@big-bo-tiledy:
- shard-mtlp: NOTRUN -> [SKIP][73] ([i915#4077]) +9 other tests skip
[73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@gem_mmap_gtt@big-bo-tiledy.html
* igt@gem_mmap_gtt@cpuset-basic-small-copy-xy:
- shard-dg1: NOTRUN -> [SKIP][74] ([i915#4077]) +3 other tests skip
[74]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@gem_mmap_gtt@cpuset-basic-small-copy-xy.html
* igt@gem_mmap_gtt@cpuset-big-copy-odd:
- shard-dg2: NOTRUN -> [SKIP][75] ([i915#4077]) +17 other tests skip
[75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@gem_mmap_gtt@cpuset-big-copy-odd.html
* igt@gem_mmap_wc@write-prefaulted:
- shard-dg2: NOTRUN -> [SKIP][76] ([i915#4083]) +6 other tests skip
[76]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@gem_mmap_wc@write-prefaulted.html
* igt@gem_partial_pwrite_pread@reads:
- shard-dg2: NOTRUN -> [SKIP][77] ([i915#3282]) +5 other tests skip
[77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-11/igt@gem_partial_pwrite_pread@reads.html
* igt@gem_partial_pwrite_pread@writes-after-reads-uncached:
- shard-rkl: NOTRUN -> [SKIP][78] ([i915#3282]) +4 other tests skip
[78]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@gem_partial_pwrite_pread@writes-after-reads-uncached.html
- shard-mtlp: NOTRUN -> [SKIP][79] ([i915#3282]) +3 other tests skip
[79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@gem_partial_pwrite_pread@writes-after-reads-uncached.html
* igt@gem_pread@exhaustion:
- shard-glk: NOTRUN -> [WARN][80] ([i915#2658])
[80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk4/igt@gem_pread@exhaustion.html
* igt@gem_pwrite@basic-self:
- shard-dg1: NOTRUN -> [SKIP][81] ([i915#3282]) +2 other tests skip
[81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@gem_pwrite@basic-self.html
* igt@gem_pxp@create-regular-buffer:
- shard-rkl: NOTRUN -> [SKIP][82] ([i915#4270])
[82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@gem_pxp@create-regular-buffer.html
* igt@gem_pxp@regular-baseline-src-copy-readible:
- shard-dg2: NOTRUN -> [SKIP][83] ([i915#4270]) +4 other tests skip
[83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-2/igt@gem_pxp@regular-baseline-src-copy-readible.html
* igt@gem_pxp@verify-pxp-stale-buf-execution:
- shard-mtlp: NOTRUN -> [SKIP][84] ([i915#4270]) +2 other tests skip
[84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-6/igt@gem_pxp@verify-pxp-stale-buf-execution.html
* igt@gem_pxp@verify-pxp-stale-buf-optout-execution:
- shard-tglu: NOTRUN -> [SKIP][85] ([i915#4270])
[85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-2/igt@gem_pxp@verify-pxp-stale-buf-optout-execution.html
* igt@gem_pxp@verify-pxp-stale-ctx-execution:
- shard-dg1: NOTRUN -> [SKIP][86] ([i915#4270]) +1 other test skip
[86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@gem_pxp@verify-pxp-stale-ctx-execution.html
* igt@gem_render_copy@y-tiled-ccs-to-y-tiled:
- shard-dg2: NOTRUN -> [SKIP][87] ([i915#5190]) +12 other tests skip
[87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-10/igt@gem_render_copy@y-tiled-ccs-to-y-tiled.html
* igt@gem_render_copy@y-tiled-ccs-to-y-tiled-mc-ccs:
- shard-mtlp: NOTRUN -> [SKIP][88] ([i915#8428]) +6 other tests skip
[88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@gem_render_copy@y-tiled-ccs-to-y-tiled-mc-ccs.html
* igt@gem_set_tiling_vs_blt@tiled-to-untiled:
- shard-mtlp: NOTRUN -> [SKIP][89] ([i915#4079])
[89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-6/igt@gem_set_tiling_vs_blt@tiled-to-untiled.html
* igt@gem_softpin@evict-snoop:
- shard-dg2: NOTRUN -> [SKIP][90] ([i915#4885])
[90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@gem_softpin@evict-snoop.html
* igt@gem_spin_batch@spin-all-new:
- shard-dg2: NOTRUN -> [FAIL][91] ([i915#5889])
[91]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@gem_spin_batch@spin-all-new.html
* igt@gem_tiled_pread_pwrite:
- shard-dg1: NOTRUN -> [SKIP][92] ([i915#4079])
[92]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@gem_tiled_pread_pwrite.html
* igt@gem_userptr_blits@access-control:
- shard-dg2: NOTRUN -> [SKIP][93] ([i915#3297]) +4 other tests skip
[93]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@gem_userptr_blits@access-control.html
* igt@gem_userptr_blits@invalid-mmap-offset-unsync:
- shard-tglu: NOTRUN -> [SKIP][94] ([i915#3297]) +1 other test skip
[94]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-3/igt@gem_userptr_blits@invalid-mmap-offset-unsync.html
* igt@gem_userptr_blits@map-fixed-invalidate-busy:
- shard-dg1: NOTRUN -> [SKIP][95] ([i915#3297] / [i915#4880])
[95]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@gem_userptr_blits@map-fixed-invalidate-busy.html
* igt@gem_userptr_blits@mmap-offset-banned@gtt:
- shard-mtlp: NOTRUN -> [SKIP][96] ([i915#3297]) +3 other tests skip
[96]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-6/igt@gem_userptr_blits@mmap-offset-banned@gtt.html
* igt@gem_userptr_blits@readonly-unsync:
- shard-rkl: NOTRUN -> [SKIP][97] ([i915#3297])
[97]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@gem_userptr_blits@readonly-unsync.html
* igt@gem_userptr_blits@relocations:
- shard-mtlp: NOTRUN -> [SKIP][98] ([i915#3281]) +7 other tests skip
[98]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-3/igt@gem_userptr_blits@relocations.html
* igt@gem_userptr_blits@unsync-unmap:
- shard-dg1: NOTRUN -> [SKIP][99] ([i915#3297])
[99]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@gem_userptr_blits@unsync-unmap.html
* igt@gen7_exec_parse@bitmasks:
- shard-dg2: NOTRUN -> [SKIP][100] +27 other tests skip
[100]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-11/igt@gen7_exec_parse@bitmasks.html
* igt@gen9_exec_parse@basic-rejected:
- shard-tglu: NOTRUN -> [SKIP][101] ([i915#2527] / [i915#2856]) +1 other test skip
[101]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-6/igt@gen9_exec_parse@basic-rejected.html
* igt@gen9_exec_parse@bb-secure:
- shard-dg2: NOTRUN -> [SKIP][102] ([i915#2856]) +1 other test skip
[102]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-2/igt@gen9_exec_parse@bb-secure.html
* igt@gen9_exec_parse@bb-start-out:
- shard-dg1: NOTRUN -> [SKIP][103] ([i915#2527]) +1 other test skip
[103]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@gen9_exec_parse@bb-start-out.html
* igt@gen9_exec_parse@unaligned-jump:
- shard-mtlp: NOTRUN -> [SKIP][104] ([i915#2856]) +3 other tests skip
[104]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@gen9_exec_parse@unaligned-jump.html
* igt@i915_module_load@load:
- shard-glk: NOTRUN -> [SKIP][105] ([i915#6227])
[105]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk7/igt@i915_module_load@load.html
* igt@i915_module_load@reload-with-fault-injection:
- shard-dg2: [PASS][106] -> [ABORT][107] ([i915#9820])
[106]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-10/igt@i915_module_load@reload-with-fault-injection.html
[107]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@i915_module_load@reload-with-fault-injection.html
* igt@i915_pipe_stress@stress-xrgb8888-ytiled:
- shard-dg2: NOTRUN -> [SKIP][108] ([i915#7091])
[108]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@i915_pipe_stress@stress-xrgb8888-ytiled.html
* igt@i915_pm_freq_mult@media-freq@gt1:
- shard-mtlp: NOTRUN -> [SKIP][109] ([i915#6590]) +1 other test skip
[109]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-2/igt@i915_pm_freq_mult@media-freq@gt1.html
* igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0:
- shard-dg1: [PASS][110] -> [FAIL][111] ([i915#3591])
[110]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg1-19/igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0.html
[111]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@i915_pm_rc6_residency@rc6-idle@gt0-bcs0.html
* igt@i915_pm_rps@reset:
- shard-snb: [PASS][112] -> [INCOMPLETE][113] ([i915#7790])
[112]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-snb7/igt@i915_pm_rps@reset.html
[113]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-snb5/igt@i915_pm_rps@reset.html
* igt@i915_query@query-topology-coherent-slice-mask:
- shard-dg2: NOTRUN -> [SKIP][114] ([i915#6188])
[114]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@i915_query@query-topology-coherent-slice-mask.html
* igt@i915_selftest@mock@memory_region:
- shard-dg1: NOTRUN -> [DMESG-WARN][115] ([i915#9311])
[115]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@i915_selftest@mock@memory_region.html
- shard-mtlp: NOTRUN -> [DMESG-WARN][116] ([i915#9311])
[116]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-6/igt@i915_selftest@mock@memory_region.html
* igt@intel_hwmon@hwmon-write:
- shard-rkl: NOTRUN -> [SKIP][117] ([i915#7707])
[117]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@intel_hwmon@hwmon-write.html
* igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy:
- shard-mtlp: NOTRUN -> [SKIP][118] ([i915#4212]) +1 other test skip
[118]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy.html
- shard-dg2: NOTRUN -> [SKIP][119] ([i915#4212])
[119]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy.html
* igt@kms_addfb_basic@bo-too-small-due-to-tiling:
- shard-dg1: NOTRUN -> [SKIP][120] ([i915#4212]) +1 other test skip
[120]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@kms_addfb_basic@bo-too-small-due-to-tiling.html
* igt@kms_async_flips@alternate-sync-async-flip@pipe-c-hdmi-a-1:
- shard-tglu: [PASS][121] -> [FAIL][122] ([i915#2521])
[121]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-tglu-7/igt@kms_async_flips@alternate-sync-async-flip@pipe-c-hdmi-a-1.html
[122]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-2/igt@kms_async_flips@alternate-sync-async-flip@pipe-c-hdmi-a-1.html
* igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-1-y-rc-ccs:
- shard-tglu: NOTRUN -> [SKIP][123] ([i915#8709]) +7 other tests skip
[123]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-4/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-1-y-rc-ccs.html
* igt@kms_atomic@plane-primary-overlay-mutable-zpos:
- shard-dg2: NOTRUN -> [SKIP][124] ([i915#9531])
[124]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@kms_atomic@plane-primary-overlay-mutable-zpos.html
* igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels:
- shard-glk: NOTRUN -> [SKIP][125] ([i915#1769])
[125]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk1/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html
- shard-dg1: NOTRUN -> [SKIP][126] ([i915#1769] / [i915#3555])
[126]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html
* igt@kms_big_fb@4-tiled-64bpp-rotate-0:
- shard-rkl: NOTRUN -> [SKIP][127] ([i915#5286]) +2 other tests skip
[127]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_big_fb@4-tiled-64bpp-rotate-0.html
* igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
- shard-dg1: NOTRUN -> [SKIP][128] ([i915#4538] / [i915#5286]) +3 other tests skip
[128]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html
* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
- shard-tglu: NOTRUN -> [SKIP][129] ([i915#5286]) +2 other tests skip
[129]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-2/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html
* igt@kms_big_fb@linear-8bpp-rotate-180:
- shard-mtlp: [PASS][130] -> [FAIL][131] ([i915#5138])
[130]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-mtlp-3/igt@kms_big_fb@linear-8bpp-rotate-180.html
[131]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-2/igt@kms_big_fb@linear-8bpp-rotate-180.html
* igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
- shard-tglu: [PASS][132] -> [FAIL][133] ([i915#3743])
[132]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-tglu-4/igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html
[133]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-7/igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html
* igt@kms_big_fb@y-tiled-64bpp-rotate-270:
- shard-rkl: NOTRUN -> [SKIP][134] ([i915#3638]) +1 other test skip
[134]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_big_fb@y-tiled-64bpp-rotate-270.html
* igt@kms_big_fb@y-tiled-8bpp-rotate-270:
- shard-dg1: NOTRUN -> [SKIP][135] ([i915#3638]) +3 other tests skip
[135]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@kms_big_fb@y-tiled-8bpp-rotate-270.html
* igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
- shard-mtlp: NOTRUN -> [SKIP][136] ([i915#6187]) +1 other test skip
[136]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_big_fb@y-tiled-addfb-size-offset-overflow.html
* igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
- shard-mtlp: NOTRUN -> [SKIP][137] +16 other tests skip
[137]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-6/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html
* igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180:
- shard-dg2: NOTRUN -> [SKIP][138] ([i915#4538] / [i915#5190]) +10 other tests skip
[138]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180.html
* igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180:
- shard-dg1: NOTRUN -> [SKIP][139] ([i915#4538]) +3 other tests skip
[139]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-15/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180.html
* igt@kms_big_joiner@basic:
- shard-dg1: NOTRUN -> [SKIP][140] ([i915#2705])
[140]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@kms_big_joiner@basic.html
* igt@kms_big_joiner@invalid-modeset:
- shard-tglu: NOTRUN -> [SKIP][141] ([i915#2705]) +1 other test skip
[141]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-7/igt@kms_big_joiner@invalid-modeset.html
- shard-dg2: NOTRUN -> [SKIP][142] ([i915#2705])
[142]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_big_joiner@invalid-modeset.html
* igt@kms_ccs@bad-pixel-format-4-tiled-dg2-rc-ccs-cc@pipe-c-edp-1:
- shard-mtlp: NOTRUN -> [SKIP][143] ([i915#6095]) +31 other tests skip
[143]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@kms_ccs@bad-pixel-format-4-tiled-dg2-rc-ccs-cc@pipe-c-edp-1.html
* igt@kms_ccs@bad-rotation-90-4-tiled-xe2-ccs:
- shard-mtlp: NOTRUN -> [SKIP][144] ([i915#10278])
[144]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@kms_ccs@bad-rotation-90-4-tiled-xe2-ccs.html
* igt@kms_ccs@ccs-on-another-bo-yf-tiled-ccs@pipe-a-hdmi-a-3:
- shard-dg2: NOTRUN -> [SKIP][145] ([i915#10307]) +119 other tests skip
[145]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@kms_ccs@ccs-on-another-bo-yf-tiled-ccs@pipe-a-hdmi-a-3.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-1:
- shard-tglu: NOTRUN -> [SKIP][146] ([i915#6095]) +19 other tests skip
[146]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-5/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-1.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-xe2-ccs:
- shard-dg1: NOTRUN -> [SKIP][147] ([i915#10278])
[147]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-xe2-ccs.html
* igt@kms_ccs@missing-ccs-buffer-y-tiled-ccs@pipe-b-hdmi-a-1:
- shard-rkl: NOTRUN -> [SKIP][148] ([i915#6095]) +51 other tests skip
[148]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_ccs@missing-ccs-buffer-y-tiled-ccs@pipe-b-hdmi-a-1.html
* igt@kms_ccs@random-ccs-data-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-3:
- shard-dg1: NOTRUN -> [SKIP][149] ([i915#6095]) +75 other tests skip
[149]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-12/igt@kms_ccs@random-ccs-data-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-3.html
* igt@kms_cdclk@mode-transition:
- shard-rkl: NOTRUN -> [SKIP][150] ([i915#3742]) +1 other test skip
[150]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_cdclk@mode-transition.html
* igt@kms_cdclk@mode-transition@pipe-b-edp-1:
- shard-mtlp: NOTRUN -> [SKIP][151] ([i915#7213] / [i915#9010]) +3 other tests skip
[151]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@kms_cdclk@mode-transition@pipe-b-edp-1.html
* igt@kms_cdclk@mode-transition@pipe-b-hdmi-a-2:
- shard-dg2: NOTRUN -> [SKIP][152] ([i915#7213]) +4 other tests skip
[152]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-2/igt@kms_cdclk@mode-transition@pipe-b-hdmi-a-2.html
* igt@kms_cdclk@plane-scaling:
- shard-dg1: NOTRUN -> [SKIP][153] ([i915#3742]) +1 other test skip
[153]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@kms_cdclk@plane-scaling.html
* igt@kms_cdclk@plane-scaling@pipe-d-hdmi-a-1:
- shard-dg2: NOTRUN -> [SKIP][154] ([i915#4087]) +3 other tests skip
[154]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@kms_cdclk@plane-scaling@pipe-d-hdmi-a-1.html
* igt@kms_chamelium_edid@dp-edid-change-during-suspend:
- shard-tglu: NOTRUN -> [SKIP][155] ([i915#7828]) +5 other tests skip
[155]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-4/igt@kms_chamelium_edid@dp-edid-change-during-suspend.html
* igt@kms_chamelium_frames@dp-crc-fast:
- shard-dg2: NOTRUN -> [SKIP][156] ([i915#7828]) +8 other tests skip
[156]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_chamelium_frames@dp-crc-fast.html
* igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode:
- shard-rkl: NOTRUN -> [SKIP][157] ([i915#7828]) +3 other tests skip
[157]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-5/igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode.html
* igt@kms_chamelium_hpd@dp-hpd-storm-disable:
- shard-dg1: NOTRUN -> [SKIP][158] ([i915#7828]) +6 other tests skip
[158]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@kms_chamelium_hpd@dp-hpd-storm-disable.html
* igt@kms_chamelium_hpd@hdmi-hpd-enable-disable-mode:
- shard-mtlp: NOTRUN -> [SKIP][159] ([i915#7828]) +4 other tests skip
[159]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@kms_chamelium_hpd@hdmi-hpd-enable-disable-mode.html
* igt@kms_content_protection@atomic-dpms:
- shard-dg2: NOTRUN -> [SKIP][160] ([i915#7118] / [i915#9424]) +1 other test skip
[160]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-10/igt@kms_content_protection@atomic-dpms.html
* igt@kms_content_protection@content-type-change:
- shard-dg1: NOTRUN -> [SKIP][161] ([i915#9424])
[161]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@kms_content_protection@content-type-change.html
* igt@kms_content_protection@lic-type-0:
- shard-mtlp: NOTRUN -> [SKIP][162] ([i915#6944] / [i915#9424])
[162]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@kms_content_protection@lic-type-0.html
- shard-dg2: NOTRUN -> [SKIP][163] ([i915#9424]) +1 other test skip
[163]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@kms_content_protection@lic-type-0.html
* igt@kms_content_protection@srm:
- shard-tglu: NOTRUN -> [SKIP][164] ([i915#6944] / [i915#7116] / [i915#7118])
[164]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-2/igt@kms_content_protection@srm.html
* igt@kms_content_protection@type1:
- shard-mtlp: NOTRUN -> [SKIP][165] ([i915#3555] / [i915#6944] / [i915#9424])
[165]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-3/igt@kms_content_protection@type1.html
* igt@kms_cursor_crc@cursor-offscreen-256x85:
- shard-mtlp: NOTRUN -> [SKIP][166] ([i915#8814])
[166]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@kms_cursor_crc@cursor-offscreen-256x85.html
* igt@kms_cursor_crc@cursor-offscreen-512x512:
- shard-rkl: NOTRUN -> [SKIP][167] ([i915#3359])
[167]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-7/igt@kms_cursor_crc@cursor-offscreen-512x512.html
* igt@kms_cursor_crc@cursor-onscreen-512x512:
- shard-mtlp: NOTRUN -> [SKIP][168] ([i915#3359])
[168]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@kms_cursor_crc@cursor-onscreen-512x512.html
* igt@kms_cursor_crc@cursor-random-32x32:
- shard-dg1: NOTRUN -> [SKIP][169] ([i915#3555]) +3 other tests skip
[169]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@kms_cursor_crc@cursor-random-32x32.html
* igt@kms_cursor_crc@cursor-random-512x170:
- shard-dg2: NOTRUN -> [SKIP][170] ([i915#3359]) +3 other tests skip
[170]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@kms_cursor_crc@cursor-random-512x170.html
* igt@kms_cursor_crc@cursor-random-512x512:
- shard-dg1: NOTRUN -> [SKIP][171] ([i915#3359]) +2 other tests skip
[171]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@kms_cursor_crc@cursor-random-512x512.html
* igt@kms_cursor_crc@cursor-random-max-size:
- shard-mtlp: NOTRUN -> [SKIP][172] ([i915#3555] / [i915#8814])
[172]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@kms_cursor_crc@cursor-random-max-size.html
* igt@kms_cursor_crc@cursor-rapid-movement-32x10:
- shard-rkl: NOTRUN -> [SKIP][173] ([i915#3555]) +2 other tests skip
[173]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_cursor_crc@cursor-rapid-movement-32x10.html
* igt@kms_cursor_crc@cursor-rapid-movement-max-size:
- shard-dg2: NOTRUN -> [SKIP][174] ([i915#3555]) +9 other tests skip
[174]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@kms_cursor_crc@cursor-rapid-movement-max-size.html
* igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
- shard-mtlp: NOTRUN -> [SKIP][175] ([i915#4213]) +1 other test skip
[175]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
- shard-dg2: NOTRUN -> [SKIP][176] ([i915#4103] / [i915#4213]) +1 other test skip
[176]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
* igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions:
- shard-mtlp: NOTRUN -> [SKIP][177] ([i915#9809])
[177]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions.html
* igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size:
- shard-rkl: NOTRUN -> [SKIP][178] +17 other tests skip
[178]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html
* igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
- shard-dg1: NOTRUN -> [SKIP][179] ([i915#4103] / [i915#4213])
[179]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-13/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html
* igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
- shard-dg2: NOTRUN -> [SKIP][180] ([i915#9833])
[180]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html
* igt@kms_draw_crc@draw-method-mmap-wc:
- shard-dg2: NOTRUN -> [SKIP][181] ([i915#8812])
[181]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@kms_draw_crc@draw-method-mmap-wc.html
* igt@kms_dsc@dsc-fractional-bpp:
- shard-mtlp: NOTRUN -> [SKIP][182] ([i915#3840] / [i915#9688])
[182]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-4/igt@kms_dsc@dsc-fractional-bpp.html
* igt@kms_dsc@dsc-with-bpc:
- shard-mtlp: NOTRUN -> [SKIP][183] ([i915#3555] / [i915#3840])
[183]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_dsc@dsc-with-bpc.html
* igt@kms_dsc@dsc-with-output-formats-with-bpc:
- shard-tglu: NOTRUN -> [SKIP][184] ([i915#3840] / [i915#9053])
[184]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-5/igt@kms_dsc@dsc-with-output-formats-with-bpc.html
* igt@kms_fbcon_fbt@psr-suspend:
- shard-dg2: NOTRUN -> [SKIP][185] ([i915#3469])
[185]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_fbcon_fbt@psr-suspend.html
* igt@kms_feature_discovery@display-2x:
- shard-dg2: NOTRUN -> [SKIP][186] ([i915#1839])
[186]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-11/igt@kms_feature_discovery@display-2x.html
* igt@kms_flip@2x-dpms-vs-vblank-race:
- shard-dg1: NOTRUN -> [SKIP][187] ([i915#9934]) +2 other tests skip
[187]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@kms_flip@2x-dpms-vs-vblank-race.html
* igt@kms_flip@2x-flip-vs-dpms:
- shard-mtlp: NOTRUN -> [SKIP][188] ([i915#3637]) +3 other tests skip
[188]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_flip@2x-flip-vs-dpms.html
* igt@kms_flip@2x-flip-vs-fences:
- shard-dg2: NOTRUN -> [SKIP][189] ([i915#8381])
[189]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_flip@2x-flip-vs-fences.html
* igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset:
- shard-tglu: NOTRUN -> [SKIP][190] ([i915#3637]) +4 other tests skip
[190]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-7/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html
* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling@pipe-a-valid-mode:
- shard-tglu: NOTRUN -> [SKIP][191] ([i915#2587] / [i915#2672])
[191]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-2/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling@pipe-a-valid-mode.html
* igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-default-mode:
- shard-mtlp: NOTRUN -> [SKIP][192] ([i915#2672]) +2 other tests skip
[192]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-3/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-default-mode.html
* igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode:
- shard-dg2: NOTRUN -> [SKIP][193] ([i915#2672]) +4 other tests skip
[193]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode.html
- shard-rkl: NOTRUN -> [SKIP][194] ([i915#2672]) +1 other test skip
[194]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode.html
- shard-dg1: NOTRUN -> [SKIP][195] ([i915#2587] / [i915#2672]) +2 other tests skip
[195]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode.html
* igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling@pipe-a-default-mode:
- shard-mtlp: NOTRUN -> [SKIP][196] ([i915#2672] / [i915#3555])
[196]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling@pipe-a-default-mode.html
* igt@kms_frontbuffer_tracking@fbc-tiling-y:
- shard-mtlp: NOTRUN -> [SKIP][197] ([i915#10055])
[197]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-3/igt@kms_frontbuffer_tracking@fbc-tiling-y.html
- shard-dg2: NOTRUN -> [SKIP][198] ([i915#10055])
[198]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_frontbuffer_tracking@fbc-tiling-y.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-gtt:
- shard-dg1: NOTRUN -> [SKIP][199] ([i915#8708]) +16 other tests skip
[199]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-gtt.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-cpu:
- shard-rkl: NOTRUN -> [SKIP][200] ([i915#1825]) +8 other tests skip
[200]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-cpu.html
* igt@kms_frontbuffer_tracking@pipe-fbc-rte:
- shard-rkl: NOTRUN -> [SKIP][201] ([i915#9766])
[201]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html
- shard-dg2: NOTRUN -> [SKIP][202] ([i915#9766])
[202]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html
* igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-mmap-wc:
- shard-dg2: NOTRUN -> [SKIP][203] ([i915#8708]) +21 other tests skip
[203]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-11/igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@psr-1p-rte:
- shard-dg2: NOTRUN -> [SKIP][204] ([i915#3458]) +22 other tests skip
[204]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_frontbuffer_tracking@psr-1p-rte.html
- shard-rkl: NOTRUN -> [SKIP][205] ([i915#3023]) +10 other tests skip
[205]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-1p-rte.html
* igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-mmap-cpu:
- shard-mtlp: NOTRUN -> [SKIP][206] ([i915#1825]) +19 other tests skip
[206]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-mmap-cpu.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-blt:
- shard-dg2: NOTRUN -> [SKIP][207] ([i915#5354]) +39 other tests skip
[207]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-10/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-render:
- shard-tglu: NOTRUN -> [SKIP][208] +37 other tests skip
[208]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-7/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-render.html
* igt@kms_frontbuffer_tracking@psr-rgb565-draw-mmap-gtt:
- shard-mtlp: NOTRUN -> [SKIP][209] ([i915#8708]) +8 other tests skip
[209]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@kms_frontbuffer_tracking@psr-rgb565-draw-mmap-gtt.html
* igt@kms_frontbuffer_tracking@psr-rgb565-draw-pwrite:
- shard-dg1: NOTRUN -> [SKIP][210] ([i915#3458]) +16 other tests skip
[210]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@kms_frontbuffer_tracking@psr-rgb565-draw-pwrite.html
* igt@kms_hdr@invalid-metadata-sizes:
- shard-mtlp: NOTRUN -> [SKIP][211] ([i915#3555] / [i915#8228])
[211]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_hdr@invalid-metadata-sizes.html
- shard-dg2: NOTRUN -> [SKIP][212] ([i915#3555] / [i915#8228])
[212]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_hdr@invalid-metadata-sizes.html
* igt@kms_hdr@static-swap:
- shard-dg1: NOTRUN -> [SKIP][213] ([i915#3555] / [i915#8228]) +1 other test skip
[213]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@kms_hdr@static-swap.html
* igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
- shard-rkl: NOTRUN -> [SKIP][214] ([i915#4070] / [i915#4816])
[214]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
* igt@kms_panel_fitting@legacy:
- shard-dg2: NOTRUN -> [SKIP][215] ([i915#6301])
[215]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@kms_panel_fitting@legacy.html
* igt@kms_plane_alpha_blend@constant-alpha-max@pipe-c-hdmi-a-1:
- shard-glk: NOTRUN -> [FAIL][216] ([i915#4573]) +1 other test fail
[216]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk8/igt@kms_plane_alpha_blend@constant-alpha-max@pipe-c-hdmi-a-1.html
* igt@kms_plane_lowres@tiling-none@pipe-b-edp-1:
- shard-mtlp: NOTRUN -> [SKIP][217] ([i915#3582]) +3 other tests skip
[217]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_plane_lowres@tiling-none@pipe-b-edp-1.html
* igt@kms_plane_multiple@tiling-4:
- shard-tglu: NOTRUN -> [SKIP][218] ([i915#3555])
[218]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-4/igt@kms_plane_multiple@tiling-4.html
* igt@kms_plane_scaling@intel-max-src-size@pipe-a-hdmi-a-3:
- shard-dg1: NOTRUN -> [FAIL][219] ([i915#8292])
[219]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-13/igt@kms_plane_scaling@intel-max-src-size@pipe-a-hdmi-a-3.html
* igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-b-hdmi-a-2:
- shard-rkl: NOTRUN -> [SKIP][220] ([i915#9423]) +9 other tests skip
[220]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-b-hdmi-a-2.html
* igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-b-hdmi-a-1:
- shard-glk: NOTRUN -> [SKIP][221] +626 other tests skip
[221]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk4/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-b-hdmi-a-1.html
* igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-b-hdmi-a-3:
- shard-dg2: NOTRUN -> [SKIP][222] ([i915#9423]) +3 other tests skip
[222]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-b-hdmi-a-3.html
* igt@kms_plane_scaling@plane-downscale-factor-0-5-with-modifiers@pipe-b-edp-1:
- shard-mtlp: NOTRUN -> [SKIP][223] ([i915#5176]) +3 other tests skip
[223]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@kms_plane_scaling@plane-downscale-factor-0-5-with-modifiers@pipe-b-edp-1.html
* igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-d-hdmi-a-4:
- shard-dg1: NOTRUN -> [SKIP][224] ([i915#9423]) +15 other tests skip
[224]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-d-hdmi-a-4.html
* igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-a-hdmi-a-1:
- shard-rkl: NOTRUN -> [SKIP][225] ([i915#5176] / [i915#9423]) +1 other test skip
[225]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-5/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-a-hdmi-a-1.html
* igt@kms_plane_scaling@plane-upscale-factor-0-25-with-rotation@pipe-d-hdmi-a-1:
- shard-tglu: NOTRUN -> [SKIP][226] ([i915#9423]) +3 other tests skip
[226]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-7/igt@kms_plane_scaling@plane-upscale-factor-0-25-with-rotation@pipe-d-hdmi-a-1.html
* igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-c-hdmi-a-2:
- shard-dg2: NOTRUN -> [SKIP][227] ([i915#5235] / [i915#9423] / [i915#9728]) +3 other tests skip
[227]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-2/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-c-hdmi-a-2.html
* igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-factor-0-25@pipe-c-hdmi-a-1:
- shard-tglu: NOTRUN -> [SKIP][228] ([i915#5235]) +3 other tests skip
[228]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-2/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-factor-0-25@pipe-c-hdmi-a-1.html
* igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-c-hdmi-a-4:
- shard-dg1: NOTRUN -> [SKIP][229] ([i915#5235]) +15 other tests skip
[229]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-c-hdmi-a-4.html
* igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-a-hdmi-a-1:
- shard-rkl: NOTRUN -> [SKIP][230] ([i915#5235]) +5 other tests skip
[230]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-5/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-a-hdmi-a-1.html
* igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-d-edp-1:
- shard-mtlp: NOTRUN -> [SKIP][231] ([i915#5235]) +7 other tests skip
[231]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-d-edp-1.html
* igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-25@pipe-a-hdmi-a-3:
- shard-dg2: NOTRUN -> [SKIP][232] ([i915#5235] / [i915#9423]) +7 other tests skip
[232]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-25@pipe-a-hdmi-a-3.html
* igt@kms_pm_backlight@bad-brightness:
- shard-dg1: NOTRUN -> [SKIP][233] ([i915#5354]) +1 other test skip
[233]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-13/igt@kms_pm_backlight@bad-brightness.html
* igt@kms_pm_dc@dc3co-vpb-simulation:
- shard-dg2: NOTRUN -> [SKIP][234] ([i915#9685]) +1 other test skip
[234]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@kms_pm_dc@dc3co-vpb-simulation.html
* igt@kms_pm_dc@dc5-psr:
- shard-rkl: NOTRUN -> [SKIP][235] ([i915#9685])
[235]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_pm_dc@dc5-psr.html
* igt@kms_pm_rpm@dpms-non-lpsp:
- shard-rkl: [PASS][236] -> [SKIP][237] ([i915#9519])
[236]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-1/igt@kms_pm_rpm@dpms-non-lpsp.html
[237]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-7/igt@kms_pm_rpm@dpms-non-lpsp.html
* igt@kms_pm_rpm@modeset-lpsp:
- shard-dg2: [PASS][238] -> [SKIP][239] ([i915#9519]) +1 other test skip
[238]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-10/igt@kms_pm_rpm@modeset-lpsp.html
[239]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-2/igt@kms_pm_rpm@modeset-lpsp.html
* igt@kms_pm_rpm@modeset-lpsp-stress:
- shard-dg1: NOTRUN -> [SKIP][240] ([i915#9519])
[240]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@kms_pm_rpm@modeset-lpsp-stress.html
* igt@kms_pm_rpm@modeset-non-lpsp-stress:
- shard-dg2: NOTRUN -> [SKIP][241] ([i915#9519])
[241]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@kms_pm_rpm@modeset-non-lpsp-stress.html
* igt@kms_prime@basic-crc-hybrid:
- shard-dg2: NOTRUN -> [SKIP][242] ([i915#6524] / [i915#6805])
[242]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@kms_prime@basic-crc-hybrid.html
- shard-rkl: NOTRUN -> [SKIP][243] ([i915#6524])
[243]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_prime@basic-crc-hybrid.html
* igt@kms_psr2_sf@cursor-plane-move-continuous-sf:
- shard-dg1: NOTRUN -> [SKIP][244] +44 other tests skip
[244]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-13/igt@kms_psr2_sf@cursor-plane-move-continuous-sf.html
* igt@kms_psr2_sf@fbc-plane-move-sf-dmg-area@psr2-pipe-a-edp-1:
- shard-mtlp: NOTRUN -> [SKIP][245] ([i915#9808]) +3 other tests skip
[245]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@kms_psr2_sf@fbc-plane-move-sf-dmg-area@psr2-pipe-a-edp-1.html
* igt@kms_psr2_su@page_flip-xrgb8888:
- shard-mtlp: NOTRUN -> [SKIP][246] ([i915#4348])
[246]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_psr2_su@page_flip-xrgb8888.html
- shard-dg2: NOTRUN -> [SKIP][247] ([i915#9683])
[247]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_psr2_su@page_flip-xrgb8888.html
* igt@kms_psr@pr-primary-mmap-cpu:
- shard-mtlp: NOTRUN -> [SKIP][248] ([i915#9688]) +11 other tests skip
[248]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-2/igt@kms_psr@pr-primary-mmap-cpu.html
* igt@kms_psr@pr-sprite-mmap-gtt:
- shard-rkl: NOTRUN -> [SKIP][249] ([i915#9732]) +8 other tests skip
[249]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_psr@pr-sprite-mmap-gtt.html
* igt@kms_psr@psr2-cursor-mmap-gtt:
- shard-tglu: NOTRUN -> [SKIP][250] ([i915#9732]) +8 other tests skip
[250]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-9/igt@kms_psr@psr2-cursor-mmap-gtt.html
* igt@kms_psr@psr2-primary-mmap-gtt:
- shard-dg2: NOTRUN -> [SKIP][251] ([i915#9732]) +23 other tests skip
[251]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@kms_psr@psr2-primary-mmap-gtt.html
* igt@kms_psr@psr2-sprite-blt:
- shard-dg1: NOTRUN -> [SKIP][252] ([i915#9732]) +19 other tests skip
[252]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@kms_psr@psr2-sprite-blt.html
* igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
- shard-dg1: NOTRUN -> [SKIP][253] ([i915#9685])
[253]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
* igt@kms_rotation_crc@multiplane-rotation-cropping-bottom:
- shard-rkl: [PASS][254] -> [INCOMPLETE][255] ([i915#9569])
[254]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-4/igt@kms_rotation_crc@multiplane-rotation-cropping-bottom.html
[255]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_rotation_crc@multiplane-rotation-cropping-bottom.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
- shard-dg1: NOTRUN -> [SKIP][256] ([i915#5289])
[256]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-12/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90:
- shard-tglu: NOTRUN -> [SKIP][257] ([i915#5289])
[257]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-6/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90.html
* igt@kms_rotation_crc@sprite-rotation-90-pos-100-0:
- shard-dg2: NOTRUN -> [SKIP][258] ([i915#4235]) +2 other tests skip
[258]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_rotation_crc@sprite-rotation-90-pos-100-0.html
- shard-mtlp: NOTRUN -> [SKIP][259] ([i915#4235])
[259]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-8/igt@kms_rotation_crc@sprite-rotation-90-pos-100-0.html
* igt@kms_sysfs_edid_timing:
- shard-dg1: NOTRUN -> [FAIL][260] ([IGT#2] / [i915#6493])
[260]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@kms_sysfs_edid_timing.html
* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-rkl: NOTRUN -> [SKIP][261] ([i915#8623])
[261]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-3/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
- shard-dg1: NOTRUN -> [SKIP][262] ([i915#8623])
[262]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
- shard-mtlp: NOTRUN -> [SKIP][263] ([i915#8623])
[263]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
* igt@kms_universal_plane@cursor-fb-leak@pipe-a-edp-1:
- shard-mtlp: [PASS][264] -> [FAIL][265] ([i915#9196])
[264]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-mtlp-7/igt@kms_universal_plane@cursor-fb-leak@pipe-a-edp-1.html
[265]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@kms_universal_plane@cursor-fb-leak@pipe-a-edp-1.html
* igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-1:
- shard-tglu: [PASS][266] -> [FAIL][267] ([i915#9196]) +1 other test fail
[266]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-tglu-7/igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-1.html
[267]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-3/igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-1.html
* igt@kms_vrr@flip-basic:
- shard-mtlp: NOTRUN -> [SKIP][268] ([i915#3555] / [i915#8808])
[268]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-6/igt@kms_vrr@flip-basic.html
* igt@kms_vrr@flip-basic-fastset:
- shard-dg1: NOTRUN -> [SKIP][269] ([i915#9906])
[269]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@kms_vrr@flip-basic-fastset.html
* igt@kms_vrr@seamless-rr-switch-drrs:
- shard-rkl: NOTRUN -> [SKIP][270] ([i915#9906])
[270]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_vrr@seamless-rr-switch-drrs.html
* igt@kms_vrr@seamless-rr-switch-vrr:
- shard-dg2: NOTRUN -> [SKIP][271] ([i915#9906]) +1 other test skip
[271]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_vrr@seamless-rr-switch-vrr.html
- shard-tglu: NOTRUN -> [SKIP][272] ([i915#9906])
[272]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-7/igt@kms_vrr@seamless-rr-switch-vrr.html
* igt@kms_writeback@writeback-check-output:
- shard-dg2: NOTRUN -> [SKIP][273] ([i915#2437])
[273]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_writeback@writeback-check-output.html
* igt@kms_writeback@writeback-fb-id:
- shard-glk: NOTRUN -> [SKIP][274] ([i915#2437]) +2 other tests skip
[274]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk8/igt@kms_writeback@writeback-fb-id.html
* igt@kms_writeback@writeback-pixel-formats:
- shard-dg1: NOTRUN -> [SKIP][275] ([i915#2437] / [i915#9412])
[275]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@kms_writeback@writeback-pixel-formats.html
* igt@perf_pmu@busy-idle@vcs1:
- shard-mtlp: [PASS][276] -> [INCOMPLETE][277] ([i915#9853])
[276]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-mtlp-3/igt@perf_pmu@busy-idle@vcs1.html
[277]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-2/igt@perf_pmu@busy-idle@vcs1.html
* igt@perf_pmu@faulting-read@gtt:
- shard-mtlp: NOTRUN -> [SKIP][278] ([i915#8440])
[278]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@perf_pmu@faulting-read@gtt.html
* igt@prime_vgem@basic-read:
- shard-dg2: NOTRUN -> [SKIP][279] ([i915#3291] / [i915#3708])
[279]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@prime_vgem@basic-read.html
* igt@prime_vgem@basic-write:
- shard-dg1: NOTRUN -> [SKIP][280] ([i915#3708])
[280]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@prime_vgem@basic-write.html
* igt@prime_vgem@fence-read-hang:
- shard-mtlp: NOTRUN -> [SKIP][281] ([i915#3708])
[281]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-3/igt@prime_vgem@fence-read-hang.html
- shard-dg2: NOTRUN -> [SKIP][282] ([i915#3708])
[282]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@prime_vgem@fence-read-hang.html
* igt@runner@aborted:
- shard-glk: NOTRUN -> ([FAIL][283], [FAIL][284]) ([i915#10291])
[283]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk1/igt@runner@aborted.html
[284]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk1/igt@runner@aborted.html
* igt@sriov_basic@bind-unbind-vf:
- shard-dg1: NOTRUN -> [SKIP][285] ([i915#9917])
[285]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@sriov_basic@bind-unbind-vf.html
* igt@sriov_basic@enable-vfs-autoprobe-on:
- shard-dg2: NOTRUN -> [SKIP][286] ([i915#9917])
[286]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@sriov_basic@enable-vfs-autoprobe-on.html
* igt@syncobj_wait@invalid-wait-zero-handles:
- shard-mtlp: NOTRUN -> [FAIL][287] ([i915#9779])
[287]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-1/igt@syncobj_wait@invalid-wait-zero-handles.html
* igt@sysfs_heartbeat_interval@nopreempt@vecs0:
- shard-dg1: [PASS][288] -> [ABORT][289] ([i915#10406])
[288]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg1-12/igt@sysfs_heartbeat_interval@nopreempt@vecs0.html
[289]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@sysfs_heartbeat_interval@nopreempt@vecs0.html
* igt@tools_test@sysfs_l3_parity:
- shard-dg1: NOTRUN -> [SKIP][290] ([i915#4818])
[290]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-19/igt@tools_test@sysfs_l3_parity.html
- shard-mtlp: NOTRUN -> [SKIP][291] ([i915#4818])
[291]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@tools_test@sysfs_l3_parity.html
- shard-dg2: NOTRUN -> [SKIP][292] ([i915#4818])
[292]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@tools_test@sysfs_l3_parity.html
* igt@v3d/v3d_perfmon@create-two-perfmon:
- shard-dg2: NOTRUN -> [SKIP][293] ([i915#2575]) +14 other tests skip
[293]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@v3d/v3d_perfmon@create-two-perfmon.html
* igt@v3d/v3d_submit_csd@bad-pad:
- shard-tglu: NOTRUN -> [SKIP][294] ([i915#2575]) +9 other tests skip
[294]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-4/igt@v3d/v3d_submit_csd@bad-pad.html
* igt@v3d/v3d_submit_csd@bad-perfmon:
- shard-dg1: NOTRUN -> [SKIP][295] ([i915#2575]) +12 other tests skip
[295]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-15/igt@v3d/v3d_submit_csd@bad-perfmon.html
- shard-snb: NOTRUN -> [SKIP][296] +3 other tests skip
[296]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-snb6/igt@v3d/v3d_submit_csd@bad-perfmon.html
* igt@v3d/v3d_wait_bo@used-bo:
- shard-mtlp: NOTRUN -> [SKIP][297] ([i915#2575]) +8 other tests skip
[297]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@v3d/v3d_wait_bo@used-bo.html
* igt@vc4/vc4_label_bo@set-bad-name:
- shard-dg1: NOTRUN -> [SKIP][298] ([i915#7711]) +7 other tests skip
[298]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@vc4/vc4_label_bo@set-bad-name.html
* igt@vc4/vc4_label_bo@set-label:
- shard-rkl: NOTRUN -> [SKIP][299] ([i915#7711]) +2 other tests skip
[299]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@vc4/vc4_label_bo@set-label.html
* igt@vc4/vc4_mmap@mmap-bo:
- shard-dg2: NOTRUN -> [SKIP][300] ([i915#7711]) +6 other tests skip
[300]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@vc4/vc4_mmap@mmap-bo.html
* igt@vc4/vc4_wait_bo@used-bo:
- shard-mtlp: NOTRUN -> [SKIP][301] ([i915#7711]) +4 other tests skip
[301]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-7/igt@vc4/vc4_wait_bo@used-bo.html
#### Possible fixes ####
* igt@gem_busy@close-race:
- shard-mtlp: [INCOMPLETE][302] -> [PASS][303]
[302]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-mtlp-5/igt@gem_busy@close-race.html
[303]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-5/igt@gem_busy@close-race.html
* igt@gem_eio@context-create:
- shard-dg2: [ABORT][304] -> [PASS][305]
[304]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-10/igt@gem_eio@context-create.html
[305]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@gem_eio@context-create.html
* igt@gem_eio@hibernate:
- shard-dg1: [ABORT][306] ([i915#7975] / [i915#8213]) -> [PASS][307]
[306]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg1-15/igt@gem_eio@hibernate.html
[307]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-18/igt@gem_eio@hibernate.html
* igt@gem_eio@unwedge-stress:
- shard-dg1: [FAIL][308] ([i915#5784]) -> [PASS][309]
[308]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg1-17/igt@gem_eio@unwedge-stress.html
[309]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-16/igt@gem_eio@unwedge-stress.html
* igt@gem_exec_fair@basic-pace-share@rcs0:
- shard-glk: [FAIL][310] ([i915#2842]) -> [PASS][311]
[310]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-glk4/igt@gem_exec_fair@basic-pace-share@rcs0.html
[311]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk6/igt@gem_exec_fair@basic-pace-share@rcs0.html
* igt@gem_exec_fair@basic-pace@rcs0:
- shard-tglu: [FAIL][312] ([i915#2842]) -> [PASS][313] +1 other test pass
[312]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-tglu-4/igt@gem_exec_fair@basic-pace@rcs0.html
[313]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-7/igt@gem_exec_fair@basic-pace@rcs0.html
* igt@gem_exec_fair@basic-pace@vcs0:
- shard-rkl: [FAIL][314] ([i915#2842]) -> [PASS][315]
[314]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-1/igt@gem_exec_fair@basic-pace@vcs0.html
[315]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-7/igt@gem_exec_fair@basic-pace@vcs0.html
* igt@gem_lmem_swapping@smem-oom@lmem0:
- shard-dg1: [TIMEOUT][316] ([i915#5493]) -> [PASS][317]
[316]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg1-17/igt@gem_lmem_swapping@smem-oom@lmem0.html
[317]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-13/igt@gem_lmem_swapping@smem-oom@lmem0.html
* igt@gem_workarounds@reset-context:
- shard-dg2: [ABORT][318] ([i915#10387] / [i915#8460]) -> [PASS][319]
[318]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-11/igt@gem_workarounds@reset-context.html
[319]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@gem_workarounds@reset-context.html
* igt@gen9_exec_parse@allowed-all:
- shard-glk: [INCOMPLETE][320] ([i915#5566]) -> [PASS][321]
[320]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-glk6/igt@gen9_exec_parse@allowed-all.html
[321]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk4/igt@gen9_exec_parse@allowed-all.html
* igt@i915_module_load@reload-with-fault-injection:
- shard-rkl: [INCOMPLETE][322] ([i915#9820] / [i915#9849]) -> [PASS][323]
[322]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-1/igt@i915_module_load@reload-with-fault-injection.html
[323]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@i915_module_load@reload-with-fault-injection.html
- shard-snb: [INCOMPLETE][324] ([i915#9849]) -> [PASS][325]
[324]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-snb2/igt@i915_module_load@reload-with-fault-injection.html
[325]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-snb2/igt@i915_module_load@reload-with-fault-injection.html
* igt@i915_pm_rpm@gem-execbuf-stress@extra-wait-lmem0:
- shard-dg2: [ABORT][326] ([i915#10367]) -> [PASS][327]
[326]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-5/igt@i915_pm_rpm@gem-execbuf-stress@extra-wait-lmem0.html
[327]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-2/igt@i915_pm_rpm@gem-execbuf-stress@extra-wait-lmem0.html
- shard-dg1: [ABORT][328] ([i915#10367]) -> [PASS][329] +1 other test pass
[328]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg1-19/igt@i915_pm_rpm@gem-execbuf-stress@extra-wait-lmem0.html
[329]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@i915_pm_rpm@gem-execbuf-stress@extra-wait-lmem0.html
* igt@i915_selftest@live@perf:
- shard-dg1: [INCOMPLETE][330] -> [PASS][331]
[330]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg1-13/igt@i915_selftest@live@perf.html
[331]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-15/igt@i915_selftest@live@perf.html
* igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
- shard-tglu: [FAIL][332] ([i915#3743]) -> [PASS][333]
[332]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-tglu-3/igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html
[333]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-4/igt@kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html
* igt@kms_cursor_legacy@cursora-vs-flipa-toggle:
- shard-dg2: [INCOMPLETE][334] ([i915#9878]) -> [PASS][335]
[334]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-1/igt@kms_cursor_legacy@cursora-vs-flipa-toggle.html
[335]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-1/igt@kms_cursor_legacy@cursora-vs-flipa-toggle.html
* igt@kms_cursor_legacy@cursorb-vs-flipa-legacy:
- shard-snb: [SKIP][336] -> [PASS][337]
[336]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-snb5/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html
[337]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-snb6/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html
* igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size:
- shard-glk: [FAIL][338] ([i915#2346]) -> [PASS][339]
[338]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-glk4/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html
[339]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-glk8/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html
* igt@kms_cursor_legacy@torture-move@pipe-a:
- shard-snb: [DMESG-WARN][340] ([i915#10166]) -> [PASS][341]
[340]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-snb1/igt@kms_cursor_legacy@torture-move@pipe-a.html
[341]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-snb2/igt@kms_cursor_legacy@torture-move@pipe-a.html
* igt@kms_plane@plane-panning-bottom-right-suspend@pipe-a:
- shard-rkl: [FAIL][342] ([i915#10246]) -> [PASS][343]
[342]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-5/igt@kms_plane@plane-panning-bottom-right-suspend@pipe-a.html
[343]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-5/igt@kms_plane@plane-panning-bottom-right-suspend@pipe-a.html
* igt@kms_pm_dc@dc9-dpms:
- shard-tglu: [SKIP][344] ([i915#4281]) -> [PASS][345]
[344]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-tglu-9/igt@kms_pm_dc@dc9-dpms.html
[345]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-6/igt@kms_pm_dc@dc9-dpms.html
* igt@kms_pm_rpm@dpms-lpsp:
- shard-dg2: [SKIP][346] ([i915#9519]) -> [PASS][347]
[346]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-6/igt@kms_pm_rpm@dpms-lpsp.html
[347]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-8/igt@kms_pm_rpm@dpms-lpsp.html
* igt@kms_pm_rpm@modeset-lpsp:
- shard-rkl: [SKIP][348] ([i915#9519]) -> [PASS][349] +2 other tests pass
[348]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-3/igt@kms_pm_rpm@modeset-lpsp.html
[349]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_pm_rpm@modeset-lpsp.html
* igt@kms_rotation_crc@bad-pixel-format:
- shard-rkl: [ABORT][350] ([i915#8875]) -> [PASS][351]
[350]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-5/igt@kms_rotation_crc@bad-pixel-format.html
[351]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-1/igt@kms_rotation_crc@bad-pixel-format.html
* igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1:
- shard-tglu: [FAIL][352] ([i915#9196]) -> [PASS][353]
[352]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-tglu-7/igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1.html
[353]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-tglu-3/igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1.html
* igt@perf_pmu@busy-double-start@rcs0:
- shard-mtlp: [FAIL][354] ([i915#4349]) -> [PASS][355]
[354]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-mtlp-8/igt@perf_pmu@busy-double-start@rcs0.html
[355]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-mtlp-6/igt@perf_pmu@busy-double-start@rcs0.html
#### Warnings ####
* igt@api_intel_bb@render-ccs:
- shard-dg2: [INCOMPLETE][356] -> [FAIL][357] ([i915#10380])
[356]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-10/igt@api_intel_bb@render-ccs.html
[357]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@api_intel_bb@render-ccs.html
* igt@device_reset@unbind-reset-rebind:
- shard-dg1: [INCOMPLETE][358] ([i915#9618]) -> [INCOMPLETE][359] ([i915#9408] / [i915#9618])
[358]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg1-15/igt@device_reset@unbind-reset-rebind.html
[359]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg1-17/igt@device_reset@unbind-reset-rebind.html
* igt@kms_content_protection@type1:
- shard-dg2: [SKIP][360] ([i915#7118] / [i915#7162] / [i915#9424]) -> [SKIP][361] ([i915#7118] / [i915#9424])
[360]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-11/igt@kms_content_protection@type1.html
[361]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-6/igt@kms_content_protection@type1.html
* igt@kms_pm_dc@dc6-dpms:
- shard-rkl: [FAIL][362] ([i915#9295]) -> [SKIP][363] ([i915#3361])
[362]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-5/igt@kms_pm_dc@dc6-dpms.html
[363]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-4/igt@kms_pm_dc@dc6-dpms.html
* igt@kms_pm_dc@dc9-dpms:
- shard-rkl: [SKIP][364] ([i915#4281]) -> [SKIP][365] ([i915#3361])
[364]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-rkl-5/igt@kms_pm_dc@dc9-dpms.html
[365]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-rkl-7/igt@kms_pm_dc@dc9-dpms.html
* igt@kms_psr@psr-primary-blt:
- shard-dg2: [SKIP][366] ([i915#9732]) -> [SKIP][367] ([i915#9673] / [i915#9732]) +3 other tests skip
[366]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-6/igt@kms_psr@psr-primary-blt.html
[367]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-11/igt@kms_psr@psr-primary-blt.html
* igt@kms_psr@psr2-primary-blt:
- shard-dg2: [SKIP][368] ([i915#9673] / [i915#9732]) -> [SKIP][369] ([i915#9732]) +3 other tests skip
[368]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14426/shard-dg2-11/igt@kms_psr@psr2-primary-blt.html
[369]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/shard-dg2-5/igt@kms_psr@psr2-primary-blt.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[IGT#2]: https://gitlab.freedesktop.org/drm/igt-gpu-tools/issues/2
[i915#10055]: https://gitlab.freedesktop.org/drm/intel/issues/10055
[i915#10166]: https://gitlab.freedesktop.org/drm/intel/issues/10166
[i915#10246]: https://gitlab.freedesktop.org/drm/intel/issues/10246
[i915#10278]: https://gitlab.freedesktop.org/drm/intel/issues/10278
[i915#10291]: https://gitlab.freedesktop.org/drm/intel/issues/10291
[i915#10307]: https://gitlab.freedesktop.org/drm/intel/issues/10307
[i915#10367]: https://gitlab.freedesktop.org/drm/intel/issues/10367
[i915#10378]: https://gitlab.freedesktop.org/drm/intel/issues/10378
[i915#10380]: https://gitlab.freedesktop.org/drm/intel/issues/10380
[i915#10387]: https://gitlab.freedesktop.org/drm/intel/issues/10387
[i915#10406]: https://gitlab.freedesktop.org/drm/intel/issues/10406
[i915#1769]: https://gitlab.freedesktop.org/drm/intel/issues/1769
[i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
[i915#1839]: https://gitlab.freedesktop.org/drm/intel/issues/1839
[i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
[i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
[i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437
[i915#2521]: https://gitlab.freedesktop.org/drm/intel/issues/2521
[i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
[i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
[i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
[i915#2658]: https://gitlab.freedesktop.org/drm/intel/issues/2658
[i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
[i915#2705]: https://gitlab.freedesktop.org/drm/intel/issues/2705
[i915#280]: https://gitlab.freedesktop.org/drm/intel/issues/280
[i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
[i915#2846]: https://gitlab.freedesktop.org/drm/intel/issues/2846
[i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856
[i915#3023]: https://gitlab.freedesktop.org/drm/intel/issues/3023
[i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
[i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
[i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291
[i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
[i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
[i915#3361]: https://gitlab.freedesktop.org/drm/intel/issues/3361
[i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
[i915#3469]: https://gitlab.freedesktop.org/drm/intel/issues/3469
[i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
[i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
[i915#3582]: https://gitlab.freedesktop.org/drm/intel/issues/3582
[i915#3591]: https://gitlab.freedesktop.org/drm/intel/issues/3591
[i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637
[i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
[i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
[i915#3742]: https://gitlab.freedesktop.org/drm/intel/issues/3742
[i915#3743]: https://gitlab.freedesktop.org/drm/intel/issues/3743
[i915#3840]: https://gitlab.freedesktop.org/drm/intel/issues/3840
[i915#4036]: https://gitlab.freedesktop.org/drm/intel/issues/4036
[i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
[i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
[i915#4079]: https://gitlab.freedesktop.org/drm/intel/issues/4079
[i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
[i915#4087]: https://gitlab.freedesktop.org/drm/intel/issues/4087
[i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
[i915#4212]: https://gitlab.freedesktop.org/drm/intel/issues/4212
[i915#4213]: https://gitlab.freedesktop.org/drm/intel/issues/4213
[i915#4235]: https://gitlab.freedesktop.org/drm/intel/issues/4235
[i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
[i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
[i915#4348]: https://gitlab.freedesktop.org/drm/intel/issues/4348
[i915#4349]: https://gitlab.freedesktop.org/drm/intel/issues/4349
[i915#4473]: https://gitlab.freedesktop.org/drm/intel/issues/4473
[i915#4537]: https://gitlab.freedesktop.org/drm/intel/issues/4537
[i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
[i915#4565]: https://gitlab.freedesktop.org/drm/intel/issues/4565
[i915#4573]: https://gitlab.freedesktop.org/drm/intel/issues/4573
[i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
[i915#4771]: https://gitlab.freedesktop.org/drm/intel/issues/4771
[i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812
[i915#4816]: https://gitlab.freedesktop.org/drm/intel/issues/4816
[i915#4818]: https://gitlab.freedesktop.org/drm/intel/issues/4818
[i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
[i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
[i915#4873]: https://gitlab.freedesktop.org/drm/intel/issues/4873
[i915#4880]: https://gitlab.freedesktop.org/drm/intel/issues/4880
[i915#4885]: https://gitlab.freedesktop.org/drm/intel/issues/4885
[i915#5107]: https://gitlab.freedesktop.org/drm/intel/issues/5107
[i915#5138]: https://gitlab.freedesktop.org/drm/intel/issues/5138
[i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
[i915#5190]: https://gitlab.freedesktop.org/drm/intel/issues/5190
[i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
[i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
[i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
[i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
[i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493
[i915#5566]: https://gitlab.freedesktop.org/drm/intel/issues/5566
[i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
[i915#5889]: https://gitlab.freedesktop.org/drm/intel/issues/5889
[i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
[i915#6117]: https://gitlab.freedesktop.org/drm/intel/issues/6117
[i915#6187]: https://gitlab.freedesktop.org/drm/intel/issues/6187
[i915#6188]: https://gitlab.freedesktop.org/drm/intel/issues/6188
[i915#6227]: https://gitlab.freedesktop.org/drm/intel/issues/6227
[i915#6301]: https://gitlab.freedesktop.org/drm/intel/issues/6301
[i915#6334]: https://gitlab.freedesktop.org/drm/intel/issues/6334
[i915#6335]: https://gitlab.freedesktop.org/drm/intel/issues/6335
[i915#6344]: https://gitlab.freedesktop.org/drm/intel/issues/6344
[i915#6493]: https://gitlab.freedesktop.org/drm/intel/issues/6493
[i915#6524]: https://gitlab.freedesktop.org/drm/intel/issues/6524
[i915#6590]: https://gitlab.freedesktop.org/drm/intel/issues/6590
[i915#6805]: https://gitlab.freedesktop.org/drm/intel/issues/6805
[i915#6944]: https://gitlab.freedesktop.org/drm/intel/issues/6944
[i915#7091]: https://gitlab.freedesktop.org/drm/intel/issues/7091
[i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116
[i915#7118]: https://gitlab.freedesktop.org/drm/intel/issues/7118
[i915#7162]: https://gitlab.freedesktop.org/drm/intel/issues/7162
[i915#7213]: https://gitlab.freedesktop.org/drm/intel/issues/7213
[i915#7697]: https://gitlab.freedesktop.org/drm/intel/issues/7697
[i915#7701]: https://gitlab.freedesktop.org/drm/intel/issues/7701
[i915#7707]: https://gitlab.freedesktop.org/drm/intel/issues/7707
[i915#7711]: https://gitlab.freedesktop.org/drm/intel/issues/7711
[i915#7790]: https://gitlab.freedesktop.org/drm/intel/issues/7790
[i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
[i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975
[i915#8213]: https://gitlab.freedesktop.org/drm/intel/issues/8213
[i915#8228]: https://gitlab.freedesktop.org/drm/intel/issues/8228
[i915#8292]: https://gitlab.freedesktop.org/drm/intel/issues/8292
[i915#8381]: https://gitlab.freedesktop.org/drm/intel/issues/8381
[i915#8411]: https://gitlab.freedesktop.org/drm/intel/issues/8411
[i915#8414]: https://gitlab.freedesktop.org/drm/intel/issues/8414
[i915#8428]: https://gitlab.freedesktop.org/drm/intel/issues/8428
[i915#8440]: https://gitlab.freedesktop.org/drm/intel/issues/8440
[i915#8460]: https://gitlab.freedesktop.org/drm/intel/issues/8460
[i915#8555]: https://gitlab.freedesktop.org/drm/intel/issues/8555
[i915#8623]: https://gitlab.freedesktop.org/drm/intel/issues/8623
[i915#8708]: https://gitlab.freedesktop.org/drm/intel/issues/8708
[i915#8709]: https://gitlab.freedesktop.org/drm/intel/issues/8709
[i915#8808]: https://gitlab.freedesktop.org/drm/intel/issues/8808
[i915#8812]: https://gitlab.freedesktop.org/drm/intel/issues/8812
[i915#8814]: https://gitlab.freedesktop.org/drm/intel/issues/8814
[i915#8875]: https://gitlab.freedesktop.org/drm/intel/issues/8875
[i915#9010]: https://gitlab.freedesktop.org/drm/intel/issues/9010
[i915#9053]: https://gitlab.freedesktop.org/drm/intel/issues/9053
[i915#9196]: https://gitlab.freedesktop.org/drm/intel/issues/9196
[i915#9295]: https://gitlab.freedesktop.org/drm/intel/issues/9295
[i915#9310]: https://gitlab.freedesktop.org/drm/intel/issues/9310
[i915#9311]: https://gitlab.freedesktop.org/drm/intel/issues/9311
[i915#9323]: https://gitlab.freedesktop.org/drm/intel/issues/9323
[i915#9408]: https://gitlab.freedesktop.org/drm/intel/issues/9408
[i915#9412]: https://gitlab.freedesktop.org/drm/intel/issues/9412
[i915#9423]: https://gitlab.freedesktop.org/drm/intel/issues/9423
[i915#9424]: https://gitlab.freedesktop.org/drm/intel/issues/9424
[i915#9519]: https://gitlab.freedesktop.org/drm/intel/issues/9519
[i915#9531]: https://gitlab.freedesktop.org/drm/intel/issues/9531
[i915#9569]: https://gitlab.freedesktop.org/drm/intel/issues/9569
[i915#9606]: https://gitlab.freedesktop.org/drm/intel/issues/9606
[i915#9618]: https://gitlab.freedesktop.org/drm/intel/issues/9618
[i915#9673]: https://gitlab.freedesktop.org/drm/intel/issues/9673
[i915#9683]: https://gitlab.freedesktop.org/drm/intel/issues/9683
[i915#9685]: https://gitlab.freedesktop.org/drm/intel/issues/9685
[i915#9688]: https://gitlab.freedesktop.org/drm/intel/issues/9688
[i915#9728]: https://gitlab.freedesktop.org/drm/intel/issues/9728
[i915#9732]: https://gitlab.freedesktop.org/drm/intel/issues/9732
[i915#9766]: https://gitlab.freedesktop.org/drm/intel/issues/9766
[i915#9779]: https://gitlab.freedesktop.org/drm/intel/issues/9779
[i915#9808]: https://gitlab.freedesktop.org/drm/intel/issues/9808
[i915#9809]: https://gitlab.freedesktop.org/drm/intel/issues/9809
[i915#9820]: https://gitlab.freedesktop.org/drm/intel/issues/9820
[i915#9833]: https://gitlab.freedesktop.org/drm/intel/issues/9833
[i915#9849]: https://gitlab.freedesktop.org/drm/intel/issues/9849
[i915#9853]: https://gitlab.freedesktop.org/drm/intel/issues/9853
[i915#9878]: https://gitlab.freedesktop.org/drm/intel/issues/9878
[i915#9906]: https://gitlab.freedesktop.org/drm/intel/issues/9906
[i915#9917]: https://gitlab.freedesktop.org/drm/intel/issues/9917
[i915#9934]: https://gitlab.freedesktop.org/drm/intel/issues/9934
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_7759 -> IGTPW_10825
* Piglit: piglit_4509 -> None
CI-20190529: 20190529
CI_DRM_14426: 72f447f984cf5526e6ad32a6e2770124c67d59d3 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_10825: 10825
IGT_7759: 7759
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_10825/index.html
[-- Attachment #2: Type: text/html, Size: 115017 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test
2024-03-13 17:09 ` [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test Louis Chauvet
@ 2024-03-14 17:06 ` Kamil Konieczny
2024-03-15 16:11 ` Louis Chauvet
2024-03-14 17:42 ` Arthur Grillo
2024-03-14 18:44 ` Kamil Konieczny
2 siblings, 1 reply; 17+ messages in thread
From: Kamil Konieczny @ 2024-03-14 17:06 UTC (permalink / raw)
To: igt-dev
Cc: Louis Chauvet, miquel.raynal, jeremie.dautheribes,
thomas.petazzoni, arthurgrillo, Mauro Carvalho Chehab
Hi Louis,
On 2024-03-13 at 18:09:42 +0100, Louis Chauvet wrote:
> The actual kms_rotation_crc test does not tes all the rotation with all
> the formats. Create the test kms_rotation, which only test "full plane
> rotation", but for all formats, planes and rotations.
>
> This allow the detection of issues like in [1], where the YUV rotation is
> not working for specific rotations.
>
> [1]: https://lore.kernel.org/dri-devel/20240304-yuv-v4-11-76beac8e9793@bootlin.com/
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> tests/kms_rotation.c | 444 +++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 2 files changed, 445 insertions(+)
>
> diff --git a/tests/kms_rotation.c b/tests/kms_rotation.c
> new file mode 100644
> index 000000000000..333485619541
> --- /dev/null
> +++ b/tests/kms_rotation.c
> @@ -0,0 +1,444 @@
Please add here SPDX MIT licence.
> +#include "igt.h"
> +
> +/**
> + * TEST: kms_rotation
> + * Category: Display
> + * Description: Tests all rotations for all planes and formats.
> + * Driver requirement: none
------------------------- ^
It is better to not have 'none' as a driver, just drop this line.
+cc Mauro.
Please use checkpatch.pl script from Linux kernel,
it can spot some code style problems (line too long can
be sometimes ignored).
Regards,
Kamil
> + * Functionality: plane, rotation
> + * Mega feature: General Display Features
> + * Test category: functionality test
> + */
> +
> +/**
> + * SUBTEST: rotations
> + * Description: Test for all rotations, planes and formats.
> + */
> +
> +/**
> + * struct data_t - Stores the test configuration
> + *
> + * @fd: file descriptor for the current drm device
> + * @display: display used for the tests
> + * @width, @height: Size of the CRTC used for this test
> + */
> +struct data_t {
> + int fd;
> + igt_display_t display;
> + uint32_t width;
> + uint32_t height;
> +};
> +
> +/**
> + * colors - List of colors used to put things on the plane
> + *
> + * Those colors are used to create a color pattern on the plane, which is not invariant by rotation or reflexion.
> + *
> + * At least black and white must be in this list to properly test black and white formats.
> + */
> +static const struct igt_vec4 colors[] = {
> + {{1.0f, 0.0f, 0.0f, 0.0f}},
> + {{1.0f, 1.0f, 1.0f, 0.0f}},
> + {{0.0f, 0.0f, 0.0f, 0.0f}},
> + {{0.0f, 1.0f, 1.0f, 0.0f}},
> + {{0.0f, 0.0f, 0.0f, 0.0f}},
> +};
> +
> +/**
> + * tested_rotation - List of all tested rotation configuration
> + */
> +static uint32_t tested_rotation[] = {
> + IGT_ROTATION_0,
> + IGT_ROTATION_0 | IGT_REFLECT_X,
> + IGT_ROTATION_0 | IGT_REFLECT_Y,
> + IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_90,
> + IGT_ROTATION_90 | IGT_REFLECT_X,
> + IGT_ROTATION_90 | IGT_REFLECT_Y,
> + IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_180,
> + IGT_ROTATION_180 | IGT_REFLECT_X,
> + IGT_ROTATION_180 | IGT_REFLECT_Y,
> + IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_270,
> + IGT_ROTATION_270 | IGT_REFLECT_X,
> + IGT_ROTATION_270 | IGT_REFLECT_Y,
> + IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y,
> +};
> +
> +/**
> + * non_equals_crc() - Check if at least one CRC is different
> + *
> + * Check if at least one CRC is different, so we can verify that the rendering is working.
> + *
> + * @crcs: List of all tested crcs
> + * @crc_count: Number of crcs in the list
> + */
> +static bool non_equals_crc(igt_crc_t crcs[], int crc_count)
> +{
> + if (!crc_count) {
> + return true;
> + }
> + for (int i = 0; i < crc_count; i++)
> + if (!igt_check_crc_equal(&crcs[i], &crcs[0]))
> + return true;
> + return false;
> +}
> +
> +/**
> + * create_fb() - Create a framebuffer
> + *
> + * This create a framebuffer and fill it with a pattern. This pattern is not invariant by rotation and reflection.
> + *
> + * The @width and @height parameters are automaticaly inverted according to @rotation if needed. If the requested plane
> + * is 1024*768 with IGT_ROTATION_90, the returned plane will have the size 768*1024.
> + *
> + * @data: Current test configuration
> + * @rotation: Rotation to apply to the pattern
> + * @format: Format of the requested plane
> + * @modifier: Modifier for the requested plane
> + * @width, @height: Size of the plane to use (without rotation)
> + * @width: Width of the requested plane
> + * @height: Height of the requested plane
> + * @fb: Place to store the created framebuffer
> + */
> +static void create_fb(struct data_t *data, igt_rotation_t rotation, uint32_t format, uint64_t modifier, int width,
> + int height, igt_fb_t *fb)
> +{
> + int step_x, step_y, color_index, current_n, current_m;
> + int offset_x, offset_y;
> + cairo_t *cr;
> +
> + switch (rotation & IGT_ROTATION_MASK) {
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_270:
> + igt_swap(width, height);
> + break;
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_180:
> + default:
> + break;
> + }
> +
> + igt_create_fb(data->fd, width, height, format, modifier, fb);
> + cr = igt_get_cairo_ctx(data->fd, fb);
> +
> + step_x = (width) / ARRAY_SIZE(colors);
> + step_y = (height) / ARRAY_SIZE(colors);
> +
> + /*
> + * This pair of offset is used to ensure that a software rotated plane is the same as a hardware rotated plane.
> + */
> + switch ((int)rotation) {
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_90 | IGT_REFLECT_X:
> + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + offset_x = 0;
> + break;
> + case IGT_ROTATION_0 | IGT_REFLECT_X:
> + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180:
> + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> + case IGT_ROTATION_270:
> + case IGT_ROTATION_270 | IGT_REFLECT_X:
> + offset_x = width % step_x;
> + break;
> + }
> + switch ((int)rotation) {
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_0 | IGT_REFLECT_X:
> + case IGT_ROTATION_90 | IGT_REFLECT_X:
> + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_270:
> + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> + offset_y = 0;
> + break;
> + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> + case IGT_ROTATION_180:
> + case IGT_ROTATION_180 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + offset_y = height % step_y;
> + break;
> + }
> +
> + /* Iterate over all colors in x and y direction. The pattern is a colored chessboard */
> + for (int n = 0; n < ARRAY_SIZE(colors); n++) {
> + for (int m = 0; m < ARRAY_SIZE(colors); m++) {
> + color_index = (n + m) % ARRAY_SIZE(colors);
> + current_n = n;
> + current_m = m;
> +
> + /*
> + * If a reflexion and a rotation is requested, apply this to the pattern rendering
> + * If a reflexion is given, it must be applied before the rotation.
> + */
> + switch (rotation & IGT_REFLECT_MASK) {
> + case IGT_REFLECT_X:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + break;
> + case IGT_REFLECT_Y:
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_REFLECT_X | IGT_REFLECT_Y:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + }
> + switch (rotation & IGT_ROTATION_MASK) {
> + case IGT_ROTATION_0:
> + break;
> + case IGT_ROTATION_90:
> + igt_swap(current_n, current_m);
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_ROTATION_180:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_ROTATION_270:
> + igt_swap(current_n, current_m);
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + break;
> + }
> +
> + igt_paint_color(cr,
> + offset_x + current_n * step_x,
> + offset_y + current_m * step_y,
> + step_x,
> + step_y,
> + colors[color_index].d[0],
> + colors[color_index].d[1],
> + colors[color_index].d[2]);
> + }
> + }
> +
> + igt_put_cairo_ctx(cr);
> +}
> +
> +/**
> + * get_ref_crcs() - Compute the reference CRC for a specific format
> + *
> + * The rotation are done by create_fb in software.
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @width, @height: Size of the plane to use (without rotation)
> + * @format, @modifier: Format description to test
> + * @ref_crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> + */
> +static void get_ref_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> + int height, uint32_t format, uint64_t modifier, igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)])
> +{
> + drmModeModeInfo *mode;
> + igt_pipe_crc_t *pipe_crc;
> + igt_fb_t fb;
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> +
> +
> + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> + int rotation = tested_rotation[r];
> + igt_debug("Computing reference CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation));
> + /* Configure the pipe for reference frame */
> + igt_display_reset(&data->display);
> +
> + mode = igt_output_get_mode(output);
> + mode->hdisplay = width;
> + mode->vdisplay = height;
> + igt_output_override_mode(output, mode);
> + mode = igt_output_get_mode(output);
> +
> + igt_output_set_pipe(output, pipe);
> + igt_plane_set_rotation(plane, IGT_ROTATION_0);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + /* Start the CRC */
> + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> + igt_pipe_crc_start(pipe_crc);
> +
> + create_fb(data, rotation, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> + igt_plane_set_fb(plane, &fb);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + igt_pipe_crc_get_current(
> + data->display.drm_fd, pipe_crc,
> + &ref_crc[r]);
> +
> + igt_pipe_crc_stop(pipe_crc);
> + igt_pipe_crc_free(pipe_crc);
> + igt_remove_fb(data->fd, &fb);
> + }
> +}
> +
> +/**
> + * get_crcs() - Compute the CRC for a specific format
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @width, @height: Size of the plane to use (without rotation)
> + * @format, @modifier: Format description to test
> + * @crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> + */
> +static void get_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> + int height, uint32_t format, uint64_t modifier, igt_crc_t crc[ARRAY_SIZE(tested_rotation)])
> +{
> + drmModeModeInfo *mode;
> + igt_pipe_crc_t *pipe_crc;
> + igt_fb_t fb;
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> +
> + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> + int rotation = tested_rotation[r];
> + igt_debug("Computing CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation));
> + /* Configure the pipe for reference frame */
> + igt_display_reset(&data->display);
> +
> + mode = igt_output_get_mode(output);
> + mode->hdisplay = width;
> + mode->vdisplay = height;
> + igt_output_override_mode(output, mode);
> + mode = igt_output_get_mode(output);
> +
> + igt_output_set_pipe(output, pipe);
> + igt_plane_set_rotation(plane, rotation);
> +
> + if (!igt_plane_has_rotation(plane, rotation))
> + continue;
> +
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + /* Start the CRC */
> + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> + igt_pipe_crc_start(pipe_crc);
> +
> + create_fb(data, IGT_ROTATION_0, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> + igt_plane_set_fb(plane, &fb);
> + if (igt_rotation_90_or_270(rotation))
> + igt_plane_set_size(plane, fb.height, fb.width);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + igt_pipe_crc_get_current(
> + data->display.drm_fd, pipe_crc,
> + &crc[r]);
> +
> + igt_pipe_crc_stop(pipe_crc);
> + igt_pipe_crc_free(pipe_crc);
> + igt_remove_fb(data->fd, &fb);
> + }
> +}
> +
> +/**
> + * run_test() - Run the subtests for a specific plane
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @format, @modifier: Format description to test
> + */
> +static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, uint32_t format,
> + uint64_t modifier)
> +{
> + int width, height;
> + const struct format_desc_struct *format_description;
> + igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)];
> + igt_crc_t crc[ARRAY_SIZE(tested_rotation)];
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> + /* Check that the rotation is supported */
> + igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
> + format_description = lookup_drm_format(format);
> + width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
> + height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
> +
> + /* Generate reference CRC with software rotation */
> + get_ref_crcs(data, output, pipe, plane, width, height, format, modifier, ref_crc);
> + igt_assert_f(non_equals_crc(ref_crc, ARRAY_SIZE(tested_rotation)), "All the reference CRC are equals.");
> +
> + /* Generate CRC with hardware rotation */
> + get_crcs(data, output, pipe, plane, width, height, format, modifier, crc);
> +
> + for (int c = 0; c < ARRAY_SIZE(tested_rotation); c++) {
> + int rotation = tested_rotation[c];
> + igt_dynamic_f("pipe-%s-format-%s-modifier-%s-rotation-%s-reflect-%s", kmstest_pipe_name(pipe),
> + igt_format_str(format),
> + igt_fb_modifier_name(modifier), igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation)) {
> + igt_assert_crc_equal(&ref_crc[c], &crc[c]);
> + }
> + }
> +}
> +
> +/**
> + * test_all_formats() - Run all the tests for all planes
> + *
> + * @data: Test configuration
> + */
> +static void test_all_formats(struct data_t *data)
> +{
> + enum pipe pipe;
> + struct igt_plane *plane;
> + igt_output_t *output;
> + for_each_pipe_with_single_output(&data->display, pipe, output) {
> + for_each_plane_on_pipe(&data->display, pipe, plane) {
> + for (int f = 0; f < plane->format_mod_count; f++) {
> + uint32_t format = plane->formats[f];
> + uint32_t modifier = plane->modifiers[f];
> +
> + if (!igt_fb_supported_format(format))
> + continue;
> + run_test(data, output, pipe, plane, format, modifier);
> + }
> + }
> + }
> +}
> +
> +static int opt_handler(int opt, int opt_index, void *void_data)
> +{
> + return IGT_OPT_HANDLER_SUCCESS;
> +}
> +
> +static const struct option long_opts[] = {
> + {}
> +};
> +
> +static const char help_str[] = "";
> +
> +static struct data_t global_data;
> +
> +igt_main_args("", long_opts, help_str, opt_handler, &global_data)
> +{
> + igt_fixture {
> + global_data.fd = drm_open_driver_master(DRIVER_ANY);
> +
> + kmstest_set_vt_graphics_mode();
> +
> + igt_display_require(&global_data.display, global_data.fd);
> + igt_require(global_data.display.is_atomic);
> + igt_display_require_output(&global_data.display);
> + igt_display_reset(&global_data.display);
> + }
> +
> + igt_describe("Testing different rotation and reflexions for different formats");
> + igt_subtest_with_dynamic_f("rotations") {
> + test_all_formats(&global_data);
> + }
> +
> +}
> \ No newline at end of file
> diff --git a/tests/meson.build b/tests/meson.build
> index a856510fcea7..71b628b86e96 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -82,6 +82,7 @@ test_progs = [
> 'tools_test',
> 'vgem_basic',
> 'vgem_slow',
> + 'kms_rotation',
> ]
>
> intel_i915_xe_progs = [
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test
2024-03-13 17:09 ` [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test Louis Chauvet
2024-03-14 17:06 ` Kamil Konieczny
@ 2024-03-14 17:42 ` Arthur Grillo
2024-03-15 16:11 ` Louis Chauvet
2024-03-14 18:44 ` Kamil Konieczny
2 siblings, 1 reply; 17+ messages in thread
From: Arthur Grillo @ 2024-03-14 17:42 UTC (permalink / raw)
To: Louis Chauvet, igt-dev
Cc: miquel.raynal, jeremie.dautheribes, thomas.petazzoni
On 13/03/24 14:09, Louis Chauvet wrote:
> The actual kms_rotation_crc test does not tes all the rotation with all
> the formats. Create the test kms_rotation, which only test "full plane
> rotation", but for all formats, planes and rotations.
>
> This allow the detection of issues like in [1], where the YUV rotation is
> not working for specific rotations.
>
> [1]: https://lore.kernel.org/dri-devel/20240304-yuv-v4-11-76beac8e9793@bootlin.com/
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> tests/kms_rotation.c | 444 +++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 2 files changed, 445 insertions(+)
>
> diff --git a/tests/kms_rotation.c b/tests/kms_rotation.c
> new file mode 100644
> index 000000000000..333485619541
> --- /dev/null
> +++ b/tests/kms_rotation.c
> @@ -0,0 +1,444 @@
> +#include "igt.h"
> +
> +/**
> + * TEST: kms_rotation
> + * Category: Display
> + * Description: Tests all rotations for all planes and formats.
> + * Driver requirement: none
> + * Functionality: plane, rotation
> + * Mega feature: General Display Features
> + * Test category: functionality test
> + */
> +
> +/**
> + * SUBTEST: rotations
> + * Description: Test for all rotations, planes and formats.
> + */
> +
> +/**
> + * struct data_t - Stores the test configuration
> + *
> + * @fd: file descriptor for the current drm device
> + * @display: display used for the tests
> + * @width, @height: Size of the CRTC used for this test
> + */
> +struct data_t {
> + int fd;
> + igt_display_t display;
> + uint32_t width;
> + uint32_t height;
> +};
> +
> +/**
> + * colors - List of colors used to put things on the plane
> + *
> + * Those colors are used to create a color pattern on the plane, which is not invariant by rotation or reflexion.
> + *
> + * At least black and white must be in this list to properly test black and white formats.
> + */
> +static const struct igt_vec4 colors[] = {
> + {{1.0f, 0.0f, 0.0f, 0.0f}},
> + {{1.0f, 1.0f, 1.0f, 0.0f}},
> + {{0.0f, 0.0f, 0.0f, 0.0f}},
> + {{0.0f, 1.0f, 1.0f, 0.0f}},
> + {{0.0f, 0.0f, 0.0f, 0.0f}},
> +};
> +
> +/**
> + * tested_rotation - List of all tested rotation configuration
> + */
> +static uint32_t tested_rotation[] = {
> + IGT_ROTATION_0,
> + IGT_ROTATION_0 | IGT_REFLECT_X,
> + IGT_ROTATION_0 | IGT_REFLECT_Y,
> + IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_90,
> + IGT_ROTATION_90 | IGT_REFLECT_X,
> + IGT_ROTATION_90 | IGT_REFLECT_Y,
> + IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_180,
> + IGT_ROTATION_180 | IGT_REFLECT_X,
> + IGT_ROTATION_180 | IGT_REFLECT_Y,
> + IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_270,
> + IGT_ROTATION_270 | IGT_REFLECT_X,
> + IGT_ROTATION_270 | IGT_REFLECT_Y,
> + IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y,
> +};
> +
> +/**
> + * non_equals_crc() - Check if at least one CRC is different
> + *
> + * Check if at least one CRC is different, so we can verify that the rendering is working.
> + *
> + * @crcs: List of all tested crcs
> + * @crc_count: Number of crcs in the list
> + */
> +static bool non_equals_crc(igt_crc_t crcs[], int crc_count)
> +{
> + if (!crc_count) {
> + return true;
> + }
> + for (int i = 0; i < crc_count; i++)
> + if (!igt_check_crc_equal(&crcs[i], &crcs[0]))
> + return true;
> + return false;
> +}
> +
> +/**
> + * create_fb() - Create a framebuffer
> + *
> + * This create a framebuffer and fill it with a pattern. This pattern is not invariant by rotation and reflection.
> + *
> + * The @width and @height parameters are automaticaly inverted according to @rotation if needed. If the requested plane
> + * is 1024*768 with IGT_ROTATION_90, the returned plane will have the size 768*1024.
> + *
> + * @data: Current test configuration
> + * @rotation: Rotation to apply to the pattern
> + * @format: Format of the requested plane
> + * @modifier: Modifier for the requested plane
> + * @width, @height: Size of the plane to use (without rotation)
> + * @width: Width of the requested plane
> + * @height: Height of the requested plane
> + * @fb: Place to store the created framebuffer
> + */
> +static void create_fb(struct data_t *data, igt_rotation_t rotation, uint32_t format, uint64_t modifier, int width,
> + int height, igt_fb_t *fb)
> +{
> + int step_x, step_y, color_index, current_n, current_m;
> + int offset_x, offset_y;
> + cairo_t *cr;
> +
> + switch (rotation & IGT_ROTATION_MASK) {
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_270:
> + igt_swap(width, height);
> + break;
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_180:
> + default:
> + break;
> + }
> +
> + igt_create_fb(data->fd, width, height, format, modifier, fb);
> + cr = igt_get_cairo_ctx(data->fd, fb);
> +
> + step_x = (width) / ARRAY_SIZE(colors);
> + step_y = (height) / ARRAY_SIZE(colors);
> +
> + /*
> + * This pair of offset is used to ensure that a software rotated plane is the same as a hardware rotated plane.
> + */
> + switch ((int)rotation) {
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_90 | IGT_REFLECT_X:
> + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + offset_x = 0;
> + break;
> + case IGT_ROTATION_0 | IGT_REFLECT_X:
> + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180:
> + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> + case IGT_ROTATION_270:
> + case IGT_ROTATION_270 | IGT_REFLECT_X:
> + offset_x = width % step_x;
> + break;
> + }
> + switch ((int)rotation) {
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_0 | IGT_REFLECT_X:
> + case IGT_ROTATION_90 | IGT_REFLECT_X:
> + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_270:
> + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> + offset_y = 0;
> + break;
> + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> + case IGT_ROTATION_180:
> + case IGT_ROTATION_180 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + offset_y = height % step_y;
> + break;
> + }
> +
> + /* Iterate over all colors in x and y direction. The pattern is a colored chessboard */
> + for (int n = 0; n < ARRAY_SIZE(colors); n++) {
> + for (int m = 0; m < ARRAY_SIZE(colors); m++) {
> + color_index = (n + m) % ARRAY_SIZE(colors);
> + current_n = n;
> + current_m = m;
> +
> + /*
> + * If a reflexion and a rotation is requested, apply this to the pattern rendering
> + * If a reflexion is given, it must be applied before the rotation.
> + */
> + switch (rotation & IGT_REFLECT_MASK) {
> + case IGT_REFLECT_X:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + break;
> + case IGT_REFLECT_Y:
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_REFLECT_X | IGT_REFLECT_Y:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + }
> + switch (rotation & IGT_ROTATION_MASK) {
> + case IGT_ROTATION_0:
> + break;
> + case IGT_ROTATION_90:
> + igt_swap(current_n, current_m);
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_ROTATION_180:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_ROTATION_270:
> + igt_swap(current_n, current_m);
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + break;
> + }
> +
> + igt_paint_color(cr,
> + offset_x + current_n * step_x,
> + offset_y + current_m * step_y,
> + step_x,
> + step_y,
> + colors[color_index].d[0],
> + colors[color_index].d[1],
> + colors[color_index].d[2]);
> + }
> + }
Couldn't all this be done with a igt_create_fb_pattern() and an
cairo_rotate()?
> +
> + igt_put_cairo_ctx(cr);
> +}
> +
> +/**
> + * get_ref_crcs() - Compute the reference CRC for a specific format
> + *
> + * The rotation are done by create_fb in software.
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @width, @height: Size of the plane to use (without rotation)
> + * @format, @modifier: Format description to test
> + * @ref_crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> + */
> +static void get_ref_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> + int height, uint32_t format, uint64_t modifier, igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)])
> +{
> + drmModeModeInfo *mode;
> + igt_pipe_crc_t *pipe_crc;
> + igt_fb_t fb;
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> +
> +
> + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> + int rotation = tested_rotation[r];
> + igt_debug("Computing reference CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation));
> + /* Configure the pipe for reference frame */
> + igt_display_reset(&data->display);
> +
> + mode = igt_output_get_mode(output);
> + mode->hdisplay = width;
> + mode->vdisplay = height;
> + igt_output_override_mode(output, mode);
> + mode = igt_output_get_mode(output);
> +
> + igt_output_set_pipe(output, pipe);
> + igt_plane_set_rotation(plane, IGT_ROTATION_0);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + /* Start the CRC */
> + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> + igt_pipe_crc_start(pipe_crc);
> +
> + create_fb(data, rotation, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> + igt_plane_set_fb(plane, &fb);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + igt_pipe_crc_get_current(
> + data->display.drm_fd, pipe_crc,
> + &ref_crc[r]);
> +
> + igt_pipe_crc_stop(pipe_crc);
> + igt_pipe_crc_free(pipe_crc);
> + igt_remove_fb(data->fd, &fb);
> + }
> +}
> +
> +/**
> + * get_crcs() - Compute the CRC for a specific format
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @width, @height: Size of the plane to use (without rotation)
> + * @format, @modifier: Format description to test
> + * @crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> + */
> +static void get_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> + int height, uint32_t format, uint64_t modifier, igt_crc_t crc[ARRAY_SIZE(tested_rotation)])
> +{
> + drmModeModeInfo *mode;
> + igt_pipe_crc_t *pipe_crc;
> + igt_fb_t fb;
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> +
> + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> + int rotation = tested_rotation[r];
> + igt_debug("Computing CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation));
> + /* Configure the pipe for reference frame */
> + igt_display_reset(&data->display);
> +
> + mode = igt_output_get_mode(output);
> + mode->hdisplay = width;
> + mode->vdisplay = height;
> + igt_output_override_mode(output, mode);
> + mode = igt_output_get_mode(output);
> +
> + igt_output_set_pipe(output, pipe);
> + igt_plane_set_rotation(plane, rotation);
> +
> + if (!igt_plane_has_rotation(plane, rotation))
> + continue;
> +
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + /* Start the CRC */
> + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> + igt_pipe_crc_start(pipe_crc);
> +
> + create_fb(data, IGT_ROTATION_0, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> + igt_plane_set_fb(plane, &fb);
> + if (igt_rotation_90_or_270(rotation))
> + igt_plane_set_size(plane, fb.height, fb.width);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + igt_pipe_crc_get_current(
> + data->display.drm_fd, pipe_crc,
> + &crc[r]);
> +
> + igt_pipe_crc_stop(pipe_crc);
> + igt_pipe_crc_free(pipe_crc);
> + igt_remove_fb(data->fd, &fb);
> + }
> +}
> +
> +/**
> + * run_test() - Run the subtests for a specific plane
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @format, @modifier: Format description to test
> + */
> +static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, uint32_t format,
> + uint64_t modifier)
> +{
> + int width, height;
> + const struct format_desc_struct *format_description;
> + igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)];
> + igt_crc_t crc[ARRAY_SIZE(tested_rotation)];
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> + /* Check that the rotation is supported */
> + igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
> + format_description = lookup_drm_format(format);
> + width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
> + height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
What's going on here?
> +
> + /* Generate reference CRC with software rotation */
> + get_ref_crcs(data, output, pipe, plane, width, height, format, modifier, ref_crc);
> + igt_assert_f(non_equals_crc(ref_crc, ARRAY_SIZE(tested_rotation)), "All the reference CRC are equals.");
> +
> + /* Generate CRC with hardware rotation */
> + get_crcs(data, output, pipe, plane, width, height, format, modifier, crc);
> +
> + for (int c = 0; c < ARRAY_SIZE(tested_rotation); c++) {
> + int rotation = tested_rotation[c];
> + igt_dynamic_f("pipe-%s-format-%s-modifier-%s-rotation-%s-reflect-%s", kmstest_pipe_name(pipe),
> + igt_format_str(format),
> + igt_fb_modifier_name(modifier), igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation)) {
> + igt_assert_crc_equal(&ref_crc[c], &crc[c]);
> + }
> + }
> +}
> +
> +/**
> + * test_all_formats() - Run all the tests for all planes
> + *
> + * @data: Test configuration
> + */
> +static void test_all_formats(struct data_t *data)
> +{
> + enum pipe pipe;
> + struct igt_plane *plane;
> + igt_output_t *output;
> + for_each_pipe_with_single_output(&data->display, pipe, output) {
> + for_each_plane_on_pipe(&data->display, pipe, plane) {
> + for (int f = 0; f < plane->format_mod_count; f++) {
> + uint32_t format = plane->formats[f];
> + uint32_t modifier = plane->modifiers[f];
> +
> + if (!igt_fb_supported_format(format))
> + continue;
> + run_test(data, output, pipe, plane, format, modifier);
> + }
> + }
> + }
> +}
> +
> +static int opt_handler(int opt, int opt_index, void *void_data)
> +{
> + return IGT_OPT_HANDLER_SUCCESS;
> +}
> +
> +static const struct option long_opts[] = {
> + {}
> +};
> +
> +static const char help_str[] = "";
> +
> +static struct data_t global_data;
> +
> +igt_main_args("", long_opts, help_str, opt_handler, &global_data)
Maybe use igt_main?
Best Regards,
~Arthur Grillo
> +{
> + igt_fixture {
> + global_data.fd = drm_open_driver_master(DRIVER_ANY);
> +
> + kmstest_set_vt_graphics_mode();
> +
> + igt_display_require(&global_data.display, global_data.fd);
> + igt_require(global_data.display.is_atomic);
> + igt_display_require_output(&global_data.display);
> + igt_display_reset(&global_data.display);
> + }
> +
> + igt_describe("Testing different rotation and reflexions for different formats");
> + igt_subtest_with_dynamic_f("rotations") {
> + test_all_formats(&global_data);
> + }
> +
> +}
> \ No newline at end of file
> diff --git a/tests/meson.build b/tests/meson.build
> index a856510fcea7..71b628b86e96 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -82,6 +82,7 @@ test_progs = [
> 'tools_test',
> 'vgem_basic',
> 'vgem_slow',
> + 'kms_rotation',
> ]
>
> intel_i915_xe_progs = [
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test
2024-03-13 17:09 ` [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test Louis Chauvet
2024-03-14 17:06 ` Kamil Konieczny
2024-03-14 17:42 ` Arthur Grillo
@ 2024-03-14 18:44 ` Kamil Konieczny
2 siblings, 0 replies; 17+ messages in thread
From: Kamil Konieczny @ 2024-03-14 18:44 UTC (permalink / raw)
To: igt-dev
Cc: Louis Chauvet, miquel.raynal, jeremie.dautheribes,
thomas.petazzoni, arthurgrillo
Hi Louis,
On 2024-03-13 at 18:09:42 +0100, Louis Chauvet wrote:
> The actual kms_rotation_crc test does not tes all the rotation with all
> the formats. Create the test kms_rotation, which only test "full plane
> rotation", but for all formats, planes and rotations.
>
> This allow the detection of issues like in [1], where the YUV rotation is
> not working for specific rotations.
>
> [1]: https://lore.kernel.org/dri-devel/20240304-yuv-v4-11-76beac8e9793@bootlin.com/
>
One more nit for meson.build, see below.
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> tests/kms_rotation.c | 444 +++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 2 files changed, 445 insertions(+)
>
> diff --git a/tests/kms_rotation.c b/tests/kms_rotation.c
> new file mode 100644
> index 000000000000..333485619541
> --- /dev/null
> +++ b/tests/kms_rotation.c
> @@ -0,0 +1,444 @@
> +#include "igt.h"
> +
> +/**
> + * TEST: kms_rotation
> + * Category: Display
> + * Description: Tests all rotations for all planes and formats.
> + * Driver requirement: none
> + * Functionality: plane, rotation
> + * Mega feature: General Display Features
> + * Test category: functionality test
> + */
> +
> +/**
> + * SUBTEST: rotations
> + * Description: Test for all rotations, planes and formats.
> + */
> +
> +/**
> + * struct data_t - Stores the test configuration
> + *
> + * @fd: file descriptor for the current drm device
> + * @display: display used for the tests
> + * @width, @height: Size of the CRTC used for this test
> + */
> +struct data_t {
> + int fd;
> + igt_display_t display;
> + uint32_t width;
> + uint32_t height;
> +};
> +
> +/**
> + * colors - List of colors used to put things on the plane
> + *
> + * Those colors are used to create a color pattern on the plane, which is not invariant by rotation or reflexion.
> + *
> + * At least black and white must be in this list to properly test black and white formats.
> + */
> +static const struct igt_vec4 colors[] = {
> + {{1.0f, 0.0f, 0.0f, 0.0f}},
> + {{1.0f, 1.0f, 1.0f, 0.0f}},
> + {{0.0f, 0.0f, 0.0f, 0.0f}},
> + {{0.0f, 1.0f, 1.0f, 0.0f}},
> + {{0.0f, 0.0f, 0.0f, 0.0f}},
> +};
> +
> +/**
> + * tested_rotation - List of all tested rotation configuration
> + */
> +static uint32_t tested_rotation[] = {
> + IGT_ROTATION_0,
> + IGT_ROTATION_0 | IGT_REFLECT_X,
> + IGT_ROTATION_0 | IGT_REFLECT_Y,
> + IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_90,
> + IGT_ROTATION_90 | IGT_REFLECT_X,
> + IGT_ROTATION_90 | IGT_REFLECT_Y,
> + IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_180,
> + IGT_ROTATION_180 | IGT_REFLECT_X,
> + IGT_ROTATION_180 | IGT_REFLECT_Y,
> + IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y,
> + IGT_ROTATION_270,
> + IGT_ROTATION_270 | IGT_REFLECT_X,
> + IGT_ROTATION_270 | IGT_REFLECT_Y,
> + IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y,
> +};
> +
> +/**
> + * non_equals_crc() - Check if at least one CRC is different
> + *
> + * Check if at least one CRC is different, so we can verify that the rendering is working.
> + *
> + * @crcs: List of all tested crcs
> + * @crc_count: Number of crcs in the list
> + */
> +static bool non_equals_crc(igt_crc_t crcs[], int crc_count)
> +{
> + if (!crc_count) {
> + return true;
> + }
> + for (int i = 0; i < crc_count; i++)
> + if (!igt_check_crc_equal(&crcs[i], &crcs[0]))
> + return true;
> + return false;
> +}
> +
> +/**
> + * create_fb() - Create a framebuffer
> + *
> + * This create a framebuffer and fill it with a pattern. This pattern is not invariant by rotation and reflection.
> + *
> + * The @width and @height parameters are automaticaly inverted according to @rotation if needed. If the requested plane
> + * is 1024*768 with IGT_ROTATION_90, the returned plane will have the size 768*1024.
> + *
> + * @data: Current test configuration
> + * @rotation: Rotation to apply to the pattern
> + * @format: Format of the requested plane
> + * @modifier: Modifier for the requested plane
> + * @width, @height: Size of the plane to use (without rotation)
> + * @width: Width of the requested plane
> + * @height: Height of the requested plane
> + * @fb: Place to store the created framebuffer
> + */
> +static void create_fb(struct data_t *data, igt_rotation_t rotation, uint32_t format, uint64_t modifier, int width,
> + int height, igt_fb_t *fb)
> +{
> + int step_x, step_y, color_index, current_n, current_m;
> + int offset_x, offset_y;
> + cairo_t *cr;
> +
> + switch (rotation & IGT_ROTATION_MASK) {
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_270:
> + igt_swap(width, height);
> + break;
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_180:
> + default:
> + break;
> + }
> +
> + igt_create_fb(data->fd, width, height, format, modifier, fb);
> + cr = igt_get_cairo_ctx(data->fd, fb);
> +
> + step_x = (width) / ARRAY_SIZE(colors);
> + step_y = (height) / ARRAY_SIZE(colors);
> +
> + /*
> + * This pair of offset is used to ensure that a software rotated plane is the same as a hardware rotated plane.
> + */
> + switch ((int)rotation) {
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_90 | IGT_REFLECT_X:
> + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + offset_x = 0;
> + break;
> + case IGT_ROTATION_0 | IGT_REFLECT_X:
> + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180:
> + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> + case IGT_ROTATION_270:
> + case IGT_ROTATION_270 | IGT_REFLECT_X:
> + offset_x = width % step_x;
> + break;
> + }
> + switch ((int)rotation) {
> + case IGT_ROTATION_0:
> + case IGT_ROTATION_0 | IGT_REFLECT_X:
> + case IGT_ROTATION_90 | IGT_REFLECT_X:
> + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_270:
> + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> + offset_y = 0;
> + break;
> + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + case IGT_ROTATION_90:
> + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> + case IGT_ROTATION_180:
> + case IGT_ROTATION_180 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_X:
> + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> + offset_y = height % step_y;
> + break;
> + }
> +
> + /* Iterate over all colors in x and y direction. The pattern is a colored chessboard */
> + for (int n = 0; n < ARRAY_SIZE(colors); n++) {
> + for (int m = 0; m < ARRAY_SIZE(colors); m++) {
> + color_index = (n + m) % ARRAY_SIZE(colors);
> + current_n = n;
> + current_m = m;
> +
> + /*
> + * If a reflexion and a rotation is requested, apply this to the pattern rendering
> + * If a reflexion is given, it must be applied before the rotation.
> + */
> + switch (rotation & IGT_REFLECT_MASK) {
> + case IGT_REFLECT_X:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + break;
> + case IGT_REFLECT_Y:
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_REFLECT_X | IGT_REFLECT_Y:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + }
> + switch (rotation & IGT_ROTATION_MASK) {
> + case IGT_ROTATION_0:
> + break;
> + case IGT_ROTATION_90:
> + igt_swap(current_n, current_m);
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_ROTATION_180:
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> + break;
> + case IGT_ROTATION_270:
> + igt_swap(current_n, current_m);
> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> + break;
> + }
> +
> + igt_paint_color(cr,
> + offset_x + current_n * step_x,
> + offset_y + current_m * step_y,
> + step_x,
> + step_y,
> + colors[color_index].d[0],
> + colors[color_index].d[1],
> + colors[color_index].d[2]);
> + }
> + }
> +
> + igt_put_cairo_ctx(cr);
> +}
> +
> +/**
> + * get_ref_crcs() - Compute the reference CRC for a specific format
> + *
> + * The rotation are done by create_fb in software.
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @width, @height: Size of the plane to use (without rotation)
> + * @format, @modifier: Format description to test
> + * @ref_crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> + */
> +static void get_ref_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> + int height, uint32_t format, uint64_t modifier, igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)])
> +{
> + drmModeModeInfo *mode;
> + igt_pipe_crc_t *pipe_crc;
> + igt_fb_t fb;
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> +
> +
> + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> + int rotation = tested_rotation[r];
> + igt_debug("Computing reference CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation));
> + /* Configure the pipe for reference frame */
> + igt_display_reset(&data->display);
> +
> + mode = igt_output_get_mode(output);
> + mode->hdisplay = width;
> + mode->vdisplay = height;
> + igt_output_override_mode(output, mode);
> + mode = igt_output_get_mode(output);
> +
> + igt_output_set_pipe(output, pipe);
> + igt_plane_set_rotation(plane, IGT_ROTATION_0);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + /* Start the CRC */
> + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> + igt_pipe_crc_start(pipe_crc);
> +
> + create_fb(data, rotation, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> + igt_plane_set_fb(plane, &fb);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + igt_pipe_crc_get_current(
> + data->display.drm_fd, pipe_crc,
> + &ref_crc[r]);
> +
> + igt_pipe_crc_stop(pipe_crc);
> + igt_pipe_crc_free(pipe_crc);
> + igt_remove_fb(data->fd, &fb);
> + }
> +}
> +
> +/**
> + * get_crcs() - Compute the CRC for a specific format
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @width, @height: Size of the plane to use (without rotation)
> + * @format, @modifier: Format description to test
> + * @crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> + */
> +static void get_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> + int height, uint32_t format, uint64_t modifier, igt_crc_t crc[ARRAY_SIZE(tested_rotation)])
> +{
> + drmModeModeInfo *mode;
> + igt_pipe_crc_t *pipe_crc;
> + igt_fb_t fb;
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> +
> + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> + int rotation = tested_rotation[r];
> + igt_debug("Computing CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation));
> + /* Configure the pipe for reference frame */
> + igt_display_reset(&data->display);
> +
> + mode = igt_output_get_mode(output);
> + mode->hdisplay = width;
> + mode->vdisplay = height;
> + igt_output_override_mode(output, mode);
> + mode = igt_output_get_mode(output);
> +
> + igt_output_set_pipe(output, pipe);
> + igt_plane_set_rotation(plane, rotation);
> +
> + if (!igt_plane_has_rotation(plane, rotation))
> + continue;
> +
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + /* Start the CRC */
> + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> + igt_pipe_crc_start(pipe_crc);
> +
> + create_fb(data, IGT_ROTATION_0, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> + igt_plane_set_fb(plane, &fb);
> + if (igt_rotation_90_or_270(rotation))
> + igt_plane_set_size(plane, fb.height, fb.width);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + igt_pipe_crc_get_current(
> + data->display.drm_fd, pipe_crc,
> + &crc[r]);
> +
> + igt_pipe_crc_stop(pipe_crc);
> + igt_pipe_crc_free(pipe_crc);
> + igt_remove_fb(data->fd, &fb);
> + }
> +}
> +
> +/**
> + * run_test() - Run the subtests for a specific plane
> + *
> + * @data: Test configuration
> + * @output, @pipe, @plane: Plane to use for the test
> + * @format, @modifier: Format description to test
> + */
> +static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, uint32_t format,
> + uint64_t modifier)
> +{
> + int width, height;
> + const struct format_desc_struct *format_description;
> + igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)];
> + igt_crc_t crc[ARRAY_SIZE(tested_rotation)];
> +
> + igt_display_reset(&data->display);
> + igt_output_set_pipe(output, pipe);
> + /* Check that the rotation is supported */
> + igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
> + format_description = lookup_drm_format(format);
> + width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
> + height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
> +
> + /* Generate reference CRC with software rotation */
> + get_ref_crcs(data, output, pipe, plane, width, height, format, modifier, ref_crc);
> + igt_assert_f(non_equals_crc(ref_crc, ARRAY_SIZE(tested_rotation)), "All the reference CRC are equals.");
> +
> + /* Generate CRC with hardware rotation */
> + get_crcs(data, output, pipe, plane, width, height, format, modifier, crc);
> +
> + for (int c = 0; c < ARRAY_SIZE(tested_rotation); c++) {
> + int rotation = tested_rotation[c];
> + igt_dynamic_f("pipe-%s-format-%s-modifier-%s-rotation-%s-reflect-%s", kmstest_pipe_name(pipe),
> + igt_format_str(format),
> + igt_fb_modifier_name(modifier), igt_plane_rotation_name(rotation),
> + igt_plane_reflect_name(rotation)) {
> + igt_assert_crc_equal(&ref_crc[c], &crc[c]);
> + }
> + }
> +}
> +
> +/**
> + * test_all_formats() - Run all the tests for all planes
> + *
> + * @data: Test configuration
> + */
> +static void test_all_formats(struct data_t *data)
> +{
> + enum pipe pipe;
> + struct igt_plane *plane;
> + igt_output_t *output;
> + for_each_pipe_with_single_output(&data->display, pipe, output) {
> + for_each_plane_on_pipe(&data->display, pipe, plane) {
> + for (int f = 0; f < plane->format_mod_count; f++) {
> + uint32_t format = plane->formats[f];
> + uint32_t modifier = plane->modifiers[f];
> +
> + if (!igt_fb_supported_format(format))
> + continue;
> + run_test(data, output, pipe, plane, format, modifier);
> + }
> + }
> + }
> +}
> +
> +static int opt_handler(int opt, int opt_index, void *void_data)
> +{
> + return IGT_OPT_HANDLER_SUCCESS;
> +}
> +
> +static const struct option long_opts[] = {
> + {}
> +};
> +
> +static const char help_str[] = "";
> +
> +static struct data_t global_data;
> +
> +igt_main_args("", long_opts, help_str, opt_handler, &global_data)
> +{
> + igt_fixture {
> + global_data.fd = drm_open_driver_master(DRIVER_ANY);
> +
> + kmstest_set_vt_graphics_mode();
> +
> + igt_display_require(&global_data.display, global_data.fd);
> + igt_require(global_data.display.is_atomic);
> + igt_display_require_output(&global_data.display);
> + igt_display_reset(&global_data.display);
> + }
> +
> + igt_describe("Testing different rotation and reflexions for different formats");
> + igt_subtest_with_dynamic_f("rotations") {
> + test_all_formats(&global_data);
> + }
> +
> +}
> \ No newline at end of file
> diff --git a/tests/meson.build b/tests/meson.build
> index a856510fcea7..71b628b86e96 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -82,6 +82,7 @@ test_progs = [
> 'tools_test',
> 'vgem_basic',
> 'vgem_slow',
---- ^
> + 'kms_rotation',
-----^
Put this in alphabetical order, before kms_rotation_crc
Regards,
Kamil
> ]
>
> intel_i915_xe_progs = [
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test
2024-03-14 17:06 ` Kamil Konieczny
@ 2024-03-15 16:11 ` Louis Chauvet
0 siblings, 0 replies; 17+ messages in thread
From: Louis Chauvet @ 2024-03-15 16:11 UTC (permalink / raw)
To: Kamil Konieczny, igt-dev, miquel.raynal, jeremie.dautheribes,
thomas.petazzoni, arthurgrillo, Mauro Carvalho Chehab
Le 14/03/24 - 18:06, Kamil Konieczny a écrit :
> Hi Louis,
> On 2024-03-13 at 18:09:42 +0100, Louis Chauvet wrote:
> > The actual kms_rotation_crc test does not tes all the rotation with all
> > the formats. Create the test kms_rotation, which only test "full plane
> > rotation", but for all formats, planes and rotations.
> >
> > This allow the detection of issues like in [1], where the YUV rotation is
> > not working for specific rotations.
> >
> > [1]: https://lore.kernel.org/dri-devel/20240304-yuv-v4-11-76beac8e9793@bootlin.com/
> >
> > Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> > ---
> > tests/kms_rotation.c | 444 +++++++++++++++++++++++++++++++++++++++++++++++++++
> > tests/meson.build | 1 +
> > 2 files changed, 445 insertions(+)
> >
> > diff --git a/tests/kms_rotation.c b/tests/kms_rotation.c
> > new file mode 100644
> > index 000000000000..333485619541
> > --- /dev/null
> > +++ b/tests/kms_rotation.c
> > @@ -0,0 +1,444 @@
Hi Kamil,
> Please add here SPDX MIT licence.
I did not know that was needed, I will add it for the v3.
(Same for the nit in meson.build, I will send a v3 in aphabetical order)
> > +#include "igt.h"
> > +
> > +/**
> > + * TEST: kms_rotation
> > + * Category: Display
> > + * Description: Tests all rotations for all planes and formats.
> > + * Driver requirement: none
> ------------------------- ^
> It is better to not have 'none' as a driver, just drop this line.
I will remove it for the v3.
> +cc Mauro.
>
> Please use checkpatch.pl script from Linux kernel,
> it can spot some code style problems (line too long can
> be sometimes ignored).
Sorry for that, it was not explained in CONTRIBUTING.md. I created a
series [1] to add it in the CONTRIBUTING.md file.
Kind regards,
Louis Chauvet
[1]: https://lore.kernel.org/all/20240315-add_coding_style-v1-1-50ad93cfa250@bootlin.com/
> Regards,
> Kamil
>
> > + * Functionality: plane, rotation
> > + * Mega feature: General Display Features
> > + * Test category: functionality test
> > + */
> > +
> > +/**
> > + * SUBTEST: rotations
> > + * Description: Test for all rotations, planes and formats.
> > + */
> > +
> > +/**
> > + * struct data_t - Stores the test configuration
> > + *
> > + * @fd: file descriptor for the current drm device
> > + * @display: display used for the tests
> > + * @width, @height: Size of the CRTC used for this test
> > + */
> > +struct data_t {
> > + int fd;
> > + igt_display_t display;
> > + uint32_t width;
> > + uint32_t height;
> > +};
> > +
> > +/**
> > + * colors - List of colors used to put things on the plane
> > + *
> > + * Those colors are used to create a color pattern on the plane, which is not invariant by rotation or reflexion.
> > + *
> > + * At least black and white must be in this list to properly test black and white formats.
> > + */
> > +static const struct igt_vec4 colors[] = {
> > + {{1.0f, 0.0f, 0.0f, 0.0f}},
> > + {{1.0f, 1.0f, 1.0f, 0.0f}},
> > + {{0.0f, 0.0f, 0.0f, 0.0f}},
> > + {{0.0f, 1.0f, 1.0f, 0.0f}},
> > + {{0.0f, 0.0f, 0.0f, 0.0f}},
> > +};
> > +
> > +/**
> > + * tested_rotation - List of all tested rotation configuration
> > + */
> > +static uint32_t tested_rotation[] = {
> > + IGT_ROTATION_0,
> > + IGT_ROTATION_0 | IGT_REFLECT_X,
> > + IGT_ROTATION_0 | IGT_REFLECT_Y,
> > + IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y,
> > + IGT_ROTATION_90,
> > + IGT_ROTATION_90 | IGT_REFLECT_X,
> > + IGT_ROTATION_90 | IGT_REFLECT_Y,
> > + IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y,
> > + IGT_ROTATION_180,
> > + IGT_ROTATION_180 | IGT_REFLECT_X,
> > + IGT_ROTATION_180 | IGT_REFLECT_Y,
> > + IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y,
> > + IGT_ROTATION_270,
> > + IGT_ROTATION_270 | IGT_REFLECT_X,
> > + IGT_ROTATION_270 | IGT_REFLECT_Y,
> > + IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y,
> > +};
> > +
> > +/**
> > + * non_equals_crc() - Check if at least one CRC is different
> > + *
> > + * Check if at least one CRC is different, so we can verify that the rendering is working.
> > + *
> > + * @crcs: List of all tested crcs
> > + * @crc_count: Number of crcs in the list
> > + */
> > +static bool non_equals_crc(igt_crc_t crcs[], int crc_count)
> > +{
> > + if (!crc_count) {
> > + return true;
> > + }
> > + for (int i = 0; i < crc_count; i++)
> > + if (!igt_check_crc_equal(&crcs[i], &crcs[0]))
> > + return true;
> > + return false;
> > +}
> > +
> > +/**
> > + * create_fb() - Create a framebuffer
> > + *
> > + * This create a framebuffer and fill it with a pattern. This pattern is not invariant by rotation and reflection.
> > + *
> > + * The @width and @height parameters are automaticaly inverted according to @rotation if needed. If the requested plane
> > + * is 1024*768 with IGT_ROTATION_90, the returned plane will have the size 768*1024.
> > + *
> > + * @data: Current test configuration
> > + * @rotation: Rotation to apply to the pattern
> > + * @format: Format of the requested plane
> > + * @modifier: Modifier for the requested plane
> > + * @width, @height: Size of the plane to use (without rotation)
> > + * @width: Width of the requested plane
> > + * @height: Height of the requested plane
> > + * @fb: Place to store the created framebuffer
> > + */
> > +static void create_fb(struct data_t *data, igt_rotation_t rotation, uint32_t format, uint64_t modifier, int width,
> > + int height, igt_fb_t *fb)
> > +{
> > + int step_x, step_y, color_index, current_n, current_m;
> > + int offset_x, offset_y;
> > + cairo_t *cr;
> > +
> > + switch (rotation & IGT_ROTATION_MASK) {
> > + case IGT_ROTATION_90:
> > + case IGT_ROTATION_270:
> > + igt_swap(width, height);
> > + break;
> > + case IGT_ROTATION_0:
> > + case IGT_ROTATION_180:
> > + default:
> > + break;
> > + }
> > +
> > + igt_create_fb(data->fd, width, height, format, modifier, fb);
> > + cr = igt_get_cairo_ctx(data->fd, fb);
> > +
> > + step_x = (width) / ARRAY_SIZE(colors);
> > + step_y = (height) / ARRAY_SIZE(colors);
> > +
> > + /*
> > + * This pair of offset is used to ensure that a software rotated plane is the same as a hardware rotated plane.
> > + */
> > + switch ((int)rotation) {
> > + case IGT_ROTATION_0:
> > + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_90:
> > + case IGT_ROTATION_90 | IGT_REFLECT_X:
> > + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180 | IGT_REFLECT_X:
> > + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + offset_x = 0;
> > + break;
> > + case IGT_ROTATION_0 | IGT_REFLECT_X:
> > + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180:
> > + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_270:
> > + case IGT_ROTATION_270 | IGT_REFLECT_X:
> > + offset_x = width % step_x;
> > + break;
> > + }
> > + switch ((int)rotation) {
> > + case IGT_ROTATION_0:
> > + case IGT_ROTATION_0 | IGT_REFLECT_X:
> > + case IGT_ROTATION_90 | IGT_REFLECT_X:
> > + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_270:
> > + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> > + offset_y = 0;
> > + break;
> > + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_90:
> > + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180:
> > + case IGT_ROTATION_180 | IGT_REFLECT_X:
> > + case IGT_ROTATION_270 | IGT_REFLECT_X:
> > + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + offset_y = height % step_y;
> > + break;
> > + }
> > +
> > + /* Iterate over all colors in x and y direction. The pattern is a colored chessboard */
> > + for (int n = 0; n < ARRAY_SIZE(colors); n++) {
> > + for (int m = 0; m < ARRAY_SIZE(colors); m++) {
> > + color_index = (n + m) % ARRAY_SIZE(colors);
> > + current_n = n;
> > + current_m = m;
> > +
> > + /*
> > + * If a reflexion and a rotation is requested, apply this to the pattern rendering
> > + * If a reflexion is given, it must be applied before the rotation.
> > + */
> > + switch (rotation & IGT_REFLECT_MASK) {
> > + case IGT_REFLECT_X:
> > + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> > + break;
> > + case IGT_REFLECT_Y:
> > + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> > + break;
> > + case IGT_REFLECT_X | IGT_REFLECT_Y:
> > + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> > + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> > + break;
> > + }
> > + switch (rotation & IGT_ROTATION_MASK) {
> > + case IGT_ROTATION_0:
> > + break;
> > + case IGT_ROTATION_90:
> > + igt_swap(current_n, current_m);
> > + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> > + break;
> > + case IGT_ROTATION_180:
> > + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> > + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> > + break;
> > + case IGT_ROTATION_270:
> > + igt_swap(current_n, current_m);
> > + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> > + break;
> > + }
> > +
> > + igt_paint_color(cr,
> > + offset_x + current_n * step_x,
> > + offset_y + current_m * step_y,
> > + step_x,
> > + step_y,
> > + colors[color_index].d[0],
> > + colors[color_index].d[1],
> > + colors[color_index].d[2]);
> > + }
> > + }
> > +
> > + igt_put_cairo_ctx(cr);
> > +}
> > +
> > +/**
> > + * get_ref_crcs() - Compute the reference CRC for a specific format
> > + *
> > + * The rotation are done by create_fb in software.
> > + *
> > + * @data: Test configuration
> > + * @output, @pipe, @plane: Plane to use for the test
> > + * @width, @height: Size of the plane to use (without rotation)
> > + * @format, @modifier: Format description to test
> > + * @ref_crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> > + */
> > +static void get_ref_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> > + int height, uint32_t format, uint64_t modifier, igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)])
> > +{
> > + drmModeModeInfo *mode;
> > + igt_pipe_crc_t *pipe_crc;
> > + igt_fb_t fb;
> > +
> > + igt_display_reset(&data->display);
> > + igt_output_set_pipe(output, pipe);
> > +
> > +
> > + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> > + int rotation = tested_rotation[r];
> > + igt_debug("Computing reference CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> > + igt_plane_reflect_name(rotation));
> > + /* Configure the pipe for reference frame */
> > + igt_display_reset(&data->display);
> > +
> > + mode = igt_output_get_mode(output);
> > + mode->hdisplay = width;
> > + mode->vdisplay = height;
> > + igt_output_override_mode(output, mode);
> > + mode = igt_output_get_mode(output);
> > +
> > + igt_output_set_pipe(output, pipe);
> > + igt_plane_set_rotation(plane, IGT_ROTATION_0);
> > + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > +
> > + /* Start the CRC */
> > + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> > + igt_pipe_crc_start(pipe_crc);
> > +
> > + create_fb(data, rotation, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> > + igt_plane_set_fb(plane, &fb);
> > + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > +
> > + igt_pipe_crc_get_current(
> > + data->display.drm_fd, pipe_crc,
> > + &ref_crc[r]);
> > +
> > + igt_pipe_crc_stop(pipe_crc);
> > + igt_pipe_crc_free(pipe_crc);
> > + igt_remove_fb(data->fd, &fb);
> > + }
> > +}
> > +
> > +/**
> > + * get_crcs() - Compute the CRC for a specific format
> > + *
> > + * @data: Test configuration
> > + * @output, @pipe, @plane: Plane to use for the test
> > + * @width, @height: Size of the plane to use (without rotation)
> > + * @format, @modifier: Format description to test
> > + * @crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> > + */
> > +static void get_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> > + int height, uint32_t format, uint64_t modifier, igt_crc_t crc[ARRAY_SIZE(tested_rotation)])
> > +{
> > + drmModeModeInfo *mode;
> > + igt_pipe_crc_t *pipe_crc;
> > + igt_fb_t fb;
> > +
> > + igt_display_reset(&data->display);
> > + igt_output_set_pipe(output, pipe);
> > +
> > + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> > + int rotation = tested_rotation[r];
> > + igt_debug("Computing CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> > + igt_plane_reflect_name(rotation));
> > + /* Configure the pipe for reference frame */
> > + igt_display_reset(&data->display);
> > +
> > + mode = igt_output_get_mode(output);
> > + mode->hdisplay = width;
> > + mode->vdisplay = height;
> > + igt_output_override_mode(output, mode);
> > + mode = igt_output_get_mode(output);
> > +
> > + igt_output_set_pipe(output, pipe);
> > + igt_plane_set_rotation(plane, rotation);
> > +
> > + if (!igt_plane_has_rotation(plane, rotation))
> > + continue;
> > +
> > + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > +
> > + /* Start the CRC */
> > + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> > + igt_pipe_crc_start(pipe_crc);
> > +
> > + create_fb(data, IGT_ROTATION_0, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> > + igt_plane_set_fb(plane, &fb);
> > + if (igt_rotation_90_or_270(rotation))
> > + igt_plane_set_size(plane, fb.height, fb.width);
> > + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > +
> > + igt_pipe_crc_get_current(
> > + data->display.drm_fd, pipe_crc,
> > + &crc[r]);
> > +
> > + igt_pipe_crc_stop(pipe_crc);
> > + igt_pipe_crc_free(pipe_crc);
> > + igt_remove_fb(data->fd, &fb);
> > + }
> > +}
> > +
> > +/**
> > + * run_test() - Run the subtests for a specific plane
> > + *
> > + * @data: Test configuration
> > + * @output, @pipe, @plane: Plane to use for the test
> > + * @format, @modifier: Format description to test
> > + */
> > +static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, uint32_t format,
> > + uint64_t modifier)
> > +{
> > + int width, height;
> > + const struct format_desc_struct *format_description;
> > + igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)];
> > + igt_crc_t crc[ARRAY_SIZE(tested_rotation)];
> > +
> > + igt_display_reset(&data->display);
> > + igt_output_set_pipe(output, pipe);
> > + /* Check that the rotation is supported */
> > + igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
> > + format_description = lookup_drm_format(format);
> > + width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
> > + height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
> > +
> > + /* Generate reference CRC with software rotation */
> > + get_ref_crcs(data, output, pipe, plane, width, height, format, modifier, ref_crc);
> > + igt_assert_f(non_equals_crc(ref_crc, ARRAY_SIZE(tested_rotation)), "All the reference CRC are equals.");
> > +
> > + /* Generate CRC with hardware rotation */
> > + get_crcs(data, output, pipe, plane, width, height, format, modifier, crc);
> > +
> > + for (int c = 0; c < ARRAY_SIZE(tested_rotation); c++) {
> > + int rotation = tested_rotation[c];
> > + igt_dynamic_f("pipe-%s-format-%s-modifier-%s-rotation-%s-reflect-%s", kmstest_pipe_name(pipe),
> > + igt_format_str(format),
> > + igt_fb_modifier_name(modifier), igt_plane_rotation_name(rotation),
> > + igt_plane_reflect_name(rotation)) {
> > + igt_assert_crc_equal(&ref_crc[c], &crc[c]);
> > + }
> > + }
> > +}
> > +
> > +/**
> > + * test_all_formats() - Run all the tests for all planes
> > + *
> > + * @data: Test configuration
> > + */
> > +static void test_all_formats(struct data_t *data)
> > +{
> > + enum pipe pipe;
> > + struct igt_plane *plane;
> > + igt_output_t *output;
> > + for_each_pipe_with_single_output(&data->display, pipe, output) {
> > + for_each_plane_on_pipe(&data->display, pipe, plane) {
> > + for (int f = 0; f < plane->format_mod_count; f++) {
> > + uint32_t format = plane->formats[f];
> > + uint32_t modifier = plane->modifiers[f];
> > +
> > + if (!igt_fb_supported_format(format))
> > + continue;
> > + run_test(data, output, pipe, plane, format, modifier);
> > + }
> > + }
> > + }
> > +}
> > +
> > +static int opt_handler(int opt, int opt_index, void *void_data)
> > +{
> > + return IGT_OPT_HANDLER_SUCCESS;
> > +}
> > +
> > +static const struct option long_opts[] = {
> > + {}
> > +};
> > +
> > +static const char help_str[] = "";
> > +
> > +static struct data_t global_data;
> > +
> > +igt_main_args("", long_opts, help_str, opt_handler, &global_data)
> > +{
> > + igt_fixture {
> > + global_data.fd = drm_open_driver_master(DRIVER_ANY);
> > +
> > + kmstest_set_vt_graphics_mode();
> > +
> > + igt_display_require(&global_data.display, global_data.fd);
> > + igt_require(global_data.display.is_atomic);
> > + igt_display_require_output(&global_data.display);
> > + igt_display_reset(&global_data.display);
> > + }
> > +
> > + igt_describe("Testing different rotation and reflexions for different formats");
> > + igt_subtest_with_dynamic_f("rotations") {
> > + test_all_formats(&global_data);
> > + }
> > +
> > +}
> > \ No newline at end of file
> > diff --git a/tests/meson.build b/tests/meson.build
> > index a856510fcea7..71b628b86e96 100644
> > --- a/tests/meson.build
> > +++ b/tests/meson.build
> > @@ -82,6 +82,7 @@ test_progs = [
> > 'tools_test',
> > 'vgem_basic',
> > 'vgem_slow',
> > + 'kms_rotation',
> > ]
> >
> > intel_i915_xe_progs = [
> >
> > --
> > 2.43.0
> >
--
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 1/4] lib/igt_kms: Add reflection name and mask
2024-03-13 20:00 ` Arthur Grillo
@ 2024-03-15 16:11 ` Louis Chauvet
0 siblings, 0 replies; 17+ messages in thread
From: Louis Chauvet @ 2024-03-15 16:11 UTC (permalink / raw)
To: Arthur Grillo
Cc: igt-dev, miquel.raynal, jeremie.dautheribes, thomas.petazzoni
Le 13/03/24 - 17:00, Arthur Grillo a écrit :
>
>
> On 13/03/24 14:09, Louis Chauvet wrote:
> > As for IGT_ROTATION_MASK and igt_plane_rotation_name, create the mask
> > IGT_REFLECT_MASK and the function igt_plane_reflect_name.
> >
> > Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> > ---
> > lib/igt_kms.c | 23 +++++++++++++++++++++++
> > lib/igt_kms.h | 3 +++
> > 2 files changed, 26 insertions(+)
> >
> > diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> > index e18f6fe59882..85d278f3cae3 100644
> > --- a/lib/igt_kms.c
> > +++ b/lib/igt_kms.c
> > @@ -5142,6 +5142,29 @@ const char *igt_plane_rotation_name(igt_rotation_t rotation)
> > }
> > }
> >
> > +
> > +/**
> > + * igt_plane_reflect_name:
> > + * @reflect: Plane reflection value (x, y)
> > + *
> > + * Returns: Plane reflection value as a string
> > + */
> > +const char *igt_plane_reflect_name(igt_rotation_t reflect)
> > +{
> > + switch (reflect & IGT_REFLECT_MASK) {
> > + case 0:
> > + return "none";
> > + case IGT_REFLECT_X:
> > + return "X";
> > + case IGT_REFLECT_Y:
> > + return "Y";
> > + case IGT_REFLECT_X | IGT_REFLECT_Y:
> > + return "XY";
> > + default:
> > + igt_assert(0);
> > + }
> > +}
>
> I think it would be good to call this on igt_plane_set_rotation(), like
> igt_plane_rotation_name() is, for debug purposes.
Hi Arthur,
I will add a separate patch for this. Thanks for the suggestion.
Kind regards,
Louis Chauvet
> Best Regards,
> ~Arthur Grillo
>
> > +
> > /**
> > * igt_plane_set_rotation:
> > * @plane: Plane pointer for which rotation is to be set
> > diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> > index b3882808b42f..4760394428f3 100644
> > --- a/lib/igt_kms.h
> > +++ b/lib/igt_kms.h
> > @@ -371,6 +371,8 @@ typedef enum {
> >
> > #define IGT_ROTATION_MASK \
> > (IGT_ROTATION_0 | IGT_ROTATION_90 | IGT_ROTATION_180 | IGT_ROTATION_270)
> > +#define IGT_REFLECT_MASK \
> > + (IGT_REFLECT_X | IGT_REFLECT_Y)
> >
> > /**
> > * igt_rotation_90_or_270:
> > @@ -562,6 +564,7 @@ static inline bool igt_plane_has_rotation(igt_plane_t *plane, igt_rotation_t rot
> > return (plane->rotations & rotation) == rotation;
> > }
> > const char *igt_plane_rotation_name(igt_rotation_t rotation);
> > +const char *igt_plane_reflect_name(igt_rotation_t reflect);
> >
> > void igt_wait_for_vblank(int drm_fd, int crtc_offset);
> > void igt_wait_for_vblank_count(int drm_fd, int crtc_offset, int count);
> >
--
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test
2024-03-14 17:42 ` Arthur Grillo
@ 2024-03-15 16:11 ` Louis Chauvet
2024-03-16 12:28 ` Arthur Grillo
0 siblings, 1 reply; 17+ messages in thread
From: Louis Chauvet @ 2024-03-15 16:11 UTC (permalink / raw)
To: Arthur Grillo
Cc: igt-dev, miquel.raynal, jeremie.dautheribes, thomas.petazzoni
Le 14/03/24 - 14:42, Arthur Grillo a écrit :
>
>
> On 13/03/24 14:09, Louis Chauvet wrote:
> > The actual kms_rotation_crc test does not tes all the rotation with all
> > the formats. Create the test kms_rotation, which only test "full plane
> > rotation", but for all formats, planes and rotations.
> >
> > This allow the detection of issues like in [1], where the YUV rotation is
> > not working for specific rotations.
> >
> > [1]: https://lore.kernel.org/dri-devel/20240304-yuv-v4-11-76beac8e9793@bootlin.com/
> >
> > Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> > ---
> > tests/kms_rotation.c | 444 +++++++++++++++++++++++++++++++++++++++++++++++++++
> > tests/meson.build | 1 +
> > 2 files changed, 445 insertions(+)
> >
> > diff --git a/tests/kms_rotation.c b/tests/kms_rotation.c
> > new file mode 100644
> > index 000000000000..333485619541
> > --- /dev/null
> > +++ b/tests/kms_rotation.c
> > @@ -0,0 +1,444 @@
> > +#include "igt.h"
> > +
> > +/**
> > + * TEST: kms_rotation
> > + * Category: Display
> > + * Description: Tests all rotations for all planes and formats.
> > + * Driver requirement: none
> > + * Functionality: plane, rotation
> > + * Mega feature: General Display Features
> > + * Test category: functionality test
> > + */
> > +
> > +/**
> > + * SUBTEST: rotations
> > + * Description: Test for all rotations, planes and formats.
> > + */
> > +
> > +/**
> > + * struct data_t - Stores the test configuration
> > + *
> > + * @fd: file descriptor for the current drm device
> > + * @display: display used for the tests
> > + * @width, @height: Size of the CRTC used for this test
> > + */
> > +struct data_t {
> > + int fd;
> > + igt_display_t display;
> > + uint32_t width;
> > + uint32_t height;
> > +};
> > +
> > +/**
> > + * colors - List of colors used to put things on the plane
> > + *
> > + * Those colors are used to create a color pattern on the plane, which is not invariant by rotation or reflexion.
> > + *
> > + * At least black and white must be in this list to properly test black and white formats.
> > + */
> > +static const struct igt_vec4 colors[] = {
> > + {{1.0f, 0.0f, 0.0f, 0.0f}},
> > + {{1.0f, 1.0f, 1.0f, 0.0f}},
> > + {{0.0f, 0.0f, 0.0f, 0.0f}},
> > + {{0.0f, 1.0f, 1.0f, 0.0f}},
> > + {{0.0f, 0.0f, 0.0f, 0.0f}},
> > +};
> > +
> > +/**
> > + * tested_rotation - List of all tested rotation configuration
> > + */
> > +static uint32_t tested_rotation[] = {
> > + IGT_ROTATION_0,
> > + IGT_ROTATION_0 | IGT_REFLECT_X,
> > + IGT_ROTATION_0 | IGT_REFLECT_Y,
> > + IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y,
> > + IGT_ROTATION_90,
> > + IGT_ROTATION_90 | IGT_REFLECT_X,
> > + IGT_ROTATION_90 | IGT_REFLECT_Y,
> > + IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y,
> > + IGT_ROTATION_180,
> > + IGT_ROTATION_180 | IGT_REFLECT_X,
> > + IGT_ROTATION_180 | IGT_REFLECT_Y,
> > + IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y,
> > + IGT_ROTATION_270,
> > + IGT_ROTATION_270 | IGT_REFLECT_X,
> > + IGT_ROTATION_270 | IGT_REFLECT_Y,
> > + IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y,
> > +};
> > +
> > +/**
> > + * non_equals_crc() - Check if at least one CRC is different
> > + *
> > + * Check if at least one CRC is different, so we can verify that the rendering is working.
> > + *
> > + * @crcs: List of all tested crcs
> > + * @crc_count: Number of crcs in the list
> > + */
> > +static bool non_equals_crc(igt_crc_t crcs[], int crc_count)
> > +{
> > + if (!crc_count) {
> > + return true;
> > + }
> > + for (int i = 0; i < crc_count; i++)
> > + if (!igt_check_crc_equal(&crcs[i], &crcs[0]))
> > + return true;
> > + return false;
> > +}
> > +
> > +/**
> > + * create_fb() - Create a framebuffer
> > + *
> > + * This create a framebuffer and fill it with a pattern. This pattern is not invariant by rotation and reflection.
> > + *
> > + * The @width and @height parameters are automaticaly inverted according to @rotation if needed. If the requested plane
> > + * is 1024*768 with IGT_ROTATION_90, the returned plane will have the size 768*1024.
> > + *
> > + * @data: Current test configuration
> > + * @rotation: Rotation to apply to the pattern
> > + * @format: Format of the requested plane
> > + * @modifier: Modifier for the requested plane
> > + * @width, @height: Size of the plane to use (without rotation)
> > + * @width: Width of the requested plane
> > + * @height: Height of the requested plane
> > + * @fb: Place to store the created framebuffer
> > + */
> > +static void create_fb(struct data_t *data, igt_rotation_t rotation, uint32_t format, uint64_t modifier, int width,
> > + int height, igt_fb_t *fb)
> > +{
> > + int step_x, step_y, color_index, current_n, current_m;
> > + int offset_x, offset_y;
> > + cairo_t *cr;
> > +
> > + switch (rotation & IGT_ROTATION_MASK) {
> > + case IGT_ROTATION_90:
> > + case IGT_ROTATION_270:
> > + igt_swap(width, height);
> > + break;
> > + case IGT_ROTATION_0:
> > + case IGT_ROTATION_180:
> > + default:
> > + break;
> > + }
> > +
> > + igt_create_fb(data->fd, width, height, format, modifier, fb);
> > + cr = igt_get_cairo_ctx(data->fd, fb);
> > +
> > + step_x = (width) / ARRAY_SIZE(colors);
> > + step_y = (height) / ARRAY_SIZE(colors);
> > +
> > + /*
> > + * This pair of offset is used to ensure that a software rotated plane is the same as a hardware rotated plane.
> > + */
> > + switch ((int)rotation) {
> > + case IGT_ROTATION_0:
> > + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_90:
> > + case IGT_ROTATION_90 | IGT_REFLECT_X:
> > + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180 | IGT_REFLECT_X:
> > + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + offset_x = 0;
> > + break;
> > + case IGT_ROTATION_0 | IGT_REFLECT_X:
> > + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180:
> > + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_270:
> > + case IGT_ROTATION_270 | IGT_REFLECT_X:
> > + offset_x = width % step_x;
> > + break;
> > + }
> > + switch ((int)rotation) {
> > + case IGT_ROTATION_0:
> > + case IGT_ROTATION_0 | IGT_REFLECT_X:
> > + case IGT_ROTATION_90 | IGT_REFLECT_X:
> > + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_270:
> > + case IGT_ROTATION_270 | IGT_REFLECT_Y:
> > + offset_y = 0;
> > + break;
> > + case IGT_ROTATION_0 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + case IGT_ROTATION_90:
> > + case IGT_ROTATION_90 | IGT_REFLECT_Y:
> > + case IGT_ROTATION_180:
> > + case IGT_ROTATION_180 | IGT_REFLECT_X:
> > + case IGT_ROTATION_270 | IGT_REFLECT_X:
> > + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
> > + offset_y = height % step_y;
> > + break;
> > + }
> > +
> > + /* Iterate over all colors in x and y direction. The pattern is a colored chessboard */
> > + for (int n = 0; n < ARRAY_SIZE(colors); n++) {
> > + for (int m = 0; m < ARRAY_SIZE(colors); m++) {
> > + color_index = (n + m) % ARRAY_SIZE(colors);
> > + current_n = n;
> > + current_m = m;
> > +
> > + /*
> > + * If a reflexion and a rotation is requested, apply this to the pattern rendering
> > + * If a reflexion is given, it must be applied before the rotation.
> > + */
> > + switch (rotation & IGT_REFLECT_MASK) {
> > + case IGT_REFLECT_X:
> > + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> > + break;
> > + case IGT_REFLECT_Y:
> > + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> > + break;
> > + case IGT_REFLECT_X | IGT_REFLECT_Y:
> > + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> > + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> > + break;
> > + }
> > + switch (rotation & IGT_ROTATION_MASK) {
> > + case IGT_ROTATION_0:
> > + break;
> > + case IGT_ROTATION_90:
> > + igt_swap(current_n, current_m);
> > + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> > + break;
> > + case IGT_ROTATION_180:
> > + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> > + current_m = ARRAY_SIZE(colors) - 1 - current_m;
> > + break;
> > + case IGT_ROTATION_270:
> > + igt_swap(current_n, current_m);
> > + current_n = ARRAY_SIZE(colors) - 1 - current_n;
> > + break;
> > + }
> > +
> > + igt_paint_color(cr,
> > + offset_x + current_n * step_x,
> > + offset_y + current_m * step_y,
> > + step_x,
> > + step_y,
> > + colors[color_index].d[0],
> > + colors[color_index].d[1],
> > + colors[color_index].d[2]);
> > + }
> > + }
>
>
> Couldn't all this be done with a igt_create_fb_pattern() and an
> cairo_rotate()?
I agree they looked like a good fit for this purpose, but unfortunately I
already tried these functions and they were either not working with YUV
(see why below) or way too complex for my use case (TBH I did not manage
to use cairo_rotate and cairo_scale was overly complex to handle).
If you don't mind I would prefer to keep all this code with the same
"idea" (i.e: use only cairo_* helpers or rotate "by hand", but not mixing
them)
The main issue with YUV formats is subsampling, and for example, NV12, the
subsampling is horizontal. A "software rotated" and a "hardware
rotated" will not use the same subsampling "direction", so the resulting
CRC will not be the same. Using plain colors and choosing the correct size
avoids those issues, and igt_fb_create_pattern use gradients, which are
not working well.
> > +
> > + igt_put_cairo_ctx(cr);
> > +}
> > +
> > +/**
> > + * get_ref_crcs() - Compute the reference CRC for a specific format
> > + *
> > + * The rotation are done by create_fb in software.
> > + *
> > + * @data: Test configuration
> > + * @output, @pipe, @plane: Plane to use for the test
> > + * @width, @height: Size of the plane to use (without rotation)
> > + * @format, @modifier: Format description to test
> > + * @ref_crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> > + */
> > +static void get_ref_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> > + int height, uint32_t format, uint64_t modifier, igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)])
> > +{
> > + drmModeModeInfo *mode;
> > + igt_pipe_crc_t *pipe_crc;
> > + igt_fb_t fb;
> > +
> > + igt_display_reset(&data->display);
> > + igt_output_set_pipe(output, pipe);
> > +
> > +
> > + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> > + int rotation = tested_rotation[r];
> > + igt_debug("Computing reference CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> > + igt_plane_reflect_name(rotation));
> > + /* Configure the pipe for reference frame */
> > + igt_display_reset(&data->display);
> > +
> > + mode = igt_output_get_mode(output);
> > + mode->hdisplay = width;
> > + mode->vdisplay = height;
> > + igt_output_override_mode(output, mode);
> > + mode = igt_output_get_mode(output);
> > +
> > + igt_output_set_pipe(output, pipe);
> > + igt_plane_set_rotation(plane, IGT_ROTATION_0);
> > + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > +
> > + /* Start the CRC */
> > + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> > + igt_pipe_crc_start(pipe_crc);
> > +
> > + create_fb(data, rotation, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> > + igt_plane_set_fb(plane, &fb);
> > + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > +
> > + igt_pipe_crc_get_current(
> > + data->display.drm_fd, pipe_crc,
> > + &ref_crc[r]);
> > +
> > + igt_pipe_crc_stop(pipe_crc);
> > + igt_pipe_crc_free(pipe_crc);
> > + igt_remove_fb(data->fd, &fb);
> > + }
> > +}
> > +
> > +/**
> > + * get_crcs() - Compute the CRC for a specific format
> > + *
> > + * @data: Test configuration
> > + * @output, @pipe, @plane: Plane to use for the test
> > + * @width, @height: Size of the plane to use (without rotation)
> > + * @format, @modifier: Format description to test
> > + * @crc: Array to store the resulting CRC. Its size must be at least ARRAY_SIZE(tested_rotation).
> > + */
> > +static void get_crcs(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, int width,
> > + int height, uint32_t format, uint64_t modifier, igt_crc_t crc[ARRAY_SIZE(tested_rotation)])
> > +{
> > + drmModeModeInfo *mode;
> > + igt_pipe_crc_t *pipe_crc;
> > + igt_fb_t fb;
> > +
> > + igt_display_reset(&data->display);
> > + igt_output_set_pipe(output, pipe);
> > +
> > + for (int r = 0; r < ARRAY_SIZE(tested_rotation); r++) {
> > + int rotation = tested_rotation[r];
> > + igt_debug("Computing CRC for rotation-%s-reflect-%s\n", igt_plane_rotation_name(rotation),
> > + igt_plane_reflect_name(rotation));
> > + /* Configure the pipe for reference frame */
> > + igt_display_reset(&data->display);
> > +
> > + mode = igt_output_get_mode(output);
> > + mode->hdisplay = width;
> > + mode->vdisplay = height;
> > + igt_output_override_mode(output, mode);
> > + mode = igt_output_get_mode(output);
> > +
> > + igt_output_set_pipe(output, pipe);
> > + igt_plane_set_rotation(plane, rotation);
> > +
> > + if (!igt_plane_has_rotation(plane, rotation))
> > + continue;
> > +
> > + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > +
> > + /* Start the CRC */
> > + pipe_crc = igt_pipe_crc_new(data->fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> > + igt_pipe_crc_start(pipe_crc);
> > +
> > + create_fb(data, IGT_ROTATION_0, format, modifier, mode->vdisplay, mode->hdisplay, &fb);
> > + igt_plane_set_fb(plane, &fb);
> > + if (igt_rotation_90_or_270(rotation))
> > + igt_plane_set_size(plane, fb.height, fb.width);
> > + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > +
> > + igt_pipe_crc_get_current(
> > + data->display.drm_fd, pipe_crc,
> > + &crc[r]);
> > +
> > + igt_pipe_crc_stop(pipe_crc);
> > + igt_pipe_crc_free(pipe_crc);
> > + igt_remove_fb(data->fd, &fb);
> > + }
> > +}
> > +
> > +/**
> > + * run_test() - Run the subtests for a specific plane
> > + *
> > + * @data: Test configuration
> > + * @output, @pipe, @plane: Plane to use for the test
> > + * @format, @modifier: Format description to test
> > + */
> > +static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, uint32_t format,
> > + uint64_t modifier)
> > +{
> > + int width, height;
> > + const struct format_desc_struct *format_description;
> > + igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)];
> > + igt_crc_t crc[ARRAY_SIZE(tested_rotation)];
> > +
> > + igt_display_reset(&data->display);
> > + igt_output_set_pipe(output, pipe);
> > + /* Check that the rotation is supported */
> > + igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
> > + format_description = lookup_drm_format(format);
> > + width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
> > + height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
>
> What's going on here?
I forgot to put a comment here:
To avoid issue with YUV subsampling, the size must be a multiple of the
subsampling, and to avoid color issues, the size must also be a multiple
of the number of colors.
The multiplication by 6 as an arbitrary value to use an intermediate size (not too small
because some drivers don't support it, not too big to reduce tests duration).
> > +
> > + /* Generate reference CRC with software rotation */
> > + get_ref_crcs(data, output, pipe, plane, width, height, format, modifier, ref_crc);
> > + igt_assert_f(non_equals_crc(ref_crc, ARRAY_SIZE(tested_rotation)), "All the reference CRC are equals.");
> > +
> > + /* Generate CRC with hardware rotation */
> > + get_crcs(data, output, pipe, plane, width, height, format, modifier, crc);
> > +
> > + for (int c = 0; c < ARRAY_SIZE(tested_rotation); c++) {
> > + int rotation = tested_rotation[c];
> > + igt_dynamic_f("pipe-%s-format-%s-modifier-%s-rotation-%s-reflect-%s", kmstest_pipe_name(pipe),
> > + igt_format_str(format),
> > + igt_fb_modifier_name(modifier), igt_plane_rotation_name(rotation),
> > + igt_plane_reflect_name(rotation)) {
> > + igt_assert_crc_equal(&ref_crc[c], &crc[c]);
> > + }
> > + }
> > +}
> > +
> > +/**
> > + * test_all_formats() - Run all the tests for all planes
> > + *
> > + * @data: Test configuration
> > + */
> > +static void test_all_formats(struct data_t *data)
> > +{
> > + enum pipe pipe;
> > + struct igt_plane *plane;
> > + igt_output_t *output;
> > + for_each_pipe_with_single_output(&data->display, pipe, output) {
> > + for_each_plane_on_pipe(&data->display, pipe, plane) {
> > + for (int f = 0; f < plane->format_mod_count; f++) {
> > + uint32_t format = plane->formats[f];
> > + uint32_t modifier = plane->modifiers[f];
> > +
> > + if (!igt_fb_supported_format(format))
> > + continue;
> > + run_test(data, output, pipe, plane, format, modifier);
> > + }
> > + }
> > + }
> > +}
> > +
> > +static int opt_handler(int opt, int opt_index, void *void_data)
> > +{
> > + return IGT_OPT_HANDLER_SUCCESS;
> > +}
> > +
> > +static const struct option long_opts[] = {
> > + {}
> > +};
> > +
> > +static const char help_str[] = "";
> > +
> > +static struct data_t global_data;
> > +
> > +igt_main_args("", long_opts, help_str, opt_handler, &global_data)
>
> Maybe use igt_main?
I will replace it for the v3.
Kind regards,
Louis Chauvet
> Best Regards,
> ~Arthur Grillo
>
> > +{
> > + igt_fixture {
> > + global_data.fd = drm_open_driver_master(DRIVER_ANY);
> > +
> > + kmstest_set_vt_graphics_mode();
> > +
> > + igt_display_require(&global_data.display, global_data.fd);
> > + igt_require(global_data.display.is_atomic);
> > + igt_display_require_output(&global_data.display);
> > + igt_display_reset(&global_data.display);
> > + }
> > +
> > + igt_describe("Testing different rotation and reflexions for different formats");
> > + igt_subtest_with_dynamic_f("rotations") {
> > + test_all_formats(&global_data);
> > + }
> > +
> > +}
> > \ No newline at end of file
> > diff --git a/tests/meson.build b/tests/meson.build
> > index a856510fcea7..71b628b86e96 100644
> > --- a/tests/meson.build
> > +++ b/tests/meson.build
> > @@ -82,6 +82,7 @@ test_progs = [
> > 'tools_test',
> > 'vgem_basic',
> > 'vgem_slow',
> > + 'kms_rotation',
> > ]
> >
> > intel_i915_xe_progs = [
> >
--
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test
2024-03-15 16:11 ` Louis Chauvet
@ 2024-03-16 12:28 ` Arthur Grillo
0 siblings, 0 replies; 17+ messages in thread
From: Arthur Grillo @ 2024-03-16 12:28 UTC (permalink / raw)
To: Louis Chauvet
Cc: igt-dev, miquel.raynal, jeremie.dautheribes, thomas.petazzoni
On 15/03/24 13:11, Louis Chauvet wrote:
> Le 14/03/24 - 14:42, Arthur Grillo a écrit :
>>
>>
>> On 13/03/24 14:09, Louis Chauvet wrote:
>>> +
>>> +/**
>>> + * create_fb() - Create a framebuffer
>>> + *
>>> + * This create a framebuffer and fill it with a pattern. This pattern is not invariant by rotation and reflection.
>>> + *
>>> + * The @width and @height parameters are automaticaly inverted according to @rotation if needed. If the requested plane
>>> + * is 1024*768 with IGT_ROTATION_90, the returned plane will have the size 768*1024.
>>> + *
>>> + * @data: Current test configuration
>>> + * @rotation: Rotation to apply to the pattern
>>> + * @format: Format of the requested plane
>>> + * @modifier: Modifier for the requested plane
>>> + * @width, @height: Size of the plane to use (without rotation)
>>> + * @width: Width of the requested plane
>>> + * @height: Height of the requested plane
>>> + * @fb: Place to store the created framebuffer
>>> + */
>>> +static void create_fb(struct data_t *data, igt_rotation_t rotation, uint32_t format, uint64_t modifier, int width,
>>> + int height, igt_fb_t *fb)
>>> +{
>>> + int step_x, step_y, color_index, current_n, current_m;
>>> + int offset_x, offset_y;
>>> + cairo_t *cr;
>>> +
>>> + switch (rotation & IGT_ROTATION_MASK) {
>>> + case IGT_ROTATION_90:
>>> + case IGT_ROTATION_270:
>>> + igt_swap(width, height);
>>> + break;
>>> + case IGT_ROTATION_0:
>>> + case IGT_ROTATION_180:
>>> + default:
>>> + break;
>>> + }
>>> +
>>> + igt_create_fb(data->fd, width, height, format, modifier, fb);
>>> + cr = igt_get_cairo_ctx(data->fd, fb);
>>> +
>>> + step_x = (width) / ARRAY_SIZE(colors);
>>> + step_y = (height) / ARRAY_SIZE(colors);
>>> +
>>> + /*
>>> + * This pair of offset is used to ensure that a software rotated plane is the same as a hardware rotated plane.
>>> + */
>>> + switch ((int)rotation) {
>>> + case IGT_ROTATION_0:
>>> + case IGT_ROTATION_0 | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_90:
>>> + case IGT_ROTATION_90 | IGT_REFLECT_X:
>>> + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_180 | IGT_REFLECT_X:
>>> + case IGT_ROTATION_270 | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + offset_x = 0;
>>> + break;
>>> + case IGT_ROTATION_0 | IGT_REFLECT_X:
>>> + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_90 | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_180:
>>> + case IGT_ROTATION_180 | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_270:
>>> + case IGT_ROTATION_270 | IGT_REFLECT_X:
>>> + offset_x = width % step_x;
>>> + break;
>>> + }
>>> + switch ((int)rotation) {
>>> + case IGT_ROTATION_0:
>>> + case IGT_ROTATION_0 | IGT_REFLECT_X:
>>> + case IGT_ROTATION_90 | IGT_REFLECT_X:
>>> + case IGT_ROTATION_90 | IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_180 | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_180 | IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_270:
>>> + case IGT_ROTATION_270 | IGT_REFLECT_Y:
>>> + offset_y = 0;
>>> + break;
>>> + case IGT_ROTATION_0 | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_0 | IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_90:
>>> + case IGT_ROTATION_90 | IGT_REFLECT_Y:
>>> + case IGT_ROTATION_180:
>>> + case IGT_ROTATION_180 | IGT_REFLECT_X:
>>> + case IGT_ROTATION_270 | IGT_REFLECT_X:
>>> + case IGT_ROTATION_270 | IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + offset_y = height % step_y;
>>> + break;
>>> + }
>>> +
>>> + /* Iterate over all colors in x and y direction. The pattern is a colored chessboard */
>>> + for (int n = 0; n < ARRAY_SIZE(colors); n++) {
>>> + for (int m = 0; m < ARRAY_SIZE(colors); m++) {
>>> + color_index = (n + m) % ARRAY_SIZE(colors);
>>> + current_n = n;
>>> + current_m = m;
>>> +
>>> + /*
>>> + * If a reflexion and a rotation is requested, apply this to the pattern rendering
>>> + * If a reflexion is given, it must be applied before the rotation.
>>> + */
>>> + switch (rotation & IGT_REFLECT_MASK) {
>>> + case IGT_REFLECT_X:
>>> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
>>> + break;
>>> + case IGT_REFLECT_Y:
>>> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
>>> + break;
>>> + case IGT_REFLECT_X | IGT_REFLECT_Y:
>>> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
>>> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
>>> + break;
>>> + }
>>> + switch (rotation & IGT_ROTATION_MASK) {
>>> + case IGT_ROTATION_0:
>>> + break;
>>> + case IGT_ROTATION_90:
>>> + igt_swap(current_n, current_m);
>>> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
>>> + break;
>>> + case IGT_ROTATION_180:
>>> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
>>> + current_m = ARRAY_SIZE(colors) - 1 - current_m;
>>> + break;
>>> + case IGT_ROTATION_270:
>>> + igt_swap(current_n, current_m);
>>> + current_n = ARRAY_SIZE(colors) - 1 - current_n;
>>> + break;
>>> + }
>>> +
>>> + igt_paint_color(cr,
>>> + offset_x + current_n * step_x,
>>> + offset_y + current_m * step_y,
>>> + step_x,
>>> + step_y,
>>> + colors[color_index].d[0],
>>> + colors[color_index].d[1],
>>> + colors[color_index].d[2]);
>>> + }
>>> + }
>>
>>
>> Couldn't all this be done with a igt_create_fb_pattern() and an
>> cairo_rotate()?
>
> I agree they looked like a good fit for this purpose, but unfortunately I
> already tried these functions and they were either not working with YUV
> (see why below) or way too complex for my use case (TBH I did not manage
> to use cairo_rotate and cairo_scale was overly complex to handle).
>
> If you don't mind I would prefer to keep all this code with the same
> "idea" (i.e: use only cairo_* helpers or rotate "by hand", but not mixing
> them)
Yeah, I can go with that, If changing to cairo_* helpers would make more
the whole thing more complex than the other way around.
>
> The main issue with YUV formats is subsampling, and for example, NV12, the
> subsampling is horizontal. A "software rotated" and a "hardware
> rotated" will not use the same subsampling "direction", so the resulting
> CRC will not be the same. Using plain colors and choosing the correct size
> avoids those issues, and igt_fb_create_pattern use gradients, which are
> not working well.
>
>>> +
>>> +/**
>>> + * run_test() - Run the subtests for a specific plane
>>> + *
>>> + * @data: Test configuration
>>> + * @output, @pipe, @plane: Plane to use for the test
>>> + * @format, @modifier: Format description to test
>>> + */
>>> +static void run_test(struct data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *plane, uint32_t format,
>>> + uint64_t modifier)
>>> +{
>>> + int width, height;
>>> + const struct format_desc_struct *format_description;
>>> + igt_crc_t ref_crc[ARRAY_SIZE(tested_rotation)];
>>> + igt_crc_t crc[ARRAY_SIZE(tested_rotation)];
>>> +
>>> + igt_display_reset(&data->display);
>>> + igt_output_set_pipe(output, pipe);
>>> + /* Check that the rotation is supported */
>>> + igt_require(igt_plane_has_prop(plane, IGT_PLANE_ROTATION));
>>> + format_description = lookup_drm_format(format);
>>> + width = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
>>> + height = ARRAY_SIZE(colors) * format_description->hsub * format_description->vsub * 6;
>>
>> What's going on here?
>
> I forgot to put a comment here:
>
> To avoid issue with YUV subsampling, the size must be a multiple of the
> subsampling, and to avoid color issues, the size must also be a multiple
> of the number of colors.
> The multiplication by 6 as an arbitrary value to use an intermediate size (not too small
> because some drivers don't support it, not too big to reduce tests duration).
I understand, could you also add a #define for this arbitrary value?
Best Regards,
~Arthur Grillo
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH i-g-t v2 0/4] New rotation test
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
` (6 preceding siblings ...)
2024-03-14 0:31 ` ✗ Fi.CI.IGT: failure " Patchwork
@ 2024-03-18 8:26 ` Modem, Bhanuprakash
7 siblings, 0 replies; 17+ messages in thread
From: Modem, Bhanuprakash @ 2024-03-18 8:26 UTC (permalink / raw)
To: Louis Chauvet, igt-dev
Cc: miquel.raynal, jeremie.dautheribes, thomas.petazzoni,
arthurgrillo, Juha-Pekka Heikkila
On 13-03-2024 10:39 pm, Louis Chauvet wrote:
> The actual kms_rotation_crc test does not test all the rotation with all
> the formats. Create the test kms_rotation, which only test "full plane
> rotation", but for all the formats, plane and rotations configuration.
Why do we need a new test binary 'kms_rotation'?
IMHO, you could extend kms_rotation_crc to support other combinations.
- Bhanu
>
> This new test allows to detect issues in [1], where the YUV rotation is
> faulty for reflect_x and reflect_y cases.
>
> [1]: https://lore.kernel.org/dri-devel/20240304-yuv-v4-11-76beac8e9793@bootlin.com/
>
> To: igt-dev@lists.freedesktop.org
> Cc: miquel.raynal@bootlin.com
> Cc: jeremie.dautheribes@bootlin.com
> Cc: thomas.petazzoni@bootlin.com
> Cc: arthurgrillo@riseup.net
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> Changes in v2:
> - Fix a typo in documentation
> - Fix a bug when using subsampling with non compatible sizes
> - Fix a bug I found when using different color count.
> - Add cli options to set specific plane size
> - Link to v1: https://lore.kernel.org/r/20240312-new_rotation-v1-0-ed9fe82589df@bootlin.com
>
> ---
> Louis Chauvet (4):
> lib/igt_kms: Add reflection name and mask
> lib/igt_fb: Expose lookup_drm_format to access format properties in tests
> tests/kms_rotation: Add extensive rotation test
> tests/kms_rotation: Add command line option to reduce the number of tests
>
> lib/igt_fb.c | 15 +-
> lib/igt_fb.h | 29 +++
> lib/igt_kms.c | 23 +++
> lib/igt_kms.h | 3 +
> tests/kms_rotation.c | 550 +++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 6 files changed, 608 insertions(+), 13 deletions(-)
> ---
> base-commit: a44ebfe43edc96acab22a19b6a8850eef9202eea
> change-id: 20240312-new_rotation-c034a68b3b9d
>
> Best regards,
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2024-03-18 8:27 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-13 17:09 [PATCH i-g-t v2 0/4] New rotation test Louis Chauvet
2024-03-13 17:09 ` [PATCH i-g-t v2 1/4] lib/igt_kms: Add reflection name and mask Louis Chauvet
2024-03-13 20:00 ` Arthur Grillo
2024-03-15 16:11 ` Louis Chauvet
2024-03-13 17:09 ` [PATCH i-g-t v2 2/4] lib/igt_fb: Expose lookup_drm_format to access format properties in tests Louis Chauvet
2024-03-13 17:09 ` [PATCH i-g-t v2 3/4] tests/kms_rotation: Add extensive rotation test Louis Chauvet
2024-03-14 17:06 ` Kamil Konieczny
2024-03-15 16:11 ` Louis Chauvet
2024-03-14 17:42 ` Arthur Grillo
2024-03-15 16:11 ` Louis Chauvet
2024-03-16 12:28 ` Arthur Grillo
2024-03-14 18:44 ` Kamil Konieczny
2024-03-13 17:09 ` [PATCH i-g-t v2 4/4] tests/kms_rotation: Add command line option to reduce the number of tests Louis Chauvet
2024-03-13 17:49 ` ✓ CI.xeBAT: success for New rotation test (rev2) Patchwork
2024-03-13 18:05 ` ✓ Fi.CI.BAT: " Patchwork
2024-03-14 0:31 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-03-18 8:26 ` [PATCH i-g-t v2 0/4] New rotation test Modem, Bhanuprakash
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.