igt-dev.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API
@ 2025-08-15  4:06 Alex Hung
  2025-08-15  4:06 ` [PATCH V10 01/30] tests/kms_writeback: Fix kms_writeback for VKMS Alex Hung
                   ` (33 more replies)
  0 siblings, 34 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

This series introduces support for
* drm_colorop DRM objects
* COLOR_PIPELINE plane property

Kernel changes can be found at [1] and on dri-devel.

It also adds a new kms_colorop test case that tests the color pipeline
API. The tests are designed to be easily extensible with a "transform"
and "compare" function pointer for each test. The "transform" function
performs the transformations under test via SW routines. The "compare"
function compares the DRM/KMS result (via a writeback connector) with
the result derived via the SW "transform".

This series introduces a number of tests for pre-defined transfer
functions, custom LUTs, 3x4 CTMs, a multiplier, 3D LUT, and a bypass
test.

It tests 8-bit and 10-bit RGB surface formats, depending on driver support
on the drm_plane as well as the writeback drm_connector end.

[1] https://gitlab.freedesktop.org/alex.hung/linux/-/tree/amd-color-pipeline-v11

v10:
 - Merge some patches accordingly
 - Change drm_color_lut_32 to drm_color_lut32
 - Fix 16bit to 32bit coversions in configure_3dlut()
 - Fix errors and warnings reported by checkpatch
 - Clear dead code and redundant debug messages and comments

v9:
 - Check !display->has_plane_color_pipeline before igt_plane_has_prop (
   IGT_PLANE_COLOR_ENCODING and IGT_PLANE_COLOR_RANGE)  (Chaitanya Kumar Borah)

v8:
 - Add a new colorop uniqueness subtest
 - Include a patch "lib/igt_kms: Destroy colorops on exit"
 - Add function documentation comment for get_writeback_formats_blob
 - Fix indentation errors and a new blank line at EOF

v7:
 - Add more documents and sync up with kernel implementation
 - Update 3DLUT tests according to kernel changes

v5:
 - Bypass test
 - 10 bpc support
 - Proper setup and cleanup
 - PQ/BT2020 TFs
 - 1D LUT tests
 - Multiplier tests
 - 3D LUT test

v4:
 - Intel color pipeline work, to possibly be combined with v5 in a future iteration.

v3:
 - Remove need for IOCTLs and libdrm changes
 - Test colorop properties with both atomic and legacy code paths
 - move enum drm_colorop_type to drm_mode.h
 - Add descriptions for public functions in lib (Kamil)
 - Use SPDX style license identifier (Kamil)
 - Replace Skia license comment with copyright note in file header
 - Fix kms_colorop subtests if applicable color pipeline not found

Alex Hung (9):
  tests/kms_colorop: Add a TF sRGB test
  lib/igt_color: Add 1D LUT color transformation support
  test/kms_colorop: Add tests that exercise the 1D LUT colorops
  tests/kms_colorop: Add multiplier tests
  scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D
    LUT API
  tests/kms_colorop: Add a 3D LUT subtest
  drm-uapi: Update kernel doc for drm_colorop_type
  drm-uapi: Sync up definition with kernel colorop implementation
  tests/kms_colorop: Add a colorop uniqueness subtest

Bhanuprakash Modem (1):
  lib/igt_kms: Destroy colorops on exit

Harry Wentland (20):
  tests/kms_writeback: Fix kms_writeback for VKMS
  lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
  drm-uapi: Add COLOROP object
  tests/kms_properties: Add colorop properties test
  igt/color: Add SW color transform functionality
  lib/igt_fb: Add igt_copy_fb function
  lib/drmtest: Add is_vkms_device()
  tests/kms_colorop: Add kms_colorop tests
  lib/igt_kms: Add support for DATA colorop property
  lib/igt_color: Add support for 3x4 matrices
  tests/kms_colorop: Add 3x4 CTM tests
  tests/kms_colorop: Add bypass test
  tests/kms_colorop: Add 10bpc test
  tests/kms_colorop: Skip if writeback does not support fourcc
  lib/igt_fb: Allow any non-planar format for igt_copy_fb
  lib/igt_color: Support color transform for XRGB2101010
  lib/igt_color: Add PQ variants for 0-1 and 0-125 range
  tests/kms_colorop: Add tests for PQ variants
  lib/igt_color: add BT2020/BT709 transfer functions
  tests/kms_colorop: Add TF BT2020/BT709 tests

 include/drm-uapi/amdgpu_drm.h |    9 -
 include/drm-uapi/drm.h        |   15 +
 include/drm-uapi/drm_mode.h   |  111 +
 lib/drmtest.c                 |    5 +
 lib/drmtest.h                 |    1 +
 lib/igt_color.c               |  634 +++++
 lib/igt_color.h               |  149 +
 lib/igt_color_lut.h           | 4946 +++++++++++++++++++++++++++++++++
 lib/igt_fb.c                  |   33 +-
 lib/igt_fb.h                  |    3 +
 lib/igt_kms.c                 |  378 ++-
 lib/igt_kms.h                 |   98 +
 lib/meson.build               |    1 +
 scripts/convert_3dlut.py      |   94 +
 tests/kms_colorop.c           |  734 +++++
 tests/kms_colorop.h           |  262 ++
 tests/kms_properties.c        |   92 +-
 tests/kms_writeback.c         |   19 +-
 tests/meson.build             |    1 +
 19 files changed, 7543 insertions(+), 42 deletions(-)
 create mode 100644 lib/igt_color.c
 create mode 100644 lib/igt_color.h
 create mode 100644 lib/igt_color_lut.h
 create mode 100755 scripts/convert_3dlut.py
 create mode 100644 tests/kms_colorop.c
 create mode 100644 tests/kms_colorop.h

-- 
2.43.0


^ permalink raw reply	[flat|nested] 49+ messages in thread

* [PATCH V10 01/30] tests/kms_writeback: Fix kms_writeback for VKMS
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 02/30] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE Alex Hung
                   ` (32 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

VKMS doesn't like us to add buffers with unknown fourcc
type. Other drivers might behave similarly. Make sure
we avoid creating 10bpc buffers if they are not supported.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_writeback.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/tests/kms_writeback.c b/tests/kms_writeback.c
index 1b81088d7..511d2630b 100644
--- a/tests/kms_writeback.c
+++ b/tests/kms_writeback.c
@@ -112,6 +112,10 @@ static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
 	height = override_mode.vdisplay;
 
 	for (i = 0; i < sizeof(fourcc) / sizeof(uint32_t); i++) {
+		plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+
+		if (!igt_plane_has_format_mod(plane, fourcc[i], DRM_FORMAT_MOD_LINEAR))
+			continue;
 
 		ret = igt_create_fb(display->drm_fd, width, height,
 				    fourcc[i], modifier, &input_fb);
@@ -121,7 +125,6 @@ static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
 				    fourcc[i], modifier, &output_fb);
 		igt_assert_lte(0, ret);
 
-		plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
 		igt_plane_set_fb(plane, &input_fb);
 		igt_output_set_writeback_fb(output, &output_fb);
 
@@ -571,12 +574,14 @@ igt_main_args("b:c:f:dl", long_options, help_str, opt_handler, NULL)
 				      &input_fb);
 		igt_assert(fb_id >= 0);
 
-		fb_id = igt_create_fb(display.drm_fd, mode.hdisplay,
-				      mode.vdisplay,
-				      DRM_FORMAT_XRGB2101010,
-				      DRM_FORMAT_MOD_LINEAR,
-				      &input_fb_10bit);
-		igt_assert(fb_id >= 0);
+		if (data.supported_colors & XRGB2101010) {
+			fb_id = igt_create_fb(display.drm_fd, mode.hdisplay,
+					      mode.vdisplay,
+					      DRM_FORMAT_XRGB2101010,
+					      DRM_FORMAT_MOD_LINEAR,
+					      &input_fb_10bit);
+			igt_assert(fb_id >= 0);
+		}
 
 		igt_plane_set_fb(plane, &input_fb);
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 02/30] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
  2025-08-15  4:06 ` [PATCH V10 01/30] tests/kms_writeback: Fix kms_writeback for VKMS Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-09-03 14:11   ` Borah, Chaitanya Kumar
  2025-08-15  4:06 ` [PATCH V10 03/30] drm-uapi: Add COLOROP object Alex Hung
                   ` (31 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Setting the COLOR_PIPELINE plane prop is only allowed when the
DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE is set.

Setting COLOR_RANGE and COLOR_ENCODING is only allowed when the
DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE is NOT set.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 include/drm-uapi/drm.h | 15 ++++++++++
 lib/igt_kms.c          | 63 ++++++++++++++++++++++++++++++++++--------
 lib/igt_kms.h          |  1 +
 tests/kms_properties.c | 20 ++++++++++----
 4 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/include/drm-uapi/drm.h b/include/drm-uapi/drm.h
index 4e4f7c2c3..6b9af3348 100644
--- a/include/drm-uapi/drm.h
+++ b/include/drm-uapi/drm.h
@@ -869,6 +869,21 @@ struct drm_get_cap {
  */
 #define DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT	6
 
+/**
+ * DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
+ *
+ * If set to 1, the DRM core will
+ * - expose plane COLOR_PIPELINE properties for pre-blending color management.
+ * - reject setting of these plane properties:
+ *   - COLOR_ENCODING
+ *   - COLOR_RANGE
+ *
+ * The client must enable &DRM_CLIENT_CAP_ATOMIC first.
+ *
+ * This capability is currently in development.
+ */
+#define DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE	7
+
 /* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
 struct drm_set_client_cap {
 	__u64 capability;
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 7191bf92e..a9641eba4 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -2545,6 +2545,8 @@ static int get_drm_plane_type(int drm_fd, uint32_t plane_id)
 
 static void igt_plane_reset(igt_plane_t *plane)
 {
+	igt_display_t *display = plane->pipe->display;
+
 	/* Reset src coordinates. */
 	igt_plane_set_prop_value(plane, IGT_PLANE_SRC_X, 0);
 	igt_plane_set_prop_value(plane, IGT_PLANE_SRC_Y, 0);
@@ -2561,13 +2563,15 @@ static void igt_plane_reset(igt_plane_t *plane)
 	igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, 0);
 	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, 0);
 
-	if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
-		igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_ENCODING,
-			igt_color_encoding_to_str(IGT_COLOR_YCBCR_BT601));
+	if (!display->has_plane_color_pipeline) {
+		if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
+			igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_ENCODING,
+				igt_color_encoding_to_str(IGT_COLOR_YCBCR_BT601));
 
-	if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
-		igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_RANGE,
-			igt_color_range_to_str(IGT_COLOR_YCBCR_LIMITED_RANGE));
+		if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
+			igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_RANGE,
+				igt_color_range_to_str(IGT_COLOR_YCBCR_LIMITED_RANGE));
+	}
 
 	/* Use default rotation */
 	if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
@@ -2982,6 +2986,9 @@ void igt_display_require(igt_display_t *display, int drm_fd)
 	if (drmSetClientCap(drm_fd, LOCAL_DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, 1) == 0)
 		display->has_virt_cursor_plane = 1;
 
+	if (drmSetClientCap(drm_fd, DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE, 1) == 0)
+		display->has_plane_color_pipeline = 1;
+
 	plane_resources = drmModeGetPlaneResources(display->drm_fd);
 	igt_assert(plane_resources);
 
@@ -3609,6 +3616,29 @@ static uint32_t igt_plane_get_fb_id(igt_plane_t *plane)
 	igt_assert_eq(r, 0);	\
 }
 
+static bool
+igt_atomic_ignore_plane_prop(igt_pipe_t *pipe, uint32_t prop)
+{
+	igt_display_t *display = pipe->display;
+
+	if (display->has_plane_color_pipeline) {
+		switch (prop) {
+		case IGT_PLANE_COLOR_ENCODING:
+		case IGT_PLANE_COLOR_RANGE:
+			return true;
+		default:
+			return false;
+		}
+	} else {
+		switch (prop) {
+		default:
+			return false;
+		}
+	}
+
+	return false;
+}
+
 /*
  * Add position and fb changes of a plane to the atomic property set
  */
@@ -3628,6 +3658,12 @@ igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_pipe_t *pipe,
 	    igt_plane_get_fb_id(plane));
 
 	for (i = 0; i < IGT_NUM_PLANE_PROPS; i++) {
+		if (igt_atomic_ignore_plane_prop(pipe, i)) {
+			igt_debug("plane %s.%d: Ignoring property \"%s\" to 0x%"PRIx64"/%"PRIi64"\n",
+				kmstest_pipe_name(pipe->pipe), plane->index, igt_plane_prop_names[i],
+			plane->values[i], plane->values[i]);			continue;
+		}
+
 		if (!igt_plane_is_prop_changed(plane, i))
 			continue;
 
@@ -5222,12 +5258,15 @@ void igt_plane_set_fb(igt_plane_t *plane, struct igt_fb *fb)
 		igt_fb_set_position(fb, plane, 0, 0);
 		igt_fb_set_size(fb, plane, fb->width, fb->height);
 
-		if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
-			igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_ENCODING,
-				igt_color_encoding_to_str(fb->color_encoding));
-		if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
-			igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_RANGE,
-				igt_color_range_to_str(fb->color_range));
+		if (!display->has_plane_color_pipeline) {
+			if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
+				igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_ENCODING,
+					igt_color_encoding_to_str(fb->color_encoding));
+
+			if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
+				igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_RANGE,
+					igt_color_range_to_str(fb->color_range));
+		}
 
 		/* Hack to prioritize the plane on the pipe that last set fb */
 		igt_plane_set_pipe(plane, pipe);
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index f140ad91a..8ec39fa85 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -508,6 +508,7 @@ struct igt_display {
 	bool has_cursor_plane;
 	bool is_atomic;
 	bool has_virt_cursor_plane;
+	bool has_plane_color_pipeline;
 	bool first_commit;
 
 	uint64_t *modifiers;
diff --git a/tests/kms_properties.c b/tests/kms_properties.c
index b30387888..e646b8184 100644
--- a/tests/kms_properties.c
+++ b/tests/kms_properties.c
@@ -101,7 +101,7 @@ static void cleanup_pipe(igt_display_t *display, enum pipe pipe, igt_output_t *o
 }
 
 static bool ignore_property(uint32_t obj_type, uint32_t prop_flags,
-			    const char *name, bool atomic)
+			    const char *name, bool atomic, bool has_color_pipeline)
 {
 	if (prop_flags & DRM_MODE_PROP_IMMUTABLE)
 		return true;
@@ -111,6 +111,14 @@ static bool ignore_property(uint32_t obj_type, uint32_t prop_flags,
 		if (atomic && !strcmp(name, "DPMS"))
 			return true;
 		break;
+	case DRM_MODE_OBJECT_PLANE:
+		if (has_color_pipeline && !strcmp(name, "COLOR_RANGE"))
+			return true;
+
+		if (has_color_pipeline && !strcmp(name, "COLOR_ENCODING"))
+			return true;
+
+		break;
 	default:
 		break;
 	}
@@ -164,7 +172,7 @@ static bool has_additional_test_lookup(uint32_t obj_type, const char *name,
 
 	return false;
 }
-static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic)
+static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic, bool has_color_pipeline)
 {
 	drmModeObjectPropertiesPtr props =
 		drmModeObjectGetProperties(fd, id, type);
@@ -183,7 +191,7 @@ static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic)
 
 		igt_assert(prop);
 
-		if (ignore_property(type, prop->flags, prop->name, atomic)) {
+		if (ignore_property(type, prop->flags, prop->name, atomic, has_color_pipeline)) {
 			igt_debug("Ignoring property \"%s\"\n", prop->name);
 
 			continue;
@@ -230,7 +238,7 @@ static void run_plane_property_tests(igt_display_t *display, enum pipe pipe, igt
 		igt_info("Testing plane properties on %s.#%d-%s (output: %s)\n",
 			 kmstest_pipe_name(pipe), plane->index, kmstest_plane_type_name(plane->type), output->name);
 
-		test_properties(display->drm_fd, DRM_MODE_OBJECT_PLANE, plane->drm_plane->plane_id, atomic);
+		test_properties(display->drm_fd, DRM_MODE_OBJECT_PLANE, plane->drm_plane->plane_id, atomic, display->has_plane_color_pipeline);
 	}
 
 	cleanup_pipe(display, pipe, output, &fb);
@@ -244,7 +252,7 @@ static void run_crtc_property_tests(igt_display_t *display, enum pipe pipe, igt_
 
 	igt_info("Testing crtc properties on %s (output: %s)\n", kmstest_pipe_name(pipe), output->name);
 
-	test_properties(display->drm_fd, DRM_MODE_OBJECT_CRTC, display->pipes[pipe].crtc_id, atomic);
+	test_properties(display->drm_fd, DRM_MODE_OBJECT_CRTC, display->pipes[pipe].crtc_id, atomic, false);
 
 	cleanup_pipe(display, pipe, output, &fb);
 }
@@ -258,7 +266,7 @@ static void run_connector_property_tests(igt_display_t *display, enum pipe pipe,
 
 	igt_info("Testing connector properties on output %s (pipe: %s)\n", output->name, kmstest_pipe_name(pipe));
 
-	test_properties(display->drm_fd, DRM_MODE_OBJECT_CONNECTOR, output->id, atomic);
+	test_properties(display->drm_fd, DRM_MODE_OBJECT_CONNECTOR, output->id, atomic, false);
 
 	if (pipe != PIPE_NONE)
 		cleanup_pipe(display, pipe, output, &fb);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 03/30] drm-uapi: Add COLOROP object
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
  2025-08-15  4:06 ` [PATCH V10 01/30] tests/kms_writeback: Fix kms_writeback for VKMS Alex Hung
  2025-08-15  4:06 ` [PATCH V10 02/30] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-26 16:37   ` Aurabindo Pillai
  2025-08-15  4:06 ` [PATCH V10 04/30] lib/igt_kms: Destroy colorops on exit Alex Hung
                   ` (30 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

DRM is introducing a new DRM core obejct, a drm_colorop. This
object will represent one color operation in a color pipeline.

Introduce the object type in the drm-uapi, including the
following types:
- DRM_COLOROP_1D_CURVE,
- DRM_COLOROP_1D_LUT,
- DRM_COLOROP_CTM_3X4,

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 include/drm-uapi/amdgpu_drm.h |   9 --
 include/drm-uapi/drm_mode.h   |  23 +++
 lib/igt_kms.c                 | 272 +++++++++++++++++++++++++++++++++-
 lib/igt_kms.h                 |  89 +++++++++++
 tests/kms_properties.c        |   3 +
 5 files changed, 381 insertions(+), 15 deletions(-)

diff --git a/include/drm-uapi/amdgpu_drm.h b/include/drm-uapi/amdgpu_drm.h
index b38f27d69..ca24519c7 100644
--- a/include/drm-uapi/amdgpu_drm.h
+++ b/include/drm-uapi/amdgpu_drm.h
@@ -1590,15 +1590,6 @@ struct drm_amdgpu_info_uq_metadata {
 #define AMDGPU_FAMILY_GC_11_5_0			150 /* GC 11.5.0 */
 #define AMDGPU_FAMILY_GC_12_0_0			152 /* GC 12.0.0 */
 
-/* FIXME wrong namespace! */
-struct drm_color_ctm_3x4 {
-	/*
-	 * Conversion matrix with 3x4 dimensions in S31.32 sign-magnitude
-	 * (not two's complement!) format.
-	 */
-	__u64 matrix[12];
-};
-
 #if defined(__cplusplus)
 }
 #endif
diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index c082810c0..fce45b5cf 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -629,6 +629,7 @@ struct drm_mode_connector_set_property {
 #define DRM_MODE_OBJECT_FB 0xfbfbfbfb
 #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
 #define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
+#define DRM_MODE_OBJECT_COLOROP 0xfafafafa
 #define DRM_MODE_OBJECT_ANY 0
 
 struct drm_mode_obj_get_properties {
@@ -846,6 +847,22 @@ struct drm_color_ctm {
 	__u64 matrix[9];
 };
 
+struct drm_color_ctm_3x4 {
+	/*
+	 * Conversion matrix with 3x4 dimensions in S31.32 sign-magnitude
+	 * (not two's complement!) format.
+	 *
+	 * TODO what's the format?
+	 *
+	 * out   matrix          in
+	 * |R|   |0  1  2  3 |   | R |
+	 * |G| = |4  5  6  7 | x | G |
+	 * |B|   |8  9  10 12|   | B |
+	 *                       |1.0|
+	 */
+	__u64 matrix[12];
+};
+
 struct drm_color_lut {
 	/*
 	 * Values are mapped linearly to 0.0 - 1.0 range, with 0x0 == 0.0 and
@@ -857,6 +874,12 @@ struct drm_color_lut {
 	__u16 reserved;
 };
 
+enum drm_colorop_type {
+	DRM_COLOROP_1D_CURVE,
+	DRM_COLOROP_1D_LUT,
+	DRM_COLOROP_CTM_3X4,
+};
+
 /**
  * struct drm_plane_size_hint - Plane size hints
  * @width: The width of the plane in pixel
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index a9641eba4..69beb523f 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -92,6 +92,7 @@
 #define MAX_CONNECTORS 32
 #define MAX_EDID 2
 #define DISPLAY_TILE_BLOCK 0x12
+#define MAX_NUM_COLOROPS 128
 
 typedef bool (*igt_connector_attr_set)(int dir, const char *attr, const char *value);
 
@@ -702,6 +703,14 @@ const char * const igt_plane_prop_names[IGT_NUM_PLANE_PROPS] = {
 	[IGT_PLANE_SCALING_FILTER] = "SCALING_FILTER",
 	[IGT_PLANE_SIZE_HINTS] = "SIZE_HINTS",
 	[IGT_PLANE_IN_FORMATS_ASYNC] = "IN_FORMATS_ASYNC",
+	[IGT_PLANE_COLOR_PIPELINE] = "COLOR_PIPELINE",
+};
+
+const char * const igt_colorop_prop_names[IGT_NUM_COLOROP_PROPS] = {
+	[IGT_COLOROP_TYPE] = "TYPE",
+	[IGT_COLOROP_BYPASS] = "BYPASS",
+	[IGT_COLOROP_CURVE_1D_TYPE] = "CURVE_1D_TYPE",
+	[IGT_COLOROP_NEXT] = "NEXT",
 };
 
 const char * const igt_crtc_prop_names[IGT_NUM_CRTC_PROPS] = {
@@ -769,6 +778,108 @@ igt_plane_rotations(igt_display_t *display, igt_plane_t *plane,
 	return rotations;
 }
 
+/**
+ * igt_find_colorop:
+ * @display: display on which to look for colorop.
+ * @id: DRM object id of the colorop.
+ *
+ * Returns: An igt_colorop_t if found, or NULL otherwise.
+ */
+igt_colorop_t *igt_find_colorop(igt_display_t *display, uint32_t id)
+{
+	int i;
+
+	/* find corresponding igt_colorop */
+	for (i = 0; i < display->n_colorops; ++i) {
+		igt_colorop_t *colorop = &display->colorops[i];
+
+		if (colorop->id == id)
+			return colorop;
+	}
+
+	return NULL;
+}
+
+/*
+ * Retrieve all the properies specified in props_name and store them into
+ * colorop->props.
+ */
+static void
+igt_fill_colorop_props(igt_display_t *display, igt_colorop_t *colorop,
+		       int num_props, const char * const prop_names[])
+{
+	drmModeObjectPropertiesPtr props;
+	int i, j, fd;
+
+	fd = display->drm_fd;
+
+	props = drmModeObjectGetProperties(fd, colorop->id, DRM_MODE_OBJECT_COLOROP);
+	igt_assert(props);
+
+	for (i = 0; i < props->count_props; i++) {
+		drmModePropertyPtr prop =
+			drmModeGetProperty(fd, props->props[i]);
+
+		for (j = 0; j < num_props; j++) {
+			if (strcmp(prop->name, prop_names[j]) != 0)
+				continue;
+
+			colorop->props[j] = props->props[i];
+			break;
+		}
+
+		drmModeFreeProperty(prop);
+	}
+	drmModeFreeObjectProperties(props);
+}
+
+static void igt_fill_colorop(igt_display_t *display, igt_plane_t *plane,
+			     igt_colorop_t *colorop, uint32_t id,
+			     char *name)
+{
+	colorop->id = id;
+	colorop->plane = plane;
+
+	if (name)
+		memcpy(colorop->name, name, sizeof(colorop->name));
+
+	igt_fill_colorop_props(display, colorop, IGT_NUM_COLOROP_PROPS, igt_colorop_prop_names);
+}
+
+static void
+igt_fill_plane_color_pipelines(igt_display_t *display, igt_plane_t *plane,
+			       drmModePropertyPtr prop)
+{
+	int i;
+	uint32_t colorop_id;
+
+	plane->num_color_pipelines = 0;
+
+	for (i = 0; i < prop->count_enums; i++) {
+		if (prop->enums[i].value) {
+			igt_colorop_t *colorop = &display->colorops[display->n_colorops++];
+
+			igt_assert(display->n_colorops < MAX_NUM_COLOROPS);
+
+			igt_fill_colorop(display, plane, colorop, prop->enums[i].value, prop->enums[i].name);
+			plane->color_pipelines[plane->num_color_pipelines++] = colorop;
+
+			/* get all NEXT colorops */
+			colorop_id = igt_colorop_get_prop(display, colorop,
+							IGT_COLOROP_NEXT);
+			while (colorop_id) {
+				colorop = &display->colorops[display->n_colorops++];
+				igt_fill_colorop(display, plane, colorop, colorop_id, NULL);
+				colorop_id = igt_colorop_get_prop(display, colorop,
+								IGT_COLOROP_NEXT);
+			}
+		}
+	}
+
+	igt_assert(plane->num_color_pipelines < IGT_NUM_PLANE_COLOR_PIPELINES);
+
+}
+
 /*
  * Retrieve all the properties specified in props_name and store them into
  * plane->props.
@@ -800,6 +911,9 @@ igt_fill_plane_props(igt_display_t *display, igt_plane_t *plane,
 		if (strcmp(prop->name, "rotation") == 0)
 			plane->rotations = igt_plane_rotations(display, plane, prop);
 
+		if (strcmp(prop->name, "COLOR_PIPELINE") == 0)
+			igt_fill_plane_color_pipelines(display, plane, prop);
+
 		drmModeFreeProperty(prop);
 	}
 
@@ -3004,16 +3118,14 @@ void igt_display_require(igt_display_t *display, int drm_fd)
 		igt_assert(plane->drm_plane);
 
 		plane->type = get_drm_plane_type(display->drm_fd, id);
-
-		/*
-		 * TODO: Fill in the rest of the plane properties here and
-		 * move away from the plane per pipe model to align closer
-		 * to the DRM KMS model.
-		 */
 	}
 
 	drmModeFreePlaneResources(plane_resources);
 
+	/* init colorops */
+	display->colorops = calloc(MAX_NUM_COLOROPS, sizeof(igt_colorop_t));
+	display->n_colorops = 0;
+
 	for_each_pipe(display, i) {
 		igt_pipe_t *pipe = &display->pipes[i];
 		igt_plane_t *plane;
@@ -3631,6 +3743,8 @@ igt_atomic_ignore_plane_prop(igt_pipe_t *pipe, uint32_t prop)
 		}
 	} else {
 		switch (prop) {
+		case IGT_PLANE_COLOR_PIPELINE:
+			return true;
 		default:
 			return false;
 		}
@@ -3680,6 +3794,45 @@ igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_pipe_t *pipe,
 	}
 }
 
+/*
+ * Add colorop properties
+ */
+static void
+igt_atomic_prepare_colorop_commit(igt_colorop_t *colorop, igt_pipe_t *pipe,
+	drmModeAtomicReq *req)
+{
+	igt_display_t *display = pipe->display;
+	int i, next_val;
+
+	while (colorop) {
+		LOG(display,
+		    "populating colorop data: %s.%d\n",
+		    kmstest_pipe_name(pipe->pipe),
+		    colorop->id);
+
+		for (i = 0; i < IGT_NUM_COLOROP_PROPS; i++) {
+			if (!igt_colorop_is_prop_changed(colorop, i))
+				continue;
+
+			/* it's an error to try an unsupported feature */
+			igt_assert(colorop->props[i]);
+
+			igt_debug("colorop %s.%d: Setting property \"%s\" to 0x%"PRIx64"/%"PRIi64"\n",
+				kmstest_pipe_name(pipe->pipe), colorop->id, igt_colorop_prop_names[i],
+				colorop->values[i], colorop->values[i]);
+
+			igt_assert_lt(0, drmModeAtomicAddProperty(req, colorop->id,
+							colorop->props[i],
+							colorop->values[i]));
+		}
+
+		/* get next colorop */
+		next_val = igt_colorop_get_prop(display, colorop,
+						IGT_COLOROP_NEXT);
+		colorop = igt_find_colorop(display, next_val);
+	}
+}
+
 /*
  * Properties that can be changed through legacy SetProperty:
  * - Obviously not the XYWH SRC/CRTC coordinates.
@@ -4127,6 +4280,25 @@ uint64_t igt_plane_get_prop(igt_plane_t *plane, enum igt_atomic_plane_properties
 					plane->drm_plane->plane_id, plane->props[prop]);
 }
 
+/**
+ * igt_colorop_get_prop:
+ * @colorop: Target colorop.
+ * @prop: Property to check.
+ *
+ * Return current value on a colorop for a given property.
+ *
+ * Returns: The value the property is set to, if this
+ * is a blob, the blob id is returned. This can be passed
+ * to drmModeGetPropertyBlob() to get the contents of the blob.
+ */
+uint64_t igt_colorop_get_prop(igt_display_t *display, igt_colorop_t *colorop, enum igt_atomic_colorop_properties prop)
+{
+	igt_assert(igt_colorop_has_prop(colorop, prop));
+
+	return igt_mode_object_get_prop(display, DRM_MODE_OBJECT_COLOROP,
+					colorop->id, colorop->props[prop]);
+}
+
 static bool igt_mode_object_get_prop_enum_value(int drm_fd, uint32_t id, const char *str, uint64_t *val)
 {
 	drmModePropertyPtr prop = drmModeGetProperty(drm_fd, id);
@@ -4215,6 +4387,44 @@ bool igt_plane_check_prop_is_mutable(igt_plane_t *plane,
 	return !(prop->flags & DRM_MODE_PROP_IMMUTABLE);
 }
 
+/**
+ * igt_plane_is_valid_colorop:
+ * @plane: Target plane.
+ * @colorop: Colorop to check.
+ *
+ * Returns: True if the given @colorop is a valid color pipeline on
+ * the given @plane
+ */
+bool igt_plane_is_valid_colorop(igt_plane_t *plane, igt_colorop_t *colorop)
+{
+	int i;
+	bool found = false;
+
+	for (i = 0; i < plane->num_color_pipelines; i++) {
+		if (plane->color_pipelines[i] == colorop) {
+			found = true;
+			break;
+		}
+	}
+
+	return found;
+}
+/**
+ * igt_plane_set_color_pipeline:
+ * @plane: Target plane.
+ * @colorop: Colorop to set as color pipeline.
+ *
+ * This function sets the given @colorop as color pipeline on @plane, or fails
+ * the test if it's an invalid color pipeline for the plane.
+ */
+void igt_plane_set_color_pipeline(igt_plane_t *plane, igt_colorop_t *colorop)
+{
+	igt_assert(igt_plane_is_valid_colorop(plane, colorop));
+
+	plane->assigned_color_pipeline = colorop;
+	igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_PIPELINE, colorop->name);
+}
+
 /**
  * igt_plane_replace_prop_blob:
  * @plane: plane to set property on.
@@ -4247,6 +4457,51 @@ igt_plane_replace_prop_blob(igt_plane_t *plane, enum igt_atomic_plane_properties
 	igt_plane_set_prop_changed(plane, prop);
 }
 
+/**
+ * igt_colorop_try_prop_enum:
+ * @colorop: Target colorop.
+ * @prop: Property to check.
+ * @val: Value to set.
+ *
+ * Returns: False if the given @colorop doesn't have the enum @prop or
+ * failed to set the enum property @val else True.
+ */
+bool igt_colorop_try_prop_enum(igt_colorop_t *colorop,
+			       enum igt_atomic_colorop_properties prop,
+			       const char *val)
+{
+	igt_display_t *display = colorop->plane->pipe->display;
+	uint64_t uval;
+
+	igt_assert(colorop->props[prop]);
+
+	if (!igt_mode_object_get_prop_enum_value(display->drm_fd,
+						 colorop->props[prop], val, &uval))
+		return false;
+
+	igt_colorop_set_prop_value(colorop, prop, uval);
+	return true;
+}
+
+/**
+ * igt_colorop_set_prop_enum:
+ * @plane: Target plane.
+ * @prop: Property to check.
+ * @val: Value to set.
+ *
+ * This function tries to set given enum property @prop value @val to
+ * the given @colorop, and terminate the execution if its failed.
+ */
+void igt_colorop_set_prop_enum(igt_colorop_t *colorop,
+			       enum igt_atomic_colorop_properties prop,
+			       const char *val)
+{
+	bool result = false;
+
+	result = igt_colorop_try_prop_enum(colorop, prop, val);
+	igt_assert(result);
+}
+
 /**
  * igt_output_get_prop:
  * @output: Target output.
@@ -4519,6 +4774,11 @@ static int igt_atomic_commit(igt_display_t *display, uint32_t flags, void *user_
 
 			if (plane->changed)
 				igt_atomic_prepare_plane_commit(plane, pipe_obj, req);
+
+			/* TODO iterate over assigned color pipeline and prepare colorop commit */
+			if (plane->assigned_color_pipeline)
+				igt_atomic_prepare_colorop_commit(plane->assigned_color_pipeline,
+								  pipe_obj, req);
 		}
 
 	}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 8ec39fa85..dc2a2d9e0 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -366,9 +366,18 @@ enum igt_atomic_plane_properties {
        IGT_PLANE_HOTSPOT_Y,
        IGT_PLANE_SIZE_HINTS,
        IGT_PLANE_IN_FORMATS_ASYNC,
+       IGT_PLANE_COLOR_PIPELINE,
        IGT_NUM_PLANE_PROPS,
 };
 
+enum igt_atomic_colorop_properties {
+	IGT_COLOROP_TYPE,
+	IGT_COLOROP_BYPASS,
+	IGT_COLOROP_CURVE_1D_TYPE,
+	IGT_COLOROP_NEXT,
+	IGT_NUM_COLOROP_PROPS
+};
+
 /**
  * igt_plane_prop_names
  *
@@ -377,10 +386,20 @@ enum igt_atomic_plane_properties {
  */
 extern const char * const igt_plane_prop_names[];
 
+/**
+ * igt_colorop_prop_names
+ *
+ * igt_colorop_prop_names contains a list of colorop property names,
+ * as indexed by the igt_atomic_colorop_properties enum.
+ */
+extern const char * const igt_colorop_prop_names[];
+
 typedef struct igt_display igt_display_t;
 typedef struct igt_pipe igt_pipe_t;
 typedef uint32_t igt_fixed_t;			/* 16.16 fixed point */
 
+#define IGT_NUM_PLANE_COLOR_PIPELINES 4
+
 typedef enum {
 	/* this maps to the kernel API */
 	IGT_ROTATION_0   = 1 << 0,
@@ -406,6 +425,20 @@ static inline bool igt_rotation_90_or_270(igt_rotation_t rotation)
 	return rotation & (IGT_ROTATION_90 | IGT_ROTATION_270);
 }
 
+typedef struct igt_plane igt_plane_t;
+
+typedef struct igt_colorop {
+	uint32_t id;
+	igt_plane_t *plane;
+
+	char name[DRM_PROP_NAME_LEN];
+
+	uint64_t changed;
+	uint32_t props[IGT_NUM_COLOROP_PROPS];
+	uint64_t values[IGT_NUM_COLOROP_PROPS];
+
+} igt_colorop_t;
+
 typedef struct igt_plane {
 	/*< private >*/
 	igt_pipe_t *pipe;
@@ -443,6 +476,11 @@ typedef struct igt_plane {
 	uint64_t *async_modifiers;
 	uint32_t *async_formats;
 	int async_format_mod_count;
+
+	igt_colorop_t *color_pipelines[IGT_NUM_PLANE_COLOR_PIPELINES];
+	int num_color_pipelines;
+
+	igt_colorop_t *assigned_color_pipeline;
 } igt_plane_t;
 
 /*
@@ -501,9 +539,11 @@ struct igt_display {
 	int log_shift;
 	int n_pipes;
 	int n_planes;
+	int n_colorops;
 	int n_outputs;
 	igt_output_t *outputs;
 	igt_plane_t *planes;
+	igt_colorop_t *colorops;
 	igt_pipe_t *pipes;
 	bool has_cursor_plane;
 	bool is_atomic;
@@ -846,6 +886,53 @@ extern void igt_plane_set_prop_enum(igt_plane_t *plane,
 				    enum igt_atomic_plane_properties prop,
 				    const char *val);
 
+
+
+extern bool igt_plane_is_valid_colorop(igt_plane_t *plane, igt_colorop_t *colorop);
+
+extern void igt_plane_set_color_pipeline(igt_plane_t *plane, igt_colorop_t *colorop);
+
+/**
+ * igt_colorop_has_prop:
+ * @colorop: colorop to check.
+ * @prop: Property to check.
+ *
+ * Check whether colorop supports a given property.
+ *
+ * Returns: True if the property is supported, otherwise false.
+ */
+static inline bool
+igt_colorop_has_prop(igt_colorop_t *colorop, enum igt_atomic_colorop_properties prop)
+{
+	return colorop->props[prop];
+}
+
+uint64_t igt_colorop_get_prop(igt_display_t *display, igt_colorop_t *colorop, enum igt_atomic_colorop_properties prop);
+
+#define igt_colorop_is_prop_changed(colorop, prop) \
+	(!!((colorop)->changed & (1 << (prop))))
+
+#define igt_colorop_set_prop_changed(colorop, prop) \
+	((colorop)->changed |= 1 << (prop))
+
+#define igt_colorop_clear_prop_changed(colorop, prop) \
+	((colorop)->changed &= ~(1 << (prop)))
+
+#define igt_colorop_set_prop_value(colorop, prop, value) \
+	do { \
+		colorop->values[prop] = value; \
+		igt_colorop_set_prop_changed(colorop, prop); \
+	} while (0)
+
+
+extern bool igt_colorop_try_prop_enum(igt_colorop_t *colorop,
+				      enum igt_atomic_colorop_properties prop,
+				      const char *val);
+
+extern void igt_colorop_set_prop_enum(igt_colorop_t *colorop,
+				      enum igt_atomic_colorop_properties prop,
+				      const char *val);
+
 extern void igt_plane_replace_prop_blob(igt_plane_t *plane,
 					enum igt_atomic_plane_properties prop,
 					const void *ptr, size_t length);
@@ -1289,4 +1376,6 @@ int igt_backlight_write(int value, const char *fname, igt_backlight_context_t *c
 
 drmModePropertyBlobRes *igt_get_writeback_formats_blob(igt_output_t *output);
 
+igt_colorop_t *igt_find_colorop(igt_display_t *display, uint32_t id);
+
 #endif /* __IGT_KMS_H__ */
diff --git a/tests/kms_properties.c b/tests/kms_properties.c
index e646b8184..3bdf23aad 100644
--- a/tests/kms_properties.c
+++ b/tests/kms_properties.c
@@ -112,6 +112,9 @@ static bool ignore_property(uint32_t obj_type, uint32_t prop_flags,
 			return true;
 		break;
 	case DRM_MODE_OBJECT_PLANE:
+		if (!has_color_pipeline && !strcmp(name, "COLOR_PIPELINE"))
+			return true;
+
 		if (has_color_pipeline && !strcmp(name, "COLOR_RANGE"))
 			return true;
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 04/30] lib/igt_kms: Destroy colorops on exit
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (2 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 03/30] drm-uapi: Add COLOROP object Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 05/30] tests/kms_properties: Add colorop properties test Alex Hung
                   ` (29 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu, Bhanuprakash Modem

From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>

- Free the memory allocated for colorops on igt_display_fini()
- Disable COLOR_PIPELINE on igt_display_reset()

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
---
 lib/igt_kms.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 69beb523f..67be5240f 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -2708,6 +2708,9 @@ static void igt_plane_reset(igt_plane_t *plane)
 	if (igt_plane_has_prop(plane, IGT_PLANE_HOTSPOT_Y))
 		igt_plane_set_prop_value(plane, IGT_PLANE_HOTSPOT_Y, 0);
 
+	if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE))
+		igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_PIPELINE, "Bypass");
+
 	igt_plane_clear_prop_changed(plane, IGT_PLANE_IN_FENCE_FD);
 	plane->values[IGT_PLANE_IN_FENCE_FD] = ~0ULL;
 	plane->gem_handle = 0;
@@ -3436,12 +3439,15 @@ void igt_display_fini(igt_display_t *display)
 
 	for (i = 0; i < display->n_outputs; i++)
 		igt_output_fini(&display->outputs[i]);
+
 	free(display->outputs);
 	display->outputs = NULL;
 	free(display->pipes);
 	display->pipes = NULL;
 	free(display->planes);
 	display->planes = NULL;
+	free(display->colorops);
+	display->colorops = NULL;
 }
 
 static void igt_display_refresh(igt_display_t *display)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 05/30] tests/kms_properties: Add colorop properties test
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (3 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 04/30] lib/igt_kms: Destroy colorops on exit Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 06/30] igt/color: Add SW color transform functionality Alex Hung
                   ` (28 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

We've introduced the concept of a new DRM core object, the
drm_colorop, to represent a color operation as part of a
color pipeline.

Add new tests to kms_properties to test the properties of
a drm_colorop object.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_properties.c | 69 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/tests/kms_properties.c b/tests/kms_properties.c
index 3bdf23aad..a4d73fe1b 100644
--- a/tests/kms_properties.c
+++ b/tests/kms_properties.c
@@ -47,6 +47,7 @@
  * @crtc:            CRTC
  * @plane:           Plane
  * @invalid:         Invalid (connector/crtc/plane)
+ * @colorop:         Colorop
  *
  * arg[2]:
  *
@@ -230,6 +231,39 @@ static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic, boo
 	}
 }
 
+static void run_colorop_property_tests(igt_display_t *display, enum pipe pipe, igt_output_t *output, bool atomic)
+{
+	struct igt_fb fb;
+	igt_plane_t *plane;
+	igt_colorop_t *colorop;
+	int i;
+	int colorop_id = 0;
+
+	prepare_pipe(display, pipe, output, &fb);
+
+	for_each_plane_on_pipe(display, pipe, plane) {
+		igt_info("Testing colorop properties on plane %s.#%d-%s (output: %s)\n",
+			 kmstest_pipe_name(pipe), plane->index, kmstest_plane_type_name(plane->type), output->name);
+
+		/* iterate over all color pipelines on plane */
+		for (i = 0; i < plane->num_color_pipelines; ++i) {
+			/* iterate over all colorops in pipeline*/
+			colorop = plane->color_pipelines[i];
+			while (colorop) {
+				igt_info("Testing colorop properties on %s.#%d.#%d-%s (output: %s)\n",
+					kmstest_pipe_name(pipe), plane->index, colorop->id, kmstest_plane_type_name(plane->type), output->name);
+				test_properties(display->drm_fd, DRM_MODE_OBJECT_COLOROP, colorop->id, atomic, false);
+
+				colorop_id = igt_colorop_get_prop(display, colorop,
+								IGT_COLOROP_NEXT);
+				colorop = igt_find_colorop(display, colorop_id);
+			}
+		}
+	}
+
+	cleanup_pipe(display, pipe, output, &fb);
+}
+
 static void run_plane_property_tests(igt_display_t *display, enum pipe pipe, igt_output_t *output, bool atomic)
 {
 	struct igt_fb fb;
@@ -275,6 +309,37 @@ static void run_connector_property_tests(igt_display_t *display, enum pipe pipe,
 		cleanup_pipe(display, pipe, output, &fb);
 }
 
+static void colorop_properties(igt_display_t *display, bool atomic)
+{
+	bool found_any = false, found;
+	igt_output_t *output;
+	enum pipe pipe;
+
+	/* colorops are only available with atomic */
+	igt_skip_on(!display->is_atomic);
+
+	for_each_pipe(display, pipe) {
+		found = false;
+
+		for_each_valid_output_on_pipe(display, pipe, output) {
+			igt_display_reset(display);
+
+			igt_output_set_pipe(output, pipe);
+			if (!intel_pipe_output_combo_valid(display))
+				continue;
+
+			found_any = found = true;
+
+			igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe),
+				igt_output_name(output)) {
+				run_colorop_property_tests(display, pipe, output, atomic);
+			}
+		}
+	}
+
+	igt_skip_on(!found_any);
+}
+
 static void plane_properties(igt_display_t *display, bool atomic)
 {
 	igt_output_t *output;
@@ -853,6 +918,10 @@ igt_main
 		  "Tests connector properties with legacy commit" },
 		{ "connector-properties-atomic", connector_properties, true,
 		  "Tests connector properties with atomic commit" },
+		{ "colorop-properties-legacy", colorop_properties, false,
+		  "Tests colorop properties with legacy commit" },
+		{ "colorop-properties-atomic", colorop_properties, true,
+		  "Tests colorop properties with atomic commit" },
 	};
 
 	igt_fixture {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 06/30] igt/color: Add SW color transform functionality
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (4 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 05/30] tests/kms_properties: Add colorop properties test Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 07/30] lib/igt_fb: Add igt_copy_fb function Alex Hung
                   ` (27 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

In order to test color we want to compare a HW (KMS) transform
with a SW transform. This introduces color transform for an
sRGB EOTF but this can be extended to other transforms. Code is
borrowed from Skia.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c | 246 ++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_color.h |  45 +++++++++
 lib/igt_fb.c    |   4 +-
 lib/igt_fb.h    |   2 +
 lib/meson.build |   1 +
 5 files changed, 296 insertions(+), 2 deletions(-)
 create mode 100644 lib/igt_color.c
 create mode 100644 lib/igt_color.h

diff --git a/lib/igt_color.c b/lib/igt_color.c
new file mode 100644
index 000000000..0e5f391db
--- /dev/null
+++ b/lib/igt_color.c
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * This file contains code adapted from Skia, which is
+ * distributed under a BSD-style license which can be
+ * found at
+ * https://skia.googlesource.com/skia.git/+/refs/heads/main/LICENSE
+ */
+
+#include <errno.h>
+#include <math.h>
+
+#include "igt_color.h"
+#include "igt_core.h"
+#include "igt_x86.h"
+
+
+static float clamp(float val, float min, float max)
+{
+	return ((val < min) ? min : ((val > max) ? max : val));
+}
+
+static float igt_color_tf_eval_unclamped(const struct igt_color_tf *fn, float x)
+{
+	if (x < fn->d)
+		return fn->c * x + fn->f;
+
+	return pow(fn->a * x + fn->b, fn->g) + fn->e;
+}
+
+static float igt_color_tf_eval(const struct igt_color_tf *fn, float x)
+{
+	float fn_at_x_unclamped = igt_color_tf_eval_unclamped(fn, x);
+
+	return clamp(fn_at_x_unclamped, 0.0f, 1.0f);
+}
+
+static void tf_inverse(const struct igt_color_tf *fn, struct igt_color_tf *inv)
+{
+	memset(inv, 0, sizeof(struct igt_color_tf));
+
+	if (fn->a > 0 && fn->g > 0) {
+		double a_to_the_g = pow(fn->a, fn->g);
+
+		inv->a = 1.f / a_to_the_g;
+		inv->b = -fn->e / a_to_the_g;
+		inv->g = 1.f / fn->g;
+	}
+
+	inv->d = fn->c * fn->d + fn->f;
+	inv->e = -fn->b / fn->a;
+	if (fn->c != 0) {
+		inv->c = 1.f / fn->c;
+		inv->f = -fn->f / fn->c;
+	}
+}
+
+void igt_color_srgb_inv_eotf(igt_pixel_t *pixel)
+{
+	struct igt_color_tf inv;
+
+	tf_inverse(&srgb_eotf, &inv);
+
+	pixel->r = igt_color_tf_eval(&inv, pixel->r);
+	pixel->g = igt_color_tf_eval(&inv, pixel->g);
+	pixel->b = igt_color_tf_eval(&inv, pixel->b);
+}
+
+
+
+void igt_color_srgb_eotf(igt_pixel_t *pixel)
+{
+	pixel->r = igt_color_tf_eval(&srgb_eotf, pixel->r);
+	pixel->g = igt_color_tf_eval(&srgb_eotf, pixel->g);
+	pixel->b = igt_color_tf_eval(&srgb_eotf, pixel->b);
+}
+
+int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], int num_transforms)
+{
+	uint32_t *line = NULL;
+	void *map;
+	char *ptr;
+	int x, y, cpp = igt_drm_format_to_bpp(fb->drm_format) / 8;
+	uint32_t stride = igt_fb_calc_plane_stride(fb, 0);
+
+	if (fb->num_planes != 1)
+		return -EINVAL;
+
+	/* TODO expand for other formats */
+	if (fb->drm_format != DRM_FORMAT_XRGB8888)
+		return -EINVAL;
+
+	ptr = igt_fb_map_buffer(fb->fd, fb);
+	igt_assert(ptr);
+	map = ptr;
+
+	/*
+	 * Framebuffers are often uncached, which can make byte-wise accesses
+	 * very slow. We copy each line of the FB into a local buffer to speed
+	 * up the hashing.
+	 */
+	line = malloc(stride);
+	if (!line) {
+		munmap(map, fb->size);
+		return -ENOMEM;
+	}
+
+	for (y = 0; y < fb->height; y++, ptr += stride) {
+
+		/* get line from buffer */
+		igt_memcpy_from_wc(line, ptr, fb->width * cpp);
+
+		for (x = 0; x < fb->width; x++) {
+			uint32_t raw_pixel = le32_to_cpu(line[x]);
+			igt_pixel_t pixel;
+			int i;
+
+			raw_pixel &= 0x00ffffff;
+
+			/*
+			 * unpack pixel into igt_pixel_t
+			 *
+			 * only for XRGB8888 for now
+			 *
+			 * TODO add "generic" mechanism for unpacking
+			 * other FB formats
+			 */
+			pixel.r = (raw_pixel & 0x00ff0000) >> 16;
+			pixel.g = (raw_pixel & 0x0000ff00) >> 8;
+			pixel.b = (raw_pixel & 0x000000ff);
+
+			/* normalize for 8-bit */
+			pixel.r /= (0xff);
+			pixel.g /= (0xff);
+			pixel.b /= (0xff);
+
+			/* TODO use read_rgb from igt_fb? */
+
+			/* run transform on pixel */
+
+			for (i = 0; i < num_transforms; i++)
+				transforms[i](&pixel);
+
+			/* de-normalize back to 8-bit */
+			pixel.r *= (0xff);
+			pixel.g *= (0xff);
+			pixel.b *= (0xff);
+
+			/* re-pack pixel into FB*/
+			raw_pixel = 0x0;
+			raw_pixel |= ((uint8_t)(lround(pixel.r) & 0xff)) << 16;
+			raw_pixel |= ((uint8_t)(lround(pixel.g) & 0xff)) << 8;
+			raw_pixel |= ((uint8_t)(lround(pixel.b) & 0xff));
+			/* TODO use write_rgb from igt_fb? */
+
+			/* write back to line */
+			line[x] = cpu_to_le32(raw_pixel);
+		}
+
+		/* copy line back to fb buffer */
+		igt_memcpy_from_wc(ptr, line, fb->width * cpp);
+	}
+
+	free(line);
+	igt_fb_unmap_buffer(fb, map);
+
+	return 0;
+}
+
+bool igt_cmp_fb_component(uint16_t comp1, uint16_t comp2, uint8_t up, uint8_t down)
+{
+	int16_t diff = comp2 - comp1;
+
+	if (diff < -down || diff > up)
+		return false;
+
+	return true;
+}
+
+bool igt_cmp_fb_pixels(igt_fb_t *fb1, igt_fb_t *fb2, uint8_t up, uint8_t down)
+{
+	uint32_t *ptr1, *ptr2;
+	uint32_t pixel1, pixel2, i, j;
+	bool matched = true;
+
+	ptr1 = igt_fb_map_buffer(fb1->fd, fb1);
+	ptr2 = igt_fb_map_buffer(fb2->fd, fb2);
+
+	igt_assert(fb1->drm_format == fb2->drm_format);
+	igt_assert(fb1->size == fb2->size);
+
+	for (i = 0; i < fb1->size / sizeof(uint32_t); i++) {
+		uint16_t mask = 0xff;
+		uint16_t shift = 8;
+
+		if (fb1->drm_format == DRM_FORMAT_XRGB2101010) {
+			/* ignore alpha */
+			pixel1 = ptr1[i] & ~0xc0000000;
+			pixel2 = ptr2[i] & ~0xc0000000;
+
+			mask = 0x3ff;
+			shift = 10;
+		} else if (fb1->drm_format == DRM_FORMAT_XRGB8888) {
+			/* ignore alpha */
+			pixel1 = ptr1[i] & ~0xff000000;
+			pixel2 = ptr2[i] & ~0xff000000;
+
+			mask = 0xff;
+			shift = 8;
+		} else {
+			pixel1 = ptr1[i];
+			pixel2 = ptr2[i];
+		}
+
+		for (j = 0; j < 3; j++) {
+			uint16_t comp1 = (pixel1 >> (shift * j)) & mask;
+			uint16_t comp2 = (pixel2 >> (shift * j)) & mask;
+
+			if (!igt_cmp_fb_component(comp1, comp2, up, down)) {
+				igt_info("i %d j %d shift %d mask %x comp1 %x comp2 %x, pixel1 %x pixel2 %x\n",
+					 i, j, shift, mask, comp1, comp2, pixel1, pixel2);
+				return false;
+			}
+		}
+	}
+
+	igt_fb_unmap_buffer(fb1, ptr1);
+	igt_fb_unmap_buffer(fb2, ptr2);
+
+	return matched;
+}
+
+void igt_dump_fb(igt_display_t *display, igt_fb_t *fb,
+		 const char *path_name, const char *file_name)
+{
+	char filepath_out[PATH_MAX];
+	cairo_surface_t *fb_surface_out;
+	cairo_status_t status;
+
+	snprintf(filepath_out, PATH_MAX, "%s/%s.png", path_name, file_name);
+	fb_surface_out = igt_get_cairo_surface(display->drm_fd, fb);
+	status = cairo_surface_write_to_png(fb_surface_out, filepath_out);
+	igt_assert_eq(status, CAIRO_STATUS_SUCCESS);
+	cairo_surface_destroy(fb_surface_out);
+}
diff --git a/lib/igt_color.h b/lib/igt_color.h
new file mode 100644
index 000000000..4f34a1b0d
--- /dev/null
+++ b/lib/igt_color.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * This file contains code adapted from Skia, which is
+ * distributed under a BSD-style license which can be
+ * found at
+ * https://skia.googlesource.com/skia.git/+/refs/heads/main/LICENSE
+ */
+
+
+#ifndef __IGT_COLOR_H__
+#define __IGT_COLOR_H__
+
+#include <limits.h>
+
+#include "igt_fb.h"
+#include "igt_kms.h"
+
+struct igt_color_tf {
+	float g, a, b, c, d, e, f;
+};
+
+const struct igt_color_tf srgb_eotf = {2.4f, (float)(1/1.055), (float)(0.055/1.055), (float)(1/12.92), 0.04045f, 0, 0};
+
+typedef struct igt_pixel {
+	float r;
+	float g;
+	float b;
+} igt_pixel_t;
+
+bool igt_cmp_fb_component(uint16_t comp1, uint16_t comp2, uint8_t up, uint8_t down);
+bool igt_cmp_fb_pixels(igt_fb_t *fb1, igt_fb_t *fb2, uint8_t up, uint8_t down);
+
+void igt_dump_fb(igt_display_t *display, igt_fb_t *fb, const char *path_name, const char *file_name);
+
+/* TODO also allow 64-bit pixels, or other weird sizes */
+typedef void (*igt_pixel_transform)(igt_pixel_t *pixel);
+
+int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], int num_transforms);
+
+void igt_color_srgb_inv_eotf(igt_pixel_t *pixel);
+void igt_color_srgb_eotf(igt_pixel_t *pixel);
+
+#endif
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 9fc1bfc65..45692b170 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -787,7 +787,7 @@ void igt_init_fb(struct igt_fb *fb, int fd, int width, int height,
 	}
 }
 
-static uint32_t calc_plane_stride(struct igt_fb *fb, int plane)
+uint32_t igt_fb_calc_plane_stride(struct igt_fb *fb, int plane)
 {
 	uint32_t min_stride = fb->plane_width[plane] *
 		(fb->plane_bpp[plane] / 8);
@@ -977,7 +977,7 @@ void igt_calc_fb_size(struct igt_fb *fb)
 
 		/* respect the stride requested by the caller */
 		if (!fb->strides[plane])
-			fb->strides[plane] = calc_plane_stride(fb, plane);
+			fb->strides[plane] = igt_fb_calc_plane_stride(fb, plane);
 
 		align = get_plane_alignment(fb, plane);
 		if (align)
diff --git a/lib/igt_fb.h b/lib/igt_fb.h
index d5aa1e88a..fe0bb580c 100644
--- a/lib/igt_fb.h
+++ b/lib/igt_fb.h
@@ -169,6 +169,8 @@ int igt_dirty_fb(int fd, struct igt_fb *fb);
 void *igt_fb_map_buffer(int fd, struct igt_fb *fb);
 void igt_fb_unmap_buffer(struct igt_fb *fb, void *buffer);
 
+uint32_t igt_fb_calc_plane_stride(struct igt_fb *fb, int plane);
+
 void igt_create_bo_for_fb(int fd, int width, int height,
 			  uint32_t format, uint64_t modifier,
 			  struct igt_fb *fb);
diff --git a/lib/meson.build b/lib/meson.build
index 2eaca42a4..6cc2d22ae 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -112,6 +112,7 @@ lib_sources = [
 	'igt_edid.c',
 	'igt_eld.c',
 	'igt_infoframe.c',
+	'igt_color.c',
 	'veboxcopy_gen12.c',
 	'igt_msm.c',
 	'igt_dsc.c',
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 07/30] lib/igt_fb: Add igt_copy_fb function
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (5 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 06/30] igt/color: Add SW color transform functionality Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-09-03 16:44   ` Kamil Konieczny
  2025-08-15  4:06 ` [PATCH V10 08/30] lib/drmtest: Add is_vkms_device() Alex Hung
                   ` (26 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Add a function to copy fb of DRM_FORMAT_XRGB8888.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_fb.c | 33 +++++++++++++++++++++++++++++++++
 lib/igt_fb.h |  1 +
 2 files changed, 34 insertions(+)

diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 45692b170..8c8436e94 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -2170,6 +2170,39 @@ unsigned int igt_create_fb(int fd, int width, int height, uint32_t format,
 					  fb, 0, 0);
 }
 
+unsigned int igt_copy_fb(int fd, struct igt_fb *src, struct igt_fb *fb)
+{
+	char *in_ptr, *out_ptr;
+	int cpp = igt_drm_format_to_bpp(src->drm_format) / 8;
+	int fb_id = 0;
+
+	igt_assert(src);
+
+	/* TODO allow multiple planes */
+	if (src->num_planes != 1)
+		return -EINVAL;
+
+	/* TODO expand for other formats */
+	if (src->drm_format != DRM_FORMAT_XRGB8888)
+		return -EINVAL;
+
+	fb_id = igt_create_fb(fd, src->width, src->height, src->drm_format,
+			      src->modifier, fb);
+
+	/* copy buffer contents */
+	in_ptr = igt_fb_map_buffer(fb->fd, src);
+	igt_assert(in_ptr);
+	out_ptr = igt_fb_map_buffer(fb->fd, fb);
+	igt_assert(out_ptr);
+
+	igt_memcpy_from_wc(out_ptr, in_ptr, fb->width * fb->height * cpp);
+
+	igt_fb_unmap_buffer(fb, out_ptr);
+	igt_fb_unmap_buffer(src, in_ptr);
+
+	return fb_id;
+}
+
 /**
  * igt_create_color_fb:
  * @fd: open drm file descriptor
diff --git a/lib/igt_fb.h b/lib/igt_fb.h
index fe0bb580c..b2176558b 100644
--- a/lib/igt_fb.h
+++ b/lib/igt_fb.h
@@ -141,6 +141,7 @@ struct intel_buf *igt_fb_create_intel_buf(int fd, struct buf_ops *bops,
 					  const struct igt_fb *fb, const char *name);
 unsigned int igt_create_fb(int fd, int width, int height, uint32_t format,
 			   uint64_t modifier, struct igt_fb *fb);
+unsigned int igt_copy_fb(int fd, struct igt_fb *src, struct igt_fb *fb);
 unsigned int igt_create_color_fb(int fd, int width, int height,
 				 uint32_t format, uint64_t modifier,
 				 double r, double g, double b,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 08/30] lib/drmtest: Add is_vkms_device()
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (6 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 07/30] lib/igt_fb: Add igt_copy_fb function Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-09-03 16:48   ` Kamil Konieczny
  2025-08-15  4:06 ` [PATCH V10 09/30] tests/kms_colorop: Add kms_colorop tests Alex Hung
                   ` (25 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Add a function to check vkms device.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/drmtest.c | 5 +++++
 lib/drmtest.h | 1 +
 2 files changed, 6 insertions(+)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 436b6de78..a3904083f 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -118,6 +118,11 @@ static bool __is_device(int fd, const char *expect)
 	return strcmp(expect, name) == 0;
 }
 
+bool is_vkms_device(int fd)
+{
+	return __is_device(fd, "vkms");
+}
+
 bool is_amdgpu_device(int fd)
 {
 	return __is_device(fd, "amdgpu");
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 27e5a18e2..b3d53f252 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -136,6 +136,7 @@ void igt_require_nouveau(int fd);
 void igt_require_vc4(int fd);
 void igt_require_xe(int fd);
 
+bool is_vkms_device(int fd);
 bool is_amdgpu_device(int fd);
 bool is_i915_device(int fd);
 bool is_mtk_device(int fd);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 09/30] tests/kms_colorop: Add kms_colorop tests
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (7 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 08/30] lib/drmtest: Add is_vkms_device() Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-26 20:39   ` Aurabindo Pillai
  2025-08-27 10:53   ` Kamil Konieczny
  2025-08-15  4:06 ` [PATCH V10 10/30] lib/igt_kms: Add support for DATA colorop property Alex Hung
                   ` (24 subsequent siblings)
  33 siblings, 2 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

This tests the color pipeline API, exposed via the
COLOR PIPELINE plane property and drm_colorop objects.

We introduce tests for:
 - sRGB EOTF
 - sRGB Inverse EOTF
 - sRGB EOTF + sRGB Inverse EOTF

The last one is the holy grail of LUT testing. It tests that
after applying an EOTF, followed by its inverse EOTF we arrive
back at the original value. We can use this to test for
precision loss in the pipeline.

All tests are tested via writeback. All transforms are done in
SW (in floating point) and at the end the SW transformed buffer
is compared with the KMS writeback output buffer. The two should
match within a bracket of acceptable deviations. Since these
deviations might look different for different KMS drivers we'll
do this check on a driver-specific basis.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 508 ++++++++++++++++++++++++++++++++++++++++++++
 tests/kms_colorop.h |  88 ++++++++
 tests/meson.build   |   1 +
 3 files changed, 597 insertions(+)
 create mode 100644 tests/kms_colorop.c
 create mode 100644 tests/kms_colorop.h

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
new file mode 100644
index 000000000..e247477ec
--- /dev/null
+++ b/tests/kms_colorop.c
@@ -0,0 +1,508 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+#include "igt_color.h"
+#include "sw_sync.h"
+#include "kms_colorop.h"
+
+/**
+ * TEST: kms colorop
+ * Category: Display
+ * Description: Test to validate the retrieving and setting of DRM colorops
+ *
+ * SUBTEST: plane-%s
+ * Description: Tests DRM colorop properties on a plane
+ * Driver requirement: amdgpu
+ * Functionality: kms_core
+ * Mega feature: General Display Features
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @srgb_eotf:                   sRGB EOTF
+ * @srgb_inv_eotf:               sRGB Inverse EOTF
+ * @srgb_eotf-srgb_inv_eotf:     sRGB EOTF -> sRGB Inverse EOTF
+ *
+ */
+
+/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
+static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
+				    drmModeModeInfo override_mode)
+{
+	igt_fb_t input_fb, output_fb;
+	igt_plane_t *plane;
+	uint32_t writeback_format = DRM_FORMAT_XRGB8888;
+	uint64_t modifier = DRM_FORMAT_MOD_LINEAR;
+	int width, height, ret;
+
+	igt_output_override_mode(output, &override_mode);
+
+	width = override_mode.hdisplay;
+	height = override_mode.vdisplay;
+
+	ret = igt_create_fb(display->drm_fd, width, height,
+			    DRM_FORMAT_XRGB8888, modifier, &input_fb);
+	igt_assert(ret >= 0);
+
+	ret = igt_create_fb(display->drm_fd, width, height,
+			    writeback_format, modifier, &output_fb);
+	igt_assert(ret >= 0);
+
+	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+	igt_plane_set_fb(plane, &input_fb);
+	igt_output_set_writeback_fb(output, &output_fb);
+
+	ret = igt_display_try_commit_atomic(display, DRM_MODE_ATOMIC_TEST_ONLY |
+					    DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+	igt_plane_set_fb(plane, NULL);
+	igt_remove_fb(display->drm_fd, &input_fb);
+	igt_remove_fb(display->drm_fd, &output_fb);
+
+	return !ret;
+}
+
+/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
+typedef struct {
+	bool builtin_mode;
+	bool custom_mode;
+	bool list_modes;
+	bool dump_check;
+	int mode_index;
+	drmModeModeInfo user_mode;
+} data_t;
+
+static data_t data;
+
+/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
+static igt_output_t *kms_writeback_get_output(igt_display_t *display)
+{
+	int i;
+	enum pipe pipe;
+
+	drmModeModeInfo override_mode = {
+		.clock = 25175,
+		.hdisplay = 640,
+		.hsync_start = 656,
+		.hsync_end = 752,
+		.htotal = 800,
+		.hskew = 0,
+		.vdisplay = 480,
+		.vsync_start = 490,
+		.vsync_end = 492,
+		.vtotal = 525,
+		.vscan = 0,
+		.vrefresh = 60,
+		.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
+		.name = {"640x480-60"},
+	};
+
+	for (i = 0; i < display->n_outputs; i++) {
+		igt_output_t *output = &display->outputs[i];
+
+		if (output->config.connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
+			continue;
+
+		for_each_pipe(display, pipe) {
+			igt_output_set_pipe(output, pipe);
+
+			if (data.custom_mode)
+				override_mode = data.user_mode;
+			if (data.builtin_mode)
+				override_mode = output->config.connector->modes[data.mode_index];
+
+			if (check_writeback_config(display, output, override_mode)) {
+				igt_debug("Using connector %u:%s on pipe %d\n",
+					  output->config.connector->connector_id,
+					  output->name, pipe);
+				return output;
+			}
+		}
+
+		igt_debug("We found %u:%s, but this test will not be able to use it.\n",
+			  output->config.connector->connector_id, output->name);
+
+		/* Restore any connectors we don't use, so we don't trip on them later */
+		kmstest_force_connector(display->drm_fd, output->config.connector, FORCE_CONNECTOR_UNSPECIFIED);
+	}
+
+	return NULL;
+}
+
+/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
+static uint64_t get_writeback_fb_id(igt_output_t *output)
+{
+	return igt_output_get_prop(output, IGT_CONNECTOR_WRITEBACK_FB_ID);
+}
+
+/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
+static void detach_crtc(igt_display_t *display, igt_output_t *output)
+{
+	if (get_writeback_fb_id(output) == 0)
+		return;
+
+	igt_output_set_pipe(output, PIPE_NONE);
+	igt_display_commit2(display, COMMIT_ATOMIC);
+}
+
+static void get_and_wait_out_fence(igt_output_t *output)
+{
+	int ret;
+
+	igt_assert(output->writeback_out_fence_fd >= 0);
+
+	ret = sync_fence_wait(output->writeback_out_fence_fd, 1000);
+	igt_assert_f(ret == 0, "sync_fence_wait failed: %s\n", strerror(-ret));
+	close(output->writeback_out_fence_fd);
+	output->writeback_out_fence_fd = -1;
+}
+
+static bool can_use_colorop(igt_display_t *display, igt_colorop_t *colorop, kms_colorop_t *desired)
+{
+	switch (desired->type) {
+	case KMS_COLOROP_ENUMERATED_LUT1D:
+		if (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_CURVE)
+			return true;
+	case KMS_COLOROP_CUSTOM_LUT1D:
+	case KMS_COLOROP_CTM:
+	case KMS_COLOROP_LUT3D:
+	default:
+		return false;
+	}
+}
+
+/**
+ * Iterate color pipeline that begins with colorop and try to map
+ * colorops[] to it.
+ */
+static bool map_to_pipeline(igt_display_t *display,
+			    igt_colorop_t *colorop,
+			    kms_colorop_t *colorops[])
+{
+	igt_colorop_t *next = colorop;
+	kms_colorop_t *current_op;
+	int i = 0;
+	int prop_val = 0;
+
+	current_op = colorops[i++];
+	igt_require(current_op);
+
+	while (next) {
+		if (can_use_colorop(display, next, current_op)) {
+			current_op->colorop = next;
+			current_op = colorops[i++];
+			if (!current_op)
+				break;
+		}
+		prop_val = igt_colorop_get_prop(display, next,
+						IGT_COLOROP_NEXT);
+		next = igt_find_colorop(display, prop_val);
+	}
+
+	if (current_op) {
+		/* we failed to map the pipeline */
+
+		/* clean up colorops[i].colorop mappings */
+		for (i = 0, current_op = colorops[0]; current_op; current_op = colorops[i++])
+			current_op->colorop = NULL;
+
+		return false;
+	}
+
+	return true;
+}
+
+static igt_colorop_t *get_color_pipeline(igt_display_t *display,
+					 igt_plane_t *plane,
+					 kms_colorop_t *colorops[])
+{
+	igt_colorop_t *colorop = NULL;
+	int i;
+
+	/* go through all color pipelines */
+	for (i = 0; i < plane->num_color_pipelines; ++i) {
+		if (map_to_pipeline(display, plane->color_pipelines[i], colorops)) {
+			colorop = plane->color_pipelines[i];
+			break;
+		}
+	}
+
+	return colorop;
+}
+
+static void set_colorop(igt_display_t *display,
+			kms_colorop_t *colorop)
+{
+	igt_assert(colorop->colorop);
+	igt_colorop_set_prop_value(colorop->colorop, IGT_COLOROP_BYPASS, 0);
+
+	/* Set to desired value from kms_colorop_t */
+	switch (colorop->type) {
+	case KMS_COLOROP_ENUMERATED_LUT1D:
+		switch (colorop->enumerated_lut1d_info.tf) {
+		case KMS_COLOROP_LUT1D_SRGB_EOTF:
+			igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, "sRGB EOTF");
+			break;
+		case KMS_COLOROP_LUT1D_SRGB_INV_EOTF:
+			igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, "sRGB Inverse EOTF");
+			break;
+		case KMS_COLOROP_LUT1D_PQ_EOTF:
+		case KMS_COLOROP_LUT1D_PQ_INV_EOTF:
+		default:
+			igt_fail(IGT_EXIT_FAILURE);
+		}
+		break;
+	case KMS_COLOROP_CUSTOM_LUT1D:
+	case KMS_COLOROP_CTM:
+	case KMS_COLOROP_LUT3D:
+	default:
+		igt_fail(IGT_EXIT_FAILURE);
+	}
+}
+
+static void set_color_pipeline(igt_display_t *display,
+			       igt_plane_t *plane,
+			       kms_colorop_t *colorops[],
+			       igt_colorop_t *color_pipeline)
+{
+	igt_colorop_t *next;
+	int prop_val = 0;
+	int i;
+
+	igt_plane_set_color_pipeline(plane, color_pipeline);
+
+	for (i = 0; colorops[i]; i++)
+		set_colorop(display, colorops[i]);
+
+	/* set unused ops in pipeline to bypass */
+	next = color_pipeline;
+	i = 0;
+	while (next) {
+		if (!colorops[i] || colorops[i]->colorop != next)
+			igt_colorop_set_prop_value(next, IGT_COLOROP_BYPASS, 1);
+		else
+			i++;
+
+		prop_val = igt_colorop_get_prop(display, next,
+						IGT_COLOROP_NEXT);
+		next = igt_find_colorop(display, prop_val);
+	}
+}
+
+static void set_color_pipeline_bypass(igt_plane_t *plane)
+{
+	igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_PIPELINE, "Bypass");
+}
+
+static bool compare_with_bracket(igt_fb_t *in, igt_fb_t *out)
+{
+	if (is_vkms_device(in->fd))
+		return igt_cmp_fb_pixels(in, out, 1, 1);
+
+	/*
+	 * By default we'll look for a [0, 0] bracket. We can then
+	 * define it for each driver that implements support for this
+	 * test. That way we can understand the precision of each
+	 * driver better.
+	 */
+	return igt_cmp_fb_pixels(in, out, 0, 0);
+}
+
+#define DUMP_FBS 1
+
+#define MAX_COLOROPS 3
+#define NUM_COLOROP_TESTS 3
+#define MAX_NAME_SIZE 256
+
+static void apply_transforms(kms_colorop_t *colorops[], igt_fb_t *sw_transform_fb)
+{
+	int i;
+	igt_pixel_transform transforms[MAX_COLOROPS];
+
+	for (i = 0; colorops[i]; i++)
+		transforms[i] = colorops[i]->transform;
+
+	igt_color_transform_pixels(sw_transform_fb, transforms, i);
+}
+
+static void colorop_plane_test(igt_display_t *display,
+			       kms_colorop_t *colorops[])
+{
+	igt_colorop_t *color_pipeline = NULL;
+	igt_output_t *output;
+	igt_plane_t *plane;
+	igt_fb_t input_fb;
+	igt_fb_t sw_transform_fb;
+	igt_fb_t output_fb;
+	drmModeModeInfo mode;
+	unsigned int fb_id;
+	igt_crc_t input_crc, output_crc;
+
+	output = kms_writeback_get_output(display);
+	igt_require(output);
+
+	if (output->use_override_mode)
+		memcpy(&mode, &output->override_mode, sizeof(mode));
+	else
+		memcpy(&mode, &output->config.default_mode, sizeof(mode));
+
+	/* create input fb */
+	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+	igt_assert(plane);
+
+	fb_id = igt_create_color_pattern_fb(display->drm_fd,
+					mode.hdisplay, mode.vdisplay,
+					DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
+					0.2, 0.2, 0.2, &input_fb);
+	igt_assert(fb_id >= 0);
+	igt_plane_set_fb(plane, &input_fb);
+#if DUMP_FBS
+	igt_dump_fb(display, &input_fb, ".", "input");
+#endif
+
+	/* create output fb */
+	fb_id = igt_create_fb(display->drm_fd, mode.hdisplay, mode.vdisplay,
+				DRM_FORMAT_XRGB8888,
+				igt_fb_mod_to_tiling(0),
+				&output_fb);
+	igt_require(fb_id > 0);
+
+	igt_fb_get_fnv1a_crc(&input_fb, &input_crc);
+
+	igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
+
+	/* reset color pipeline*/
+
+	set_color_pipeline_bypass(plane);
+
+	/* Commit */
+	igt_plane_set_fb(plane, &input_fb);
+	igt_output_set_writeback_fb(output, &output_fb);
+
+	igt_display_commit_atomic(output->display,
+				DRM_MODE_ATOMIC_ALLOW_MODESET,
+				NULL);
+	get_and_wait_out_fence(output);
+
+	/* Compare input and output buffers. They should be equal here. */
+	igt_fb_get_fnv1a_crc(&output_fb, &output_crc);
+
+	igt_assert_crc_equal(&input_crc, &output_crc);
+
+	/* create sw transformed buffer */
+
+	igt_copy_fb(display->drm_fd, &input_fb, &sw_transform_fb);
+	igt_assert(igt_cmp_fb_pixels(&input_fb, &sw_transform_fb, 0, 0));
+
+	apply_transforms(colorops, &sw_transform_fb);
+#if DUMP_FBS
+	igt_dump_fb(display, &sw_transform_fb, ".", "sw_transform");
+#endif
+	/* discover and set COLOR PIPELINE */
+
+	/* get COLOR_PIPELINE enum */
+	color_pipeline = get_color_pipeline(display, plane, colorops);
+
+	/* skip test if we can't find applicable pipeline */
+	igt_skip_on(!color_pipeline);
+
+	set_color_pipeline(display, plane, colorops, color_pipeline);
+
+	igt_output_set_writeback_fb(output, &output_fb);
+
+	/* commit COLOR_PIPELINE */
+	igt_display_commit_atomic(display,
+				DRM_MODE_ATOMIC_ALLOW_MODESET,
+				NULL);
+	get_and_wait_out_fence(output);
+#if DUMP_FBS
+	igt_dump_fb(display, &output_fb, ".", "output");
+#endif
+
+	/* compare sw transformed and KMS transformed FBs */
+	igt_assert(compare_with_bracket(&sw_transform_fb, &output_fb));
+
+	/* reset color pipeline*/
+	set_color_pipeline_bypass(plane);
+
+	/* Commit */
+	igt_plane_set_fb(plane, &input_fb);
+	igt_output_set_writeback_fb(output, &output_fb);
+
+	igt_display_commit_atomic(output->display,
+				DRM_MODE_ATOMIC_ALLOW_MODESET,
+				NULL);
+	get_and_wait_out_fence(output);
+
+	/* cleanup */
+	detach_crtc(display, output);
+	igt_remove_fb(display->drm_fd, &input_fb);
+	igt_remove_fb(display->drm_fd, &output_fb);
+}
+
+igt_main
+{
+
+	struct {
+		kms_colorop_t *colorops[MAX_COLOROPS];
+		const char *name;
+	} tests[] = {
+		{ { &kms_colorop_srgb_eotf, NULL }, "srgb_eotf" },
+		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
+		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" }
+	};
+
+	igt_display_t display;
+	int i, ret;
+
+	igt_fixture {
+		display.drm_fd = drm_open_driver_master(DRIVER_ANY);
+
+		if (drmSetClientCap(display.drm_fd, DRM_CLIENT_CAP_ATOMIC, 1) == 0)
+			display.is_atomic = 1;
+
+		ret = drmSetClientCap(display.drm_fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1);
+
+		igt_require_f(!ret, "error setting DRM_CLIENT_CAP_WRITEBACK_CONNECTORS\n");
+
+		igt_display_require(&display, display.drm_fd);
+
+		kmstest_set_vt_graphics_mode();
+
+		igt_display_require(&display, display.drm_fd);
+
+		igt_require(display.is_atomic);
+
+	}
+
+	for (i = 0; i < ARRAY_SIZE(tests); i++) {
+		igt_describe("Check color ops on a plane");
+		igt_subtest_f("plane-%s", tests[i].name)
+			colorop_plane_test(&display, tests[i].colorops);
+	}
+
+	igt_describe("Tests getting and setting COLOR_PIPELINE property on plane");
+	igt_fixture {
+		igt_display_fini(&display);
+	}
+}
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
new file mode 100644
index 000000000..f414895dd
--- /dev/null
+++ b/tests/kms_colorop.h
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef __KMS_COLOROP_H__
+#define __KMS_COLOROP_H__
+
+#include "igt_color.h"
+
+typedef bool (*compare_fb_t)(igt_fb_t *in, igt_fb_t *out);
+
+typedef int (*transform_fb)(igt_fb_t *in);
+
+typedef int (*transform_pixel)(igt_pixel_t *pixel);
+
+/* Test version definitions */
+typedef enum kms_colorop_type {
+	KMS_COLOROP_ENUMERATED_LUT1D,
+	KMS_COLOROP_CUSTOM_LUT1D,
+	KMS_COLOROP_CTM,
+	KMS_COLOROP_LUT3D
+} kms_colorop_type_t;
+
+typedef enum kms_colorop_lut1d_tf {
+	KMS_COLOROP_LUT1D_SRGB_EOTF,
+	KMS_COLOROP_LUT1D_SRGB_INV_EOTF,
+	KMS_COLOROP_LUT1D_PQ_EOTF,
+	KMS_COLOROP_LUT1D_PQ_INV_EOTF,
+} kms_colorop_lut1d_tf_t;
+
+typedef struct kms_colorop_enumerated_lut1d_info {
+	kms_colorop_lut1d_tf_t tf;
+} kms_colorop_enumerated_lut1d_info_t;
+
+typedef struct kms_colorop {
+	kms_colorop_type_t type;
+
+	union {
+		kms_colorop_enumerated_lut1d_info_t enumerated_lut1d_info;
+	};
+
+	const char *name;
+
+	igt_pixel_transform transform;
+
+	/* Mapped colorop */
+	igt_colorop_t *colorop;
+
+} kms_colorop_t;
+
+kms_colorop_t kms_colorop_srgb_eotf = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_SRGB_EOTF
+	},
+	.name = "srgb_eotf",
+	.transform = &igt_color_srgb_eotf
+};
+
+kms_colorop_t kms_colorop_srgb_inv_eotf = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_SRGB_INV_EOTF
+	},
+	.name = "srgb_inv_eotf",
+	.transform = &igt_color_srgb_inv_eotf
+};
+
+#endif /* __KMS_COLOROP_H__ */
diff --git a/tests/meson.build b/tests/meson.build
index 5c01c64e9..e612e1a05 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -26,6 +26,7 @@ test_progs = [
 	'kms_bw',
 	'kms_color',
 	'kms_concurrent',
+	'kms_colorop',
 	'kms_content_protection',
 	'kms_cursor_crc',
 	'kms_cursor_edge_walk',
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 10/30] lib/igt_kms: Add support for DATA colorop property
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (8 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 09/30] tests/kms_colorop: Add kms_colorop tests Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 11/30] lib/igt_color: Add support for 3x4 matrices Alex Hung
                   ` (23 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Support DATA property in color pipeline API.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_kms.c | 33 +++++++++++++++++++++++++++++++++
 lib/igt_kms.h | 12 ++++++++----
 2 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 67be5240f..d1c23b4a4 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -710,6 +710,7 @@ const char * const igt_colorop_prop_names[IGT_NUM_COLOROP_PROPS] = {
 	[IGT_COLOROP_TYPE] = "TYPE",
 	[IGT_COLOROP_BYPASS] = "BYPASS",
 	[IGT_COLOROP_CURVE_1D_TYPE] = "CURVE_1D_TYPE",
+	[IGT_COLOROP_DATA] = "DATA",
 	[IGT_COLOROP_NEXT] = "NEXT",
 };
 
@@ -4463,6 +4464,38 @@ igt_plane_replace_prop_blob(igt_plane_t *plane, enum igt_atomic_plane_properties
 	igt_plane_set_prop_changed(plane, prop);
 }
 
+/**
+ * igt_colorop_replace_prop_blob:
+ * @plane: colorop to set property on.
+ * @prop: property for which the blob will be replaced.
+ * @ptr: Pointer to contents for the property.
+ * @length: Length of contents.
+ *
+ * This function will destroy the old property blob for the given property,
+ * and will create a new property blob with the values passed to this function.
+ *
+ * The new property blob will be committed when you call igt_display_commit(),
+ * igt_display_commit2() or igt_display_commit_atomic().
+ */
+void
+igt_colorop_replace_prop_blob(igt_colorop_t *colorop, enum igt_atomic_colorop_properties prop, const void *ptr, size_t length)
+{
+	igt_display_t *display = colorop->plane->pipe->display;
+	uint64_t *blob = &colorop->values[prop];
+	uint32_t blob_id = 0;
+
+	if (*blob != 0)
+		igt_assert(drmModeDestroyPropertyBlob(display->drm_fd,
+						      *blob) == 0);
+
+	if (length > 0)
+		igt_assert(drmModeCreatePropertyBlob(display->drm_fd,
+						     ptr, length, &blob_id) == 0);
+
+	*blob = blob_id;
+	igt_colorop_set_prop_changed(colorop, prop);
+}
+
 /**
  * igt_colorop_try_prop_enum:
  * @colorop: Target colorop.
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index dc2a2d9e0..2a401cd3b 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -374,6 +374,7 @@ enum igt_atomic_colorop_properties {
 	IGT_COLOROP_TYPE,
 	IGT_COLOROP_BYPASS,
 	IGT_COLOROP_CURVE_1D_TYPE,
+	IGT_COLOROP_DATA,
 	IGT_COLOROP_NEXT,
 	IGT_NUM_COLOROP_PROPS
 };
@@ -886,12 +887,15 @@ extern void igt_plane_set_prop_enum(igt_plane_t *plane,
 				    enum igt_atomic_plane_properties prop,
 				    const char *val);
 
-
+extern void igt_plane_replace_prop_blob(igt_plane_t *plane,
+					enum igt_atomic_plane_properties prop,
+					const void *ptr, size_t length);
 
 extern bool igt_plane_is_valid_colorop(igt_plane_t *plane, igt_colorop_t *colorop);
 
 extern void igt_plane_set_color_pipeline(igt_plane_t *plane, igt_colorop_t *colorop);
 
+
 /**
  * igt_colorop_has_prop:
  * @colorop: colorop to check.
@@ -933,9 +937,9 @@ extern void igt_colorop_set_prop_enum(igt_colorop_t *colorop,
 				      enum igt_atomic_colorop_properties prop,
 				      const char *val);
 
-extern void igt_plane_replace_prop_blob(igt_plane_t *plane,
-					enum igt_atomic_plane_properties prop,
-					const void *ptr, size_t length);
+extern void igt_colorop_replace_prop_blob(igt_colorop_t *colorop,
+					  enum igt_atomic_colorop_properties prop,
+					  const void *ptr, size_t length);
 
 extern bool igt_plane_check_prop_is_mutable(igt_plane_t *plane,
 					    enum igt_atomic_plane_properties igt_prop);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 11/30] lib/igt_color: Add support for 3x4 matrices
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (9 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 10/30] lib/igt_kms: Add support for DATA colorop property Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-26 16:29   ` Aurabindo Pillai
  2025-08-15  4:06 ` [PATCH V10 12/30] tests/kms_colorop: Add 3x4 CTM tests Alex Hung
                   ` (22 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Support 3x4 matrices in color pipeline API.

Also add a few matrices for testing.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_color.h | 54 +++++++++++++++++++++++++++++++
 2 files changed, 140 insertions(+)

diff --git a/lib/igt_color.c b/lib/igt_color.c
index 0e5f391db..bc90fbdca 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -11,6 +11,7 @@
 #include <errno.h>
 #include <math.h>
 
+#include "drmtest.h"
 #include "igt_color.h"
 #include "igt_core.h"
 #include "igt_x86.h"
@@ -76,6 +77,62 @@ void igt_color_srgb_eotf(igt_pixel_t *pixel)
 	pixel->b = igt_color_tf_eval(&srgb_eotf, pixel->b);
 }
 
+static void igt_color_apply_3x4_ctm(igt_pixel_t *pixel, const igt_matrix_3x4_t *matrix)
+{
+	igt_pixel_t result;
+
+	memcpy(&result, pixel, sizeof(result));
+
+	result.r = matrix->m[0] * pixel->r +
+		   matrix->m[1] * pixel->g +
+		   matrix->m[2] * pixel->b +
+		   matrix->m[3];
+
+	result.g = matrix->m[4] * pixel->r +
+		   matrix->m[5] * pixel->g +
+		   matrix->m[6] * pixel->b +
+		   matrix->m[7];
+
+	result.b = matrix->m[8] * pixel->r +
+		   matrix->m[9] * pixel->g +
+		   matrix->m[10] * pixel->b +
+		   matrix->m[11];
+
+	memcpy(pixel, &result, sizeof(result));
+
+}
+
+void igt_color_ctm_3x4_50_desat(igt_pixel_t *pixel)
+{
+	/* apply a 50% desat matrix */
+	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_50_desat);
+}
+
+void igt_color_ctm_3x4_overdrive(igt_pixel_t *pixel)
+{
+	/* apply a 50% desat matrix */
+	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_overdrive);
+}
+
+void igt_color_ctm_3x4_oversaturate(igt_pixel_t *pixel)
+{
+	/* apply a 50% desat matrix */
+	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_oversaturate);
+}
+
+void igt_color_ctm_3x4_bt709_enc(igt_pixel_t *pixel)
+{
+	/* apply a 50% desat matrix */
+	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_bt709_enc);
+}
+
+void igt_color_ctm_3x4_bt709_dec(igt_pixel_t *pixel)
+{
+	/* apply a 50% desat matrix */
+	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_bt709_dec);
+}
+
+
 int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], int num_transforms)
 {
 	uint32_t *line = NULL;
@@ -142,6 +199,11 @@ int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], i
 			for (i = 0; i < num_transforms; i++)
 				transforms[i](&pixel);
 
+			/* clip */
+			pixel.r = fmax(fmin(pixel.r, 1.0), 0.0);
+			pixel.g = fmax(fmin(pixel.g, 1.0), 0.0);
+			pixel.b = fmax(fmin(pixel.b, 1.0), 0.0);
+
 			/* de-normalize back to 8-bit */
 			pixel.r *= (0xff);
 			pixel.g *= (0xff);
@@ -244,3 +306,27 @@ void igt_dump_fb(igt_display_t *display, igt_fb_t *fb,
 	igt_assert_eq(status, CAIRO_STATUS_SUCCESS);
 	cairo_surface_destroy(fb_surface_out);
 }
+
+void igt_colorop_set_ctm_3x4(igt_display_t *display,
+			     igt_colorop_t *colorop,
+			     const igt_matrix_3x4_t *matrix)
+{
+	struct drm_color_ctm_3x4 ctm;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(ctm.matrix); i++) {
+		if (matrix->m[i] < 0) {
+			ctm.matrix[i] =
+				(int64_t) (-matrix->m[i] *
+				((int64_t) 1L << 32));
+			ctm.matrix[i] |= 1ULL << 63;
+		} else {
+			ctm.matrix[i] =
+				(int64_t) (matrix->m[i] *
+				((int64_t) 1L << 32));
+		}
+	}
+
+	/* set blob property */
+	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, &ctm, sizeof(ctm));
+}
diff --git a/lib/igt_color.h b/lib/igt_color.h
index 4f34a1b0d..fe0037ae5 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -29,6 +29,47 @@ typedef struct igt_pixel {
 	float b;
 } igt_pixel_t;
 
+typedef struct igt_matrix_3x4 {
+	/*
+	 * out   matrix          in
+	 * |R|   |0  1  2  3 |   | R |
+	 * |G| = |4  5  6  7 | x | G |
+	 * |B|   |8  9  10 12|   | B |
+	 *                       |1.0|
+	 */
+	float m[12];
+} igt_matrix_3x4_t;
+
+const igt_matrix_3x4_t igt_matrix_3x4_50_desat = { {
+	0.5, 0.25, 0.25, 0.0,
+	0.25, 0.5, 0.25, 0.0,
+	0.25, 0.25, 0.5, 0.0
+} };
+
+const igt_matrix_3x4_t igt_matrix_3x4_overdrive = { {
+	1.5, 0.0, 0.0, 0.0,
+	0.0, 1.5, 0.0, 0.0,
+	0.0, 0.0, 1.5, 0.0
+} };
+
+const igt_matrix_3x4_t igt_matrix_3x4_oversaturate = { {
+	1.5,   -0.25, -0.25, 0.0,
+	-0.25,  1.5,  -0.25, 0.0,
+	-0.25, -0.25,  1.5,  0.0
+} };
+
+const igt_matrix_3x4_t igt_matrix_3x4_bt709_enc = { {
+	 0.2126,   0.7152,   0.0722,  0.0,
+	-0.09991, -0.33609,  0.436,   0.0,
+	 0.615,   -0.55861, -0.05639, 0.0
+} };
+
+const igt_matrix_3x4_t igt_matrix_3x4_bt709_dec = { {
+	1.0,  0.0,      1.28033, 0.0,
+	1.0, -0.21482, -0.38059, 0.0,
+	1.0,  2.12798,  0.0,     0.0
+} };
+
 bool igt_cmp_fb_component(uint16_t comp1, uint16_t comp2, uint8_t up, uint8_t down);
 bool igt_cmp_fb_pixels(igt_fb_t *fb1, igt_fb_t *fb2, uint8_t up, uint8_t down);
 
@@ -39,7 +80,20 @@ typedef void (*igt_pixel_transform)(igt_pixel_t *pixel);
 
 int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], int num_transforms);
 
+/* colorop helpers */
+
+void igt_colorop_set_ctm_3x4(igt_display_t *display,
+			     igt_colorop_t *colorop,
+			     const igt_matrix_3x4_t *matrix);
+
+/* transformations */
+
 void igt_color_srgb_inv_eotf(igt_pixel_t *pixel);
 void igt_color_srgb_eotf(igt_pixel_t *pixel);
 
+void igt_color_ctm_3x4_50_desat(igt_pixel_t *pixel);
+void igt_color_ctm_3x4_overdrive(igt_pixel_t *pixel);
+void igt_color_ctm_3x4_oversaturate(igt_pixel_t *pixel);
+void igt_color_ctm_3x4_bt709_dec(igt_pixel_t *pixel);
+void igt_color_ctm_3x4_bt709_enc(igt_pixel_t *pixel);
 #endif
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 12/30] tests/kms_colorop: Add 3x4 CTM tests
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (10 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 11/30] lib/igt_color: Add support for 3x4 matrices Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 13/30] tests/kms_colorop: Add bypass test Alex Hung
                   ` (21 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Add 3x4 CTM test for color pipeline API.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 42 +++++++++++++++++++++++++++++-------------
 tests/kms_colorop.h | 39 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 67 insertions(+), 14 deletions(-)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index e247477ec..8c595751e 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -40,9 +40,16 @@
  *
  * arg[1]:
  *
- * @srgb_eotf:                   sRGB EOTF
- * @srgb_inv_eotf:               sRGB Inverse EOTF
- * @srgb_eotf-srgb_inv_eotf:     sRGB EOTF -> sRGB Inverse EOTF
+ * @srgb_eotf:                  sRGB EOTF
+ * @srgb_inv_eotf:              sRGB Inverse EOTF
+ * @srgb_eotf-srgb_inv_eotf:    sRGB EOTF -> sRGB Inverse EOTF
+ * @ctm_3x4_50_desat:		3x4 matrix doing a 50% desaturation
+ * @ctm_3x4_overdrive:		3x4 matrix overdring all values by 50%
+ * @ctm_3x4_oversaturate:	3x4 matrix oversaturating values
+ * @ctm_3x4_bt709_enc:		BT709 encoding matrix
+ * @ctm_3x4_bt709_dec:		BT709 decoding matrix
+ * @ctm_3x4_bt709_enc_dec:	BT709 encoding matrix, followed by decoding matrix
+ * @ctm_3x4_bt709_dec_enc:	BT709 decoding matrix, followed by encoding matrix
  *
  */
 
@@ -181,10 +188,10 @@ static bool can_use_colorop(igt_display_t *display, igt_colorop_t *colorop, kms_
 {
 	switch (desired->type) {
 	case KMS_COLOROP_ENUMERATED_LUT1D:
-		if (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_CURVE)
-			return true;
+		return (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_CURVE);
+	case KMS_COLOROP_CTM_3X4:
+		return (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_CTM_3X4);
 	case KMS_COLOROP_CUSTOM_LUT1D:
-	case KMS_COLOROP_CTM:
 	case KMS_COLOROP_LUT3D:
 	default:
 		return false;
@@ -204,13 +211,15 @@ static bool map_to_pipeline(igt_display_t *display,
 	int i = 0;
 	int prop_val = 0;
 
-	current_op = colorops[i++];
+	current_op = colorops[i];
+	i++;
 	igt_require(current_op);
 
 	while (next) {
 		if (can_use_colorop(display, next, current_op)) {
 			current_op->colorop = next;
-			current_op = colorops[i++];
+			current_op = colorops[i];
+			i++;
 			if (!current_op)
 				break;
 		}
@@ -272,8 +281,10 @@ static void set_colorop(igt_display_t *display,
 			igt_fail(IGT_EXIT_FAILURE);
 		}
 		break;
+	case KMS_COLOROP_CTM_3X4:
+		igt_colorop_set_ctm_3x4(display, colorop->colorop, colorop->matrix_3x4);
+		break;
 	case KMS_COLOROP_CUSTOM_LUT1D:
-	case KMS_COLOROP_CTM:
 	case KMS_COLOROP_LUT3D:
 	default:
 		igt_fail(IGT_EXIT_FAILURE);
@@ -330,9 +341,7 @@ static bool compare_with_bracket(igt_fb_t *in, igt_fb_t *out)
 
 #define DUMP_FBS 1
 
-#define MAX_COLOROPS 3
-#define NUM_COLOROP_TESTS 3
-#define MAX_NAME_SIZE 256
+#define MAX_COLOROPS 5
 
 static void apply_transforms(kms_colorop_t *colorops[], igt_fb_t *sw_transform_fb)
 {
@@ -469,7 +478,14 @@ igt_main
 	} tests[] = {
 		{ { &kms_colorop_srgb_eotf, NULL }, "srgb_eotf" },
 		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
-		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" }
+		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" },
+		{ { &kms_colorop_ctm_3x4_50_desat, NULL }, "ctm_3x4_50_desat" },
+		{ { &kms_colorop_ctm_3x4_overdrive, NULL }, "ctm_3x4_overdrive" },
+		{ { &kms_colorop_ctm_3x4_oversaturate, NULL }, "ctm_3x4_oversaturate" },
+		{ { &kms_colorop_ctm_3x4_bt709_enc, NULL }, "ctm_3x4_bt709_enc" },
+		{ { &kms_colorop_ctm_3x4_bt709_dec, NULL }, "ctm_3x4_bt709_dec" },
+		{ { &kms_colorop_ctm_3x4_bt709_enc, &kms_colorop_ctm_3x4_bt709_dec, NULL }, "ctm_3x4_bt709_enc_dec" },
+		{ { &kms_colorop_ctm_3x4_bt709_dec, &kms_colorop_ctm_3x4_bt709_enc, NULL }, "ctm_3x4_bt709_dec_enc" },
 	};
 
 	igt_display_t display;
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
index f414895dd..8f0c29cba 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -36,7 +36,7 @@ typedef int (*transform_pixel)(igt_pixel_t *pixel);
 typedef enum kms_colorop_type {
 	KMS_COLOROP_ENUMERATED_LUT1D,
 	KMS_COLOROP_CUSTOM_LUT1D,
-	KMS_COLOROP_CTM,
+	KMS_COLOROP_CTM_3X4,
 	KMS_COLOROP_LUT3D
 } kms_colorop_type_t;
 
@@ -56,6 +56,7 @@ typedef struct kms_colorop {
 
 	union {
 		kms_colorop_enumerated_lut1d_info_t enumerated_lut1d_info;
+		const igt_matrix_3x4_t *matrix_3x4;
 	};
 
 	const char *name;
@@ -85,4 +86,40 @@ kms_colorop_t kms_colorop_srgb_inv_eotf = {
 	.transform = &igt_color_srgb_inv_eotf
 };
 
+kms_colorop_t kms_colorop_ctm_3x4_50_desat = {
+	.type = KMS_COLOROP_CTM_3X4,
+	.matrix_3x4 = &igt_matrix_3x4_50_desat,
+	.name = "ctm_3x4_50_desat",
+	.transform = &igt_color_ctm_3x4_50_desat
+};
+
+kms_colorop_t kms_colorop_ctm_3x4_overdrive = {
+	.type = KMS_COLOROP_CTM_3X4,
+	.matrix_3x4 = &igt_matrix_3x4_overdrive,
+	.name = "ctm_3x4_overdrive",
+	.transform = &igt_color_ctm_3x4_overdrive
+};
+
+kms_colorop_t kms_colorop_ctm_3x4_oversaturate = {
+	.type = KMS_COLOROP_CTM_3X4,
+	.matrix_3x4 = &igt_matrix_3x4_oversaturate,
+	.name = "ctm_3x4_oversaturate",
+	.transform = &igt_color_ctm_3x4_oversaturate
+};
+
+kms_colorop_t kms_colorop_ctm_3x4_bt709_enc = {
+	.type = KMS_COLOROP_CTM_3X4,
+	.matrix_3x4 = &igt_matrix_3x4_bt709_enc,
+	.name = "ctm_3x4_bt709_enc",
+	.transform = &igt_color_ctm_3x4_bt709_enc
+};
+
+kms_colorop_t kms_colorop_ctm_3x4_bt709_dec = {
+	.type = KMS_COLOROP_CTM_3X4,
+	.matrix_3x4 = &igt_matrix_3x4_bt709_dec,
+	.name = "ctm_3x4_bt709_dec",
+	.transform = &igt_color_ctm_3x4_bt709_dec
+};
+
+
 #endif /* __KMS_COLOROP_H__ */
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 13/30] tests/kms_colorop: Add bypass test
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (11 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 12/30] tests/kms_colorop: Add 3x4 CTM tests Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 14/30] tests/kms_colorop: Add 10bpc test Alex Hung
                   ` (20 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

We want to test that setting the color pipeline to bypass
yields the expected results.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 66 +++++++++++++++++++++++++++++++--------------
 1 file changed, 46 insertions(+), 20 deletions(-)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 8c595751e..fe9854ed9 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -31,7 +31,7 @@
  * Category: Display
  * Description: Test to validate the retrieving and setting of DRM colorops
  *
- * SUBTEST: plane-%s
+ * SUBTEST: plane-%s-%s
  * Description: Tests DRM colorop properties on a plane
  * Driver requirement: amdgpu
  * Functionality: kms_core
@@ -40,6 +40,11 @@
  *
  * arg[1]:
  *
+ * @XR24-XR24:			XRGB8888 framebuffer and writeback buffer
+ *
+ * arg[2]:
+ *
+ * @bypass:			Bypass Color Pipeline
  * @srgb_eotf:                  sRGB EOTF
  * @srgb_inv_eotf:              sRGB Inverse EOTF
  * @srgb_eotf-srgb_inv_eotf:    sRGB EOTF -> sRGB Inverse EOTF
@@ -55,11 +60,12 @@
 
 /* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
 static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
-				    drmModeModeInfo override_mode)
+				    drmModeModeInfo override_mode, __u32 fourcc_in,
+				    __u32 fourcc_out)
 {
 	igt_fb_t input_fb, output_fb;
 	igt_plane_t *plane;
-	uint32_t writeback_format = DRM_FORMAT_XRGB8888;
+	uint32_t writeback_format = fourcc_out;
 	uint64_t modifier = DRM_FORMAT_MOD_LINEAR;
 	int width, height, ret;
 
@@ -69,7 +75,7 @@ static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
 	height = override_mode.vdisplay;
 
 	ret = igt_create_fb(display->drm_fd, width, height,
-			    DRM_FORMAT_XRGB8888, modifier, &input_fb);
+			    fourcc_in, modifier, &input_fb);
 	igt_assert(ret >= 0);
 
 	ret = igt_create_fb(display->drm_fd, width, height,
@@ -102,7 +108,7 @@ typedef struct {
 static data_t data;
 
 /* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
-static igt_output_t *kms_writeback_get_output(igt_display_t *display)
+static igt_output_t *kms_writeback_get_output(igt_display_t *display, __u32 fourcc_in, __u32 fourcc_out)
 {
 	int i;
 	enum pipe pipe;
@@ -138,7 +144,7 @@ static igt_output_t *kms_writeback_get_output(igt_display_t *display)
 			if (data.builtin_mode)
 				override_mode = output->config.connector->modes[data.mode_index];
 
-			if (check_writeback_config(display, output, override_mode)) {
+			if (check_writeback_config(display, output, override_mode, fourcc_in, fourcc_out)) {
 				igt_debug("Using connector %u:%s on pipe %d\n",
 					  output->config.connector->connector_id,
 					  output->name, pipe);
@@ -355,6 +361,8 @@ static void apply_transforms(kms_colorop_t *colorops[], igt_fb_t *sw_transform_f
 }
 
 static void colorop_plane_test(igt_display_t *display,
+			       __u32 fourcc_in,
+			       __u32 fourcc_out,
 			       kms_colorop_t *colorops[])
 {
 	igt_colorop_t *color_pipeline = NULL;
@@ -367,7 +375,7 @@ static void colorop_plane_test(igt_display_t *display,
 	unsigned int fb_id;
 	igt_crc_t input_crc, output_crc;
 
-	output = kms_writeback_get_output(display);
+	output = kms_writeback_get_output(display, fourcc_in, fourcc_out);
 	igt_require(output);
 
 	if (output->use_override_mode)
@@ -381,7 +389,7 @@ static void colorop_plane_test(igt_display_t *display,
 
 	fb_id = igt_create_color_pattern_fb(display->drm_fd,
 					mode.hdisplay, mode.vdisplay,
-					DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
+					fourcc_in, DRM_FORMAT_MOD_LINEAR,
 					0.2, 0.2, 0.2, &input_fb);
 	igt_assert(fb_id >= 0);
 	igt_plane_set_fb(plane, &input_fb);
@@ -391,7 +399,7 @@ static void colorop_plane_test(igt_display_t *display,
 
 	/* create output fb */
 	fb_id = igt_create_fb(display->drm_fd, mode.hdisplay, mode.vdisplay,
-				DRM_FORMAT_XRGB8888,
+				fourcc_in,
 				igt_fb_mod_to_tiling(0),
 				&output_fb);
 	igt_require(fb_id > 0);
@@ -429,13 +437,18 @@ static void colorop_plane_test(igt_display_t *display,
 #endif
 	/* discover and set COLOR PIPELINE */
 
-	/* get COLOR_PIPELINE enum */
-	color_pipeline = get_color_pipeline(display, plane, colorops);
+	if (!colorops[0]) {
+		/* bypass test */
+		set_color_pipeline_bypass(plane);
+	} else {
+		/* get COLOR_PIPELINE enum */
+		color_pipeline = get_color_pipeline(display, plane, colorops);
 
-	/* skip test if we can't find applicable pipeline */
-	igt_skip_on(!color_pipeline);
+		/* skip test if we can't find applicable pipeline */
+		igt_skip_on(!color_pipeline);
 
-	set_color_pipeline(display, plane, colorops, color_pipeline);
+		set_color_pipeline(display, plane, colorops, color_pipeline);
+	}
 
 	igt_output_set_writeback_fb(output, &output_fb);
 
@@ -476,6 +489,7 @@ igt_main
 		kms_colorop_t *colorops[MAX_COLOROPS];
 		const char *name;
 	} tests[] = {
+		{ { NULL }, "bypass" },
 		{ { &kms_colorop_srgb_eotf, NULL }, "srgb_eotf" },
 		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
 		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" },
@@ -488,8 +502,16 @@ igt_main
 		{ { &kms_colorop_ctm_3x4_bt709_dec, &kms_colorop_ctm_3x4_bt709_enc, NULL }, "ctm_3x4_bt709_dec_enc" },
 	};
 
+	struct {
+		__u32 fourcc_in;
+		__u32 fourcc_out;
+		const char *name;
+	} formats[] = {
+		{ DRM_FORMAT_XRGB8888, DRM_FORMAT_XRGB8888, "XR24-XR24" },
+	};
+
 	igt_display_t display;
-	int i, ret;
+	int i, j, ret;
 
 	igt_fixture {
 		display.drm_fd = drm_open_driver_master(DRIVER_ANY);
@@ -511,12 +533,16 @@ igt_main
 
 	}
 
-	for (i = 0; i < ARRAY_SIZE(tests); i++) {
-		igt_describe("Check color ops on a plane");
-		igt_subtest_f("plane-%s", tests[i].name)
-			colorop_plane_test(&display, tests[i].colorops);
+	for (j = 0; j < ARRAY_SIZE(formats); j++) {
+		for (i = 0; i < ARRAY_SIZE(tests); i++) {
+			igt_describe("Check color ops on a plane");
+			igt_subtest_f("plane-%s-%s", formats[j].name, tests[i].name)
+				colorop_plane_test(&display,
+						   formats[j].fourcc_in,
+						   formats[j].fourcc_out,
+						   tests[i].colorops);
+		}
 	}
-
 	igt_describe("Tests getting and setting COLOR_PIPELINE property on plane");
 	igt_fixture {
 		igt_display_fini(&display);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 14/30] tests/kms_colorop: Add 10bpc test
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (12 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 13/30] tests/kms_colorop: Add bypass test Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 15/30] tests/kms_colorop: Skip if writeback does not support fourcc Alex Hung
                   ` (19 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Support DRM_FORMAT_XRGB2101010 color format, and skip if it is not
supported.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index fe9854ed9..e23f876fe 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -41,6 +41,7 @@
  * arg[1]:
  *
  * @XR24-XR24:			XRGB8888 framebuffer and writeback buffer
+ * @XR30-XR30:			XRGB2101010 framebuffer and writeback buffer
  *
  * arg[2]:
  *
@@ -74,6 +75,10 @@ static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
 	width = override_mode.hdisplay;
 	height = override_mode.vdisplay;
 
+	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+	igt_skip_on_f(!igt_plane_has_format_mod(plane, fourcc_in, DRM_FORMAT_MOD_LINEAR),
+		      "plane doesn't support fourcc format %x\n", fourcc_in);
+
 	ret = igt_create_fb(display->drm_fd, width, height,
 			    fourcc_in, modifier, &input_fb);
 	igt_assert(ret >= 0);
@@ -82,7 +87,6 @@ static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
 			    writeback_format, modifier, &output_fb);
 	igt_assert(ret >= 0);
 
-	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
 	igt_plane_set_fb(plane, &input_fb);
 	igt_output_set_writeback_fb(output, &output_fb);
 
@@ -508,6 +512,7 @@ igt_main
 		const char *name;
 	} formats[] = {
 		{ DRM_FORMAT_XRGB8888, DRM_FORMAT_XRGB8888, "XR24-XR24" },
+		{ DRM_FORMAT_XRGB2101010, DRM_FORMAT_XRGB2101010, "XR30-XR30" },
 	};
 
 	igt_display_t display;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 15/30] tests/kms_colorop: Skip if writeback does not support fourcc
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (13 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 14/30] tests/kms_colorop: Add 10bpc test Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 16/30] lib/igt_fb: Allow any non-planar format for igt_copy_fb Alex Hung
                   ` (18 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Writeback is used by kms_colorop so skip tests if it doesn't support
specific color formats.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index e23f876fe..77d8c6bfa 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -69,6 +69,10 @@ static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
 	uint32_t writeback_format = fourcc_out;
 	uint64_t modifier = DRM_FORMAT_MOD_LINEAR;
 	int width, height, ret;
+	drmModePropertyBlobRes *wb_formats_blob;
+	int i;
+	__u32 *format;
+	bool found_format = false;
 
 	igt_output_override_mode(output, &override_mode);
 
@@ -83,6 +87,17 @@ static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
 			    fourcc_in, modifier, &input_fb);
 	igt_assert(ret >= 0);
 
+	/* check writeback formats */
+	wb_formats_blob = igt_get_writeback_formats_blob(output);
+	format = wb_formats_blob->data;
+
+	for (i = 0; i < wb_formats_blob->length / 4; i++)
+		if (fourcc_out == format[i])
+			found_format = true;
+
+	igt_skip_on_f(!found_format,
+		      "writeback doesn't support fourcc format %x\n", fourcc_out);
+
 	ret = igt_create_fb(display->drm_fd, width, height,
 			    writeback_format, modifier, &output_fb);
 	igt_assert(ret >= 0);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 16/30] lib/igt_fb: Allow any non-planar format for igt_copy_fb
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (14 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 15/30] tests/kms_colorop: Skip if writeback does not support fourcc Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-09-03 16:51   ` Kamil Konieczny
  2025-08-15  4:06 ` [PATCH V10 17/30] lib/igt_color: Support color transform for XRGB2101010 Alex Hung
                   ` (17 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

The function is able to handle any non-planar format. It's been
tested for XRGB8888 and XRGB2101010 so far but should work
for a wider range of formats.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_fb.c        |   4 --
 tests/kms_colorop.c | 138 +++++++++++++++++++++++++-------------------
 2 files changed, 78 insertions(+), 64 deletions(-)

diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 8c8436e94..b3474781d 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -2182,10 +2182,6 @@ unsigned int igt_copy_fb(int fd, struct igt_fb *src, struct igt_fb *fb)
 	if (src->num_planes != 1)
 		return -EINVAL;
 
-	/* TODO expand for other formats */
-	if (src->drm_format != DRM_FORMAT_XRGB8888)
-		return -EINVAL;
-
 	fb_id = igt_create_fb(fd, src->width, src->height, src->drm_format,
 			      src->modifier, fb);
 
diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 77d8c6bfa..7ac74c536 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -380,60 +380,28 @@ static void apply_transforms(kms_colorop_t *colorops[], igt_fb_t *sw_transform_f
 }
 
 static void colorop_plane_test(igt_display_t *display,
+			       igt_output_t *output,
+			       igt_plane_t *plane,
+			       igt_fb_t *input_fb,
+			       igt_fb_t *output_fb,
 			       __u32 fourcc_in,
 			       __u32 fourcc_out,
 			       kms_colorop_t *colorops[])
 {
 	igt_colorop_t *color_pipeline = NULL;
-	igt_output_t *output;
-	igt_plane_t *plane;
-	igt_fb_t input_fb;
 	igt_fb_t sw_transform_fb;
-	igt_fb_t output_fb;
-	drmModeModeInfo mode;
-	unsigned int fb_id;
 	igt_crc_t input_crc, output_crc;
+	int res;
 
-	output = kms_writeback_get_output(display, fourcc_in, fourcc_out);
-	igt_require(output);
-
-	if (output->use_override_mode)
-		memcpy(&mode, &output->override_mode, sizeof(mode));
-	else
-		memcpy(&mode, &output->config.default_mode, sizeof(mode));
-
-	/* create input fb */
-	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
-	igt_assert(plane);
-
-	fb_id = igt_create_color_pattern_fb(display->drm_fd,
-					mode.hdisplay, mode.vdisplay,
-					fourcc_in, DRM_FORMAT_MOD_LINEAR,
-					0.2, 0.2, 0.2, &input_fb);
-	igt_assert(fb_id >= 0);
-	igt_plane_set_fb(plane, &input_fb);
-#if DUMP_FBS
-	igt_dump_fb(display, &input_fb, ".", "input");
-#endif
-
-	/* create output fb */
-	fb_id = igt_create_fb(display->drm_fd, mode.hdisplay, mode.vdisplay,
-				fourcc_in,
-				igt_fb_mod_to_tiling(0),
-				&output_fb);
-	igt_require(fb_id > 0);
-
-	igt_fb_get_fnv1a_crc(&input_fb, &input_crc);
-
-	igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
+	igt_fb_get_fnv1a_crc(input_fb, &input_crc);
 
 	/* reset color pipeline*/
 
 	set_color_pipeline_bypass(plane);
 
 	/* Commit */
-	igt_plane_set_fb(plane, &input_fb);
-	igt_output_set_writeback_fb(output, &output_fb);
+	igt_plane_set_fb(plane, input_fb);
+	igt_output_set_writeback_fb(output, output_fb);
 
 	igt_display_commit_atomic(output->display,
 				DRM_MODE_ATOMIC_ALLOW_MODESET,
@@ -441,14 +409,15 @@ static void colorop_plane_test(igt_display_t *display,
 	get_and_wait_out_fence(output);
 
 	/* Compare input and output buffers. They should be equal here. */
-	igt_fb_get_fnv1a_crc(&output_fb, &output_crc);
+	igt_fb_get_fnv1a_crc(output_fb, &output_crc);
 
 	igt_assert_crc_equal(&input_crc, &output_crc);
 
 	/* create sw transformed buffer */
+	res = igt_copy_fb(display->drm_fd, input_fb, &sw_transform_fb);
+	igt_assert_lte(0, res);
 
-	igt_copy_fb(display->drm_fd, &input_fb, &sw_transform_fb);
-	igt_assert(igt_cmp_fb_pixels(&input_fb, &sw_transform_fb, 0, 0));
+	igt_assert(igt_cmp_fb_pixels(input_fb, &sw_transform_fb, 0, 0));
 
 	apply_transforms(colorops, &sw_transform_fb);
 #if DUMP_FBS
@@ -469,7 +438,7 @@ static void colorop_plane_test(igt_display_t *display,
 		set_color_pipeline(display, plane, colorops, color_pipeline);
 	}
 
-	igt_output_set_writeback_fb(output, &output_fb);
+	igt_output_set_writeback_fb(output, output_fb);
 
 	/* commit COLOR_PIPELINE */
 	igt_display_commit_atomic(display,
@@ -477,28 +446,24 @@ static void colorop_plane_test(igt_display_t *display,
 				NULL);
 	get_and_wait_out_fence(output);
 #if DUMP_FBS
-	igt_dump_fb(display, &output_fb, ".", "output");
+	igt_dump_fb(display, output_fb, ".", "output");
 #endif
 
 	/* compare sw transformed and KMS transformed FBs */
-	igt_assert(compare_with_bracket(&sw_transform_fb, &output_fb));
+	igt_assert(compare_with_bracket(&sw_transform_fb, output_fb));
 
 	/* reset color pipeline*/
 	set_color_pipeline_bypass(plane);
 
 	/* Commit */
-	igt_plane_set_fb(plane, &input_fb);
-	igt_output_set_writeback_fb(output, &output_fb);
+	igt_plane_set_fb(plane, input_fb);
+	igt_output_set_writeback_fb(output, output_fb);
 
 	igt_display_commit_atomic(output->display,
 				DRM_MODE_ATOMIC_ALLOW_MODESET,
 				NULL);
 	get_and_wait_out_fence(output);
 
-	/* cleanup */
-	detach_crtc(display, output);
-	igt_remove_fb(display->drm_fd, &input_fb);
-	igt_remove_fb(display->drm_fd, &output_fb);
 }
 
 igt_main
@@ -550,21 +515,74 @@ igt_main
 		igt_display_require(&display, display.drm_fd);
 
 		igt_require(display.is_atomic);
-
 	}
 
 	for (j = 0; j < ARRAY_SIZE(formats); j++) {
-		for (i = 0; i < ARRAY_SIZE(tests); i++) {
-			igt_describe("Check color ops on a plane");
-			igt_subtest_f("plane-%s-%s", formats[j].name, tests[i].name)
-				colorop_plane_test(&display,
-						   formats[j].fourcc_in,
-						   formats[j].fourcc_out,
-						   tests[i].colorops);
+		igt_output_t *output;
+		igt_plane_t *plane;
+		igt_fb_t input_fb, output_fb;
+		unsigned int fb_id;
+		drmModeModeInfo mode;
+
+		igt_subtest_group {
+			igt_fixture {
+				output = kms_writeback_get_output(&display,
+								  formats[j].fourcc_in,
+								  formats[j].fourcc_out);
+				igt_require(output);
+
+				if (output->use_override_mode)
+					memcpy(&mode, &output->override_mode, sizeof(mode));
+				else
+					memcpy(&mode, &output->config.default_mode, sizeof(mode));
+
+				/* create input fb */
+				plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+				igt_assert(plane);
+				igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
+
+				fb_id = igt_create_color_pattern_fb(display.drm_fd,
+								mode.hdisplay, mode.vdisplay,
+								formats[j].fourcc_in, DRM_FORMAT_MOD_LINEAR,
+								0.2, 0.2, 0.2, &input_fb);
+				igt_assert(fb_id >= 0);
+				igt_plane_set_fb(plane, &input_fb);
+#if DUMP_FBS
+				igt_dump_fb(&display, &input_fb, ".", "input");
+#endif
+
+				/* create output fb */
+				fb_id = igt_create_fb(display.drm_fd, mode.hdisplay, mode.vdisplay,
+							formats[j].fourcc_in,
+							igt_fb_mod_to_tiling(0),
+							&output_fb);
+				igt_require(fb_id > 0);
+			}
+
+			for (i = 0; i < ARRAY_SIZE(tests); i++) {
+				igt_describe("Check color ops on a plane");
+				igt_subtest_f("plane-%s-%s", formats[j].name, tests[i].name)
+					colorop_plane_test(&display,
+							output,
+							plane,
+							&input_fb,
+							&output_fb,
+							formats[j].fourcc_in,
+							formats[j].fourcc_out,
+							tests[i].colorops);
+			}
+
+			igt_fixture {
+				detach_crtc(&display, output);
+				igt_remove_fb(display.drm_fd, &input_fb);
+				igt_remove_fb(display.drm_fd, &output_fb);
+
+			}
 		}
 	}
 	igt_describe("Tests getting and setting COLOR_PIPELINE property on plane");
 	igt_fixture {
 		igt_display_fini(&display);
+		drm_close_driver(display.drm_fd);
 	}
 }
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 17/30] lib/igt_color: Support color transform for XRGB2101010
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (15 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 16/30] lib/igt_fb: Allow any non-planar format for igt_copy_fb Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-26 16:28   ` Aurabindo Pillai
  2025-08-15  4:06 ` [PATCH V10 18/30] lib/igt_color: Add PQ variants for 0-1 and 0-125 range Alex Hung
                   ` (16 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Support color format XRGB2101010.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c     | 113 +++++++++++++++++++++++++++-----------------
 tests/kms_colorop.c |   3 ++
 2 files changed, 73 insertions(+), 43 deletions(-)

diff --git a/lib/igt_color.c b/lib/igt_color.c
index bc90fbdca..adf08fa2a 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -132,6 +132,74 @@ void igt_color_ctm_3x4_bt709_dec(igt_pixel_t *pixel)
 	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_bt709_dec);
 }
 
+static void
+igt_color_fourcc_to_pixel(uint32_t raw_pixel, uint32_t drm_format, igt_pixel_t *pixel)
+{
+	if (drm_format == DRM_FORMAT_XRGB8888) {
+		raw_pixel &= 0x00ffffff;
+
+		pixel->r = (raw_pixel & 0x00ff0000) >> 16;
+		pixel->g = (raw_pixel & 0x0000ff00) >> 8;
+		pixel->b = (raw_pixel & 0x000000ff);
+
+		/* normalize for 8-bit */
+		pixel->r /= (0xff);
+		pixel->g /= (0xff);
+		pixel->b /= (0xff);
+	} else if (drm_format == DRM_FORMAT_XRGB2101010) {
+		raw_pixel &= 0x3fffffff;
+
+		pixel->r = (raw_pixel & 0x3ff00000) >> 20;
+		pixel->g = (raw_pixel & 0x000ffc00) >> 10;
+		pixel->b = (raw_pixel & 0x000003ff);
+
+		/* normalize for 10-bit */
+		pixel->r /= (0x3ff);
+		pixel->g /= (0x3ff);
+		pixel->b /= (0x3ff);
+	} else {
+		igt_skip("pixel format support not implemented");
+	}
+}
+
+static uint32_t
+igt_color_pixel_to_fourc(uint32_t drm_format, igt_pixel_t *pixel)
+{
+	uint32_t raw_pixel;
+
+	/* clip */
+	pixel->r = fmax(fmin(pixel->r, 1.0), 0.0);
+	pixel->g = fmax(fmin(pixel->g, 1.0), 0.0);
+	pixel->b = fmax(fmin(pixel->b, 1.0), 0.0);
+
+	if (drm_format == DRM_FORMAT_XRGB8888) {
+		/* de-normalize back to 8-bit */
+		pixel->r *= (0xff);
+		pixel->g *= (0xff);
+		pixel->b *= (0xff);
+
+		/* re-pack pixel into FB*/
+		raw_pixel = 0x0;
+		raw_pixel |= ((uint8_t)(lround(pixel->r) & 0xff)) << 16;
+		raw_pixel |= ((uint8_t)(lround(pixel->g) & 0xff)) << 8;
+		raw_pixel |= ((uint8_t)(lround(pixel->b) & 0xff));
+	} else if (drm_format == DRM_FORMAT_XRGB2101010) {
+		/* de-normalize back to 10-bit */
+		pixel->r *= (0x3ff);
+		pixel->g *= (0x3ff);
+		pixel->b *= (0x3ff);
+
+		/* re-pack pixel into FB*/
+		raw_pixel = 0x0;
+		raw_pixel |= (lround(pixel->r) & 0x3ff) << 20;
+		raw_pixel |= (lround(pixel->g) & 0x3ff) << 10;
+		raw_pixel |= (lround(pixel->b) & 0x3ff);
+	} else {
+		igt_skip("pixel format support not implemented");
+	}
+
+	return raw_pixel;
+}
 
 int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], int num_transforms)
 {
@@ -144,10 +212,6 @@ int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], i
 	if (fb->num_planes != 1)
 		return -EINVAL;
 
-	/* TODO expand for other formats */
-	if (fb->drm_format != DRM_FORMAT_XRGB8888)
-		return -EINVAL;
-
 	ptr = igt_fb_map_buffer(fb->fd, fb);
 	igt_assert(ptr);
 	map = ptr;
@@ -173,51 +237,14 @@ int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], i
 			igt_pixel_t pixel;
 			int i;
 
-			raw_pixel &= 0x00ffffff;
-
-			/*
-			 * unpack pixel into igt_pixel_t
-			 *
-			 * only for XRGB8888 for now
-			 *
-			 * TODO add "generic" mechanism for unpacking
-			 * other FB formats
-			 */
-			pixel.r = (raw_pixel & 0x00ff0000) >> 16;
-			pixel.g = (raw_pixel & 0x0000ff00) >> 8;
-			pixel.b = (raw_pixel & 0x000000ff);
-
-			/* normalize for 8-bit */
-			pixel.r /= (0xff);
-			pixel.g /= (0xff);
-			pixel.b /= (0xff);
-
-			/* TODO use read_rgb from igt_fb? */
+			igt_color_fourcc_to_pixel(raw_pixel, fb->drm_format, &pixel);
 
 			/* run transform on pixel */
-
 			for (i = 0; i < num_transforms; i++)
 				transforms[i](&pixel);
 
-			/* clip */
-			pixel.r = fmax(fmin(pixel.r, 1.0), 0.0);
-			pixel.g = fmax(fmin(pixel.g, 1.0), 0.0);
-			pixel.b = fmax(fmin(pixel.b, 1.0), 0.0);
-
-			/* de-normalize back to 8-bit */
-			pixel.r *= (0xff);
-			pixel.g *= (0xff);
-			pixel.b *= (0xff);
-
-			/* re-pack pixel into FB*/
-			raw_pixel = 0x0;
-			raw_pixel |= ((uint8_t)(lround(pixel.r) & 0xff)) << 16;
-			raw_pixel |= ((uint8_t)(lround(pixel.g) & 0xff)) << 8;
-			raw_pixel |= ((uint8_t)(lround(pixel.b) & 0xff));
-			/* TODO use write_rgb from igt_fb? */
-
 			/* write back to line */
-			line[x] = cpu_to_le32(raw_pixel);
+			line[x] = cpu_to_le32(igt_color_pixel_to_fourc(fb->drm_format, &pixel));
 		}
 
 		/* copy line back to fb buffer */
diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 7ac74c536..1528da2f1 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -355,6 +355,9 @@ static bool compare_with_bracket(igt_fb_t *in, igt_fb_t *out)
 	if (is_vkms_device(in->fd))
 		return igt_cmp_fb_pixels(in, out, 1, 1);
 
+	if (is_amdgpu_device(in->fd))
+		return igt_cmp_fb_pixels(in, out, 13, 13);
+
 	/*
 	 * By default we'll look for a [0, 0] bracket. We can then
 	 * define it for each driver that implements support for this
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 18/30] lib/igt_color: Add PQ variants for 0-1 and 0-125 range
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (16 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 17/30] lib/igt_color: Support color transform for XRGB2101010 Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 19/30] tests/kms_colorop: Add tests for PQ variants Alex Hung
                   ` (15 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Add PQ SW transforms. The most obvious to do the PQ EOTF
is to transform [0.0, 1.0] non-linear values to [0.0, 1.0]
linear values, and same in the inverse. So we add transforms
that do this.

Some HW (like AMD's) has scaling baked into the PQ EOTF
and will scale [0.0, 1.0] non-linear values to [0.0, 125.0]
linear values when applying the PQ EOTF. The inverse will
take [0.0, 125.0] linear values and output [0.0, 1.0]
linear values. We're adding a transform that can handle
this variant as well.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c | 79 +++++++++++++++++++++++++++++++++++++++++++------
 lib/igt_color.h | 13 ++++++++
 2 files changed, 83 insertions(+), 9 deletions(-)

diff --git a/lib/igt_color.c b/lib/igt_color.c
index adf08fa2a..106b54e9d 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -22,6 +22,13 @@ static float clamp(float val, float min, float max)
 	return ((val < min) ? min : ((val > max) ? max : val));
 }
 
+static void igt_color_multiply(igt_pixel_t *pixel, float multiplier)
+{
+	pixel->r *= multiplier;
+	pixel->g *= multiplier;
+	pixel->b *= multiplier;
+}
+
 static float igt_color_tf_eval_unclamped(const struct igt_color_tf *fn, float x)
 {
 	if (x < fn->d)
@@ -57,24 +64,78 @@ static void tf_inverse(const struct igt_color_tf *fn, struct igt_color_tf *inv)
 	}
 }
 
-void igt_color_srgb_inv_eotf(igt_pixel_t *pixel)
+static float pq_eval(const struct igt_color_tf_pq *pq, float x)
 {
-	struct igt_color_tf inv;
+	return powf(fmaxf(pq->A + pq->B * powf(x, pq->C), 0)
+		       / (pq->D + pq->E * powf(x, pq->C)),
+			    pq->F);
+}
 
-	tf_inverse(&srgb_eotf, &inv);
+static void pq_inv(struct igt_color_tf_pq *inv)
+{
+	inv->A = -pq_eotf.A;
+	inv->B = pq_eotf.D;
+	inv->C = 1.0f / pq_eotf.F;
+	inv->D = pq_eotf.B;
+	inv->E = -pq_eotf.E;
+	inv->F = 1.0f / pq_eotf.C;
+}
 
-	pixel->r = igt_color_tf_eval(&inv, pixel->r);
-	pixel->g = igt_color_tf_eval(&inv, pixel->g);
-	pixel->b = igt_color_tf_eval(&inv, pixel->b);
+static void igt_color_tf(igt_pixel_t *pixel, const struct igt_color_tf *tf)
+{
+	pixel->r = igt_color_tf_eval(tf, pixel->r);
+	pixel->g = igt_color_tf_eval(tf, pixel->g);
+	pixel->b = igt_color_tf_eval(tf, pixel->b);
 }
 
+static void igt_color_inv_tf(igt_pixel_t *pixel, const struct igt_color_tf *tf)
+{
+	struct igt_color_tf inv;
+
+	tf_inverse(tf, &inv);
+	igt_color_tf(pixel, &inv);
+}
 
+static void tf_pq(igt_pixel_t *pixel, const struct igt_color_tf_pq *pq)
+{
+	pixel->r = pq_eval(pq, pixel->r);
+	pixel->g = pq_eval(pq, pixel->g);
+	pixel->b = pq_eval(pq, pixel->b);
+}
 
 void igt_color_srgb_eotf(igt_pixel_t *pixel)
 {
-	pixel->r = igt_color_tf_eval(&srgb_eotf, pixel->r);
-	pixel->g = igt_color_tf_eval(&srgb_eotf, pixel->g);
-	pixel->b = igt_color_tf_eval(&srgb_eotf, pixel->b);
+	igt_color_tf(pixel, &srgb_eotf);
+}
+
+void igt_color_srgb_inv_eotf(igt_pixel_t *pixel)
+{
+	igt_color_inv_tf(pixel, &srgb_eotf);
+}
+
+void igt_color_pq_eotf(igt_pixel_t *pixel)
+{
+	tf_pq(pixel, &pq_eotf);
+}
+
+void igt_color_pq_inv_eotf(igt_pixel_t *pixel)
+{
+	struct igt_color_tf_pq inv;
+
+	pq_inv(&inv);
+	tf_pq(pixel, &inv);
+}
+
+void igt_color_pq_125_eotf(igt_pixel_t *pixel)
+{
+	igt_color_pq_eotf(pixel);
+	igt_color_multiply(pixel, 125.0f);
+}
+
+void igt_color_pq_125_inv_eotf(igt_pixel_t *pixel)
+{
+	igt_color_multiply(pixel, 1/125.0f);
+	igt_color_pq_inv_eotf(pixel);
 }
 
 static void igt_color_apply_3x4_ctm(igt_pixel_t *pixel, const igt_matrix_3x4_t *matrix)
diff --git a/lib/igt_color.h b/lib/igt_color.h
index fe0037ae5..7e429a98f 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -21,8 +21,15 @@ struct igt_color_tf {
 	float g, a, b, c, d, e, f;
 };
 
+struct igt_color_tf_pq {
+	float A, B, C, D, E, F, G;
+};
+
+
 const struct igt_color_tf srgb_eotf = {2.4f, (float)(1/1.055), (float)(0.055/1.055), (float)(1/12.92), 0.04045f, 0, 0};
 
+const struct igt_color_tf_pq pq_eotf = {-107/128.0f, 1.0f, 32/2523.0f, 2413/128.0f, -2392/128.0f, 8192/1305.0f };
+
 typedef struct igt_pixel {
 	float r;
 	float g;
@@ -91,6 +98,12 @@ void igt_colorop_set_ctm_3x4(igt_display_t *display,
 void igt_color_srgb_inv_eotf(igt_pixel_t *pixel);
 void igt_color_srgb_eotf(igt_pixel_t *pixel);
 
+void igt_color_pq_inv_eotf(igt_pixel_t *pixel);
+void igt_color_pq_eotf(igt_pixel_t *pixel);
+
+void igt_color_pq_125_inv_eotf(igt_pixel_t *pixel);
+void igt_color_pq_125_eotf(igt_pixel_t *pixel);
+
 void igt_color_ctm_3x4_50_desat(igt_pixel_t *pixel);
 void igt_color_ctm_3x4_overdrive(igt_pixel_t *pixel);
 void igt_color_ctm_3x4_oversaturate(igt_pixel_t *pixel);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 19/30] tests/kms_colorop: Add tests for PQ variants
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (17 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 18/30] lib/igt_color: Add PQ variants for 0-1 and 0-125 range Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 20/30] tests/kms_colorop: Add a TF sRGB test Alex Hung
                   ` (14 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Add tests exercising the PQ EOTF and its inverse, both
for the [0.0, 1.0] variant as well as the [0.0, 125.0]
scaled variant.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 32 ++++++++++++++-----------
 tests/kms_colorop.h | 57 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+), 13 deletions(-)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 1528da2f1..c650ea59e 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -49,6 +49,13 @@
  * @srgb_eotf:                  sRGB EOTF
  * @srgb_inv_eotf:              sRGB Inverse EOTF
  * @srgb_eotf-srgb_inv_eotf:    sRGB EOTF -> sRGB Inverse EOTF
+ * @pq_eotf:                    PQ EOTF
+ * @pq_inv_eotf:                PQ Inverse EOTF
+ * @pq_eotf-pq_inv_eotf:        PQ EOTF -> PQ Inverse EOTF
+ * @pq_125_eotf:                PQ EOTF for [0.0, 125.0] optical range
+ * @pq_125_inv_eotf:            PQ Inverse EOTF for [0.0, 125.0] optical range
+ * @pq_125_eotf-pq_125_inv_eotf: PQ EOTF -> PQ Inverse EOTF with [0.0, 125.0] optical range
+ * @pq_125_eotf-pq_125_inv_eotf-pq_125_eotf: PQ EOTF -> PQ Inverse EOTF -> PQ EOTF with [0.0, 125.0] optical range
  * @ctm_3x4_50_desat:		3x4 matrix doing a 50% desaturation
  * @ctm_3x4_overdrive:		3x4 matrix overdring all values by 50%
  * @ctm_3x4_oversaturate:	3x4 matrix oversaturating values
@@ -213,7 +220,10 @@ static bool can_use_colorop(igt_display_t *display, igt_colorop_t *colorop, kms_
 {
 	switch (desired->type) {
 	case KMS_COLOROP_ENUMERATED_LUT1D:
-		return (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_CURVE);
+		if (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_CURVE &&
+		    igt_colorop_try_prop_enum(colorop, IGT_COLOROP_CURVE_1D_TYPE, kms_colorop_lut1d_tf_names[desired->enumerated_lut1d_info.tf]))
+			return true;
+		return false;
 	case KMS_COLOROP_CTM_3X4:
 		return (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_CTM_3X4);
 	case KMS_COLOROP_CUSTOM_LUT1D:
@@ -293,18 +303,7 @@ static void set_colorop(igt_display_t *display,
 	/* Set to desired value from kms_colorop_t */
 	switch (colorop->type) {
 	case KMS_COLOROP_ENUMERATED_LUT1D:
-		switch (colorop->enumerated_lut1d_info.tf) {
-		case KMS_COLOROP_LUT1D_SRGB_EOTF:
-			igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, "sRGB EOTF");
-			break;
-		case KMS_COLOROP_LUT1D_SRGB_INV_EOTF:
-			igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, "sRGB Inverse EOTF");
-			break;
-		case KMS_COLOROP_LUT1D_PQ_EOTF:
-		case KMS_COLOROP_LUT1D_PQ_INV_EOTF:
-		default:
-			igt_fail(IGT_EXIT_FAILURE);
-		}
+		igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, kms_colorop_lut1d_tf_names[colorop->enumerated_lut1d_info.tf]);
 		break;
 	case KMS_COLOROP_CTM_3X4:
 		igt_colorop_set_ctm_3x4(display, colorop->colorop, colorop->matrix_3x4);
@@ -480,6 +479,13 @@ igt_main
 		{ { &kms_colorop_srgb_eotf, NULL }, "srgb_eotf" },
 		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
 		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" },
+		{ { &kms_colorop_pq_eotf, NULL }, "pq_eotf" },
+		{ { &kms_colorop_pq_inv_eotf, NULL }, "pq_inv_eotf" },
+		{ { &kms_colorop_pq_eotf, &kms_colorop_pq_inv_eotf, NULL }, "pq_eotf-pq_inv_eotf" },
+		{ { &kms_colorop_pq_125_eotf, NULL }, "pq_125_eotf" },
+		{ { &kms_colorop_pq_125_inv_eotf, NULL }, "pq_125_inv_eotf" },
+		{ { &kms_colorop_pq_125_eotf, &kms_colorop_pq_125_inv_eotf, NULL }, "pq_125_eotf-pq_125_inv_eotf" },
+		{ { &kms_colorop_pq_125_eotf, &kms_colorop_pq_125_inv_eotf, &kms_colorop_pq_125_eotf_2, NULL }, "pq_125_eotf-pq_125_inv_eotf-pq_125_eotf" },
 		{ { &kms_colorop_ctm_3x4_50_desat, NULL }, "ctm_3x4_50_desat" },
 		{ { &kms_colorop_ctm_3x4_overdrive, NULL }, "ctm_3x4_overdrive" },
 		{ { &kms_colorop_ctm_3x4_oversaturate, NULL }, "ctm_3x4_oversaturate" },
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
index 8f0c29cba..0f56361df 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -45,8 +45,20 @@ typedef enum kms_colorop_lut1d_tf {
 	KMS_COLOROP_LUT1D_SRGB_INV_EOTF,
 	KMS_COLOROP_LUT1D_PQ_EOTF,
 	KMS_COLOROP_LUT1D_PQ_INV_EOTF,
+	KMS_COLOROP_LUT1D_PQ_125_EOTF,
+	KMS_COLOROP_LUT1D_PQ_125_INV_EOTF,
+	KMS_COLOROP_LUT1D_NUM_ENUMS
 } kms_colorop_lut1d_tf_t;
 
+const char * const kms_colorop_lut1d_tf_names[KMS_COLOROP_LUT1D_NUM_ENUMS] = {
+	[KMS_COLOROP_LUT1D_SRGB_EOTF] = "sRGB EOTF",
+	[KMS_COLOROP_LUT1D_SRGB_INV_EOTF] = "sRGB Inverse EOTF",
+	[KMS_COLOROP_LUT1D_PQ_EOTF] = "PQ EOTF",
+	[KMS_COLOROP_LUT1D_PQ_INV_EOTF] = "PQ Inverse EOTF",
+	[KMS_COLOROP_LUT1D_PQ_125_EOTF] = "PQ 125 EOTF",
+	[KMS_COLOROP_LUT1D_PQ_125_INV_EOTF] = "PQ 125 Inverse EOTF",
+};
+
 typedef struct kms_colorop_enumerated_lut1d_info {
 	kms_colorop_lut1d_tf_t tf;
 } kms_colorop_enumerated_lut1d_info_t;
@@ -86,6 +98,51 @@ kms_colorop_t kms_colorop_srgb_inv_eotf = {
 	.transform = &igt_color_srgb_inv_eotf
 };
 
+kms_colorop_t kms_colorop_pq_eotf = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_PQ_EOTF
+	},
+	.name = "pq_eotf",
+	.transform = &igt_color_pq_eotf
+};
+
+kms_colorop_t kms_colorop_pq_inv_eotf = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_PQ_INV_EOTF
+	},
+	.name = "pq_inv_eotf",
+	.transform = &igt_color_pq_inv_eotf
+};
+
+kms_colorop_t kms_colorop_pq_125_eotf = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_PQ_125_EOTF
+	},
+	.name = "pq_125_eotf",
+	.transform = &igt_color_pq_125_eotf
+};
+
+kms_colorop_t kms_colorop_pq_125_eotf_2 = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_PQ_125_EOTF
+	},
+	.name = "pq_125_eotf",
+	.transform = &igt_color_pq_125_eotf
+};
+
+kms_colorop_t kms_colorop_pq_125_inv_eotf = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_PQ_125_INV_EOTF
+	},
+	.name = "pq_125_inv_eotf",
+	.transform = &igt_color_pq_125_inv_eotf
+};
+
 kms_colorop_t kms_colorop_ctm_3x4_50_desat = {
 	.type = KMS_COLOROP_CTM_3X4,
 	.matrix_3x4 = &igt_matrix_3x4_50_desat,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 20/30] tests/kms_colorop: Add a TF sRGB test
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (18 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 19/30] tests/kms_colorop: Add tests for PQ variants Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 21/30] lib/igt_color: add BT2020/BT709 transfer functions Alex Hung
                   ` (13 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

Add test for EOTF -> Inverse EOTF -> EOTF

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 tests/kms_colorop.c | 40 +++++++++++++++++++++-------------------
 tests/kms_colorop.h |  9 +++++++++
 2 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index c650ea59e..98e78f8c9 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -40,29 +40,30 @@
  *
  * arg[1]:
  *
- * @XR24-XR24:			XRGB8888 framebuffer and writeback buffer
- * @XR30-XR30:			XRGB2101010 framebuffer and writeback buffer
+ * @XR24-XR24:				XRGB8888 framebuffer and writeback buffer
+ * @XR30-XR30:				XRGB2101010 framebuffer and writeback buffer
  *
  * arg[2]:
  *
- * @bypass:			Bypass Color Pipeline
- * @srgb_eotf:                  sRGB EOTF
- * @srgb_inv_eotf:              sRGB Inverse EOTF
- * @srgb_eotf-srgb_inv_eotf:    sRGB EOTF -> sRGB Inverse EOTF
- * @pq_eotf:                    PQ EOTF
- * @pq_inv_eotf:                PQ Inverse EOTF
- * @pq_eotf-pq_inv_eotf:        PQ EOTF -> PQ Inverse EOTF
- * @pq_125_eotf:                PQ EOTF for [0.0, 125.0] optical range
- * @pq_125_inv_eotf:            PQ Inverse EOTF for [0.0, 125.0] optical range
- * @pq_125_eotf-pq_125_inv_eotf: PQ EOTF -> PQ Inverse EOTF with [0.0, 125.0] optical range
+ * @bypass:				Bypass Color Pipeline
+ * @srgb_eotf:				sRGB EOTF
+ * @srgb_inv_eotf:			sRGB Inverse EOTF
+ * @srgb_eotf-srgb_inv_eotf:		sRGB EOTF -> sRGB Inverse EOTF
+ * @srgb_eotf-srgb_inv_eotf-srgb_eotf:  sRGB EOTF -> sRGB Inverse EOTF -> sRGB EOTF
+ * @pq_eotf:				PQ EOTF
+ * @pq_inv_eotf:			PQ Inverse EOTF
+ * @pq_eotf-pq_inv_eotf:		PQ EOTF -> PQ Inverse EOTF
+ * @pq_125_eotf:			PQ EOTF for [0.0, 125.0] optical range
+ * @pq_125_inv_eotf:			PQ Inverse EOTF for [0.0, 125.0] optical range
+ * @pq_125_eotf-pq_125_inv_eotf:	PQ EOTF -> PQ Inverse EOTF with [0.0, 125.0] optical range
  * @pq_125_eotf-pq_125_inv_eotf-pq_125_eotf: PQ EOTF -> PQ Inverse EOTF -> PQ EOTF with [0.0, 125.0] optical range
- * @ctm_3x4_50_desat:		3x4 matrix doing a 50% desaturation
- * @ctm_3x4_overdrive:		3x4 matrix overdring all values by 50%
- * @ctm_3x4_oversaturate:	3x4 matrix oversaturating values
- * @ctm_3x4_bt709_enc:		BT709 encoding matrix
- * @ctm_3x4_bt709_dec:		BT709 decoding matrix
- * @ctm_3x4_bt709_enc_dec:	BT709 encoding matrix, followed by decoding matrix
- * @ctm_3x4_bt709_dec_enc:	BT709 decoding matrix, followed by encoding matrix
+ * @ctm_3x4_50_desat:			3x4 matrix doing a 50% desaturation
+ * @ctm_3x4_overdrive:			3x4 matrix overdring all values by 50%
+ * @ctm_3x4_oversaturate:		3x4 matrix oversaturating values
+ * @ctm_3x4_bt709_enc:			BT709 encoding matrix
+ * @ctm_3x4_bt709_dec:			BT709 decoding matrix
+ * @ctm_3x4_bt709_enc_dec:		BT709 encoding matrix, followed by decoding matrix
+ * @ctm_3x4_bt709_dec_enc:		BT709 decoding matrix, followed by encoding matrix
  *
  */
 
@@ -479,6 +480,7 @@ igt_main
 		{ { &kms_colorop_srgb_eotf, NULL }, "srgb_eotf" },
 		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
 		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" },
+		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, &kms_colorop_srgb_eotf_2, NULL }, "srgb_eotf-srgb_inv_eotf-srgb_eotf" },
 		{ { &kms_colorop_pq_eotf, NULL }, "pq_eotf" },
 		{ { &kms_colorop_pq_inv_eotf, NULL }, "pq_inv_eotf" },
 		{ { &kms_colorop_pq_eotf, &kms_colorop_pq_inv_eotf, NULL }, "pq_eotf-pq_inv_eotf" },
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
index 0f56361df..494fd7d5d 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -89,6 +89,15 @@ kms_colorop_t kms_colorop_srgb_eotf = {
 	.transform = &igt_color_srgb_eotf
 };
 
+kms_colorop_t kms_colorop_srgb_eotf_2 = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_SRGB_EOTF
+	},
+	.name = "srgb_eotf",
+	.transform = &igt_color_srgb_eotf
+};
+
 kms_colorop_t kms_colorop_srgb_inv_eotf = {
 	.type = KMS_COLOROP_ENUMERATED_LUT1D,
 	.enumerated_lut1d_info = {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 21/30] lib/igt_color: add BT2020/BT709 transfer functions
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (19 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 20/30] tests/kms_colorop: Add a TF sRGB test Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 22/30] tests/kms_colorop: Add TF BT2020/BT709 tests Alex Hung
                   ` (12 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

BT.709 and BT.2020 transfer functions are identical, the
only difference beind that BT.2020 is defined with a higher
precision for 10 and 12 bpc encodings.

These transfer functions are defined as OETFs, not EOTFs,
so we create functions for them as OETF and its inverse.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c | 10 ++++++++++
 lib/igt_color.h |  4 ++++
 2 files changed, 14 insertions(+)

diff --git a/lib/igt_color.c b/lib/igt_color.c
index 106b54e9d..6a639813f 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -113,6 +113,16 @@ void igt_color_srgb_inv_eotf(igt_pixel_t *pixel)
 	igt_color_inv_tf(pixel, &srgb_eotf);
 }
 
+void igt_color_bt2020_inv_oetf(igt_pixel_t *pixel)
+{
+	igt_color_tf(pixel, &bt2020_inv_oetf);
+}
+
+void igt_color_bt2020_oetf(igt_pixel_t *pixel)
+{
+	igt_color_inv_tf(pixel, &bt2020_inv_oetf);
+}
+
 void igt_color_pq_eotf(igt_pixel_t *pixel)
 {
 	tf_pq(pixel, &pq_eotf);
diff --git a/lib/igt_color.h b/lib/igt_color.h
index 7e429a98f..9f56536a3 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -27,6 +27,7 @@ struct igt_color_tf_pq {
 
 
 const struct igt_color_tf srgb_eotf = {2.4f, (float)(1/1.055), (float)(0.055/1.055), (float)(1/12.92), 0.04045f, 0, 0};
+const struct igt_color_tf bt2020_inv_oetf = {(float)(1/0.45f), (float)(1/1.0993f), (float)(0.0993f/1.0993f), (float)(1/4.5f), (float)(0.081), 0, 0};
 
 const struct igt_color_tf_pq pq_eotf = {-107/128.0f, 1.0f, 32/2523.0f, 2413/128.0f, -2392/128.0f, 8192/1305.0f };
 
@@ -104,6 +105,9 @@ void igt_color_pq_eotf(igt_pixel_t *pixel);
 void igt_color_pq_125_inv_eotf(igt_pixel_t *pixel);
 void igt_color_pq_125_eotf(igt_pixel_t *pixel);
 
+void igt_color_bt2020_inv_oetf(igt_pixel_t *pixel);
+void igt_color_bt2020_oetf(igt_pixel_t *pixel);
+
 void igt_color_ctm_3x4_50_desat(igt_pixel_t *pixel);
 void igt_color_ctm_3x4_overdrive(igt_pixel_t *pixel);
 void igt_color_ctm_3x4_oversaturate(igt_pixel_t *pixel);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 22/30] tests/kms_colorop: Add TF BT2020/BT709 tests
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (20 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 21/30] lib/igt_color: add BT2020/BT709 transfer functions Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 23/30] lib/igt_color: Add 1D LUT color transformation support Alex Hung
                   ` (11 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

From: Harry Wentland <harry.wentland@amd.com>

Add tests for OETF, Inverse OEFT and INVERSE OETF -> OETF.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c |  6 ++++++
 tests/kms_colorop.h | 22 ++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 98e78f8c9..ab2771d37 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -50,6 +50,9 @@
  * @srgb_inv_eotf:			sRGB Inverse EOTF
  * @srgb_eotf-srgb_inv_eotf:		sRGB EOTF -> sRGB Inverse EOTF
  * @srgb_eotf-srgb_inv_eotf-srgb_eotf:  sRGB EOTF -> sRGB Inverse EOTF -> sRGB EOTF
+ * @bt2020_inv_oetf:			BT.2020 Inverse OETF
+ * @bt2020_oetf:			BT.2020 OETF
+ * @bt2020_inv_oetf-bt2020_oetf:	BT.2020 Inverse OETF > BT.2020 OETF
  * @pq_eotf:				PQ EOTF
  * @pq_inv_eotf:			PQ Inverse EOTF
  * @pq_eotf-pq_inv_eotf:		PQ EOTF -> PQ Inverse EOTF
@@ -481,6 +484,9 @@ igt_main
 		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
 		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" },
 		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, &kms_colorop_srgb_eotf_2, NULL }, "srgb_eotf-srgb_inv_eotf-srgb_eotf" },
+		{ { &kms_colorop_bt2020_inv_oetf, NULL }, "bt2020_inv_oetf" },
+		{ { &kms_colorop_bt2020_oetf, NULL }, "bt2020_oetf" },
+		{ { &kms_colorop_bt2020_inv_oetf, &kms_colorop_bt2020_oetf, NULL }, "bt2020_inv_oetf-bt2020_oetf" },
 		{ { &kms_colorop_pq_eotf, NULL }, "pq_eotf" },
 		{ { &kms_colorop_pq_inv_eotf, NULL }, "pq_inv_eotf" },
 		{ { &kms_colorop_pq_eotf, &kms_colorop_pq_inv_eotf, NULL }, "pq_eotf-pq_inv_eotf" },
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
index 494fd7d5d..50df2b26a 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -43,6 +43,8 @@ typedef enum kms_colorop_type {
 typedef enum kms_colorop_lut1d_tf {
 	KMS_COLOROP_LUT1D_SRGB_EOTF,
 	KMS_COLOROP_LUT1D_SRGB_INV_EOTF,
+	KMS_COLOROP_LUT1D_BT2020_INV_OETF,
+	KMS_COLOROP_LUT1D_BT2020_OETF,
 	KMS_COLOROP_LUT1D_PQ_EOTF,
 	KMS_COLOROP_LUT1D_PQ_INV_EOTF,
 	KMS_COLOROP_LUT1D_PQ_125_EOTF,
@@ -53,6 +55,8 @@ typedef enum kms_colorop_lut1d_tf {
 const char * const kms_colorop_lut1d_tf_names[KMS_COLOROP_LUT1D_NUM_ENUMS] = {
 	[KMS_COLOROP_LUT1D_SRGB_EOTF] = "sRGB EOTF",
 	[KMS_COLOROP_LUT1D_SRGB_INV_EOTF] = "sRGB Inverse EOTF",
+	[KMS_COLOROP_LUT1D_BT2020_INV_OETF] = "BT.2020 Inverse OETF",
+	[KMS_COLOROP_LUT1D_BT2020_OETF] = "BT.2020 OETF",
 	[KMS_COLOROP_LUT1D_PQ_EOTF] = "PQ EOTF",
 	[KMS_COLOROP_LUT1D_PQ_INV_EOTF] = "PQ Inverse EOTF",
 	[KMS_COLOROP_LUT1D_PQ_125_EOTF] = "PQ 125 EOTF",
@@ -107,6 +111,24 @@ kms_colorop_t kms_colorop_srgb_inv_eotf = {
 	.transform = &igt_color_srgb_inv_eotf
 };
 
+kms_colorop_t kms_colorop_bt2020_inv_oetf = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_BT2020_INV_OETF
+	},
+	.name = "bt2020_inv_oetf",
+	.transform = &igt_color_bt2020_inv_oetf
+};
+
+kms_colorop_t kms_colorop_bt2020_oetf = {
+	.type = KMS_COLOROP_ENUMERATED_LUT1D,
+	.enumerated_lut1d_info = {
+		.tf = KMS_COLOROP_LUT1D_BT2020_OETF
+	},
+	.name = "bt2020_oetf",
+	.transform = &igt_color_bt2020_oetf
+};
+
 kms_colorop_t kms_colorop_pq_eotf = {
 	.type = KMS_COLOROP_ENUMERATED_LUT1D,
 	.enumerated_lut1d_info = {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 23/30] lib/igt_color: Add 1D LUT color transformation support
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (21 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 22/30] tests/kms_colorop: Add TF BT2020/BT709 tests Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-22 21:43   ` Aurabindo Pillai
  2025-08-15  4:06 ` [PATCH V10 24/30] test/kms_colorop: Add tests that exercise the 1D LUT colorops Alex Hung
                   ` (10 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

Add definitions and functions for setting 1D LUT on a
drm_colorop.

Add support for the SIZE prop of a colorop, as that's
required for understanding the size of the LUT to
construct.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Co-developed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 include/drm-uapi/drm_mode.h | 12 ++++++++++++
 lib/igt_color.c             |  8 ++++++++
 lib/igt_color.h             | 20 ++++++++++++++++++++
 lib/igt_kms.c               |  1 +
 lib/igt_kms.h               |  1 +
 5 files changed, 42 insertions(+)

diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index fce45b5cf..106fbb889 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -874,6 +874,18 @@ struct drm_color_lut {
 	__u16 reserved;
 };
 
+/*
+ * struct drm_color_lut32
+ *
+ * 32-bit per channel color LUT entry, similar to drm_color_lut.
+ */
+struct drm_color_lut32 {
+	__u32 red;
+	__u32 green;
+	__u32 blue;
+	__u32 reserved;
+};
+
 enum drm_colorop_type {
 	DRM_COLOROP_1D_CURVE,
 	DRM_COLOROP_1D_LUT,
diff --git a/lib/igt_color.c b/lib/igt_color.c
index 6a639813f..a58ba0e57 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -428,3 +428,11 @@ void igt_colorop_set_ctm_3x4(igt_display_t *display,
 	/* set blob property */
 	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, &ctm, sizeof(ctm));
 }
+
+void igt_colorop_set_custom_1dlut(igt_display_t *display,
+				  igt_colorop_t *colorop,
+				  const igt_1dlut_t *lut1d,
+				  const size_t lut_size)
+{
+	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, lut1d, lut_size);
+}
diff --git a/lib/igt_color.h b/lib/igt_color.h
index 9f56536a3..88de8166f 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -17,6 +17,8 @@
 #include "igt_fb.h"
 #include "igt_kms.h"
 
+#define MAX_COLOR_LUT_ENTRIES 4096
+
 struct igt_color_tf {
 	float g, a, b, c, d, e, f;
 };
@@ -37,6 +39,17 @@ typedef struct igt_pixel {
 	float b;
 } igt_pixel_t;
 
+typedef struct igt_1dlut {
+	struct drm_color_lut32 lut[MAX_COLOR_LUT_ENTRIES];
+} igt_1dlut_t;
+
+igt_1dlut_t igt_1dlut_srgb_inv_eotf = { {
+} };
+
+
+igt_1dlut_t igt_1dlut_srgb_eotf = { {
+} };
+
 typedef struct igt_matrix_3x4 {
 	/*
 	 * out   matrix          in
@@ -94,11 +107,18 @@ void igt_colorop_set_ctm_3x4(igt_display_t *display,
 			     igt_colorop_t *colorop,
 			     const igt_matrix_3x4_t *matrix);
 
+void igt_colorop_set_custom_1dlut(igt_display_t *display,
+				  igt_colorop_t *colorop,
+				  const igt_1dlut_t *lut1d,
+				  const size_t lut_size);
+
 /* transformations */
 
 void igt_color_srgb_inv_eotf(igt_pixel_t *pixel);
 void igt_color_srgb_eotf(igt_pixel_t *pixel);
 
+void igt_color_srgb_inv_eotf_custom_lut(igt_pixel_t *pixel);
+
 void igt_color_pq_inv_eotf(igt_pixel_t *pixel);
 void igt_color_pq_eotf(igt_pixel_t *pixel);
 
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index d1c23b4a4..bdde2fc72 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -710,6 +710,7 @@ const char * const igt_colorop_prop_names[IGT_NUM_COLOROP_PROPS] = {
 	[IGT_COLOROP_TYPE] = "TYPE",
 	[IGT_COLOROP_BYPASS] = "BYPASS",
 	[IGT_COLOROP_CURVE_1D_TYPE] = "CURVE_1D_TYPE",
+	[IGT_COLOROP_SIZE] = "SIZE",
 	[IGT_COLOROP_DATA] = "DATA",
 	[IGT_COLOROP_NEXT] = "NEXT",
 };
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 2a401cd3b..d0a7ed037 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -374,6 +374,7 @@ enum igt_atomic_colorop_properties {
 	IGT_COLOROP_TYPE,
 	IGT_COLOROP_BYPASS,
 	IGT_COLOROP_CURVE_1D_TYPE,
+	IGT_COLOROP_SIZE,
 	IGT_COLOROP_DATA,
 	IGT_COLOROP_NEXT,
 	IGT_NUM_COLOROP_PROPS
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 24/30] test/kms_colorop: Add tests that exercise the 1D LUT colorops
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (22 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 23/30] lib/igt_color: Add 1D LUT color transformation support Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 25/30] tests/kms_colorop: Add multiplier tests Alex Hung
                   ` (9 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

We'll use the sRGB EOTF and its inverse for convenience.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 35 +++++++++++++++++++++++++++++++++++
 tests/kms_colorop.h | 15 +++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index ab2771d37..bd7358a27 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -50,6 +50,8 @@
  * @srgb_inv_eotf:			sRGB Inverse EOTF
  * @srgb_eotf-srgb_inv_eotf:		sRGB EOTF -> sRGB Inverse EOTF
  * @srgb_eotf-srgb_inv_eotf-srgb_eotf:  sRGB EOTF -> sRGB Inverse EOTF -> sRGB EOTF
+ * @srgb_inv_eotf_lut:			sRGB Inverse EOTF Custom LUT
+ * @srgb_inv_eotf_lut-srgb_eotf_lut:	sRGB Inverse EOTF Custom LUT -> sRGB EOTF Custom LUT
  * @bt2020_inv_oetf:			BT.2020 Inverse OETF
  * @bt2020_oetf:			BT.2020 OETF
  * @bt2020_inv_oetf-bt2020_oetf:	BT.2020 Inverse OETF > BT.2020 OETF
@@ -231,6 +233,9 @@ static bool can_use_colorop(igt_display_t *display, igt_colorop_t *colorop, kms_
 	case KMS_COLOROP_CTM_3X4:
 		return (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_CTM_3X4);
 	case KMS_COLOROP_CUSTOM_LUT1D:
+		if (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_LUT)
+			return true;
+		return false;
 	case KMS_COLOROP_LUT3D:
 	default:
 		return false;
@@ -298,9 +303,33 @@ static igt_colorop_t *get_color_pipeline(igt_display_t *display,
 	return colorop;
 }
 
+static void fill_custom_1dlut(igt_display_t *display, kms_colorop_t *colorop)
+{
+	uint64_t lut_size = igt_colorop_get_prop(display, colorop->colorop, IGT_COLOROP_SIZE);
+	igt_pixel_t pixel;
+	float index;
+	int i;
+
+	for (i = 0; i < lut_size; i++) {
+		index = i / (float) lut_size;
+
+		pixel.r = index;
+		pixel.g = index;
+		pixel.b = index;
+
+		colorop->transform(&pixel);
+
+		colorop->lut1d->lut[i].red = pixel.r * UINT_MAX;
+		colorop->lut1d->lut[i].green = pixel.g * UINT_MAX;
+		colorop->lut1d->lut[i].blue = pixel.b * UINT_MAX;
+	}
+}
+
 static void set_colorop(igt_display_t *display,
 			kms_colorop_t *colorop)
 {
+	uint64_t lut_size = 0;
+
 	igt_assert(colorop->colorop);
 	igt_colorop_set_prop_value(colorop->colorop, IGT_COLOROP_BYPASS, 0);
 
@@ -313,6 +342,10 @@ static void set_colorop(igt_display_t *display,
 		igt_colorop_set_ctm_3x4(display, colorop->colorop, colorop->matrix_3x4);
 		break;
 	case KMS_COLOROP_CUSTOM_LUT1D:
+		fill_custom_1dlut(display, colorop);
+		lut_size = igt_colorop_get_prop(display, colorop->colorop, IGT_COLOROP_SIZE);
+		igt_colorop_set_custom_1dlut(display, colorop->colorop, colorop->lut1d, lut_size * sizeof(struct drm_color_lut32));
+		break;
 	case KMS_COLOROP_LUT3D:
 	default:
 		igt_fail(IGT_EXIT_FAILURE);
@@ -484,6 +517,8 @@ igt_main
 		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
 		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" },
 		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, &kms_colorop_srgb_eotf_2, NULL }, "srgb_eotf-srgb_inv_eotf-srgb_eotf" },
+		{ { &kms_colorop_srgb_inv_eotf_lut, NULL }, "srgb_inv_eotf_lut" },
+		{ { &kms_colorop_srgb_inv_eotf_lut, &kms_colorop_srgb_eotf_lut, NULL }, "srgb_inv_eotf_lut-srgb_eotf_lut" },
 		{ { &kms_colorop_bt2020_inv_oetf, NULL }, "bt2020_inv_oetf" },
 		{ { &kms_colorop_bt2020_oetf, NULL }, "bt2020_oetf" },
 		{ { &kms_colorop_bt2020_inv_oetf, &kms_colorop_bt2020_oetf, NULL }, "bt2020_inv_oetf-bt2020_oetf" },
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
index 50df2b26a..dfc42b352 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -72,6 +72,7 @@ typedef struct kms_colorop {
 
 	union {
 		kms_colorop_enumerated_lut1d_info_t enumerated_lut1d_info;
+		igt_1dlut_t *lut1d;
 		const igt_matrix_3x4_t *matrix_3x4;
 	};
 
@@ -111,6 +112,20 @@ kms_colorop_t kms_colorop_srgb_inv_eotf = {
 	.transform = &igt_color_srgb_inv_eotf
 };
 
+kms_colorop_t kms_colorop_srgb_inv_eotf_lut = {
+	.type = KMS_COLOROP_CUSTOM_LUT1D,
+	.lut1d = &igt_1dlut_srgb_inv_eotf,
+	.name = "srgb_inv_eotf_lut",
+	.transform = &igt_color_srgb_inv_eotf
+};
+
+kms_colorop_t kms_colorop_srgb_eotf_lut = {
+	.type = KMS_COLOROP_CUSTOM_LUT1D,
+	.lut1d = &igt_1dlut_srgb_eotf,
+	.name = "srgb_eotf_lut",
+	.transform = &igt_color_srgb_eotf
+};
+
 kms_colorop_t kms_colorop_bt2020_inv_oetf = {
 	.type = KMS_COLOROP_ENUMERATED_LUT1D,
 	.enumerated_lut1d_info = {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 25/30] tests/kms_colorop: Add multiplier tests
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (23 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 24/30] test/kms_colorop: Add tests that exercise the 1D LUT colorops Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 26/30] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API Alex Hung
                   ` (8 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

This includes multiply_125 (125.0f) and multiply_inv_125 (1/125.0f).

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 include/drm-uapi/drm_mode.h |  1 +
 lib/igt_color.c             | 10 ++++++++++
 lib/igt_color.h             |  3 +++
 lib/igt_kms.c               |  1 +
 lib/igt_kms.h               |  1 +
 tests/kms_colorop.c         | 11 +++++++++++
 tests/kms_colorop.h         | 15 +++++++++++++++
 7 files changed, 42 insertions(+)

diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index 106fbb889..fe3e98e20 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -890,6 +890,7 @@ enum drm_colorop_type {
 	DRM_COLOROP_1D_CURVE,
 	DRM_COLOROP_1D_LUT,
 	DRM_COLOROP_CTM_3X4,
+	DRM_COLOROP_MULTIPLIER,
 };
 
 /**
diff --git a/lib/igt_color.c b/lib/igt_color.c
index a58ba0e57..aa65eac20 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -203,6 +203,16 @@ void igt_color_ctm_3x4_bt709_dec(igt_pixel_t *pixel)
 	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_bt709_dec);
 }
 
+void igt_color_multiply_125(igt_pixel_t *pixel)
+{
+	igt_color_multiply(pixel, 125.0f);
+}
+
+void igt_color_multiply_inv_125(igt_pixel_t *pixel)
+{
+	igt_color_multiply(pixel, 1 / 125.0f);
+}
+
 static void
 igt_color_fourcc_to_pixel(uint32_t raw_pixel, uint32_t drm_format, igt_pixel_t *pixel)
 {
diff --git a/lib/igt_color.h b/lib/igt_color.h
index 88de8166f..761dd2f95 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -133,4 +133,7 @@ void igt_color_ctm_3x4_overdrive(igt_pixel_t *pixel);
 void igt_color_ctm_3x4_oversaturate(igt_pixel_t *pixel);
 void igt_color_ctm_3x4_bt709_dec(igt_pixel_t *pixel);
 void igt_color_ctm_3x4_bt709_enc(igt_pixel_t *pixel);
+
+void igt_color_multiply_125(igt_pixel_t *pixel);
+void igt_color_multiply_inv_125(igt_pixel_t *pixel);
 #endif
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index bdde2fc72..2ff70808b 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -712,6 +712,7 @@ const char * const igt_colorop_prop_names[IGT_NUM_COLOROP_PROPS] = {
 	[IGT_COLOROP_CURVE_1D_TYPE] = "CURVE_1D_TYPE",
 	[IGT_COLOROP_SIZE] = "SIZE",
 	[IGT_COLOROP_DATA] = "DATA",
+	[IGT_COLOROP_MULTIPLIER] = "MULTIPLIER",
 	[IGT_COLOROP_NEXT] = "NEXT",
 };
 
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index d0a7ed037..cd64fd38f 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -376,6 +376,7 @@ enum igt_atomic_colorop_properties {
 	IGT_COLOROP_CURVE_1D_TYPE,
 	IGT_COLOROP_SIZE,
 	IGT_COLOROP_DATA,
+	IGT_COLOROP_MULTIPLIER,
 	IGT_COLOROP_NEXT,
 	IGT_NUM_COLOROP_PROPS
 };
diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index bd7358a27..50cbc1a9d 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -69,6 +69,8 @@
  * @ctm_3x4_bt709_dec:			BT709 decoding matrix
  * @ctm_3x4_bt709_enc_dec:		BT709 encoding matrix, followed by decoding matrix
  * @ctm_3x4_bt709_dec_enc:		BT709 decoding matrix, followed by encoding matrix
+ * @multiply_125:			Multiplier by 125
+ * @multiply_inv_125:			Multiplier by inverse of 125
  *
  */
 
@@ -236,6 +238,8 @@ static bool can_use_colorop(igt_display_t *display, igt_colorop_t *colorop, kms_
 		if (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_LUT)
 			return true;
 		return false;
+	case KMS_COLOROP_MULTIPLIER:
+		return (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_MULTIPLIER);
 	case KMS_COLOROP_LUT3D:
 	default:
 		return false;
@@ -329,6 +333,7 @@ static void set_colorop(igt_display_t *display,
 			kms_colorop_t *colorop)
 {
 	uint64_t lut_size = 0;
+	uint64_t mult = 1;
 
 	igt_assert(colorop->colorop);
 	igt_colorop_set_prop_value(colorop->colorop, IGT_COLOROP_BYPASS, 0);
@@ -346,6 +351,10 @@ static void set_colorop(igt_display_t *display,
 		lut_size = igt_colorop_get_prop(display, colorop->colorop, IGT_COLOROP_SIZE);
 		igt_colorop_set_custom_1dlut(display, colorop->colorop, colorop->lut1d, lut_size * sizeof(struct drm_color_lut32));
 		break;
+	case KMS_COLOROP_MULTIPLIER:
+		mult = colorop->multiplier * (mult << 32);	/* convert double to fixed number */
+		igt_colorop_set_prop_value(colorop->colorop, IGT_COLOROP_MULTIPLIER, mult);
+		break;
 	case KMS_COLOROP_LUT3D:
 	default:
 		igt_fail(IGT_EXIT_FAILURE);
@@ -536,6 +545,8 @@ igt_main
 		{ { &kms_colorop_ctm_3x4_bt709_dec, NULL }, "ctm_3x4_bt709_dec" },
 		{ { &kms_colorop_ctm_3x4_bt709_enc, &kms_colorop_ctm_3x4_bt709_dec, NULL }, "ctm_3x4_bt709_enc_dec" },
 		{ { &kms_colorop_ctm_3x4_bt709_dec, &kms_colorop_ctm_3x4_bt709_enc, NULL }, "ctm_3x4_bt709_dec_enc" },
+		{ { &kms_colorop_multiply_125, NULL }, "multiply_125" },
+		{ { &kms_colorop_multiply_inv_125, NULL }, "multiply_inv_125" },
 	};
 
 	struct {
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
index dfc42b352..b0371aff7 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -37,6 +37,7 @@ typedef enum kms_colorop_type {
 	KMS_COLOROP_ENUMERATED_LUT1D,
 	KMS_COLOROP_CUSTOM_LUT1D,
 	KMS_COLOROP_CTM_3X4,
+	KMS_COLOROP_MULTIPLIER,
 	KMS_COLOROP_LUT3D
 } kms_colorop_type_t;
 
@@ -74,6 +75,7 @@ typedef struct kms_colorop {
 		kms_colorop_enumerated_lut1d_info_t enumerated_lut1d_info;
 		igt_1dlut_t *lut1d;
 		const igt_matrix_3x4_t *matrix_3x4;
+		double multiplier;
 	};
 
 	const char *name;
@@ -224,5 +226,18 @@ kms_colorop_t kms_colorop_ctm_3x4_bt709_dec = {
 	.transform = &igt_color_ctm_3x4_bt709_dec
 };
 
+kms_colorop_t kms_colorop_multiply_125 = {
+	.type =	KMS_COLOROP_MULTIPLIER,
+	.multiplier = 125.0f,
+	.name = "multiply_125",
+	.transform = &igt_color_multiply_125
+};
+
+kms_colorop_t kms_colorop_multiply_inv_125 = {
+	.type =	KMS_COLOROP_MULTIPLIER,
+	.multiplier = 1/125.0f,
+	.name = "multiply_inv_125",
+	.transform = &igt_color_multiply_inv_125
+};
 
 #endif /* __KMS_COLOROP_H__ */
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 26/30] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (24 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 25/30] tests/kms_colorop: Add multiplier tests Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 27/30] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
                   ` (7 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

This script converts a 17x17x17 3D LUT in a txt file to the following
(i.e. 4913 entries):

	{ .red = 0.000000, .green = 0.000000, .blue = 0.000000 },
	{ .red = 0.175580, .green = 0.003419, .blue = 0.006838 },
	{ .red = 0.338706, .green = 0.015140, .blue = 0.012454 },
	...

The text file should contains 3 column (RGB) in following form:

	0000 0000 0000
	0255 0307 0606
	0225 0306 0893
	...

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 scripts/convert_3dlut.py | 94 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 94 insertions(+)
 create mode 100755 scripts/convert_3dlut.py

diff --git a/scripts/convert_3dlut.py b/scripts/convert_3dlut.py
new file mode 100755
index 000000000..35189b549
--- /dev/null
+++ b/scripts/convert_3dlut.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+## Copyright (C) 2024 Advanced Micro Devices, Inc.         ##
+## Author: Alex Hung <alex.hung@amd.com>                   ##
+
+import sys, os, argparse
+import numpy as np
+import pprint
+
+import pprint
+
+class Color:
+    def __init__(self, r, g, b):
+        self.r = r
+        self.g = g
+        self.b = b
+    def __str__(self):
+        r = self.r
+        g = self.g
+        b = self.b
+        rgb = "\t{ " + ".red = {0:05f}, .green = {1:05f}, .blue = {2:05f}".format(r, g, b) + " },"
+        return rgb
+
+def print_lut(ind, lut):
+    for i, v in enumerate(lut):
+        if (i - ind) % (17 * 17) == 0:
+            print(str(i) + " " + v)
+            #print(v)
+
+def parse_lut_file(file_path, max_value=4095):
+    lut = []
+
+    try:
+        with open(file_path, "r") as file:
+            for line in file:
+                values = line.strip().split()  # Split values by spaces or tabs
+                if len(values) == 3:
+                    r, g, b = map(float, values)  # Convert to floats
+                    r = r / max_value
+                    g = g / max_value
+                    b = b / max_value
+                    color = Color(r, g, b)
+                    lut.append(color)
+                else:
+                    print(f"Skipping invalid line: '{line.strip()}'")
+    except FileNotFoundError:
+        print(f"File '{file_path}' not found.")
+
+    return lut
+
+def fill_3d_array(lut, size=17):
+    lut3d = np.zeros((size, size, size), dtype=object)
+
+    for i in range(size):
+        for j in range(size):
+            for k in range(size):
+                index = i * (size ** 2) +  j * size + k
+                color = lut[index]
+                lut3d[i][j][k] = color
+    return lut3d
+
+def print_3d_array_rgb(lut3d, size=17):
+    for i in range(size):
+        for j in range(size):
+            for k in range(size):
+                print(lut3d[i][j][k])
+
+def print_3d_array_bgr(lut3d, size=17):
+    for i in range(size):
+        for j in range(size):
+            for k in range(size):
+                print(lut3d[k][j][i])
+
+def main():
+
+    parser = argparse.ArgumentParser(description='Convert integer values in a 3D LUT file to IGT format.')
+    parser.add_argument("-f", "--input", help="3D LUT file", required=True)
+    parser.add_argument("-t", "--traversal", help="traversal order", required=True)
+    args = parser.parse_args()
+
+    lut = parse_lut_file(args.input)
+    lut3d = fill_3d_array(lut)
+
+    if args.traversal.lower() == "rgb":
+        print_3d_array_rgb(lut3d)
+    elif args.traversal.lower() == "bgr":
+        print_3d_array_bgr(lut3d)
+
+    return 0
+
+if __name__ == "__main__":
+    ret = main()
+    sys.exit(ret)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 27/30] tests/kms_colorop: Add a 3D LUT subtest
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (25 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 26/30] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-22 21:35   ` Aurabindo Pillai
  2025-08-26 16:39   ` Aurabindo Pillai
  2025-08-15  4:06 ` [PATCH V10 28/30] drm-uapi: Update kernel doc for drm_colorop_type Alex Hung
                   ` (6 subsequent siblings)
  33 siblings, 2 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

This includes a subtests 3dlut_17_12_rgb.

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 include/drm-uapi/drm_mode.h |   18 +
 lib/igt_color.c             |  186 ++
 lib/igt_color.h             |   10 +
 lib/igt_color_lut.h         | 4946 +++++++++++++++++++++++++++++++++++
 lib/igt_kms.c               |    2 +
 lib/igt_kms.h               |    2 +
 tests/kms_colorop.c         |   35 +-
 tests/kms_colorop.h         |   19 +
 8 files changed, 5217 insertions(+), 1 deletion(-)
 create mode 100644 lib/igt_color_lut.h

diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index fe3e98e20..009bb3e7f 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -891,6 +891,24 @@ enum drm_colorop_type {
 	DRM_COLOROP_1D_LUT,
 	DRM_COLOROP_CTM_3X4,
 	DRM_COLOROP_MULTIPLIER,
+	DRM_COLOROP_3D_LUT,
+};
+
+enum drm_colorop_interpolation_type {
+	DRM_COLOROP_TETRAHEDRAL,
+};
+
+/**
+ * enum drm_colorop_lut3d_interpolation_type - type of 3DLUT interpolation
+ *
+ */
+enum drm_colorop_lut3d_interpolation_type {
+	/**
+	 * @DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL:
+	 *
+	 * Tetrahedral 3DLUT interpolation
+	 */
+	DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL,
 };
 
 /**
diff --git a/lib/igt_color.c b/lib/igt_color.c
index aa65eac20..6a306bda2 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -213,6 +213,184 @@ void igt_color_multiply_inv_125(igt_pixel_t *pixel)
 	igt_color_multiply(pixel, 1 / 125.0f);
 }
 
+static int
+igt_get_lut3d_index_blue_fast(int r, int g, int b, long dim, int components)
+{
+	return components * (b + (int)dim * (g + (int)dim * r));
+}
+
+/* algorithm from https://github.com/AcademySoftwareFoundation/OpenColorIO/blob/main/src/OpenColorIO/ops/lut3d/Lut3DOpCPU.cpp#L422 */
+static void igt_color_3dlut_tetrahedral(igt_pixel_t *pixel, igt_3dlut_t *lut3d, long m_dim)
+{
+	int n000, n100, n010, n001, n110, n101, n011, n111;
+	float m_step = (float) m_dim - 1.0f;
+	const float dimMinusOne = (float) m_dim - 1.f;
+	float *m_optLut = (float *) lut3d->lut;
+	float idx[3];
+	float out[3];
+	int indexLow[3];
+	int indexHigh[3];
+	float fx, fy, fz;
+
+	idx[0] = pixel->b * m_step;
+	idx[1] = pixel->g * m_step;
+	idx[2] = pixel->r * m_step;
+
+	// NaNs become 0.
+	idx[0] = clamp(idx[0], 0.f, dimMinusOne);
+	idx[1] = clamp(idx[1], 0.f, dimMinusOne);
+	idx[2] = clamp(idx[2], 0.f, dimMinusOne);
+
+	indexLow[0] = floor(idx[0]);
+	indexLow[1] = floor(idx[1]);
+	indexLow[2] = floor(idx[2]);
+
+	// When the idx is exactly equal to an index (e.g. 0,1,2...)
+	// then the computation of highIdx is wrong. However,
+	// the delta is then equal to zero (e.g. idx-lowIdx),
+	// so the highIdx has no impact.
+	indexHigh[0] = ceil(idx[0]);
+	indexHigh[1] = ceil(idx[1]);
+	indexHigh[2] = ceil(idx[2]);
+
+	fx = idx[0] - (float) indexLow[0];
+	fy = idx[1] - (float) indexLow[1];
+	fz = idx[2] - (float) indexLow[2];
+
+	// Compute index into LUT for surrounding corners
+	n000 = igt_get_lut3d_index_blue_fast(indexLow[0], indexLow[1], indexLow[2], m_dim, 3);
+	n100 = igt_get_lut3d_index_blue_fast(indexHigh[0], indexLow[1], indexLow[2], m_dim, 3);
+	n010 = igt_get_lut3d_index_blue_fast(indexLow[0], indexHigh[1], indexLow[2], m_dim, 3);
+	n001 = igt_get_lut3d_index_blue_fast(indexLow[0], indexLow[1], indexHigh[2], m_dim, 3);
+	n110 = igt_get_lut3d_index_blue_fast(indexHigh[0], indexHigh[1], indexLow[2], m_dim, 3);
+	n101 = igt_get_lut3d_index_blue_fast(indexHigh[0], indexLow[1], indexHigh[2], m_dim, 3);
+	n011 = igt_get_lut3d_index_blue_fast(indexLow[0], indexHigh[1], indexHigh[2], m_dim, 3);
+	n111 = igt_get_lut3d_index_blue_fast(indexHigh[0], indexHigh[1], indexHigh[2], m_dim, 3);
+
+	if (fx > fy) {
+		if (fy > fz) {
+			out[0] =
+				(1 - fx)  * m_optLut[n000] +
+				(fx - fy) * m_optLut[n100] +
+				(fy - fz) * m_optLut[n110] +
+				(fz)      * m_optLut[n111];
+
+			out[1] =
+				(1 - fx)  * m_optLut[n000 + 1] +
+				(fx - fy) * m_optLut[n100 + 1] +
+				(fy - fz) * m_optLut[n110 + 1] +
+				(fz)      * m_optLut[n111 + 1];
+
+			out[2] =
+				(1 - fx)  * m_optLut[n000 + 2] +
+				(fx - fy) * m_optLut[n100 + 2] +
+				(fy - fz) * m_optLut[n110 + 2] +
+				(fz)      * m_optLut[n111 + 2];
+		} else if (fx > fz) {
+			out[0] =
+				(1 - fx)  * m_optLut[n000] +
+				(fx - fz) * m_optLut[n100] +
+				(fz - fy) * m_optLut[n101] +
+				(fy)      * m_optLut[n111];
+
+			out[1] =
+				(1 - fx)  * m_optLut[n000 + 1] +
+				(fx - fz) * m_optLut[n100 + 1] +
+				(fz - fy) * m_optLut[n101 + 1] +
+				(fy)      * m_optLut[n111 + 1];
+
+			out[2] =
+				(1 - fx)  * m_optLut[n000 + 2] +
+				(fx - fz) * m_optLut[n100 + 2] +
+				(fz - fy) * m_optLut[n101 + 2] +
+				(fy)      * m_optLut[n111 + 2];
+		} else {
+			out[0] =
+				(1 - fz)  * m_optLut[n000] +
+				(fz - fx) * m_optLut[n001] +
+				(fx - fy) * m_optLut[n101] +
+				(fy)      * m_optLut[n111];
+
+			out[1] =
+				(1 - fz)  * m_optLut[n000 + 1] +
+				(fz - fx) * m_optLut[n001 + 1] +
+				(fx - fy) * m_optLut[n101 + 1] +
+				(fy)      * m_optLut[n111 + 1];
+
+			out[2] =
+				(1 - fz)  * m_optLut[n000 + 2] +
+				(fz - fx) * m_optLut[n001 + 2] +
+				(fx - fy) * m_optLut[n101 + 2] +
+				(fy)      * m_optLut[n111 + 2];
+		}
+	} else {
+		if (fz > fy) {
+			out[0] =
+				(1 - fz)  * m_optLut[n000] +
+				(fz - fy) * m_optLut[n001] +
+				(fy - fx) * m_optLut[n011] +
+				(fx)      * m_optLut[n111];
+
+			out[1] =
+				(1 - fz)  * m_optLut[n000 + 1] +
+				(fz - fy) * m_optLut[n001 + 1] +
+				(fy - fx) * m_optLut[n011 + 1] +
+				(fx)      * m_optLut[n111 + 1];
+
+			out[2] =
+				(1 - fz)  * m_optLut[n000 + 2] +
+				(fz - fy) * m_optLut[n001 + 2] +
+				(fy - fx) * m_optLut[n011 + 2] +
+				(fx)      * m_optLut[n111 + 2];
+		} else if (fz > fx) {
+			out[0] =
+				(1 - fy)  * m_optLut[n000] +
+				(fy - fz) * m_optLut[n010] +
+				(fz - fx) * m_optLut[n011] +
+				(fx)      * m_optLut[n111];
+
+			out[1] =
+				(1 - fy)  * m_optLut[n000 + 1] +
+				(fy - fz) * m_optLut[n010 + 1] +
+				(fz - fx) * m_optLut[n011 + 1] +
+				(fx)      * m_optLut[n111 + 1];
+
+			out[2] =
+				(1 - fy)  * m_optLut[n000 + 2] +
+				(fy - fz) * m_optLut[n010 + 2] +
+				(fz - fx) * m_optLut[n011 + 2] +
+				(fx)      * m_optLut[n111 + 2];
+		} else {
+			out[0] =
+				(1 - fy)  * m_optLut[n000] +
+				(fy - fx) * m_optLut[n010] +
+				(fx - fz) * m_optLut[n110] +
+				(fz)      * m_optLut[n111];
+
+			out[1] =
+				(1 - fy)  * m_optLut[n000 + 1] +
+				(fy - fx) * m_optLut[n010 + 1] +
+				(fx - fz) * m_optLut[n110 + 1] +
+				(fz)      * m_optLut[n111 + 1];
+
+			out[2] =
+				(1 - fy)  * m_optLut[n000 + 2] +
+				(fy - fx) * m_optLut[n010 + 2] +
+				(fx - fz) * m_optLut[n110 + 2] +
+				(fz)      * m_optLut[n111 + 2];
+		}
+	}
+
+	pixel->r = out[0];
+	pixel->g = out[1];
+	pixel->b = out[2];
+}
+
+void igt_color_3dlut_17_12_rgb(igt_pixel_t *pixel)
+{
+	igt_color_3dlut_tetrahedral(pixel, &igt_3dlut_17_rgb, 17);
+}
+
 static void
 igt_color_fourcc_to_pixel(uint32_t raw_pixel, uint32_t drm_format, igt_pixel_t *pixel)
 {
@@ -446,3 +624,11 @@ void igt_colorop_set_custom_1dlut(igt_display_t *display,
 {
 	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, lut1d, lut_size);
 }
+
+void igt_colorop_set_3dlut(igt_display_t *display,
+			   igt_colorop_t *colorop,
+			   const igt_3dlut_norm_t *lut3d,
+			   const size_t lut_size)
+{
+	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, lut3d, lut_size);
+}
diff --git a/lib/igt_color.h b/lib/igt_color.h
index 761dd2f95..0e1dc84e2 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -16,6 +16,7 @@
 
 #include "igt_fb.h"
 #include "igt_kms.h"
+#include "igt_color_lut.h"
 
 #define MAX_COLOR_LUT_ENTRIES 4096
 
@@ -112,6 +113,12 @@ void igt_colorop_set_custom_1dlut(igt_display_t *display,
 				  const igt_1dlut_t *lut1d,
 				  const size_t lut_size);
 
+void igt_colorop_set_3dlut(igt_display_t *display,
+			   igt_colorop_t *colorop,
+			   const igt_3dlut_norm_t *lut3d,
+			   const size_t lut_size);
+
+
 /* transformations */
 
 void igt_color_srgb_inv_eotf(igt_pixel_t *pixel);
@@ -136,4 +143,7 @@ void igt_color_ctm_3x4_bt709_enc(igt_pixel_t *pixel);
 
 void igt_color_multiply_125(igt_pixel_t *pixel);
 void igt_color_multiply_inv_125(igt_pixel_t *pixel);
+void igt_color_3dlut_17_12_rgb(igt_pixel_t *pixel);
+void igt_color_3dlut_17_12_bgr(igt_pixel_t *pixel);
+
 #endif
diff --git a/lib/igt_color_lut.h b/lib/igt_color_lut.h
new file mode 100644
index 000000000..b5c149c3d
--- /dev/null
+++ b/lib/igt_color_lut.h
@@ -0,0 +1,4946 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2024 Advanced Micro Devices, Inc.
+ *
+ */
+
+#ifndef __IGT_COLOR_LUT_H__
+#define __IGT_COLOR_LUT_H__
+
+#include "drm_mode.h"
+
+typedef struct igt_3dlut_norm {
+	struct drm_color_lut32 lut[4913];
+} igt_3dlut_norm_t;
+
+struct igt_color_lut_float {
+	float red;
+	float green;
+	float blue;
+};
+
+typedef struct igt_3dlut {
+	struct igt_color_lut_float lut[4913];
+} igt_3dlut_t;
+
+/*
+ * A 3D LUT table with 17x17x17 entries for Traversal order RGB.
+ * It can be generated by scripts/convert_3dlut.py
+ */
+igt_3dlut_t igt_3dlut_17_rgb = { {
+	{ .red = 0.000000, .green = 0.000000, .blue = 0.000000 },
+	{ .red = 0.175580, .green = 0.003419, .blue = 0.006838 },
+	{ .red = 0.338706, .green = 0.015140, .blue = 0.012454 },
+	{ .red = 0.492552, .green = 0.015629, .blue = 0.012454 },
+	{ .red = 0.641026, .green = 0.023687, .blue = 0.013187 },
+	{ .red = 0.734310, .green = 0.049817, .blue = 0.013675 },
+	{ .red = 0.809035, .green = 0.063736, .blue = 0.006105 },
+	{ .red = 0.884982, .green = 0.063492, .blue = 0.019048 },
+	{ .red = 0.963370, .green = 0.056899, .blue = 0.028571 },
+	{ .red = 0.993407, .green = 0.080586, .blue = 0.044689 },
+	{ .red = 0.999267, .green = 0.099145, .blue = 0.054457 },
+	{ .red = 0.999267, .green = 0.110623, .blue = 0.060317 },
+	{ .red = 0.999267, .green = 0.116972, .blue = 0.064225 },
+	{ .red = 0.999267, .green = 0.121612, .blue = 0.066422 },
+	{ .red = 0.999267, .green = 0.126007, .blue = 0.067643 },
+	{ .red = 0.999512, .green = 0.130647, .blue = 0.067888 },
+	{ .red = 0.999512, .green = 0.134799, .blue = 0.067888 },
+	{ .red = 0.016606, .green = 0.179976, .blue = 0.018559 },
+	{ .red = 0.173382, .green = 0.173382, .blue = 0.005861 },
+	{ .red = 0.328205, .green = 0.158974, .blue = 0.007082 },
+	{ .red = 0.484493, .green = 0.155800, .blue = 0.003663 },
+	{ .red = 0.634432, .green = 0.154090, .blue = 0.006593 },
+	{ .red = 0.718437, .green = 0.145543, .blue = 0.004151 },
+	{ .red = 0.794872, .green = 0.140904, .blue = 0.008791 },
+	{ .red = 0.884493, .green = 0.130891, .blue = 0.003175 },
+	{ .red = 0.978755, .green = 0.118681, .blue = 0.013187 },
+	{ .red = 0.995116, .green = 0.126740, .blue = 0.042002 },
+	{ .red = 0.998046, .green = 0.132357, .blue = 0.053236 },
+	{ .red = 0.999023, .green = 0.135775, .blue = 0.059096 },
+	{ .red = 0.999512, .green = 0.136752, .blue = 0.063004 },
+	{ .red = 0.999512, .green = 0.137729, .blue = 0.065446 },
+	{ .red = 0.999512, .green = 0.139438, .blue = 0.066667 },
+	{ .red = 0.999512, .green = 0.141880, .blue = 0.067399 },
+	{ .red = 0.999512, .green = 0.144567, .blue = 0.067643 },
+	{ .red = 0.020757, .green = 0.326984, .blue = 0.023932 },
+	{ .red = 0.161416, .green = 0.325763, .blue = 0.006838 },
+	{ .red = 0.334554, .green = 0.334310, .blue = 0.008791 },
+	{ .red = 0.462027, .green = 0.302564, .blue = 0.005617 },
+	{ .red = 0.587790, .green = 0.288400, .blue = 0.010012 },
+	{ .red = 0.672772, .green = 0.266667, .blue = 0.006105 },
+	{ .red = 0.755067, .green = 0.251038, .blue = 0.005128 },
+	{ .red = 0.844689, .green = 0.239560, .blue = 0.005372 },
+	{ .red = 0.936508, .green = 0.229548, .blue = 0.010012 },
+	{ .red = 0.990720, .green = 0.218315, .blue = 0.031013 },
+	{ .red = 0.998535, .green = 0.207082, .blue = 0.046398 },
+	{ .red = 0.998779, .green = 0.197802, .blue = 0.054701 },
+	{ .red = 0.998535, .green = 0.189988, .blue = 0.060073 },
+	{ .red = 0.999023, .green = 0.183883, .blue = 0.063248 },
+	{ .red = 0.999267, .green = 0.179487, .blue = 0.064957 },
+	{ .red = 0.999267, .green = 0.176801, .blue = 0.065690 },
+	{ .red = 0.999512, .green = 0.174847, .blue = 0.066422 },
+	{ .red = 0.044933, .green = 0.454701, .blue = 0.035409 },
+	{ .red = 0.150427, .green = 0.454945, .blue = 0.008791 },
+	{ .red = 0.310379, .green = 0.465934, .blue = 0.008547 },
+	{ .red = 0.481807, .green = 0.481807, .blue = 0.010501 },
+	{ .red = 0.573382, .green = 0.425397, .blue = 0.012454 },
+	{ .red = 0.676679, .green = 0.400244, .blue = 0.009280 },
+	{ .red = 0.756044, .green = 0.372405, .blue = 0.011477 },
+	{ .red = 0.821001, .green = 0.346520, .blue = 0.010256 },
+	{ .red = 0.872772, .green = 0.322100, .blue = 0.009768 },
+	{ .red = 0.950183, .green = 0.309890, .blue = 0.010256 },
+	{ .red = 0.986813, .green = 0.291819, .blue = 0.030037 },
+	{ .red = 0.997802, .green = 0.273504, .blue = 0.044444 },
+	{ .red = 0.996825, .green = 0.256410, .blue = 0.052015 },
+	{ .red = 0.998779, .green = 0.243223, .blue = 0.056899 },
+	{ .red = 0.999023, .green = 0.232967, .blue = 0.059829 },
+	{ .red = 0.999023, .green = 0.224176, .blue = 0.061294 },
+	{ .red = 0.999267, .green = 0.217094, .blue = 0.062271 },
+	{ .red = 0.071062, .green = 0.569719, .blue = 0.048840 },
+	{ .red = 0.143590, .green = 0.571673, .blue = 0.011722 },
+	{ .red = 0.291087, .green = 0.581929, .blue = 0.010256 },
+	{ .red = 0.449817, .green = 0.599756, .blue = 0.007570 },
+	{ .red = 0.619780, .green = 0.619536, .blue = 0.012943 },
+	{ .red = 0.693284, .green = 0.548962, .blue = 0.011966 },
+	{ .red = 0.781685, .green = 0.513065, .blue = 0.009768 },
+	{ .red = 0.847619, .green = 0.475702, .blue = 0.011233 },
+	{ .red = 0.895238, .green = 0.439072, .blue = 0.011477 },
+	{ .red = 0.929426, .green = 0.404884, .blue = 0.010989 },
+	{ .red = 0.954823, .green = 0.374359, .blue = 0.008547 },
+	{ .red = 0.975092, .green = 0.347985, .blue = 0.019048 },
+	{ .red = 0.998535, .green = 0.328938, .blue = 0.032723 },
+	{ .red = 0.995116, .green = 0.307937, .blue = 0.044200 },
+	{ .red = 0.996825, .green = 0.291575, .blue = 0.049573 },
+	{ .red = 0.997802, .green = 0.278144, .blue = 0.053480 },
+	{ .red = 0.998779, .green = 0.266178, .blue = 0.055433 },
+	{ .red = 0.086935, .green = 0.676679, .blue = 0.055678 },
+	{ .red = 0.139927, .green = 0.680342, .blue = 0.010256 },
+	{ .red = 0.277656, .green = 0.689621, .blue = 0.013675 },
+	{ .red = 0.424420, .green = 0.705983, .blue = 0.010256 },
+	{ .red = 0.582418, .green = 0.727473, .blue = 0.008303 },
+	{ .red = 0.746764, .green = 0.746764, .blue = 0.014408 },
+	{ .red = 0.805128, .green = 0.664469, .blue = 0.017582 },
+	{ .red = 0.863980, .green = 0.608059, .blue = 0.016117 },
+	{ .red = 0.908913, .green = 0.558242, .blue = 0.011722 },
+	{ .red = 0.939927, .green = 0.512576, .blue = 0.014896 },
+	{ .red = 0.962149, .green = 0.471795, .blue = 0.013919 },
+	{ .red = 0.978755, .green = 0.436386, .blue = 0.010256 },
+	{ .red = 0.978755, .green = 0.401709, .blue = 0.023199 },
+	{ .red = 0.981685, .green = 0.373626, .blue = 0.023687 },
+	{ .red = 0.993895, .green = 0.352869, .blue = 0.025641 },
+	{ .red = 0.993895, .green = 0.334310, .blue = 0.038828 },
+	{ .red = 0.993651, .green = 0.317949, .blue = 0.044444 },
+	{ .red = 0.097192, .green = 0.774603, .blue = 0.057875 },
+	{ .red = 0.137973, .green = 0.779243, .blue = 0.008303 },
+	{ .red = 0.265446, .green = 0.785592, .blue = 0.011966 },
+	{ .red = 0.400488, .green = 0.796581, .blue = 0.015140 },
+	{ .red = 0.541880, .green = 0.810989, .blue = 0.007082 },
+	{ .red = 0.689621, .green = 0.826618, .blue = 0.009035 },
+	{ .red = 0.837851, .green = 0.837851, .blue = 0.014652 },
+	{ .red = 0.880586, .green = 0.748474, .blue = 0.010989 },
+	{ .red = 0.917705, .green = 0.678877, .blue = 0.014652 },
+	{ .red = 0.947009, .green = 0.621245, .blue = 0.013675 },
+	{ .red = 0.965812, .green = 0.569719, .blue = 0.018803 },
+	{ .red = 0.982173, .green = 0.526252, .blue = 0.008547 },
+	{ .red = 0.983150, .green = 0.484737, .blue = 0.024664 },
+	{ .red = 0.981441, .green = 0.448352, .blue = 0.029548 },
+	{ .red = 0.981197, .green = 0.418315, .blue = 0.030525 },
+	{ .red = 0.983150, .green = 0.392918, .blue = 0.029548 },
+	{ .red = 0.980464, .green = 0.369231, .blue = 0.026862 },
+	{ .red = 0.101587, .green = 0.846398, .blue = 0.059096 },
+	{ .red = 0.132845, .green = 0.851038, .blue = 0.011966 },
+	{ .red = 0.249084, .green = 0.855189, .blue = 0.008059 },
+	{ .red = 0.372405, .green = 0.862027, .blue = 0.013431 },
+	{ .red = 0.499878, .green = 0.871062, .blue = 0.011966 },
+	{ .red = 0.631013, .green = 0.881563, .blue = 0.011477 },
+	{ .red = 0.765324, .green = 0.892063, .blue = 0.020513 },
+	{ .red = 0.897680, .green = 0.897680, .blue = 0.017338 },
+	{ .red = 0.928205, .green = 0.806105, .blue = 0.019780 },
+	{ .red = 0.951404, .green = 0.731136, .blue = 0.016361 },
+	{ .red = 0.970452, .green = 0.669597, .blue = 0.013187 },
+	{ .red = 0.977534, .green = 0.613675, .blue = 0.030281 },
+	{ .red = 0.981685, .green = 0.565568, .blue = 0.033700 },
+	{ .red = 0.990476, .green = 0.527228, .blue = 0.024908 },
+	{ .red = 0.995849, .green = 0.493040, .blue = 0.019048 },
+	{ .red = 0.994383, .green = 0.461538, .blue = 0.023687 },
+	{ .red = 0.990232, .green = 0.432723, .blue = 0.023443 },
+	{ .red = 0.101832, .green = 0.896215, .blue = 0.062515 },
+	{ .red = 0.122344, .green = 0.900855, .blue = 0.016361 },
+	{ .red = 0.230525, .green = 0.903297, .blue = 0.020024 },
+	{ .red = 0.343101, .green = 0.907937, .blue = 0.014896 },
+	{ .red = 0.458608, .green = 0.913797, .blue = 0.014896 },
+	{ .red = 0.576801, .green = 0.920391, .blue = 0.020024 },
+	{ .red = 0.696703, .green = 0.927717, .blue = 0.015873 },
+	{ .red = 0.818315, .green = 0.934554, .blue = 0.021245 },
+	{ .red = 0.936508, .green = 0.936264, .blue = 0.016850 },
+	{ .red = 0.957998, .green = 0.845665, .blue = 0.023687 },
+	{ .red = 0.971184, .green = 0.768987, .blue = 0.027839 },
+	{ .red = 0.978022, .green = 0.703541, .blue = 0.039805 },
+	{ .red = 0.982173, .green = 0.648107, .blue = 0.041270 },
+	{ .red = 0.985836, .green = 0.600977, .blue = 0.037851 },
+	{ .red = 0.989011, .green = 0.560684, .blue = 0.032967 },
+	{ .red = 0.992674, .green = 0.526252, .blue = 0.028571 },
+	{ .red = 0.993651, .green = 0.494994, .blue = 0.022222 },
+	{ .red = 0.100366, .green = 0.930159, .blue = 0.065201 },
+	{ .red = 0.113309, .green = 0.935043, .blue = 0.025397 },
+	{ .red = 0.211233, .green = 0.936996, .blue = 0.016361 },
+	{ .red = 0.315263, .green = 0.939683, .blue = 0.012698 },
+	{ .red = 0.420757, .green = 0.943590, .blue = 0.013187 },
+	{ .red = 0.527717, .green = 0.947985, .blue = 0.012454 },
+	{ .red = 0.636142, .green = 0.952625, .blue = 0.015873 },
+	{ .red = 0.745543, .green = 0.957265, .blue = 0.017582 },
+	{ .red = 0.855922, .green = 0.961661, .blue = 0.019536 },
+	{ .red = 0.961172, .green = 0.960195, .blue = 0.018559 },
+	{ .red = 0.976801, .green = 0.873504, .blue = 0.019048 },
+	{ .red = 0.985348, .green = 0.798535, .blue = 0.021001 },
+	{ .red = 0.991453, .green = 0.736020, .blue = 0.022711 },
+	{ .red = 0.993407, .green = 0.680830, .blue = 0.029060 },
+	{ .red = 0.995116, .green = 0.633944, .blue = 0.027106 },
+	{ .red = 0.994628, .green = 0.592918, .blue = 0.029548 },
+	{ .red = 0.993407, .green = 0.556288, .blue = 0.026618 },
+	{ .red = 0.095238, .green = 0.952869, .blue = 0.073016 },
+	{ .red = 0.106227, .green = 0.956777, .blue = 0.047619 },
+	{ .red = 0.188034, .green = 0.960195, .blue = 0.012210 },
+	{ .red = 0.286691, .green = 0.961905, .blue = 0.014896 },
+	{ .red = 0.385348, .green = 0.963370, .blue = 0.027350 },
+	{ .red = 0.483272, .green = 0.966789, .blue = 0.018559 },
+	{ .red = 0.582418, .green = 0.969963, .blue = 0.010745 },
+	{ .red = 0.681807, .green = 0.972650, .blue = 0.020269 },
+	{ .red = 0.781929, .green = 0.975824, .blue = 0.016117 },
+	{ .red = 0.882051, .green = 0.978510, .blue = 0.020513 },
+	{ .red = 0.976313, .green = 0.975092, .blue = 0.019048 },
+	{ .red = 0.985592, .green = 0.891331, .blue = 0.045177 },
+	{ .red = 0.986081, .green = 0.816606, .blue = 0.055922 },
+	{ .red = 0.986569, .green = 0.754090, .blue = 0.054457 },
+	{ .red = 0.987057, .green = 0.700855, .blue = 0.050549 },
+	{ .red = 0.987057, .green = 0.654945, .blue = 0.046642 },
+	{ .red = 0.986813, .green = 0.614652, .blue = 0.041514 },
+	{ .red = 0.105983, .green = 0.965324, .blue = 0.085958 },
+	{ .red = 0.112332, .green = 0.969475, .blue = 0.067888 },
+	{ .red = 0.174115, .green = 0.973871, .blue = 0.039560 },
+	{ .red = 0.261783, .green = 0.976557, .blue = 0.017338 },
+	{ .red = 0.355067, .green = 0.976313, .blue = 0.039805 },
+	{ .red = 0.444444, .green = 0.979487, .blue = 0.022955 },
+	{ .red = 0.535531, .green = 0.981197, .blue = 0.023687 },
+	{ .red = 0.626618, .green = 0.981197, .blue = 0.048840 },
+	{ .red = 0.716972, .green = 0.982418, .blue = 0.057143 },
+	{ .red = 0.807570, .green = 0.984127, .blue = 0.063492 },
+	{ .red = 0.897924, .green = 0.985836, .blue = 0.071551 },
+	{ .red = 0.985348, .green = 0.983883, .blue = 0.019048 },
+	{ .red = 0.988278, .green = 0.902808, .blue = 0.068620 },
+	{ .red = 0.988523, .green = 0.832479, .blue = 0.063248 },
+	{ .red = 0.990476, .green = 0.773871, .blue = 0.052747 },
+	{ .red = 0.995116, .green = 0.725275, .blue = 0.036874 },
+	{ .red = 0.994628, .green = 0.680342, .blue = 0.032967 },
+	{ .red = 0.115507, .green = 0.973626, .blue = 0.093040 },
+	{ .red = 0.122100, .green = 0.976557, .blue = 0.080342 },
+	{ .red = 0.165568, .green = 0.981929, .blue = 0.052991 },
+	{ .red = 0.242491, .green = 0.985592, .blue = 0.031502 },
+	{ .red = 0.329182, .green = 0.984371, .blue = 0.047863 },
+	{ .red = 0.412210, .green = 0.985836, .blue = 0.045177 },
+	{ .red = 0.496215, .green = 0.984860, .blue = 0.060562 },
+	{ .red = 0.578999, .green = 0.987057, .blue = 0.055189 },
+	{ .red = 0.662515, .green = 0.991453, .blue = 0.018559 },
+	{ .red = 0.746032, .green = 0.991453, .blue = 0.041758 },
+	{ .red = 0.828327, .green = 0.990965, .blue = 0.062515 },
+	{ .red = 0.910134, .green = 0.990965, .blue = 0.080342 },
+	{ .red = 0.988278, .green = 0.987790, .blue = 0.063004 },
+	{ .red = 0.990720, .green = 0.912332, .blue = 0.075458 },
+	{ .red = 0.991941, .green = 0.846886, .blue = 0.060073 },
+	{ .red = 0.997558, .green = 0.793651, .blue = 0.031990 },
+	{ .red = 0.990965, .green = 0.740415, .blue = 0.048840 },
+	{ .red = 0.122344, .green = 0.979243, .blue = 0.095482 },
+	{ .red = 0.128205, .green = 0.981685, .blue = 0.085714 },
+	{ .red = 0.160928, .green = 0.986813, .blue = 0.061050 },
+	{ .red = 0.228571, .green = 0.990232, .blue = 0.044200 },
+	{ .red = 0.307204, .green = 0.989744, .blue = 0.050549 },
+	{ .red = 0.385348, .green = 0.988767, .blue = 0.060073 },
+	{ .red = 0.461538, .green = 0.989499, .blue = 0.061294 },
+	{ .red = 0.537241, .green = 0.993651, .blue = 0.037363 },
+	{ .red = 0.614408, .green = 0.990232, .blue = 0.068864 },
+	{ .red = 0.690598, .green = 0.989988, .blue = 0.077411 },
+	{ .red = 0.768010, .green = 0.994383, .blue = 0.055189 },
+	{ .red = 0.844933, .green = 0.995849, .blue = 0.049817 },
+	{ .red = 0.919414, .green = 0.994139, .blue = 0.081319 },
+	{ .red = 0.989499, .green = 0.989255, .blue = 0.080830 },
+	{ .red = 0.992430, .green = 0.920147, .blue = 0.077167 },
+	{ .red = 0.995360, .green = 0.859585, .blue = 0.052259 },
+	{ .red = 0.992918, .green = 0.804151, .blue = 0.052015 },
+	{ .red = 0.127717, .green = 0.982906, .blue = 0.095238 },
+	{ .red = 0.132601, .green = 0.984860, .blue = 0.087668 },
+	{ .red = 0.158730, .green = 0.989744, .blue = 0.065690 },
+	{ .red = 0.218071, .green = 0.992674, .blue = 0.052015 },
+	{ .red = 0.287668, .green = 0.993651, .blue = 0.047863 },
+	{ .red = 0.362637, .green = 0.989988, .blue = 0.069353 },
+	{ .red = 0.431013, .green = 0.993407, .blue = 0.054701 },
+	{ .red = 0.502808, .green = 0.991453, .blue = 0.069109 },
+	{ .red = 0.573382, .green = 0.992186, .blue = 0.069353 },
+	{ .red = 0.644444, .green = 0.995604, .blue = 0.051526 },
+	{ .red = 0.714530, .green = 0.992674, .blue = 0.076435 },
+	{ .red = 0.784615, .green = 0.992674, .blue = 0.083272 },
+	{ .red = 0.857631, .green = 0.997802, .blue = 0.047619 },
+	{ .red = 0.926252, .green = 0.995849, .blue = 0.079365 },
+	{ .red = 0.989988, .green = 0.990232, .blue = 0.089133 },
+	{ .red = 0.993407, .green = 0.926252, .blue = 0.076435 },
+	{ .red = 0.997314, .green = 0.870085, .blue = 0.042491 },
+	{ .red = 0.131868, .green = 0.985592, .blue = 0.093284 },
+	{ .red = 0.136020, .green = 0.987057, .blue = 0.087179 },
+	{ .red = 0.157998, .green = 0.991209, .blue = 0.068376 },
+	{ .red = 0.210256, .green = 0.993895, .blue = 0.056654 },
+	{ .red = 0.270085, .green = 0.996825, .blue = 0.038584 },
+	{ .red = 0.343101, .green = 0.990965, .blue = 0.072772 },
+	{ .red = 0.404884, .green = 0.995116, .blue = 0.054212 },
+	{ .red = 0.472772, .green = 0.991453, .blue = 0.074969 },
+	{ .red = 0.536752, .green = 0.997314, .blue = 0.043223 },
+	{ .red = 0.603419, .green = 0.991941, .blue = 0.077900 },
+	{ .red = 0.669109, .green = 0.994139, .blue = 0.070085 },
+	{ .red = 0.735287, .green = 0.995849, .blue = 0.063492 },
+	{ .red = 0.799512, .green = 0.993407, .blue = 0.085470 },
+	{ .red = 0.866178, .green = 0.995849, .blue = 0.074969 },
+	{ .red = 0.931624, .green = 0.996581, .blue = 0.076190 },
+	{ .red = 0.989988, .green = 0.990965, .blue = 0.092308 },
+	{ .red = 0.994383, .green = 0.931624, .blue = 0.074725 },
+	{ .red = 0.135287, .green = 0.987302, .blue = 0.090842 },
+	{ .red = 0.138706, .green = 0.988767, .blue = 0.085226 },
+	{ .red = 0.158486, .green = 0.992186, .blue = 0.069597 },
+	{ .red = 0.204640, .green = 0.994628, .blue = 0.059829 },
+	{ .red = 0.254457, .green = 0.999267, .blue = 0.022466 },
+	{ .red = 0.325763, .green = 0.991941, .blue = 0.073016 },
+	{ .red = 0.384615, .green = 0.993407, .blue = 0.066911 },
+	{ .red = 0.445665, .green = 0.993162, .blue = 0.070330 },
+	{ .red = 0.506716, .green = 0.993407, .blue = 0.070330 },
+	{ .red = 0.568010, .green = 0.993895, .blue = 0.069841 },
+	{ .red = 0.629304, .green = 0.995116, .blue = 0.065446 },
+	{ .red = 0.690110, .green = 0.992186, .blue = 0.084249 },
+	{ .red = 0.753358, .green = 0.998291, .blue = 0.046154 },
+	{ .red = 0.812698, .green = 0.994383, .blue = 0.081807 },
+	{ .red = 0.873748, .green = 0.995116, .blue = 0.083761 },
+	{ .red = 0.936020, .green = 0.997070, .blue = 0.073016 },
+	{ .red = 0.989988, .green = 0.991209, .blue = 0.092796 },
+	{ .red = 0.010745, .green = 0.008059, .blue = 0.156532 },
+	{ .red = 0.173382, .green = 0.005372, .blue = 0.173626 },
+	{ .red = 0.344078, .green = 0.008059, .blue = 0.169719 },
+	{ .red = 0.495971, .green = 0.007814, .blue = 0.163858 },
+	{ .red = 0.640293, .green = 0.014408, .blue = 0.159463 },
+	{ .red = 0.725763, .green = 0.015140, .blue = 0.143834 },
+	{ .red = 0.795360, .green = 0.013919, .blue = 0.129915 },
+	{ .red = 0.861050, .green = 0.012454, .blue = 0.121368 },
+	{ .red = 0.926252, .green = 0.014408, .blue = 0.116239 },
+	{ .red = 0.979976, .green = 0.025397, .blue = 0.111844 },
+	{ .red = 0.991209, .green = 0.059829, .blue = 0.106227 },
+	{ .red = 0.995849, .green = 0.075214, .blue = 0.101099 },
+	{ .red = 0.998046, .green = 0.084005, .blue = 0.096703 },
+	{ .red = 0.998779, .green = 0.090354, .blue = 0.092552 },
+	{ .red = 0.999267, .green = 0.095726, .blue = 0.088645 },
+	{ .red = 0.999756, .green = 0.100366, .blue = 0.084249 },
+	{ .red = 0.999512, .green = 0.109158, .blue = 0.082051 },
+	{ .red = 0.011722, .green = 0.216117, .blue = 0.216117 },
+	{ .red = 0.147253, .green = 0.147009, .blue = 0.147253 },
+	{ .red = 0.326007, .green = 0.137973, .blue = 0.143834 },
+	{ .red = 0.495726, .green = 0.120147, .blue = 0.139438 },
+	{ .red = 0.662759, .green = 0.088156, .blue = 0.134554 },
+	{ .red = 0.815140, .green = 0.010012, .blue = 0.128449 },
+	{ .red = 0.889866, .green = 0.015385, .blue = 0.119902 },
+	{ .red = 0.953358, .green = 0.013919, .blue = 0.114042 },
+	{ .red = 0.988034, .green = 0.051038, .blue = 0.109402 },
+	{ .red = 0.995116, .green = 0.075458, .blue = 0.104274 },
+	{ .red = 0.997802, .green = 0.087179, .blue = 0.099389 },
+	{ .red = 0.998779, .green = 0.094505, .blue = 0.094750 },
+	{ .red = 0.999267, .green = 0.099145, .blue = 0.091331 },
+	{ .red = 0.999512, .green = 0.105006, .blue = 0.088889 },
+	{ .red = 0.999512, .green = 0.119658, .blue = 0.089621 },
+	{ .red = 0.999512, .green = 0.135287, .blue = 0.091575 },
+	{ .red = 0.999512, .green = 0.148230, .blue = 0.093284 },
+	{ .red = 0.013675, .green = 0.354823, .blue = 0.199756 },
+	{ .red = 0.084493, .green = 0.298168, .blue = 0.128694 },
+	{ .red = 0.299389, .green = 0.296947, .blue = 0.134310 },
+	{ .red = 0.474969, .green = 0.293284, .blue = 0.131624 },
+	{ .red = 0.645665, .green = 0.286447, .blue = 0.124298 },
+	{ .red = 0.814164, .green = 0.275702, .blue = 0.115995 },
+	{ .red = 0.982418, .green = 0.259829, .blue = 0.108181 },
+	{ .red = 0.999267, .green = 0.239316, .blue = 0.108913 },
+	{ .red = 0.999756, .green = 0.232723, .blue = 0.114286 },
+	{ .red = 0.999512, .green = 0.231746, .blue = 0.119658 },
+	{ .red = 0.999267, .green = 0.232723, .blue = 0.124054 },
+	{ .red = 0.999267, .green = 0.234188, .blue = 0.127228 },
+	{ .red = 0.999267, .green = 0.233211, .blue = 0.128449 },
+	{ .red = 0.999267, .green = 0.231502, .blue = 0.128205 },
+	{ .red = 0.999267, .green = 0.230525, .blue = 0.127228 },
+	{ .red = 0.999267, .green = 0.230037, .blue = 0.126252 },
+	{ .red = 0.999267, .green = 0.229304, .blue = 0.124786 },
+	{ .red = 0.008303, .green = 0.469841, .blue = 0.183883 },
+	{ .red = 0.012698, .green = 0.454212, .blue = 0.132845 },
+	{ .red = 0.268376, .green = 0.445665, .blue = 0.097924 },
+	{ .red = 0.450794, .green = 0.446154, .blue = 0.105739 },
+	{ .red = 0.626862, .green = 0.443223, .blue = 0.104274 },
+	{ .red = 0.798779, .green = 0.437851, .blue = 0.097924 },
+	{ .red = 0.969719, .green = 0.429304, .blue = 0.088889 },
+	{ .red = 0.999512, .green = 0.387302, .blue = 0.101099 },
+	{ .red = 0.998779, .green = 0.353846, .blue = 0.112088 },
+	{ .red = 0.999267, .green = 0.330891, .blue = 0.118926 },
+	{ .red = 0.999023, .green = 0.314286, .blue = 0.123565 },
+	{ .red = 0.999756, .green = 0.302320, .blue = 0.127228 },
+	{ .red = 0.999267, .green = 0.292796, .blue = 0.129670 },
+	{ .red = 0.998779, .green = 0.284493, .blue = 0.130403 },
+	{ .red = 0.999023, .green = 0.276923, .blue = 0.129182 },
+	{ .red = 0.999512, .green = 0.269597, .blue = 0.126984 },
+	{ .red = 0.999756, .green = 0.262027, .blue = 0.123810 },
+	{ .red = 0.001954, .green = 0.578999, .blue = 0.172405 },
+	{ .red = 0.000000, .green = 0.581197, .blue = 0.134554 },
+	{ .red = 0.224908, .green = 0.591697, .blue = 0.009035 },
+	{ .red = 0.425153, .green = 0.594872, .blue = 0.011722 },
+	{ .red = 0.602442, .green = 0.595849, .blue = 0.011477 },
+	{ .red = 0.776801, .green = 0.590232, .blue = 0.013919 },
+	{ .red = 0.937973, .green = 0.579243, .blue = 0.010501 },
+	{ .red = 0.998535, .green = 0.529670, .blue = 0.074969 },
+	{ .red = 0.999512, .green = 0.474725, .blue = 0.102564 },
+	{ .red = 0.999267, .green = 0.433211, .blue = 0.113797 },
+	{ .red = 0.999512, .green = 0.401221, .blue = 0.119170 },
+	{ .red = 0.998779, .green = 0.377045, .blue = 0.124054 },
+	{ .red = 0.998535, .green = 0.357265, .blue = 0.126496 },
+	{ .red = 0.999023, .green = 0.340904, .blue = 0.126984 },
+	{ .red = 0.999512, .green = 0.326740, .blue = 0.125763 },
+	{ .red = 0.999267, .green = 0.313309, .blue = 0.123077 },
+	{ .red = 0.999756, .green = 0.301587, .blue = 0.120147 },
+	{ .red = 0.012698, .green = 0.683761, .blue = 0.163370 },
+	{ .red = 0.012210, .green = 0.692552, .blue = 0.131136 },
+	{ .red = 0.206593, .green = 0.713797, .blue = 0.012454 },
+	{ .red = 0.401465, .green = 0.724054, .blue = 0.012454 },
+	{ .red = 0.577534, .green = 0.735531, .blue = 0.007326 },
+	{ .red = 0.747009, .green = 0.741392, .blue = 0.013431 },
+	{ .red = 0.863980, .green = 0.696703, .blue = 0.014896 },
+	{ .red = 0.962882, .green = 0.654945, .blue = 0.018315 },
+	{ .red = 0.998779, .green = 0.596337, .blue = 0.077411 },
+	{ .red = 0.999756, .green = 0.539438, .blue = 0.105739 },
+	{ .red = 0.999267, .green = 0.494505, .blue = 0.116728 },
+	{ .red = 0.998779, .green = 0.457875, .blue = 0.120879 },
+	{ .red = 0.999023, .green = 0.427595, .blue = 0.121123 },
+	{ .red = 0.999512, .green = 0.401954, .blue = 0.119658 },
+	{ .red = 0.998779, .green = 0.381197, .blue = 0.119170 },
+	{ .red = 0.998535, .green = 0.362882, .blue = 0.117460 },
+	{ .red = 0.998779, .green = 0.346032, .blue = 0.114042 },
+	{ .red = 0.000000, .green = 0.780952, .blue = 0.154335 },
+	{ .red = 0.008547, .green = 0.791697, .blue = 0.125275 },
+	{ .red = 0.191941, .green = 0.814164, .blue = 0.013675 },
+	{ .red = 0.374359, .green = 0.821978, .blue = 0.010501 },
+	{ .red = 0.535775, .green = 0.830769, .blue = 0.012943 },
+	{ .red = 0.693284, .green = 0.838828, .blue = 0.007326 },
+	{ .red = 0.844444, .green = 0.840049, .blue = 0.013187 },
+	{ .red = 0.921368, .green = 0.771673, .blue = 0.017582 },
+	{ .red = 0.979731, .green = 0.710623, .blue = 0.035897 },
+	{ .red = 0.999267, .green = 0.646642, .blue = 0.085470 },
+	{ .red = 0.998779, .green = 0.589255, .blue = 0.109402 },
+	{ .red = 0.999756, .green = 0.543101, .blue = 0.117705 },
+	{ .red = 0.999756, .green = 0.504518, .blue = 0.119902 },
+	{ .red = 0.999267, .green = 0.471306, .blue = 0.118681 },
+	{ .red = 0.999267, .green = 0.442491, .blue = 0.115018 },
+	{ .red = 0.999023, .green = 0.417094, .blue = 0.110379 },
+	{ .red = 0.999512, .green = 0.394628, .blue = 0.105250 },
+	{ .red = 0.000000, .green = 0.852503, .blue = 0.143834 },
+	{ .red = 0.033455, .green = 0.862027, .blue = 0.118437 },
+	{ .red = 0.175824, .green = 0.882295, .blue = 0.014164 },
+	{ .red = 0.343346, .green = 0.887179, .blue = 0.015629 },
+	{ .red = 0.489866, .green = 0.893284, .blue = 0.011966 },
+	{ .red = 0.631746, .green = 0.899389, .blue = 0.015385 },
+	{ .red = 0.771917, .green = 0.904029, .blue = 0.021734 },
+	{ .red = 0.905739, .green = 0.902564, .blue = 0.015873 },
+	{ .red = 0.957998, .green = 0.823687, .blue = 0.015385 },
+	{ .red = 0.987546, .green = 0.750183, .blue = 0.054945 },
+	{ .red = 0.999023, .green = 0.686203, .blue = 0.094261 },
+	{ .red = 0.999023, .green = 0.629304, .blue = 0.111355 },
+	{ .red = 0.998779, .green = 0.582418, .blue = 0.116972 },
+	{ .red = 0.999756, .green = 0.542857, .blue = 0.116728 },
+	{ .red = 0.999756, .green = 0.508425, .blue = 0.114042 },
+	{ .red = 0.999512, .green = 0.477900, .blue = 0.109646 },
+	{ .red = 0.998779, .green = 0.450794, .blue = 0.104029 },
+	{ .red = 0.018071, .green = 0.901587, .blue = 0.134554 },
+	{ .red = 0.055922, .green = 0.908913, .blue = 0.114774 },
+	{ .red = 0.157509, .green = 0.927717, .blue = 0.016361 },
+	{ .red = 0.312088, .green = 0.930891, .blue = 0.011966 },
+	{ .red = 0.445421, .green = 0.934799, .blue = 0.012454 },
+	{ .red = 0.573871, .green = 0.938950, .blue = 0.016361 },
+	{ .red = 0.700366, .green = 0.942613, .blue = 0.015385 },
+	{ .red = 0.825397, .green = 0.945055, .blue = 0.021245 },
+	{ .red = 0.944078, .green = 0.941392, .blue = 0.016606 },
+	{ .red = 0.978755, .green = 0.858364, .blue = 0.032723 },
+	{ .red = 0.998779, .green = 0.785104, .blue = 0.063736 },
+	{ .red = 0.999512, .green = 0.717705, .blue = 0.100611 },
+	{ .red = 0.998779, .green = 0.662027, .blue = 0.111600 },
+	{ .red = 0.999267, .green = 0.615385, .blue = 0.113797 },
+	{ .red = 0.999512, .green = 0.575092, .blue = 0.112088 },
+	{ .red = 0.999756, .green = 0.539927, .blue = 0.107937 },
+	{ .red = 0.999756, .green = 0.508669, .blue = 0.102564 },
+	{ .red = 0.046642, .green = 0.934554, .blue = 0.127961 },
+	{ .red = 0.069109, .green = 0.940415, .blue = 0.111355 },
+	{ .red = 0.140171, .green = 0.957998, .blue = 0.013431 },
+	{ .red = 0.284249, .green = 0.959951, .blue = 0.014896 },
+	{ .red = 0.406105, .green = 0.961661, .blue = 0.027839 },
+	{ .red = 0.522100, .green = 0.964591, .blue = 0.023932 },
+	{ .red = 0.636386, .green = 0.967033, .blue = 0.025397 },
+	{ .red = 0.749939, .green = 0.969475, .blue = 0.015873 },
+	{ .red = 0.862271, .green = 0.970452, .blue = 0.018071 },
+	{ .red = 0.968010, .green = 0.964835, .blue = 0.018559 },
+	{ .red = 0.992186, .green = 0.883028, .blue = 0.030525 },
+	{ .red = 0.997558, .green = 0.806838, .blue = 0.086447 },
+	{ .red = 0.998779, .green = 0.743101, .blue = 0.104274 },
+	{ .red = 0.999267, .green = 0.689133, .blue = 0.109402 },
+	{ .red = 0.999023, .green = 0.642735, .blue = 0.109402 },
+	{ .red = 0.999267, .green = 0.602686, .blue = 0.105983 },
+	{ .red = 0.999267, .green = 0.567277, .blue = 0.100855 },
+	{ .red = 0.067643, .green = 0.954823, .blue = 0.127473 },
+	{ .red = 0.086447, .green = 0.958974, .blue = 0.115507 },
+	{ .red = 0.125031, .green = 0.976068, .blue = 0.039560 },
+	{ .red = 0.255189, .green = 0.979243, .blue = 0.018071 },
+	{ .red = 0.370696, .green = 0.977778, .blue = 0.047375 },
+	{ .red = 0.476190, .green = 0.979976, .blue = 0.043956 },
+	{ .red = 0.580220, .green = 0.982418, .blue = 0.037118 },
+	{ .red = 0.683272, .green = 0.982662, .blue = 0.048107 },
+	{ .red = 0.785348, .green = 0.983639, .blue = 0.052747 },
+	{ .red = 0.886447, .green = 0.984127, .blue = 0.056410 },
+	{ .red = 0.982173, .green = 0.979243, .blue = 0.019048 },
+	{ .red = 0.992918, .green = 0.895971, .blue = 0.077167 },
+	{ .red = 0.999023, .green = 0.825885, .blue = 0.093773 },
+	{ .red = 0.999512, .green = 0.764347, .blue = 0.103541 },
+	{ .red = 0.999267, .green = 0.711844, .blue = 0.105250 },
+	{ .red = 0.999023, .green = 0.666422, .blue = 0.103297 },
+	{ .red = 0.999023, .green = 0.626618, .blue = 0.098657 },
+	{ .red = 0.082295, .green = 0.968010, .blue = 0.126984 },
+	{ .red = 0.097924, .green = 0.970940, .blue = 0.117949 },
+	{ .red = 0.133333, .green = 0.983639, .blue = 0.070818 },
+	{ .red = 0.234188, .green = 0.989744, .blue = 0.040293 },
+	{ .red = 0.341636, .green = 0.987057, .blue = 0.062027 },
+	{ .red = 0.436142, .green = 0.991209, .blue = 0.041758 },
+	{ .red = 0.531868, .green = 0.991941, .blue = 0.043956 },
+	{ .red = 0.626129, .green = 0.990476, .blue = 0.061294 },
+	{ .red = 0.718926, .green = 0.990476, .blue = 0.069353 },
+	{ .red = 0.810989, .green = 0.990476, .blue = 0.074725 },
+	{ .red = 0.902076, .green = 0.990476, .blue = 0.083028 },
+	{ .red = 0.988767, .green = 0.986325, .blue = 0.056410 },
+	{ .red = 0.995849, .green = 0.908181, .blue = 0.088889 },
+	{ .red = 0.998779, .green = 0.840537, .blue = 0.097924 },
+	{ .red = 0.999023, .green = 0.781685, .blue = 0.101099 },
+	{ .red = 0.999267, .green = 0.731136, .blue = 0.099634 },
+	{ .red = 0.999023, .green = 0.686935, .blue = 0.095971 },
+	{ .red = 0.096703, .green = 0.976068, .blue = 0.126007 },
+	{ .red = 0.107448, .green = 0.978755, .blue = 0.117949 },
+	{ .red = 0.138950, .green = 0.988523, .blue = 0.083272 },
+	{ .red = 0.219048, .green = 0.995360, .blue = 0.053724 },
+	{ .red = 0.317705, .green = 0.992186, .blue = 0.071062 },
+	{ .red = 0.403663, .green = 0.996093, .blue = 0.056654 },
+	{ .red = 0.492796, .green = 0.993162, .blue = 0.077167 },
+	{ .red = 0.578022, .green = 0.993407, .blue = 0.080586 },
+	{ .red = 0.663004, .green = 0.996581, .blue = 0.067643 },
+	{ .red = 0.748230, .green = 0.998291, .blue = 0.056410 },
+	{ .red = 0.831746, .green = 0.996825, .blue = 0.069597 },
+	{ .red = 0.913797, .green = 0.995116, .blue = 0.087424 },
+	{ .red = 0.990720, .green = 0.989255, .blue = 0.087912 },
+	{ .red = 0.998779, .green = 0.918437, .blue = 0.091575 },
+	{ .red = 0.998779, .green = 0.852503, .blue = 0.096703 },
+	{ .red = 0.999267, .green = 0.796581, .blue = 0.096215 },
+	{ .red = 0.998779, .green = 0.747497, .blue = 0.093773 },
+	{ .red = 0.111844, .green = 0.980708, .blue = 0.125031 },
+	{ .red = 0.118926, .green = 0.982906, .blue = 0.117949 },
+	{ .red = 0.142369, .green = 0.991697, .blue = 0.088645 },
+	{ .red = 0.221001, .green = 0.999512, .blue = 0.083516 },
+	{ .red = 0.305250, .green = 0.997314, .blue = 0.091087 },
+	{ .red = 0.382173, .green = 0.999267, .blue = 0.084982 },
+	{ .red = 0.462027, .green = 0.996581, .blue = 0.094505 },
+	{ .red = 0.538706, .green = 0.999512, .blue = 0.084737 },
+	{ .red = 0.616606, .green = 0.999023, .blue = 0.087179 },
+	{ .red = 0.693284, .green = 0.996581, .blue = 0.097436 },
+	{ .red = 0.770208, .green = 0.997558, .blue = 0.093773 },
+	{ .red = 0.847863, .green = 0.999756, .blue = 0.079609 },
+	{ .red = 0.923565, .green = 0.998779, .blue = 0.087668 },
+	{ .red = 0.991697, .green = 0.991209, .blue = 0.102808 },
+	{ .red = 0.999267, .green = 0.925275, .blue = 0.093040 },
+	{ .red = 0.998535, .green = 0.863004, .blue = 0.094505 },
+	{ .red = 0.998046, .green = 0.809035, .blue = 0.091819 },
+	{ .red = 0.122100, .green = 0.983639, .blue = 0.122344 },
+	{ .red = 0.127961, .green = 0.985592, .blue = 0.116484 },
+	{ .red = 0.154335, .green = 0.995360, .blue = 0.098168 },
+	{ .red = 0.226374, .green = 0.999512, .blue = 0.103297 },
+	{ .red = 0.295238, .green = 0.999267, .blue = 0.103053 },
+	{ .red = 0.364347, .green = 0.999756, .blue = 0.100611 },
+	{ .red = 0.435897, .green = 0.998291, .blue = 0.104518 },
+	{ .red = 0.505495, .green = 0.999756, .blue = 0.098901 },
+	{ .red = 0.576557, .green = 0.997802, .blue = 0.104029 },
+	{ .red = 0.647131, .green = 0.998291, .blue = 0.101343 },
+	{ .red = 0.717949, .green = 0.998779, .blue = 0.098168 },
+	{ .red = 0.788034, .green = 0.997802, .blue = 0.102808 },
+	{ .red = 0.858852, .green = 0.998779, .blue = 0.096947 },
+	{ .red = 0.929670, .green = 0.999512, .blue = 0.093284 },
+	{ .red = 0.991941, .green = 0.991941, .blue = 0.107692 },
+	{ .red = 0.999023, .green = 0.930647, .blue = 0.090598 },
+	{ .red = 0.998291, .green = 0.871551, .blue = 0.088889 },
+	{ .red = 0.129182, .green = 0.985592, .blue = 0.118681 },
+	{ .red = 0.133333, .green = 0.987546, .blue = 0.113065 },
+	{ .red = 0.165568, .green = 0.996337, .blue = 0.105250 },
+	{ .red = 0.226862, .green = 0.999512, .blue = 0.110867 },
+	{ .red = 0.285714, .green = 0.999756, .blue = 0.108913 },
+	{ .red = 0.347985, .green = 1.000000, .blue = 0.107204 },
+	{ .red = 0.412210, .green = 0.999267, .blue = 0.107204 },
+	{ .red = 0.476190, .green = 0.999756, .blue = 0.103297 },
+	{ .red = 0.541636, .green = 0.999267, .blue = 0.103297 },
+	{ .red = 0.606838, .green = 0.999023, .blue = 0.102320 },
+	{ .red = 0.672039, .green = 0.997802, .blue = 0.105006 },
+	{ .red = 0.737729, .green = 0.999023, .blue = 0.098657 },
+	{ .red = 0.803175, .green = 0.998779, .blue = 0.098168 },
+	{ .red = 0.867888, .green = 0.998046, .blue = 0.104029 },
+	{ .red = 0.934310, .green = 0.999512, .blue = 0.092796 },
+	{ .red = 0.991941, .green = 0.992430, .blue = 0.108181 },
+	{ .red = 0.998779, .green = 0.935043, .blue = 0.086447 },
+	{ .red = 0.133333, .green = 0.987546, .blue = 0.113553 },
+	{ .red = 0.136508, .green = 0.989011, .blue = 0.108181 },
+	{ .red = 0.170940, .green = 0.997070, .blue = 0.107204 },
+	{ .red = 0.223932, .green = 0.999512, .blue = 0.112088 },
+	{ .red = 0.276190, .green = 0.999756, .blue = 0.110134 },
+	{ .red = 0.332357, .green = 1.000000, .blue = 0.108181 },
+	{ .red = 0.391209, .green = 0.999512, .blue = 0.107204 },
+	{ .red = 0.451282, .green = 0.998535, .blue = 0.107692 },
+	{ .red = 0.510867, .green = 0.999512, .blue = 0.101832 },
+	{ .red = 0.571673, .green = 0.998046, .blue = 0.105006 },
+	{ .red = 0.632479, .green = 0.998779, .blue = 0.099389 },
+	{ .red = 0.693284, .green = 0.997802, .blue = 0.101832 },
+	{ .red = 0.754823, .green = 0.999023, .blue = 0.095482 },
+	{ .red = 0.815873, .green = 0.999023, .blue = 0.093529 },
+	{ .red = 0.875702, .green = 0.997314, .blue = 0.103785 },
+	{ .red = 0.938462, .green = 0.999512, .blue = 0.088400 },
+	{ .red = 0.991453, .green = 0.992430, .blue = 0.106471 },
+	{ .red = 0.015385, .green = 0.007814, .blue = 0.294994 },
+	{ .red = 0.162882, .green = 0.007326, .blue = 0.296215 },
+	{ .red = 0.327961, .green = 0.007570, .blue = 0.328205 },
+	{ .red = 0.486935, .green = 0.006838, .blue = 0.320879 },
+	{ .red = 0.632967, .green = 0.010501, .blue = 0.313065 },
+	{ .red = 0.707937, .green = 0.013431, .blue = 0.280830 },
+	{ .red = 0.769963, .green = 0.010745, .blue = 0.254945 },
+	{ .red = 0.830281, .green = 0.010989, .blue = 0.237118 },
+	{ .red = 0.891575, .green = 0.012210, .blue = 0.224664 },
+	{ .red = 0.944567, .green = 0.013187, .blue = 0.213187 },
+	{ .red = 0.987790, .green = 0.018803, .blue = 0.202442 },
+	{ .red = 0.999267, .green = 0.049573, .blue = 0.188767 },
+	{ .red = 0.999512, .green = 0.070085, .blue = 0.176313 },
+	{ .red = 0.996337, .green = 0.081074, .blue = 0.164835 },
+	{ .red = 0.997558, .green = 0.086691, .blue = 0.154823 },
+	{ .red = 0.999267, .green = 0.090842, .blue = 0.145543 },
+	{ .red = 0.999756, .green = 0.096215, .blue = 0.137485 },
+	{ .red = 0.006838, .green = 0.154090, .blue = 0.289621 },
+	{ .red = 0.150183, .green = 0.137973, .blue = 0.297680 },
+	{ .red = 0.314286, .green = 0.133822, .blue = 0.313553 },
+	{ .red = 0.491331, .green = 0.110379, .blue = 0.310379 },
+	{ .red = 0.663248, .green = 0.059829, .blue = 0.303785 },
+	{ .red = 0.774115, .green = 0.016850, .blue = 0.284005 },
+	{ .red = 0.840781, .green = 0.016606, .blue = 0.260317 },
+	{ .red = 0.900855, .green = 0.010745, .blue = 0.242979 },
+	{ .red = 0.956288, .green = 0.015873, .blue = 0.229304 },
+	{ .red = 0.985836, .green = 0.049084, .blue = 0.214652 },
+	{ .red = 0.996337, .green = 0.066178, .blue = 0.199023 },
+	{ .red = 0.999267, .green = 0.077656, .blue = 0.184860 },
+	{ .red = 0.999267, .green = 0.087424, .blue = 0.172894 },
+	{ .red = 0.998535, .green = 0.092552, .blue = 0.161905 },
+	{ .red = 0.999756, .green = 0.109158, .blue = 0.155067 },
+	{ .red = 0.999756, .green = 0.123321, .blue = 0.149206 },
+	{ .red = 0.999512, .green = 0.135775, .blue = 0.144322 },
+	{ .red = 0.021490, .green = 0.377289, .blue = 0.377289 },
+	{ .red = 0.021245, .green = 0.306960, .blue = 0.308425 },
+	{ .red = 0.295238, .green = 0.294750, .blue = 0.294994 },
+	{ .red = 0.478632, .green = 0.287668, .blue = 0.292308 },
+	{ .red = 0.652747, .green = 0.276679, .blue = 0.289133 },
+	{ .red = 0.823199, .green = 0.261294, .blue = 0.285226 },
+	{ .red = 0.992186, .green = 0.240049, .blue = 0.282784 },
+	{ .red = 0.999512, .green = 0.226862, .blue = 0.259341 },
+	{ .red = 0.999267, .green = 0.223932, .blue = 0.242002 },
+	{ .red = 0.999267, .green = 0.223443, .blue = 0.227839 },
+	{ .red = 0.999512, .green = 0.223687, .blue = 0.216117 },
+	{ .red = 0.998535, .green = 0.223687, .blue = 0.205861 },
+	{ .red = 0.999267, .green = 0.222955, .blue = 0.197070 },
+	{ .red = 0.999756, .green = 0.221978, .blue = 0.188767 },
+	{ .red = 0.998779, .green = 0.221978, .blue = 0.181441 },
+	{ .red = 0.998779, .green = 0.221490, .blue = 0.174359 },
+	{ .red = 0.999023, .green = 0.220757, .blue = 0.168010 },
+	{ .red = 0.024176, .green = 0.494505, .blue = 0.355800 },
+	{ .red = 0.013431, .green = 0.476190, .blue = 0.325763 },
+	{ .red = 0.249817, .green = 0.447375, .blue = 0.280098 },
+	{ .red = 0.447863, .green = 0.444933, .blue = 0.284982 },
+	{ .red = 0.625641, .green = 0.441758, .blue = 0.282295 },
+	{ .red = 0.800000, .green = 0.435653, .blue = 0.276190 },
+	{ .red = 0.972161, .green = 0.425885, .blue = 0.271062 },
+	{ .red = 0.999267, .green = 0.410745, .blue = 0.275458 },
+	{ .red = 0.999267, .green = 0.396825, .blue = 0.274969 },
+	{ .red = 0.999023, .green = 0.385104, .blue = 0.270085 },
+	{ .red = 0.999023, .green = 0.374603, .blue = 0.263004 },
+	{ .red = 0.998779, .green = 0.364347, .blue = 0.254701 },
+	{ .red = 0.998779, .green = 0.354090, .blue = 0.245910 },
+	{ .red = 0.999267, .green = 0.344078, .blue = 0.236386 },
+	{ .red = 0.999512, .green = 0.335043, .blue = 0.227106 },
+	{ .red = 0.999267, .green = 0.326252, .blue = 0.217827 },
+	{ .red = 0.998535, .green = 0.317949, .blue = 0.209035 },
+	{ .red = 0.014408, .green = 0.596093, .blue = 0.335775 },
+	{ .red = 0.021001, .green = 0.594872, .blue = 0.317949 },
+	{ .red = 0.164835, .green = 0.597314, .blue = 0.259585 },
+	{ .red = 0.419048, .green = 0.594383, .blue = 0.263492 },
+	{ .red = 0.599756, .green = 0.594383, .blue = 0.269353 },
+	{ .red = 0.778510, .green = 0.590965, .blue = 0.268620 },
+	{ .red = 0.952381, .green = 0.584615, .blue = 0.264957 },
+	{ .red = 0.999023, .green = 0.544811, .blue = 0.273993 },
+	{ .red = 0.999512, .green = 0.511111, .blue = 0.281563 },
+	{ .red = 0.998291, .green = 0.488400, .blue = 0.285470 },
+	{ .red = 0.999267, .green = 0.472039, .blue = 0.286203 },
+	{ .red = 0.999267, .green = 0.458608, .blue = 0.284737 },
+	{ .red = 0.999756, .green = 0.446398, .blue = 0.280830 },
+	{ .red = 0.999512, .green = 0.434676, .blue = 0.274969 },
+	{ .red = 0.999512, .green = 0.422711, .blue = 0.267155 },
+	{ .red = 0.999023, .green = 0.410501, .blue = 0.257875 },
+	{ .red = 0.999512, .green = 0.397802, .blue = 0.247863 },
+	{ .red = 0.018803, .green = 0.693773, .blue = 0.320635 },
+	{ .red = 0.016361, .green = 0.699878, .blue = 0.307692 },
+	{ .red = 0.010989, .green = 0.734066, .blue = 0.248107 },
+	{ .red = 0.375580, .green = 0.743346, .blue = 0.232723 },
+	{ .red = 0.571917, .green = 0.742857, .blue = 0.240781 },
+	{ .red = 0.746276, .green = 0.738462, .blue = 0.243956 },
+	{ .red = 0.914774, .green = 0.725763, .blue = 0.240049 },
+	{ .red = 0.998779, .green = 0.678877, .blue = 0.254212 },
+	{ .red = 0.999267, .green = 0.619048, .blue = 0.272283 },
+	{ .red = 0.998779, .green = 0.576068, .blue = 0.278632 },
+	{ .red = 0.999512, .green = 0.543346, .blue = 0.279121 },
+	{ .red = 0.998779, .green = 0.516972, .blue = 0.276679 },
+	{ .red = 0.998779, .green = 0.495971, .blue = 0.273016 },
+	{ .red = 0.999267, .green = 0.476923, .blue = 0.266667 },
+	{ .red = 0.998779, .green = 0.459341, .blue = 0.259341 },
+	{ .red = 0.999512, .green = 0.442491, .blue = 0.250061 },
+	{ .red = 0.998779, .green = 0.426618, .blue = 0.240537 },
+	{ .red = 0.015140, .green = 0.785348, .blue = 0.306716 },
+	{ .red = 0.014408, .green = 0.793895, .blue = 0.295726 },
+	{ .red = 0.025885, .green = 0.833700, .blue = 0.246642 },
+	{ .red = 0.303053, .green = 0.878632, .blue = 0.184371 },
+	{ .red = 0.522589, .green = 0.871306, .blue = 0.191453 },
+	{ .red = 0.698657, .green = 0.860562, .blue = 0.196093 },
+	{ .red = 0.855922, .green = 0.845665, .blue = 0.195849 },
+	{ .red = 0.999756, .green = 0.819536, .blue = 0.195116 },
+	{ .red = 0.998779, .green = 0.731380, .blue = 0.249817 },
+	{ .red = 0.998535, .green = 0.669353, .blue = 0.266422 },
+	{ .red = 0.999512, .green = 0.622955, .blue = 0.270818 },
+	{ .red = 0.999267, .green = 0.585104, .blue = 0.269353 },
+	{ .red = 0.998291, .green = 0.553358, .blue = 0.264469 },
+	{ .red = 0.999512, .green = 0.525763, .blue = 0.256899 },
+	{ .red = 0.998779, .green = 0.500855, .blue = 0.248107 },
+	{ .red = 0.999267, .green = 0.479609, .blue = 0.240049 },
+	{ .red = 0.998779, .green = 0.460073, .blue = 0.231502 },
+	{ .red = 0.019292, .green = 0.853724, .blue = 0.288645 },
+	{ .red = 0.018803, .green = 0.862027, .blue = 0.278877 },
+	{ .red = 0.010989, .green = 0.899145, .blue = 0.235409 },
+	{ .red = 0.164591, .green = 0.983883, .blue = 0.092552 },
+	{ .red = 0.449573, .green = 0.973138, .blue = 0.105495 },
+	{ .red = 0.634188, .green = 0.958730, .blue = 0.115751 },
+	{ .red = 0.791209, .green = 0.940904, .blue = 0.121123 },
+	{ .red = 0.931624, .green = 0.919414, .blue = 0.120391 },
+	{ .red = 0.999756, .green = 0.851526, .blue = 0.198779 },
+	{ .red = 0.999023, .green = 0.768498, .blue = 0.244200 },
+	{ .red = 0.998779, .green = 0.706716, .blue = 0.257143 },
+	{ .red = 0.999023, .green = 0.657875, .blue = 0.259341 },
+	{ .red = 0.999512, .green = 0.617582, .blue = 0.256166 },
+	{ .red = 0.999512, .green = 0.582906, .blue = 0.249817 },
+	{ .red = 0.999267, .green = 0.552381, .blue = 0.241758 },
+	{ .red = 0.999023, .green = 0.524542, .blue = 0.232234 },
+	{ .red = 0.999023, .green = 0.499634, .blue = 0.221978 },
+	{ .red = 0.016117, .green = 0.901832, .blue = 0.269109 },
+	{ .red = 0.000000, .green = 0.909402, .blue = 0.260073 },
+	{ .red = 0.000000, .green = 0.941148, .blue = 0.221490 },
+	{ .red = 0.188034, .green = 0.997558, .blue = 0.136264 },
+	{ .red = 0.402442, .green = 0.999512, .blue = 0.128449 },
+	{ .red = 0.564347, .green = 0.998779, .blue = 0.112576 },
+	{ .red = 0.712576, .green = 0.995116, .blue = 0.083028 },
+	{ .red = 0.851526, .green = 0.985104, .blue = 0.032234 },
+	{ .red = 0.975824, .green = 0.963614, .blue = 0.018559 },
+	{ .red = 0.999756, .green = 0.874481, .blue = 0.203419 },
+	{ .red = 0.999267, .green = 0.795849, .blue = 0.237118 },
+	{ .red = 0.999023, .green = 0.735043, .blue = 0.245665 },
+	{ .red = 0.999267, .green = 0.685470, .blue = 0.245665 },
+	{ .red = 0.999512, .green = 0.643712, .blue = 0.241026 },
+	{ .red = 0.998779, .green = 0.607082, .blue = 0.234188 },
+	{ .red = 0.999023, .green = 0.575092, .blue = 0.225641 },
+	{ .red = 0.999267, .green = 0.546032, .blue = 0.216117 },
+	{ .red = 0.018071, .green = 0.935043, .blue = 0.249817 },
+	{ .red = 0.031746, .green = 0.941392, .blue = 0.242247 },
+	{ .red = 0.027106, .green = 0.968010, .blue = 0.207326 },
+	{ .red = 0.232234, .green = 0.999512, .blue = 0.175092 },
+	{ .red = 0.391209, .green = 0.999267, .blue = 0.180220 },
+	{ .red = 0.518926, .green = 0.999023, .blue = 0.174603 },
+	{ .red = 0.640781, .green = 0.999267, .blue = 0.163126 },
+	{ .red = 0.761416, .green = 0.999512, .blue = 0.140659 },
+	{ .red = 0.881563, .green = 0.996825, .blue = 0.102320 },
+	{ .red = 0.992918, .green = 0.982906, .blue = 0.064225 },
+	{ .red = 0.999512, .green = 0.891087, .blue = 0.205861 },
+	{ .red = 0.999267, .green = 0.816850, .blue = 0.228327 },
+	{ .red = 0.998779, .green = 0.757265, .blue = 0.233211 },
+	{ .red = 0.999756, .green = 0.708181, .blue = 0.230769 },
+	{ .red = 0.999512, .green = 0.665690, .blue = 0.225397 },
+	{ .red = 0.998779, .green = 0.628083, .blue = 0.218315 },
+	{ .red = 0.999023, .green = 0.595360, .blue = 0.209768 },
+	{ .red = 0.055678, .green = 0.955311, .blue = 0.235409 },
+	{ .red = 0.051526, .green = 0.961172, .blue = 0.227839 },
+	{ .red = 0.087668, .green = 0.979243, .blue = 0.201465 },
+	{ .red = 0.260562, .green = 0.999512, .blue = 0.200733 },
+	{ .red = 0.386813, .green = 0.999756, .blue = 0.211233 },
+	{ .red = 0.488889, .green = 0.999512, .blue = 0.207082 },
+	{ .red = 0.590232, .green = 0.999756, .blue = 0.199512 },
+	{ .red = 0.692063, .green = 0.999512, .blue = 0.190965 },
+	{ .red = 0.794383, .green = 0.999023, .blue = 0.178266 },
+	{ .red = 0.898901, .green = 0.999756, .blue = 0.152625 },
+	{ .red = 0.996093, .green = 0.989499, .blue = 0.129426 },
+	{ .red = 0.999267, .green = 0.903541, .blue = 0.204151 },
+	{ .red = 0.998779, .green = 0.832967, .blue = 0.218315 },
+	{ .red = 0.999267, .green = 0.775580, .blue = 0.219536 },
+	{ .red = 0.999267, .green = 0.726740, .blue = 0.215873 },
+	{ .red = 0.999756, .green = 0.684737, .blue = 0.209768 },
+	{ .red = 0.998535, .green = 0.646886, .blue = 0.202930 },
+	{ .red = 0.041514, .green = 0.970940, .blue = 0.219780 },
+	{ .red = 0.027350, .green = 0.976313, .blue = 0.212454 },
+	{ .red = 0.115751, .green = 0.984860, .blue = 0.196093 },
+	{ .red = 0.278877, .green = 0.999512, .blue = 0.215629 },
+	{ .red = 0.385104, .green = 0.999512, .blue = 0.230281 },
+	{ .red = 0.467643, .green = 0.999512, .blue = 0.225885 },
+	{ .red = 0.552869, .green = 0.999267, .blue = 0.220513 },
+	{ .red = 0.639805, .green = 0.999267, .blue = 0.213675 },
+	{ .red = 0.728205, .green = 0.999023, .blue = 0.205861 },
+	{ .red = 0.818559, .green = 1.000000, .blue = 0.194139 },
+	{ .red = 0.909890, .green = 0.999512, .blue = 0.181929 },
+	{ .red = 0.994628, .green = 0.991209, .blue = 0.168010 },
+	{ .red = 0.999512, .green = 0.913309, .blue = 0.199756 },
+	{ .red = 0.999512, .green = 0.846642, .blue = 0.206349 },
+	{ .red = 0.999023, .green = 0.790476, .blue = 0.205617 },
+	{ .red = 0.998779, .green = 0.742857, .blue = 0.201465 },
+	{ .red = 0.999267, .green = 0.701099, .blue = 0.195116 },
+	{ .red = 0.058852, .green = 0.979976, .blue = 0.206838 },
+	{ .red = 0.084493, .green = 0.981197, .blue = 0.203663 },
+	{ .red = 0.135043, .green = 0.989988, .blue = 0.190965 },
+	{ .red = 0.289377, .green = 0.999267, .blue = 0.222711 },
+	{ .red = 0.382418, .green = 0.999267, .blue = 0.240049 },
+	{ .red = 0.450061, .green = 0.999512, .blue = 0.235165 },
+	{ .red = 0.522833, .green = 0.998779, .blue = 0.230525 },
+	{ .red = 0.598046, .green = 0.999023, .blue = 0.223687 },
+	{ .red = 0.675702, .green = 0.999023, .blue = 0.217338 },
+	{ .red = 0.755067, .green = 0.999023, .blue = 0.210012 },
+	{ .red = 0.836142, .green = 0.999512, .blue = 0.201709 },
+	{ .red = 0.917949, .green = 0.999512, .blue = 0.194383 },
+	{ .red = 0.993895, .green = 0.992186, .blue = 0.181929 },
+	{ .red = 0.999267, .green = 0.920635, .blue = 0.191697 },
+	{ .red = 0.999756, .green = 0.857875, .blue = 0.194139 },
+	{ .red = 0.999023, .green = 0.803663, .blue = 0.191941 },
+	{ .red = 0.998779, .green = 0.757021, .blue = 0.187546 },
+	{ .red = 0.101343, .green = 0.981685, .blue = 0.199023 },
+	{ .red = 0.111355, .green = 0.983394, .blue = 0.195604 },
+	{ .red = 0.158486, .green = 0.995604, .blue = 0.189499 },
+	{ .red = 0.293040, .green = 0.999267, .blue = 0.223687 },
+	{ .red = 0.376313, .green = 0.999267, .blue = 0.242491 },
+	{ .red = 0.433455, .green = 0.999512, .blue = 0.237363 },
+	{ .red = 0.496703, .green = 0.999023, .blue = 0.232479 },
+	{ .red = 0.562882, .green = 0.999267, .blue = 0.225885 },
+	{ .red = 0.631990, .green = 0.999512, .blue = 0.219048 },
+	{ .red = 0.703297, .green = 0.999267, .blue = 0.212943 },
+	{ .red = 0.776068, .green = 0.999512, .blue = 0.206105 },
+	{ .red = 0.849573, .green = 0.999023, .blue = 0.201465 },
+	{ .red = 0.924542, .green = 0.999512, .blue = 0.195604 },
+	{ .red = 0.993407, .green = 0.992918, .blue = 0.184615 },
+	{ .red = 0.999512, .green = 0.927228, .blue = 0.182662 },
+	{ .red = 0.999267, .green = 0.866911, .blue = 0.182173 },
+	{ .red = 0.999756, .green = 0.815629, .blue = 0.178266 },
+	{ .red = 0.114530, .green = 0.984127, .blue = 0.189255 },
+	{ .red = 0.118193, .green = 0.986325, .blue = 0.185104 },
+	{ .red = 0.172894, .green = 0.999023, .blue = 0.186325 },
+	{ .red = 0.291819, .green = 0.999267, .blue = 0.220513 },
+	{ .red = 0.367277, .green = 0.999023, .blue = 0.239560 },
+	{ .red = 0.416850, .green = 0.999512, .blue = 0.234188 },
+	{ .red = 0.472527, .green = 0.999267, .blue = 0.229304 },
+	{ .red = 0.532357, .green = 0.998779, .blue = 0.224420 },
+	{ .red = 0.594383, .green = 0.999267, .blue = 0.217094 },
+	{ .red = 0.659096, .green = 0.998779, .blue = 0.211722 },
+	{ .red = 0.725275, .green = 0.999023, .blue = 0.205128 },
+	{ .red = 0.792674, .green = 0.999512, .blue = 0.198291 },
+	{ .red = 0.860562, .green = 0.998779, .blue = 0.195360 },
+	{ .red = 0.929670, .green = 0.999267, .blue = 0.190476 },
+	{ .red = 0.992918, .green = 0.993162, .blue = 0.180952 },
+	{ .red = 0.999756, .green = 0.932601, .blue = 0.171673 },
+	{ .red = 0.999267, .green = 0.875214, .blue = 0.170208 },
+	{ .red = 0.109646, .green = 0.988523, .blue = 0.176313 },
+	{ .red = 0.108425, .green = 0.991697, .blue = 0.171673 },
+	{ .red = 0.184860, .green = 0.999267, .blue = 0.183150 },
+	{ .red = 0.286935, .green = 0.999267, .blue = 0.214164 },
+	{ .red = 0.355800, .green = 0.999023, .blue = 0.232967 },
+	{ .red = 0.400000, .green = 0.999756, .blue = 0.227839 },
+	{ .red = 0.450305, .green = 0.999267, .blue = 0.223199 },
+	{ .red = 0.504518, .green = 0.999023, .blue = 0.218315 },
+	{ .red = 0.561416, .green = 0.999267, .blue = 0.211722 },
+	{ .red = 0.620513, .green = 0.999267, .blue = 0.205861 },
+	{ .red = 0.681319, .green = 0.999267, .blue = 0.200000 },
+	{ .red = 0.743346, .green = 0.998779, .blue = 0.195360 },
+	{ .red = 0.806593, .green = 0.999512, .blue = 0.188278 },
+	{ .red = 0.870085, .green = 0.999267, .blue = 0.185104 },
+	{ .red = 0.934310, .green = 0.999267, .blue = 0.181441 },
+	{ .red = 0.992674, .green = 0.993407, .blue = 0.174115 },
+	{ .red = 0.999756, .green = 0.936996, .blue = 0.160195 },
+	{ .red = 0.087424, .green = 0.994872, .blue = 0.160195 },
+	{ .red = 0.103297, .green = 0.999023, .blue = 0.159951 },
+	{ .red = 0.191209, .green = 0.999267, .blue = 0.178022 },
+	{ .red = 0.280586, .green = 0.999512, .blue = 0.206349 },
+	{ .red = 0.342857, .green = 0.999023, .blue = 0.223687 },
+	{ .red = 0.382906, .green = 0.999756, .blue = 0.218803 },
+	{ .red = 0.429548, .green = 0.999023, .blue = 0.215140 },
+	{ .red = 0.478877, .green = 0.999756, .blue = 0.209280 },
+	{ .red = 0.531868, .green = 0.999023, .blue = 0.204884 },
+	{ .red = 0.586325, .green = 0.999756, .blue = 0.198046 },
+	{ .red = 0.642735, .green = 0.999267, .blue = 0.193407 },
+	{ .red = 0.700611, .green = 0.999512, .blue = 0.187302 },
+	{ .red = 0.758974, .green = 0.998779, .blue = 0.184127 },
+	{ .red = 0.818559, .green = 0.999512, .blue = 0.177778 },
+	{ .red = 0.878388, .green = 0.999512, .blue = 0.172894 },
+	{ .red = 0.938217, .green = 0.999267, .blue = 0.171429 },
+	{ .red = 0.992674, .green = 0.993651, .blue = 0.164591 },
+	{ .red = 0.016117, .green = 0.017338, .blue = 0.421490 },
+	{ .red = 0.157509, .green = 0.010989, .blue = 0.424664 },
+	{ .red = 0.316972, .green = 0.011722, .blue = 0.442002 },
+	{ .red = 0.470085, .green = 0.010501, .blue = 0.470085 },
+	{ .red = 0.613675, .green = 0.012210, .blue = 0.456410 },
+	{ .red = 0.688889, .green = 0.015140, .blue = 0.409524 },
+	{ .red = 0.751160, .green = 0.010256, .blue = 0.372894 },
+	{ .red = 0.809280, .green = 0.017094, .blue = 0.346520 },
+	{ .red = 0.865690, .green = 0.018071, .blue = 0.326496 },
+	{ .red = 0.916484, .green = 0.018071, .blue = 0.309402 },
+	{ .red = 0.958730, .green = 0.020024, .blue = 0.293040 },
+	{ .red = 0.980952, .green = 0.036386, .blue = 0.274725 },
+	{ .red = 0.992430, .green = 0.054701, .blue = 0.257631 },
+	{ .red = 0.999023, .green = 0.063980, .blue = 0.241270 },
+	{ .red = 0.999756, .green = 0.075458, .blue = 0.226129 },
+	{ .red = 0.997314, .green = 0.082784, .blue = 0.211722 },
+	{ .red = 0.998291, .green = 0.087668, .blue = 0.199512 },
+	{ .red = 0.000000, .green = 0.143346, .blue = 0.415629 },
+	{ .red = 0.150427, .green = 0.119170, .blue = 0.449084 },
+	{ .red = 0.313309, .green = 0.123077, .blue = 0.451526 },
+	{ .red = 0.476435, .green = 0.096459, .blue = 0.480342 },
+	{ .red = 0.652503, .green = 0.014896, .blue = 0.476435 },
+	{ .red = 0.751160, .green = 0.013919, .blue = 0.432234 },
+	{ .red = 0.814408, .green = 0.010745, .blue = 0.390720 },
+	{ .red = 0.870818, .green = 0.014408, .blue = 0.361172 },
+	{ .red = 0.925275, .green = 0.008791, .blue = 0.338950 },
+	{ .red = 0.969719, .green = 0.015629, .blue = 0.318926 },
+	{ .red = 0.994139, .green = 0.039560, .blue = 0.297680 },
+	{ .red = 0.991697, .green = 0.063736, .blue = 0.273748 },
+	{ .red = 0.996337, .green = 0.073748, .blue = 0.255433 },
+	{ .red = 0.999267, .green = 0.079121, .blue = 0.238584 },
+	{ .red = 0.999512, .green = 0.100122, .blue = 0.226129 },
+	{ .red = 0.999267, .green = 0.117216, .blue = 0.215140 },
+	{ .red = 0.999267, .green = 0.129915, .blue = 0.205617 },
+	{ .red = 0.014164, .green = 0.273993, .blue = 0.389255 },
+	{ .red = 0.069353, .green = 0.284737, .blue = 0.460317 },
+	{ .red = 0.299389, .green = 0.286935, .blue = 0.445665 },
+	{ .red = 0.464957, .green = 0.285470, .blue = 0.460562 },
+	{ .red = 0.645177, .green = 0.271551, .blue = 0.461050 },
+	{ .red = 0.820269, .green = 0.253236, .blue = 0.455922 },
+	{ .red = 0.991941, .green = 0.228327, .blue = 0.452015 },
+	{ .red = 0.998535, .green = 0.216361, .blue = 0.401954 },
+	{ .red = 0.998535, .green = 0.214164, .blue = 0.365079 },
+	{ .red = 0.999512, .green = 0.214652, .blue = 0.336752 },
+	{ .red = 0.999267, .green = 0.215873, .blue = 0.313553 },
+	{ .red = 0.999023, .green = 0.217338, .blue = 0.294261 },
+	{ .red = 0.998779, .green = 0.218315, .blue = 0.277411 },
+	{ .red = 0.999267, .green = 0.219292, .blue = 0.263248 },
+	{ .red = 0.999267, .green = 0.219292, .blue = 0.249817 },
+	{ .red = 0.999023, .green = 0.219292, .blue = 0.237851 },
+	{ .red = 0.999023, .green = 0.219536, .blue = 0.227106 },
+	{ .red = 0.021734, .green = 0.507937, .blue = 0.508181 },
+	{ .red = 0.010989, .green = 0.487424, .blue = 0.488645 },
+	{ .red = 0.224176, .green = 0.446398, .blue = 0.447863 },
+	{ .red = 0.442979, .green = 0.442491, .blue = 0.442735 },
+	{ .red = 0.629060, .green = 0.435897, .blue = 0.440537 },
+	{ .red = 0.806349, .green = 0.426618, .blue = 0.438584 },
+	{ .red = 0.979731, .green = 0.414408, .blue = 0.437118 },
+	{ .red = 0.998779, .green = 0.401221, .blue = 0.416361 },
+	{ .red = 0.999267, .green = 0.390720, .blue = 0.395360 },
+	{ .red = 0.999512, .green = 0.380952, .blue = 0.375580 },
+	{ .red = 0.999023, .green = 0.371917, .blue = 0.357265 },
+	{ .red = 0.998535, .green = 0.362882, .blue = 0.339927 },
+	{ .red = 0.999023, .green = 0.353602, .blue = 0.323565 },
+	{ .red = 0.999512, .green = 0.344567, .blue = 0.307937 },
+	{ .red = 0.999023, .green = 0.336020, .blue = 0.293040 },
+	{ .red = 0.999267, .green = 0.327473, .blue = 0.279121 },
+	{ .red = 0.999267, .green = 0.318926, .blue = 0.265690 },
+	{ .red = 0.029060, .green = 0.611966, .blue = 0.485226 },
+	{ .red = 0.024176, .green = 0.609035, .blue = 0.475214 },
+	{ .red = 0.022466, .green = 0.600244, .blue = 0.432479 },
+	{ .red = 0.401465, .green = 0.595604, .blue = 0.429060 },
+	{ .red = 0.596093, .green = 0.592674, .blue = 0.433700 },
+	{ .red = 0.776801, .green = 0.589255, .blue = 0.431258 },
+	{ .red = 0.951893, .green = 0.581685, .blue = 0.425153 },
+	{ .red = 0.998779, .green = 0.564591, .blue = 0.433944 },
+	{ .red = 0.998779, .green = 0.546032, .blue = 0.435653 },
+	{ .red = 0.998535, .green = 0.529426, .blue = 0.428571 },
+	{ .red = 0.999023, .green = 0.513065, .blue = 0.416606 },
+	{ .red = 0.999267, .green = 0.497192, .blue = 0.402198 },
+	{ .red = 0.998046, .green = 0.481074, .blue = 0.386081 },
+	{ .red = 0.999023, .green = 0.465446, .blue = 0.369231 },
+	{ .red = 0.999756, .green = 0.450061, .blue = 0.352137 },
+	{ .red = 0.998779, .green = 0.434921, .blue = 0.335287 },
+	{ .red = 0.998779, .green = 0.420024, .blue = 0.318681 },
+	{ .red = 0.023443, .green = 0.705739, .blue = 0.465446 },
+	{ .red = 0.017094, .green = 0.709646, .blue = 0.458608 },
+	{ .red = 0.028083, .green = 0.730159, .blue = 0.431502 },
+	{ .red = 0.340659, .green = 0.746764, .blue = 0.411966 },
+	{ .red = 0.567033, .green = 0.741392, .blue = 0.414652 },
+	{ .red = 0.742613, .green = 0.736264, .blue = 0.417338 },
+	{ .red = 0.911111, .green = 0.723321, .blue = 0.411233 },
+	{ .red = 0.998535, .green = 0.687668, .blue = 0.419048 },
+	{ .red = 0.999023, .green = 0.649084, .blue = 0.435653 },
+	{ .red = 0.998779, .green = 0.625885, .blue = 0.444444 },
+	{ .red = 0.999023, .green = 0.610012, .blue = 0.447619 },
+	{ .red = 0.999023, .green = 0.596825, .blue = 0.446642 },
+	{ .red = 0.999512, .green = 0.584615, .blue = 0.441514 },
+	{ .red = 0.998535, .green = 0.571917, .blue = 0.433211 },
+	{ .red = 0.998535, .green = 0.558486, .blue = 0.421978 },
+	{ .red = 0.999023, .green = 0.539683, .blue = 0.403175 },
+	{ .red = 0.999023, .green = 0.520391, .blue = 0.384127 },
+	{ .red = 0.020757, .green = 0.792186, .blue = 0.446642 },
+	{ .red = 0.019292, .green = 0.798535, .blue = 0.441270 },
+	{ .red = 0.031502, .green = 0.827595, .blue = 0.419536 },
+	{ .red = 0.237118, .green = 0.881563, .blue = 0.383639 },
+	{ .red = 0.515507, .green = 0.869597, .blue = 0.380952 },
+	{ .red = 0.693529, .green = 0.858364, .blue = 0.383150 },
+	{ .red = 0.851770, .green = 0.843223, .blue = 0.379976 },
+	{ .red = 0.998779, .green = 0.819048, .blue = 0.372650 },
+	{ .red = 0.999267, .green = 0.747253, .blue = 0.411477 },
+	{ .red = 0.999023, .green = 0.701587, .blue = 0.426129 },
+	{ .red = 0.998535, .green = 0.668620, .blue = 0.430281 },
+	{ .red = 0.998535, .green = 0.642735, .blue = 0.428327 },
+	{ .red = 0.999267, .green = 0.621734, .blue = 0.423443 },
+	{ .red = 0.999756, .green = 0.602442, .blue = 0.415629 },
+	{ .red = 0.999267, .green = 0.584371, .blue = 0.405372 },
+	{ .red = 0.998779, .green = 0.566300, .blue = 0.392918 },
+	{ .red = 0.999023, .green = 0.548962, .blue = 0.378999 },
+	{ .red = 0.026618, .green = 0.856410, .blue = 0.421734 },
+	{ .red = 0.020513, .green = 0.863492, .blue = 0.416850 },
+	{ .red = 0.013431, .green = 0.892796, .blue = 0.396825 },
+	{ .red = 0.047375, .green = 0.970940, .blue = 0.348474 },
+	{ .red = 0.439805, .green = 0.971184, .blue = 0.335775 },
+	{ .red = 0.628327, .green = 0.956532, .blue = 0.337485 },
+	{ .red = 0.786325, .green = 0.938462, .blue = 0.336020 },
+	{ .red = 0.927717, .green = 0.916728, .blue = 0.330647 },
+	{ .red = 0.999023, .green = 0.855678, .blue = 0.365324 },
+	{ .red = 0.999023, .green = 0.785348, .blue = 0.398046 },
+	{ .red = 0.999512, .green = 0.736508, .blue = 0.408547 },
+	{ .red = 0.999023, .green = 0.698657, .blue = 0.409768 },
+	{ .red = 0.998535, .green = 0.667155, .blue = 0.405128 },
+	{ .red = 0.998535, .green = 0.639805, .blue = 0.396825 },
+	{ .red = 0.999023, .green = 0.615140, .blue = 0.385592 },
+	{ .red = 0.998291, .green = 0.592430, .blue = 0.373626 },
+	{ .red = 0.999267, .green = 0.571917, .blue = 0.361416 },
+	{ .red = 0.023932, .green = 0.902564, .blue = 0.394628 },
+	{ .red = 0.027839, .green = 0.908913, .blue = 0.389988 },
+	{ .red = 0.026618, .green = 0.935287, .blue = 0.371429 },
+	{ .red = 0.115507, .green = 0.991453, .blue = 0.332112 },
+	{ .red = 0.416361, .green = 0.999512, .blue = 0.339194 },
+	{ .red = 0.571673, .green = 0.999512, .blue = 0.329670 },
+	{ .red = 0.712821, .green = 0.999512, .blue = 0.307448 },
+	{ .red = 0.853236, .green = 0.991697, .blue = 0.281319 },
+	{ .red = 0.979243, .green = 0.966300, .blue = 0.275458 },
+	{ .red = 0.998535, .green = 0.879365, .blue = 0.355800 },
+	{ .red = 0.999267, .green = 0.811477, .blue = 0.380220 },
+	{ .red = 0.998779, .green = 0.760684, .blue = 0.386813 },
+	{ .red = 0.998535, .green = 0.719658, .blue = 0.385348 },
+	{ .red = 0.998779, .green = 0.685226, .blue = 0.378999 },
+	{ .red = 0.999023, .green = 0.654945, .blue = 0.369475 },
+	{ .red = 0.998535, .green = 0.627350, .blue = 0.357998 },
+	{ .red = 0.999512, .green = 0.602198, .blue = 0.345055 },
+	{ .red = 0.024908, .green = 0.935043, .blue = 0.367521 },
+	{ .red = 0.027350, .green = 0.940659, .blue = 0.363126 },
+	{ .red = 0.039072, .green = 0.963126, .blue = 0.346032 },
+	{ .red = 0.193407, .green = 0.998779, .blue = 0.325763 },
+	{ .red = 0.429060, .green = 0.999023, .blue = 0.356777 },
+	{ .red = 0.552137, .green = 0.999023, .blue = 0.359707 },
+	{ .red = 0.656654, .green = 0.999512, .blue = 0.344567 },
+	{ .red = 0.766789, .green = 0.999023, .blue = 0.325763 },
+	{ .red = 0.883028, .green = 0.999023, .blue = 0.295238 },
+	{ .red = 0.999512, .green = 0.988278, .blue = 0.257631 },
+	{ .red = 0.999267, .green = 0.896215, .blue = 0.342613 },
+	{ .red = 0.999756, .green = 0.830769, .blue = 0.359219 },
+	{ .red = 0.999023, .green = 0.778755, .blue = 0.362637 },
+	{ .red = 0.999512, .green = 0.736508, .blue = 0.358974 },
+	{ .red = 0.998779, .green = 0.699878, .blue = 0.351893 },
+	{ .red = 0.998779, .green = 0.667643, .blue = 0.342125 },
+	{ .red = 0.999023, .green = 0.638584, .blue = 0.330891 },
+	{ .red = 0.041026, .green = 0.956288, .blue = 0.343101 },
+	{ .red = 0.058120, .green = 0.960195, .blue = 0.339438 },
+	{ .red = 0.053480, .green = 0.979731, .blue = 0.323565 },
+	{ .red = 0.243712, .green = 0.999023, .blue = 0.324054 },
+	{ .red = 0.434432, .green = 0.999023, .blue = 0.364103 },
+	{ .red = 0.541880, .green = 0.999512, .blue = 0.377045 },
+	{ .red = 0.621978, .green = 0.999023, .blue = 0.364835 },
+	{ .red = 0.708669, .green = 0.998535, .blue = 0.350916 },
+	{ .red = 0.801465, .green = 0.999267, .blue = 0.332357 },
+	{ .red = 0.899389, .green = 0.998779, .blue = 0.312332 },
+	{ .red = 0.999512, .green = 0.992674, .blue = 0.273260 },
+	{ .red = 0.999267, .green = 0.908425, .blue = 0.327228 },
+	{ .red = 0.999267, .green = 0.844444, .blue = 0.337729 },
+	{ .red = 0.999512, .green = 0.793162, .blue = 0.337973 },
+	{ .red = 0.999023, .green = 0.749939, .blue = 0.333333 },
+	{ .red = 0.998779, .green = 0.712332, .blue = 0.325763 },
+	{ .red = 0.999267, .green = 0.679365, .blue = 0.315995 },
+	{ .red = 0.045665, .green = 0.970940, .blue = 0.320391 },
+	{ .red = 0.069109, .green = 0.973382, .blue = 0.317460 },
+	{ .red = 0.062759, .green = 0.990232, .blue = 0.302564 },
+	{ .red = 0.273260, .green = 0.998779, .blue = 0.320391 },
+	{ .red = 0.435165, .green = 0.999023, .blue = 0.363858 },
+	{ .red = 0.533578, .green = 0.999267, .blue = 0.385104 },
+	{ .red = 0.596581, .green = 0.998779, .blue = 0.373871 },
+	{ .red = 0.666422, .green = 0.999023, .blue = 0.359951 },
+	{ .red = 0.742857, .green = 0.998779, .blue = 0.346032 },
+	{ .red = 0.824664, .green = 0.999512, .blue = 0.330403 },
+	{ .red = 0.910623, .green = 0.998779, .blue = 0.317216 },
+	{ .red = 0.997558, .green = 0.993895, .blue = 0.281807 },
+	{ .red = 0.999023, .green = 0.916972, .blue = 0.310867 },
+	{ .red = 0.999512, .green = 0.855922, .blue = 0.315995 },
+	{ .red = 0.998779, .green = 0.804884, .blue = 0.314530 },
+	{ .red = 0.999267, .green = 0.761905, .blue = 0.308669 },
+	{ .red = 0.998779, .green = 0.723810, .blue = 0.301343 },
+	{ .red = 0.016606, .green = 0.981929, .blue = 0.298413 },
+	{ .red = 0.025153, .green = 0.985592, .blue = 0.294994 },
+	{ .red = 0.119170, .green = 0.989988, .blue = 0.287912 },
+	{ .red = 0.290598, .green = 0.999023, .blue = 0.315018 },
+	{ .red = 0.431013, .green = 0.999023, .blue = 0.358486 },
+	{ .red = 0.524054, .green = 0.999023, .blue = 0.385104 },
+	{ .red = 0.574603, .green = 0.999023, .blue = 0.373871 },
+	{ .red = 0.632479, .green = 0.999267, .blue = 0.360684 },
+	{ .red = 0.697192, .green = 0.999267, .blue = 0.347741 },
+	{ .red = 0.767033, .green = 0.999023, .blue = 0.334799 },
+	{ .red = 0.841514, .green = 0.999512, .blue = 0.321856 },
+	{ .red = 0.918681, .green = 0.998779, .blue = 0.312576 },
+	{ .red = 0.995849, .green = 0.994383, .blue = 0.281074 },
+	{ .red = 0.999267, .green = 0.924298, .blue = 0.292796 },
+	{ .red = 0.999267, .green = 0.864957, .blue = 0.294750 },
+	{ .red = 0.998779, .green = 0.815140, .blue = 0.292063 },
+	{ .red = 0.999512, .green = 0.772650, .blue = 0.286203 },
+	{ .red = 0.100366, .green = 0.982418, .blue = 0.283516 },
+	{ .red = 0.106960, .green = 0.984371, .blue = 0.280830 },
+	{ .red = 0.140171, .green = 0.998046, .blue = 0.275214 },
+	{ .red = 0.298901, .green = 0.998779, .blue = 0.306960 },
+	{ .red = 0.422711, .green = 0.999267, .blue = 0.348718 },
+	{ .red = 0.511111, .green = 0.998779, .blue = 0.378755 },
+	{ .red = 0.553602, .green = 0.998779, .blue = 0.368010 },
+	{ .red = 0.603419, .green = 0.998779, .blue = 0.356288 },
+	{ .red = 0.658852, .green = 0.999512, .blue = 0.342857 },
+	{ .red = 0.719902, .green = 0.998779, .blue = 0.331868 },
+	{ .red = 0.785348, .green = 0.999023, .blue = 0.319902 },
+	{ .red = 0.854212, .green = 0.999756, .blue = 0.308181 },
+	{ .red = 0.925275, .green = 0.999267, .blue = 0.300855 },
+	{ .red = 0.994872, .green = 0.994628, .blue = 0.273504 },
+	{ .red = 0.998535, .green = 0.929426, .blue = 0.275458 },
+	{ .red = 0.999512, .green = 0.873260, .blue = 0.274481 },
+	{ .red = 0.999267, .green = 0.824664, .blue = 0.271062 },
+	{ .red = 0.089377, .green = 0.988767, .blue = 0.264469 },
+	{ .red = 0.097192, .green = 0.990476, .blue = 0.262271 },
+	{ .red = 0.170940, .green = 0.999267, .blue = 0.266911 },
+	{ .red = 0.300366, .green = 0.998779, .blue = 0.296947 },
+	{ .red = 0.410745, .green = 0.999756, .blue = 0.335531 },
+	{ .red = 0.494994, .green = 0.999267, .blue = 0.366789 },
+	{ .red = 0.532357, .green = 0.999023, .blue = 0.357265 },
+	{ .red = 0.575580, .green = 0.999756, .blue = 0.345543 },
+	{ .red = 0.625397, .green = 0.999023, .blue = 0.334799 },
+	{ .red = 0.679609, .green = 0.999512, .blue = 0.322833 },
+	{ .red = 0.738217, .green = 0.999267, .blue = 0.312088 },
+	{ .red = 0.799756, .green = 0.998779, .blue = 0.302808 },
+	{ .red = 0.864225, .green = 0.999267, .blue = 0.292796 },
+	{ .red = 0.930403, .green = 0.999267, .blue = 0.286447 },
+	{ .red = 0.994139, .green = 0.994628, .blue = 0.262271 },
+	{ .red = 0.998535, .green = 0.933822, .blue = 0.258364 },
+	{ .red = 0.999267, .green = 0.880098, .blue = 0.255922 },
+	{ .red = 0.123077, .green = 0.986325, .blue = 0.252503 },
+	{ .red = 0.130647, .green = 0.987790, .blue = 0.251038 },
+	{ .red = 0.190965, .green = 0.998535, .blue = 0.258608 },
+	{ .red = 0.298901, .green = 0.998779, .blue = 0.286203 },
+	{ .red = 0.397070, .green = 0.999756, .blue = 0.321123 },
+	{ .red = 0.476679, .green = 0.999512, .blue = 0.351893 },
+	{ .red = 0.511111, .green = 0.998535, .blue = 0.344078 },
+	{ .red = 0.550183, .green = 0.999267, .blue = 0.333578 },
+	{ .red = 0.594872, .green = 0.999267, .blue = 0.323321 },
+	{ .red = 0.643956, .green = 0.999756, .blue = 0.312332 },
+	{ .red = 0.697192, .green = 0.999512, .blue = 0.302076 },
+	{ .red = 0.753358, .green = 0.999267, .blue = 0.293040 },
+	{ .red = 0.811722, .green = 0.998535, .blue = 0.285226 },
+	{ .red = 0.872527, .green = 0.999023, .blue = 0.276679 },
+	{ .red = 0.934310, .green = 0.999267, .blue = 0.270818 },
+	{ .red = 0.993651, .green = 0.994383, .blue = 0.248840 },
+	{ .red = 0.998535, .green = 0.937973, .blue = 0.242491 },
+	{ .red = 0.126252, .green = 0.988767, .blue = 0.238339 },
+	{ .red = 0.141392, .green = 0.992186, .blue = 0.239805 },
+	{ .red = 0.199267, .green = 0.999023, .blue = 0.248596 },
+	{ .red = 0.294750, .green = 0.998779, .blue = 0.274969 },
+	{ .red = 0.382906, .green = 0.999512, .blue = 0.306227 },
+	{ .red = 0.458120, .green = 0.999267, .blue = 0.336020 },
+	{ .red = 0.489621, .green = 0.998779, .blue = 0.328938 },
+	{ .red = 0.525763, .green = 0.999267, .blue = 0.319902 },
+	{ .red = 0.566789, .green = 0.999512, .blue = 0.310379 },
+	{ .red = 0.611966, .green = 0.999756, .blue = 0.300611 },
+	{ .red = 0.661050, .green = 0.999512, .blue = 0.291087 },
+	{ .red = 0.712821, .green = 0.999512, .blue = 0.282051 },
+	{ .red = 0.766545, .green = 0.998779, .blue = 0.274969 },
+	{ .red = 0.822711, .green = 0.999023, .blue = 0.266667 },
+	{ .red = 0.880098, .green = 0.999267, .blue = 0.259829 },
+	{ .red = 0.938217, .green = 0.999267, .blue = 0.254945 },
+	{ .red = 0.993407, .green = 0.994383, .blue = 0.235165 },
+	{ .red = 0.026618, .green = 0.072039, .blue = 0.524542 },
+	{ .red = 0.152381, .green = 0.013675, .blue = 0.548230 },
+	{ .red = 0.309646, .green = 0.013919, .blue = 0.561172 },
+	{ .red = 0.461294, .green = 0.017338, .blue = 0.580220 },
+	{ .red = 0.584860, .green = 0.014652, .blue = 0.584615 },
+	{ .red = 0.673504, .green = 0.016361, .blue = 0.535043 },
+	{ .red = 0.740171, .green = 0.012698, .blue = 0.489866 },
+	{ .red = 0.794872, .green = 0.012698, .blue = 0.452991 },
+	{ .red = 0.848840, .green = 0.015140, .blue = 0.425641 },
+	{ .red = 0.896703, .green = 0.015629, .blue = 0.402198 },
+	{ .red = 0.936996, .green = 0.017338, .blue = 0.380464 },
+	{ .red = 0.968742, .green = 0.017094, .blue = 0.359463 },
+	{ .red = 0.986813, .green = 0.037118, .blue = 0.338217 },
+	{ .red = 0.996093, .green = 0.052015, .blue = 0.317460 },
+	{ .red = 0.999512, .green = 0.061538, .blue = 0.297436 },
+	{ .red = 0.995604, .green = 0.071306, .blue = 0.277900 },
+	{ .red = 0.996093, .green = 0.080342, .blue = 0.262027 },
+	{ .red = 0.000000, .green = 0.131868, .blue = 0.519414 },
+	{ .red = 0.149939, .green = 0.075702, .blue = 0.603419 },
+	{ .red = 0.312576, .green = 0.102320, .blue = 0.593651 },
+	{ .red = 0.474481, .green = 0.074237, .blue = 0.614652 },
+	{ .red = 0.620513, .green = 0.010256, .blue = 0.626618 },
+	{ .red = 0.728938, .green = 0.013431, .blue = 0.576068 },
+	{ .red = 0.799267, .green = 0.015629, .blue = 0.521612 },
+	{ .red = 0.851282, .green = 0.018559, .blue = 0.476923 },
+	{ .red = 0.903297, .green = 0.018559, .blue = 0.445177 },
+	{ .red = 0.948962, .green = 0.014164, .blue = 0.418315 },
+	{ .red = 0.980220, .green = 0.026129, .blue = 0.391941 },
+	{ .red = 0.986081, .green = 0.047619, .blue = 0.361905 },
+	{ .red = 0.992186, .green = 0.061050, .blue = 0.336996 },
+	{ .red = 0.997802, .green = 0.070085, .blue = 0.315507 },
+	{ .red = 0.999267, .green = 0.089621, .blue = 0.297192 },
+	{ .red = 0.999023, .green = 0.110867, .blue = 0.281807 },
+	{ .red = 0.999512, .green = 0.126496, .blue = 0.268620 },
+	{ .red = 0.010501, .green = 0.247863, .blue = 0.462759 },
+	{ .red = 0.109158, .green = 0.267155, .blue = 0.613675 },
+	{ .red = 0.301587, .green = 0.276190, .blue = 0.595604 },
+	{ .red = 0.465201, .green = 0.278144, .blue = 0.600977 },
+	{ .red = 0.629548, .green = 0.267643, .blue = 0.627839 },
+	{ .red = 0.807326, .green = 0.247863, .blue = 0.628816 },
+	{ .red = 0.982418, .green = 0.221490, .blue = 0.623932 },
+	{ .red = 0.999267, .green = 0.211722, .blue = 0.548230 },
+	{ .red = 0.999756, .green = 0.210745, .blue = 0.490110 },
+	{ .red = 0.999267, .green = 0.211233, .blue = 0.445910 },
+	{ .red = 0.999512, .green = 0.212698, .blue = 0.411722 },
+	{ .red = 0.999267, .green = 0.214652, .blue = 0.383394 },
+	{ .red = 0.998535, .green = 0.216117, .blue = 0.359463 },
+	{ .red = 0.999756, .green = 0.217338, .blue = 0.339194 },
+	{ .red = 0.999023, .green = 0.218071, .blue = 0.320391 },
+	{ .red = 0.999512, .green = 0.219048, .blue = 0.304274 },
+	{ .red = 0.999512, .green = 0.219048, .blue = 0.289377 },
+	{ .red = 0.012943, .green = 0.401954, .blue = 0.514530 },
+	{ .red = 0.021734, .green = 0.403419, .blue = 0.535775 },
+	{ .red = 0.252503, .green = 0.432479, .blue = 0.609280 },
+	{ .red = 0.449084, .green = 0.434676, .blue = 0.593162 },
+	{ .red = 0.614652, .green = 0.434432, .blue = 0.607814 },
+	{ .red = 0.796825, .green = 0.422955, .blue = 0.610745 },
+	{ .red = 0.973871, .green = 0.409280, .blue = 0.608059 },
+	{ .red = 0.998535, .green = 0.399023, .blue = 0.557265 },
+	{ .red = 0.998779, .green = 0.389988, .blue = 0.514774 },
+	{ .red = 0.999756, .green = 0.381197, .blue = 0.481074 },
+	{ .red = 0.999512, .green = 0.372650, .blue = 0.452015 },
+	{ .red = 0.999756, .green = 0.364347, .blue = 0.426618 },
+	{ .red = 0.998535, .green = 0.355556, .blue = 0.403419 },
+	{ .red = 0.999267, .green = 0.347009, .blue = 0.382418 },
+	{ .red = 0.999512, .green = 0.338217, .blue = 0.362393 },
+	{ .red = 0.999023, .green = 0.329426, .blue = 0.343834 },
+	{ .red = 0.999023, .green = 0.321123, .blue = 0.326496 },
+	{ .red = 0.023443, .green = 0.622466, .blue = 0.622711 },
+	{ .red = 0.021978, .green = 0.617827, .blue = 0.618559 },
+	{ .red = 0.017827, .green = 0.599267, .blue = 0.602442 },
+	{ .red = 0.381929, .green = 0.594139, .blue = 0.595849 },
+	{ .red = 0.590965, .green = 0.590232, .blue = 0.590476 },
+	{ .red = 0.778755, .green = 0.583639, .blue = 0.589744 },
+	{ .red = 0.955311, .green = 0.573138, .blue = 0.587057 },
+	{ .red = 0.999267, .green = 0.559219, .blue = 0.570696 },
+	{ .red = 0.999023, .green = 0.545055, .blue = 0.549939 },
+	{ .red = 0.999023, .green = 0.530647, .blue = 0.528694 },
+	{ .red = 0.999023, .green = 0.515995, .blue = 0.506960 },
+	{ .red = 0.999267, .green = 0.500855, .blue = 0.485226 },
+	{ .red = 0.999756, .green = 0.485470, .blue = 0.463004 },
+	{ .red = 0.998535, .green = 0.469841, .blue = 0.441026 },
+	{ .red = 0.998779, .green = 0.454457, .blue = 0.419536 },
+	{ .red = 0.998779, .green = 0.439072, .blue = 0.398291 },
+	{ .red = 0.998779, .green = 0.423932, .blue = 0.378022 },
+	{ .red = 0.023687, .green = 0.717216, .blue = 0.599512 },
+	{ .red = 0.021978, .green = 0.719902, .blue = 0.597558 },
+	{ .red = 0.025397, .green = 0.732601, .blue = 0.589744 },
+	{ .red = 0.294994, .green = 0.748718, .blue = 0.580708 },
+	{ .red = 0.549451, .green = 0.741636, .blue = 0.575824 },
+	{ .red = 0.736996, .green = 0.733089, .blue = 0.575824 },
+	{ .red = 0.906227, .green = 0.719414, .blue = 0.566056 },
+	{ .red = 0.999023, .green = 0.697192, .blue = 0.568498 },
+	{ .red = 0.998046, .green = 0.678877, .blue = 0.581441 },
+	{ .red = 0.998291, .green = 0.659829, .blue = 0.576801 },
+	{ .red = 0.998779, .green = 0.640781, .blue = 0.564347 },
+	{ .red = 0.998779, .green = 0.621734, .blue = 0.547497 },
+	{ .red = 0.998291, .green = 0.601954, .blue = 0.527717 },
+	{ .red = 0.999512, .green = 0.582173, .blue = 0.505983 },
+	{ .red = 0.999023, .green = 0.562149, .blue = 0.483516 },
+	{ .red = 0.998291, .green = 0.541880, .blue = 0.460562 },
+	{ .red = 0.999023, .green = 0.522344, .blue = 0.437607 },
+	{ .red = 0.016850, .green = 0.799756, .blue = 0.576068 },
+	{ .red = 0.012454, .green = 0.804884, .blue = 0.574115 },
+	{ .red = 0.018071, .green = 0.826862, .blue = 0.566789 },
+	{ .red = 0.125763, .green = 0.883028, .blue = 0.552869 },
+	{ .red = 0.483028, .green = 0.870574, .blue = 0.545788 },
+	{ .red = 0.686691, .green = 0.854701, .blue = 0.540904 },
+	{ .red = 0.845665, .green = 0.839072, .blue = 0.536508 },
+	{ .red = 0.996581, .green = 0.816606, .blue = 0.523810 },
+	{ .red = 0.998535, .green = 0.764835, .blue = 0.559951 },
+	{ .red = 0.998291, .green = 0.736752, .blue = 0.575336 },
+	{ .red = 0.999023, .green = 0.719658, .blue = 0.582662 },
+	{ .red = 0.999512, .green = 0.706471, .blue = 0.583394 },
+	{ .red = 0.999267, .green = 0.694261, .blue = 0.579487 },
+	{ .red = 0.998535, .green = 0.679853, .blue = 0.568987 },
+	{ .red = 0.998291, .green = 0.656654, .blue = 0.546520 },
+	{ .red = 0.999756, .green = 0.633455, .blue = 0.521612 },
+	{ .red = 0.999756, .green = 0.610989, .blue = 0.497924 },
+	{ .red = 0.023443, .green = 0.860562, .blue = 0.545055 },
+	{ .red = 0.024664, .green = 0.866178, .blue = 0.542857 },
+	{ .red = 0.021978, .green = 0.889621, .blue = 0.534554 },
+	{ .red = 0.031013, .green = 0.948962, .blue = 0.517216 },
+	{ .red = 0.391209, .green = 0.972405, .blue = 0.503541 },
+	{ .red = 0.620513, .green = 0.952869, .blue = 0.495726 },
+	{ .red = 0.779731, .green = 0.934554, .blue = 0.493040 },
+	{ .red = 0.921856, .green = 0.912821, .blue = 0.484737 },
+	{ .red = 0.998535, .green = 0.859829, .blue = 0.509646 },
+	{ .red = 0.999023, .green = 0.804640, .blue = 0.542125 },
+	{ .red = 0.999267, .green = 0.769475, .blue = 0.553846 },
+	{ .red = 0.999756, .green = 0.743346, .blue = 0.555800 },
+	{ .red = 0.998291, .green = 0.721612, .blue = 0.552381 },
+	{ .red = 0.999023, .green = 0.703541, .blue = 0.545788 },
+	{ .red = 0.998535, .green = 0.685958, .blue = 0.536020 },
+	{ .red = 0.999267, .green = 0.668620, .blue = 0.523077 },
+	{ .red = 0.999023, .green = 0.651282, .blue = 0.508425 },
+	{ .red = 0.026618, .green = 0.904274, .blue = 0.511111 },
+	{ .red = 0.027106, .green = 0.909890, .blue = 0.508913 },
+	{ .red = 0.018803, .green = 0.931868, .blue = 0.499878 },
+	{ .red = 0.078144, .green = 0.980464, .blue = 0.481563 },
+	{ .red = 0.379976, .green = 0.998779, .blue = 0.482295 },
+	{ .red = 0.575580, .green = 0.998535, .blue = 0.483272 },
+	{ .red = 0.710379, .green = 0.999267, .blue = 0.459585 },
+	{ .red = 0.847131, .green = 0.988278, .blue = 0.438584 },
+	{ .red = 0.973871, .green = 0.962637, .blue = 0.429548 },
+	{ .red = 0.998535, .green = 0.885714, .blue = 0.492308 },
+	{ .red = 0.999023, .green = 0.829548, .blue = 0.517460 },
+	{ .red = 0.998779, .green = 0.789988, .blue = 0.525275 },
+	{ .red = 0.999023, .green = 0.758974, .blue = 0.524542 },
+	{ .red = 0.998291, .green = 0.732357, .blue = 0.518437 },
+	{ .red = 0.999267, .green = 0.708669, .blue = 0.508181 },
+	{ .red = 0.999756, .green = 0.686447, .blue = 0.495238 },
+	{ .red = 0.998291, .green = 0.666422, .blue = 0.482784 },
+	{ .red = 0.028327, .green = 0.935531, .blue = 0.477411 },
+	{ .red = 0.031502, .green = 0.940415, .blue = 0.474969 },
+	{ .red = 0.050794, .green = 0.959219, .blue = 0.466178 },
+	{ .red = 0.136508, .green = 0.995849, .blue = 0.451038 },
+	{ .red = 0.405128, .green = 0.999267, .blue = 0.473260 },
+	{ .red = 0.573382, .green = 0.998779, .blue = 0.498413 },
+	{ .red = 0.678632, .green = 0.999267, .blue = 0.492552 },
+	{ .red = 0.774603, .green = 0.998779, .blue = 0.468620 },
+	{ .red = 0.883272, .green = 0.999267, .blue = 0.434432 },
+	{ .red = 0.998535, .green = 0.987790, .blue = 0.396093 },
+	{ .red = 0.999023, .green = 0.902564, .blue = 0.470085 },
+	{ .red = 0.999267, .green = 0.846398, .blue = 0.488400 },
+	{ .red = 0.998779, .green = 0.803907, .blue = 0.492796 },
+	{ .red = 0.999023, .green = 0.769719, .blue = 0.489377 },
+	{ .red = 0.999023, .green = 0.740171, .blue = 0.482051 },
+	{ .red = 0.999023, .green = 0.713553, .blue = 0.471306 },
+	{ .red = 0.999267, .green = 0.689133, .blue = 0.458608 },
+	{ .red = 0.046886, .green = 0.956288, .blue = 0.446154 },
+	{ .red = 0.050061, .green = 0.960440, .blue = 0.443712 },
+	{ .red = 0.062271, .green = 0.976557, .blue = 0.434921 },
+	{ .red = 0.211477, .green = 0.999267, .blue = 0.432234 },
+	{ .red = 0.419536, .green = 0.999512, .blue = 0.463492 },
+	{ .red = 0.568742, .green = 0.998779, .blue = 0.500366 },
+	{ .red = 0.663736, .green = 0.998779, .blue = 0.511355 },
+	{ .red = 0.731868, .green = 0.998291, .blue = 0.490110 },
+	{ .red = 0.811233, .green = 0.998291, .blue = 0.466667 },
+	{ .red = 0.901832, .green = 0.999267, .blue = 0.439316 },
+	{ .red = 0.997558, .green = 0.991453, .blue = 0.399267 },
+	{ .red = 0.999267, .green = 0.914042, .blue = 0.445177 },
+	{ .red = 0.999267, .green = 0.858120, .blue = 0.457387 },
+	{ .red = 0.999267, .green = 0.814408, .blue = 0.458364 },
+	{ .red = 0.999512, .green = 0.778022, .blue = 0.453968 },
+	{ .red = 0.998535, .green = 0.746032, .blue = 0.446398 },
+	{ .red = 0.998779, .green = 0.717949, .blue = 0.435653 },
+	{ .red = 0.049573, .green = 0.970940, .blue = 0.416850 },
+	{ .red = 0.060806, .green = 0.973871, .blue = 0.414652 },
+	{ .red = 0.090598, .green = 0.985836, .blue = 0.406838 },
+	{ .red = 0.256654, .green = 0.999512, .blue = 0.417094 },
+	{ .red = 0.426618, .green = 0.999267, .blue = 0.452015 },
+	{ .red = 0.560440, .green = 0.998535, .blue = 0.493529 },
+	{ .red = 0.652503, .green = 0.998535, .blue = 0.517705 },
+	{ .red = 0.701832, .green = 0.999756, .blue = 0.495726 },
+	{ .red = 0.763370, .green = 0.998779, .blue = 0.475946 },
+	{ .red = 0.834188, .green = 0.999512, .blue = 0.453480 },
+	{ .red = 0.913309, .green = 0.998779, .blue = 0.435409 },
+	{ .red = 0.997070, .green = 0.993895, .blue = 0.392186 },
+	{ .red = 0.998779, .green = 0.921856, .blue = 0.419536 },
+	{ .red = 0.998779, .green = 0.866667, .blue = 0.426618 },
+	{ .red = 0.999267, .green = 0.822711, .blue = 0.425397 },
+	{ .red = 0.999023, .green = 0.785104, .blue = 0.420269 },
+	{ .red = 0.999267, .green = 0.752381, .blue = 0.412210 },
+	{ .red = 0.079609, .green = 0.978510, .blue = 0.390720 },
+	{ .red = 0.084005, .green = 0.981441, .blue = 0.388523 },
+	{ .red = 0.119414, .green = 0.989011, .blue = 0.382173 },
+	{ .red = 0.281807, .green = 0.999512, .blue = 0.401954 },
+	{ .red = 0.427595, .green = 0.998535, .blue = 0.438095 },
+	{ .red = 0.547741, .green = 0.998535, .blue = 0.480342 },
+	{ .red = 0.639072, .green = 0.999267, .blue = 0.513553 },
+	{ .red = 0.677900, .green = 0.999267, .blue = 0.494261 },
+	{ .red = 0.726496, .green = 0.999023, .blue = 0.474725 },
+	{ .red = 0.783883, .green = 0.998779, .blue = 0.455189 },
+	{ .red = 0.849573, .green = 0.999512, .blue = 0.435409 },
+	{ .red = 0.920635, .green = 0.998291, .blue = 0.422955 },
+	{ .red = 0.997802, .green = 0.996093, .blue = 0.376068 },
+	{ .red = 0.998779, .green = 0.927961, .blue = 0.393162 },
+	{ .red = 0.998779, .green = 0.873993, .blue = 0.396825 },
+	{ .red = 0.998535, .green = 0.829548, .blue = 0.394628 },
+	{ .red = 0.998291, .green = 0.791453, .blue = 0.389255 },
+	{ .red = 0.096215, .green = 0.983394, .blue = 0.366789 },
+	{ .red = 0.099389, .green = 0.986081, .blue = 0.364835 },
+	{ .red = 0.144811, .green = 0.995360, .blue = 0.362882 },
+	{ .red = 0.294994, .green = 0.999023, .blue = 0.386813 },
+	{ .red = 0.420269, .green = 0.999756, .blue = 0.421001 },
+	{ .red = 0.531624, .green = 0.998779, .blue = 0.463004 },
+	{ .red = 0.622955, .green = 1.000000, .blue = 0.502076 },
+	{ .red = 0.655678, .green = 0.998779, .blue = 0.485714 },
+	{ .red = 0.695238, .green = 0.999267, .blue = 0.466422 },
+	{ .red = 0.743346, .green = 0.998779, .blue = 0.448352 },
+	{ .red = 0.798779, .green = 0.999267, .blue = 0.430037 },
+	{ .red = 0.860562, .green = 0.999023, .blue = 0.414896 },
+	{ .red = 0.926740, .green = 0.999023, .blue = 0.403175 },
+	{ .red = 0.999267, .green = 0.998535, .blue = 0.353602 },
+	{ .red = 0.998779, .green = 0.932845, .blue = 0.367766 },
+	{ .red = 0.999512, .green = 0.880830, .blue = 0.368742 },
+	{ .red = 0.999756, .green = 0.836874, .blue = 0.365812 },
+	{ .red = 0.108669, .green = 0.986325, .blue = 0.345299 },
+	{ .red = 0.114042, .green = 0.988034, .blue = 0.343590 },
+	{ .red = 0.167033, .green = 0.999267, .blue = 0.346276 },
+	{ .red = 0.298657, .green = 0.999267, .blue = 0.370452 },
+	{ .red = 0.411722, .green = 0.999023, .blue = 0.403907 },
+	{ .red = 0.512576, .green = 0.999512, .blue = 0.442735 },
+	{ .red = 0.600733, .green = 0.999023, .blue = 0.482540 },
+	{ .red = 0.632234, .green = 0.999267, .blue = 0.470818 },
+	{ .red = 0.666667, .green = 0.999267, .blue = 0.453724 },
+	{ .red = 0.708425, .green = 0.998779, .blue = 0.437118 },
+	{ .red = 0.756532, .green = 0.999023, .blue = 0.419780 },
+	{ .red = 0.810501, .green = 0.999267, .blue = 0.404151 },
+	{ .red = 0.869597, .green = 0.999512, .blue = 0.390476 },
+	{ .red = 0.931624, .green = 0.999267, .blue = 0.381685 },
+	{ .red = 0.998291, .green = 0.998046, .blue = 0.336264 },
+	{ .red = 0.999023, .green = 0.936996, .blue = 0.343590 },
+	{ .red = 0.999023, .green = 0.886203, .blue = 0.343590 },
+	{ .red = 0.107937, .green = 0.989744, .blue = 0.324542 },
+	{ .red = 0.115751, .green = 0.990965, .blue = 0.323321 },
+	{ .red = 0.193651, .green = 0.997558, .blue = 0.332601 },
+	{ .red = 0.298168, .green = 0.999267, .blue = 0.354335 },
+	{ .red = 0.400244, .green = 0.998535, .blue = 0.385592 },
+	{ .red = 0.493040, .green = 0.999756, .blue = 0.421978 },
+	{ .red = 0.576557, .green = 0.999023, .blue = 0.459829 },
+	{ .red = 0.608791, .green = 0.999267, .blue = 0.453236 },
+	{ .red = 0.639805, .green = 0.998779, .blue = 0.438584 },
+	{ .red = 0.676435, .green = 0.999512, .blue = 0.421978 },
+	{ .red = 0.719658, .green = 0.999023, .blue = 0.407326 },
+	{ .red = 0.767766, .green = 0.999267, .blue = 0.392186 },
+	{ .red = 0.820513, .green = 0.999512, .blue = 0.378266 },
+	{ .red = 0.876679, .green = 0.999512, .blue = 0.366789 },
+	{ .red = 0.935775, .green = 0.999512, .blue = 0.358242 },
+	{ .red = 0.995849, .green = 0.996581, .blue = 0.321856 },
+	{ .red = 0.999267, .green = 0.940659, .blue = 0.320635 },
+	{ .red = 0.090598, .green = 0.994872, .blue = 0.304274 },
+	{ .red = 0.108181, .green = 0.998535, .blue = 0.305250 },
+	{ .red = 0.199512, .green = 0.999267, .blue = 0.317216 },
+	{ .red = 0.294994, .green = 0.998779, .blue = 0.338462 },
+	{ .red = 0.386569, .green = 0.999023, .blue = 0.367033 },
+	{ .red = 0.474237, .green = 0.999267, .blue = 0.401954 },
+	{ .red = 0.551648, .green = 0.999267, .blue = 0.436386 },
+	{ .red = 0.585348, .green = 0.999023, .blue = 0.434188 },
+	{ .red = 0.613919, .green = 0.998779, .blue = 0.421245 },
+	{ .red = 0.647131, .green = 0.999512, .blue = 0.406105 },
+	{ .red = 0.686447, .green = 0.998779, .blue = 0.392918 },
+	{ .red = 0.730159, .green = 0.999023, .blue = 0.378999 },
+	{ .red = 0.778022, .green = 0.998779, .blue = 0.367033 },
+	{ .red = 0.829304, .green = 0.999512, .blue = 0.354090 },
+	{ .red = 0.883516, .green = 0.999756, .blue = 0.344078 },
+	{ .red = 0.938950, .green = 0.999512, .blue = 0.337729 },
+	{ .red = 0.994383, .green = 0.995849, .blue = 0.306471 },
+	{ .red = 0.000000, .green = 0.082051, .blue = 0.585348 },
+	{ .red = 0.135775, .green = 0.011966, .blue = 0.620024 },
+	{ .red = 0.285470, .green = 0.015385, .blue = 0.642979 },
+	{ .red = 0.425641, .green = 0.014896, .blue = 0.650061 },
+	{ .red = 0.540904, .green = 0.011722, .blue = 0.642979 },
+	{ .red = 0.656654, .green = 0.013187, .blue = 0.655433 },
+	{ .red = 0.732112, .green = 0.019048, .blue = 0.606349 },
+	{ .red = 0.793162, .green = 0.011722, .blue = 0.564103 },
+	{ .red = 0.843223, .green = 0.018071, .blue = 0.527228 },
+	{ .red = 0.882540, .green = 0.017827, .blue = 0.493284 },
+	{ .red = 0.919414, .green = 0.012698, .blue = 0.464713 },
+	{ .red = 0.952625, .green = 0.016606, .blue = 0.440293 },
+	{ .red = 0.978999, .green = 0.017582, .blue = 0.416850 },
+	{ .red = 0.991453, .green = 0.037851, .blue = 0.391941 },
+	{ .red = 0.989744, .green = 0.053480, .blue = 0.365568 },
+	{ .red = 0.992430, .green = 0.064469, .blue = 0.343834 },
+	{ .red = 0.995604, .green = 0.069841, .blue = 0.324298 },
+	{ .red = 0.000000, .green = 0.124786, .blue = 0.581929 },
+	{ .red = 0.139438, .green = 0.014896, .blue = 0.695482 },
+	{ .red = 0.311600, .green = 0.044200, .blue = 0.741148 },
+	{ .red = 0.473260, .green = 0.012210, .blue = 0.750427 },
+	{ .red = 0.585836, .green = 0.015873, .blue = 0.710134 },
+	{ .red = 0.701832, .green = 0.015385, .blue = 0.705495 },
+	{ .red = 0.785592, .green = 0.016850, .blue = 0.650061 },
+	{ .red = 0.846642, .green = 0.017582, .blue = 0.598291 },
+	{ .red = 0.895971, .green = 0.011966, .blue = 0.555067 },
+	{ .red = 0.928449, .green = 0.019292, .blue = 0.513553 },
+	{ .red = 0.962393, .green = 0.014896, .blue = 0.481563 },
+	{ .red = 0.985836, .green = 0.024420, .blue = 0.451038 },
+	{ .red = 0.995360, .green = 0.042735, .blue = 0.420513 },
+	{ .red = 0.998779, .green = 0.056410, .blue = 0.392430 },
+	{ .red = 0.999267, .green = 0.081319, .blue = 0.368498 },
+	{ .red = 0.999512, .green = 0.105495, .blue = 0.348718 },
+	{ .red = 0.999023, .green = 0.122344, .blue = 0.331136 },
+	{ .red = 0.006105, .green = 0.217094, .blue = 0.501099 },
+	{ .red = 0.124054, .green = 0.244689, .blue = 0.767033 },
+	{ .red = 0.302808, .green = 0.260562, .blue = 0.746520 },
+	{ .red = 0.466178, .green = 0.267155, .blue = 0.743590 },
+	{ .red = 0.628816, .green = 0.258608, .blue = 0.764103 },
+	{ .red = 0.792186, .green = 0.238095, .blue = 0.795360 },
+	{ .red = 0.968498, .green = 0.209768, .blue = 0.796581 },
+	{ .red = 0.998779, .green = 0.205617, .blue = 0.697680 },
+	{ .red = 0.999023, .green = 0.208303, .blue = 0.615629 },
+	{ .red = 0.999756, .green = 0.210012, .blue = 0.555800 },
+	{ .red = 0.999756, .green = 0.211966, .blue = 0.509402 },
+	{ .red = 0.999512, .green = 0.214164, .blue = 0.472039 },
+	{ .red = 0.999267, .green = 0.215873, .blue = 0.441026 },
+	{ .red = 0.999267, .green = 0.217338, .blue = 0.414408 },
+	{ .red = 0.999267, .green = 0.218803, .blue = 0.391209 },
+	{ .red = 0.998779, .green = 0.219048, .blue = 0.369963 },
+	{ .red = 0.998535, .green = 0.219780, .blue = 0.351648 },
+	{ .red = 0.015629, .green = 0.348474, .blue = 0.548230 },
+	{ .red = 0.008791, .green = 0.367521, .blue = 0.624176 },
+	{ .red = 0.281807, .green = 0.416117, .blue = 0.761172 },
+	{ .red = 0.453480, .green = 0.425153, .blue = 0.742613 },
+	{ .red = 0.616361, .green = 0.427595, .blue = 0.748718 },
+	{ .red = 0.780952, .green = 0.421001, .blue = 0.774603 },
+	{ .red = 0.959463, .green = 0.406105, .blue = 0.779976 },
+	{ .red = 0.998535, .green = 0.398046, .blue = 0.700366 },
+	{ .red = 0.999267, .green = 0.390965, .blue = 0.632723 },
+	{ .red = 0.998779, .green = 0.383639, .blue = 0.583394 },
+	{ .red = 0.999512, .green = 0.375580, .blue = 0.544078 },
+	{ .red = 0.999023, .green = 0.367521, .blue = 0.510867 },
+	{ .red = 0.999023, .green = 0.358974, .blue = 0.481807 },
+	{ .red = 0.999023, .green = 0.350427, .blue = 0.455433 },
+	{ .red = 0.998779, .green = 0.341392, .blue = 0.431013 },
+	{ .red = 0.999512, .green = 0.332845, .blue = 0.408791 },
+	{ .red = 0.998779, .green = 0.324054, .blue = 0.387790 },
+	{ .red = 0.025885, .green = 0.521123, .blue = 0.631746 },
+	{ .red = 0.020757, .green = 0.525519, .blue = 0.646642 },
+	{ .red = 0.053480, .green = 0.583394, .blue = 0.768498 },
+	{ .red = 0.410012, .green = 0.579487, .blue = 0.757998 },
+	{ .red = 0.598535, .green = 0.582173, .blue = 0.740904 },
+	{ .red = 0.763370, .green = 0.582662, .blue = 0.755067 },
+	{ .red = 0.941880, .green = 0.569475, .blue = 0.756288 },
+	{ .red = 0.998535, .green = 0.557998, .blue = 0.706716 },
+	{ .red = 0.998535, .green = 0.547497, .blue = 0.659829 },
+	{ .red = 0.998535, .green = 0.535043, .blue = 0.623932 },
+	{ .red = 0.999023, .green = 0.521368, .blue = 0.593162 },
+	{ .red = 0.999267, .green = 0.506960, .blue = 0.564591 },
+	{ .red = 0.999267, .green = 0.491575, .blue = 0.537485 },
+	{ .red = 0.998535, .green = 0.476190, .blue = 0.511111 },
+	{ .red = 0.998535, .green = 0.460317, .blue = 0.485714 },
+	{ .red = 0.999023, .green = 0.444444, .blue = 0.461294 },
+	{ .red = 0.998779, .green = 0.429548, .blue = 0.438095 },
+	{ .red = 0.032723, .green = 0.726740, .blue = 0.726740 },
+	{ .red = 0.031258, .green = 0.728205, .blue = 0.728694 },
+	{ .red = 0.025397, .green = 0.734799, .blue = 0.736996 },
+	{ .red = 0.272772, .green = 0.744567, .blue = 0.747985 },
+	{ .red = 0.531624, .green = 0.738706, .blue = 0.740415 },
+	{ .red = 0.729426, .green = 0.728449, .blue = 0.728694 },
+	{ .red = 0.903297, .green = 0.711844, .blue = 0.718681 },
+	{ .red = 0.999267, .green = 0.694017, .blue = 0.704274 },
+	{ .red = 0.998779, .green = 0.679853, .blue = 0.686447 },
+	{ .red = 0.999512, .green = 0.663980, .blue = 0.666667 },
+	{ .red = 0.999512, .green = 0.646886, .blue = 0.644933 },
+	{ .red = 0.999023, .green = 0.628571, .blue = 0.621978 },
+	{ .red = 0.998779, .green = 0.609524, .blue = 0.597802 },
+	{ .red = 0.999756, .green = 0.589744, .blue = 0.572405 },
+	{ .red = 0.998535, .green = 0.569475, .blue = 0.546764 },
+	{ .red = 0.999023, .green = 0.548962, .blue = 0.520879 },
+	{ .red = 0.999756, .green = 0.528938, .blue = 0.495482 },
+	{ .red = 0.018559, .green = 0.807326, .blue = 0.697680 },
+	{ .red = 0.021001, .green = 0.811477, .blue = 0.698657 },
+	{ .red = 0.033700, .green = 0.828571, .blue = 0.702564 },
+	{ .red = 0.036142, .green = 0.872772, .blue = 0.713797 },
+	{ .red = 0.447863, .green = 0.868864, .blue = 0.705983 },
+	{ .red = 0.668132, .green = 0.852015, .blue = 0.693040 },
+	{ .red = 0.837607, .green = 0.833455, .blue = 0.684249 },
+	{ .red = 0.989255, .green = 0.810989, .blue = 0.667155 },
+	{ .red = 0.999756, .green = 0.784860, .blue = 0.692552 },
+	{ .red = 0.998779, .green = 0.767277, .blue = 0.697680 },
+	{ .red = 0.998779, .green = 0.747741, .blue = 0.687912 },
+	{ .red = 0.998779, .green = 0.727961, .blue = 0.672039 },
+	{ .red = 0.998779, .green = 0.706960, .blue = 0.651770 },
+	{ .red = 0.998779, .green = 0.685470, .blue = 0.629060 },
+	{ .red = 0.998535, .green = 0.663248, .blue = 0.604640 },
+	{ .red = 0.999512, .green = 0.640537, .blue = 0.578755 },
+	{ .red = 0.999023, .green = 0.618071, .blue = 0.552869 },
+	{ .red = 0.029792, .green = 0.865201, .blue = 0.660073 },
+	{ .red = 0.022711, .green = 0.870085, .blue = 0.660073 },
+	{ .red = 0.016117, .green = 0.889377, .blue = 0.660317 },
+	{ .red = 0.030525, .green = 0.935043, .blue = 0.662027 },
+	{ .red = 0.339194, .green = 0.970940, .blue = 0.659341 },
+	{ .red = 0.590476, .green = 0.951648, .blue = 0.647131 },
+	{ .red = 0.771673, .green = 0.929182, .blue = 0.636630 },
+	{ .red = 0.914042, .green = 0.907204, .blue = 0.626618 },
+	{ .red = 0.998779, .green = 0.864469, .blue = 0.641758 },
+	{ .red = 0.998779, .green = 0.825397, .blue = 0.672527 },
+	{ .red = 0.999512, .green = 0.803907, .blue = 0.683516 },
+	{ .red = 0.999023, .green = 0.789499, .blue = 0.687424 },
+	{ .red = 0.999512, .green = 0.777045, .blue = 0.684982 },
+	{ .red = 0.999267, .green = 0.763858, .blue = 0.676923 },
+	{ .red = 0.999512, .green = 0.740171, .blue = 0.653236 },
+	{ .red = 0.999512, .green = 0.716972, .blue = 0.629304 },
+	{ .red = 0.999267, .green = 0.693773, .blue = 0.604151 },
+	{ .red = 0.034432, .green = 0.906960, .blue = 0.620024 },
+	{ .red = 0.030037, .green = 0.911600, .blue = 0.619536 },
+	{ .red = 0.031990, .green = 0.929915, .blue = 0.617094 },
+	{ .red = 0.038339, .green = 0.971917, .blue = 0.612943 },
+	{ .red = 0.337973, .green = 0.998535, .blue = 0.614164 },
+	{ .red = 0.545299, .green = 0.999512, .blue = 0.613431 },
+	{ .red = 0.704274, .green = 0.999023, .blue = 0.593162 },
+	{ .red = 0.839805, .green = 0.983150, .blue = 0.577289 },
+	{ .red = 0.967033, .green = 0.957753, .blue = 0.565568 },
+	{ .red = 0.999267, .green = 0.892552, .blue = 0.618071 },
+	{ .red = 0.998535, .green = 0.848596, .blue = 0.644933 },
+	{ .red = 0.998779, .green = 0.820513, .blue = 0.652991 },
+	{ .red = 0.998779, .green = 0.798535, .blue = 0.652259 },
+	{ .red = 0.998291, .green = 0.779976, .blue = 0.647375 },
+	{ .red = 0.998535, .green = 0.763614, .blue = 0.639072 },
+	{ .red = 0.998291, .green = 0.747253, .blue = 0.627839 },
+	{ .red = 0.998046, .green = 0.731136, .blue = 0.614408 },
+	{ .red = 0.028083, .green = 0.936996, .blue = 0.580464 },
+	{ .red = 0.025397, .green = 0.941148, .blue = 0.579487 },
+	{ .red = 0.044444, .green = 0.957509, .blue = 0.575580 },
+	{ .red = 0.112332, .green = 0.988278, .blue = 0.568254 },
+	{ .red = 0.380464, .green = 0.998779, .blue = 0.583883 },
+	{ .red = 0.554823, .green = 0.999267, .blue = 0.602198 },
+	{ .red = 0.692552, .green = 0.999756, .blue = 0.616361 },
+	{ .red = 0.783639, .green = 0.999756, .blue = 0.594628 },
+	{ .red = 0.883028, .green = 0.999023, .blue = 0.556777 },
+	{ .red = 0.999267, .green = 0.988767, .blue = 0.512576 },
+	{ .red = 0.999023, .green = 0.909158, .blue = 0.590476 },
+	{ .red = 0.999267, .green = 0.863248, .blue = 0.610256 },
+	{ .red = 0.998779, .green = 0.830281, .blue = 0.615873 },
+	{ .red = 0.998779, .green = 0.804151, .blue = 0.613431 },
+	{ .red = 0.999267, .green = 0.781441, .blue = 0.605861 },
+	{ .red = 0.998779, .green = 0.760195, .blue = 0.595116 },
+	{ .red = 0.998535, .green = 0.740659, .blue = 0.582662 },
+	{ .red = 0.041758, .green = 0.957265, .blue = 0.543101 },
+	{ .red = 0.052259, .green = 0.960684, .blue = 0.541880 },
+	{ .red = 0.040537, .green = 0.976068, .blue = 0.537241 },
+	{ .red = 0.170696, .green = 0.999756, .blue = 0.534799 },
+	{ .red = 0.404396, .green = 0.999512, .blue = 0.559951 },
+	{ .red = 0.557753, .green = 0.998779, .blue = 0.589011 },
+	{ .red = 0.682295, .green = 0.998535, .blue = 0.619292 },
+	{ .red = 0.759951, .green = 0.999023, .blue = 0.617338 },
+	{ .red = 0.823932, .green = 0.999267, .blue = 0.586569 },
+	{ .red = 0.904762, .green = 0.998779, .blue = 0.555800 },
+	{ .red = 0.999756, .green = 0.993407, .blue = 0.503785 },
+	{ .red = 0.999023, .green = 0.919902, .blue = 0.558730 },
+	{ .red = 0.999023, .green = 0.872527, .blue = 0.573138 },
+	{ .red = 0.998779, .green = 0.836630, .blue = 0.575824 },
+	{ .red = 0.998291, .green = 0.807326, .blue = 0.572161 },
+	{ .red = 0.999023, .green = 0.781929, .blue = 0.564103 },
+	{ .red = 0.998535, .green = 0.758486, .blue = 0.553358 },
+	{ .red = 0.042979, .green = 0.971673, .blue = 0.508181 },
+	{ .red = 0.063980, .green = 0.973871, .blue = 0.506960 },
+	{ .red = 0.083272, .green = 0.985348, .blue = 0.502320 },
+	{ .red = 0.241270, .green = 0.999023, .blue = 0.509646 },
+	{ .red = 0.418071, .green = 0.999267, .blue = 0.538217 },
+	{ .red = 0.553114, .green = 0.999512, .blue = 0.571917 },
+	{ .red = 0.667643, .green = 0.998535, .blue = 0.609035 },
+	{ .red = 0.744811, .green = 0.999267, .blue = 0.624420 },
+	{ .red = 0.788278, .green = 0.999512, .blue = 0.596093 },
+	{ .red = 0.846154, .green = 0.999267, .blue = 0.568254 },
+	{ .red = 0.917216, .green = 0.998779, .blue = 0.544078 },
+	{ .red = 0.998046, .green = 0.994628, .blue = 0.491331 },
+	{ .red = 0.999023, .green = 0.927228, .blue = 0.525031 },
+	{ .red = 0.999023, .green = 0.879121, .blue = 0.535043 },
+	{ .red = 0.999267, .green = 0.841514, .blue = 0.535287 },
+	{ .red = 0.998535, .green = 0.810012, .blue = 0.531136 },
+	{ .red = 0.999512, .green = 0.782662, .blue = 0.522589 },
+	{ .red = 0.070818, .green = 0.979976, .blue = 0.476435 },
+	{ .red = 0.080342, .green = 0.982173, .blue = 0.475214 },
+	{ .red = 0.108181, .green = 0.990232, .blue = 0.470574 },
+	{ .red = 0.273260, .green = 0.999512, .blue = 0.486935 },
+	{ .red = 0.422955, .green = 0.998535, .blue = 0.516972 },
+	{ .red = 0.542857, .green = 0.999756, .blue = 0.551648 },
+	{ .red = 0.649328, .green = 0.998779, .blue = 0.591453 },
+	{ .red = 0.731624, .green = 0.998535, .blue = 0.622955 },
+	{ .red = 0.762393, .green = 0.998779, .blue = 0.596093 },
+	{ .red = 0.805128, .green = 0.999267, .blue = 0.568987 },
+	{ .red = 0.859829, .green = 0.999023, .blue = 0.544322 },
+	{ .red = 0.925031, .green = 0.999512, .blue = 0.523321 },
+	{ .red = 0.995604, .green = 0.994628, .blue = 0.475458 },
+	{ .red = 0.999512, .green = 0.932845, .blue = 0.490842 },
+	{ .red = 0.998291, .green = 0.884005, .blue = 0.498413 },
+	{ .red = 0.999512, .green = 0.845910, .blue = 0.496947 },
+	{ .red = 0.998779, .green = 0.812698, .blue = 0.492308 },
+	{ .red = 0.088156, .green = 0.985104, .blue = 0.447619 },
+	{ .red = 0.099145, .green = 0.986325, .blue = 0.446398 },
+	{ .red = 0.136752, .green = 0.994872, .blue = 0.444933 },
+	{ .red = 0.290354, .green = 0.999512, .blue = 0.464957 },
+	{ .red = 0.419780, .green = 0.998535, .blue = 0.494994 },
+	{ .red = 0.530647, .green = 0.998535, .blue = 0.530647 },
+	{ .red = 0.628571, .green = 0.998779, .blue = 0.569719 },
+	{ .red = 0.712088, .green = 0.999023, .blue = 0.607814 },
+	{ .red = 0.738462, .green = 0.999267, .blue = 0.586081 },
+	{ .red = 0.772161, .green = 0.999512, .blue = 0.560684 },
+	{ .red = 0.816117, .green = 0.998535, .blue = 0.538462 },
+	{ .red = 0.869109, .green = 0.998779, .blue = 0.516484 },
+	{ .red = 0.929915, .green = 0.999023, .blue = 0.500122 },
+	{ .red = 0.994383, .green = 0.994628, .blue = 0.453724 },
+	{ .red = 0.998779, .green = 0.936752, .blue = 0.459341 },
+	{ .red = 0.999267, .green = 0.889133, .blue = 0.462759 },
+	{ .red = 0.999267, .green = 0.849817, .blue = 0.461538 },
+	{ .red = 0.107204, .green = 0.987302, .blue = 0.421490 },
+	{ .red = 0.110623, .green = 0.989011, .blue = 0.420269 },
+	{ .red = 0.162882, .green = 0.999023, .blue = 0.423199 },
+	{ .red = 0.298657, .green = 0.998779, .blue = 0.444200 },
+	{ .red = 0.410256, .green = 0.999512, .blue = 0.472039 },
+	{ .red = 0.513309, .green = 0.998779, .blue = 0.506716 },
+	{ .red = 0.605128, .green = 0.999267, .blue = 0.544811 },
+	{ .red = 0.685958, .green = 0.999267, .blue = 0.583150 },
+	{ .red = 0.715507, .green = 0.999023, .blue = 0.571673 },
+	{ .red = 0.743346, .green = 0.998535, .blue = 0.548962 },
+	{ .red = 0.779731, .green = 0.998535, .blue = 0.526496 },
+	{ .red = 0.824176, .green = 0.999023, .blue = 0.504762 },
+	{ .red = 0.876190, .green = 0.999023, .blue = 0.486447 },
+	{ .red = 0.934066, .green = 0.999267, .blue = 0.473016 },
+	{ .red = 0.994383, .green = 0.995360, .blue = 0.428816 },
+	{ .red = 0.999023, .green = 0.940171, .blue = 0.428816 },
+	{ .red = 0.999267, .green = 0.893284, .blue = 0.431258 },
+	{ .red = 0.113553, .green = 0.989499, .blue = 0.397558 },
+	{ .red = 0.113797, .green = 0.991453, .blue = 0.396093 },
+	{ .red = 0.185348, .green = 0.999756, .blue = 0.403663 },
+	{ .red = 0.298413, .green = 0.999267, .blue = 0.423199 },
+	{ .red = 0.400488, .green = 0.998779, .blue = 0.450061 },
+	{ .red = 0.494994, .green = 0.998535, .blue = 0.482784 },
+	{ .red = 0.580952, .green = 0.999267, .blue = 0.518681 },
+	{ .red = 0.659096, .green = 0.999023, .blue = 0.556777 },
+	{ .red = 0.691819, .green = 0.999023, .blue = 0.552625 },
+	{ .red = 0.715995, .green = 0.998779, .blue = 0.531868 },
+	{ .red = 0.747497, .green = 0.998535, .blue = 0.511355 },
+	{ .red = 0.786081, .green = 0.999267, .blue = 0.490598 },
+	{ .red = 0.831258, .green = 0.998535, .blue = 0.473504 },
+	{ .red = 0.882295, .green = 0.999267, .blue = 0.456899 },
+	{ .red = 0.937241, .green = 0.999267, .blue = 0.445910 },
+	{ .red = 0.995849, .green = 0.996825, .blue = 0.400000 },
+	{ .red = 0.999023, .green = 0.943346, .blue = 0.401465 },
+	{ .red = 0.126740, .green = 0.989988, .blue = 0.376557 },
+	{ .red = 0.142369, .green = 0.992918, .blue = 0.378022 },
+	{ .red = 0.200488, .green = 0.999023, .blue = 0.385348 },
+	{ .red = 0.294994, .green = 0.999512, .blue = 0.403175 },
+	{ .red = 0.388278, .green = 0.998535, .blue = 0.428327 },
+	{ .red = 0.475214, .green = 0.999023, .blue = 0.458608 },
+	{ .red = 0.557753, .green = 0.998779, .blue = 0.493773 },
+	{ .red = 0.632234, .green = 0.999023, .blue = 0.529670 },
+	{ .red = 0.668132, .green = 0.999023, .blue = 0.531624 },
+	{ .red = 0.689621, .green = 0.999267, .blue = 0.512332 },
+	{ .red = 0.718193, .green = 0.998291, .blue = 0.494750 },
+	{ .red = 0.752381, .green = 0.998779, .blue = 0.476190 },
+	{ .red = 0.792430, .green = 0.998535, .blue = 0.459096 },
+	{ .red = 0.837851, .green = 0.999512, .blue = 0.442247 },
+	{ .red = 0.887424, .green = 0.999023, .blue = 0.429792 },
+	{ .red = 0.940171, .green = 0.999267, .blue = 0.420513 },
+	{ .red = 0.998046, .green = 0.998779, .blue = 0.371429 },
+	{ .red = 0.000000, .green = 0.109402, .blue = 0.609035 },
+	{ .red = 0.118193, .green = 0.014652, .blue = 0.668376 },
+	{ .red = 0.258852, .green = 0.016117, .blue = 0.700611 },
+	{ .red = 0.398046, .green = 0.013919, .blue = 0.719170 },
+	{ .red = 0.513797, .green = 0.011477, .blue = 0.711600 },
+	{ .red = 0.607326, .green = 0.011722, .blue = 0.696947 },
+	{ .red = 0.723077, .green = 0.018315, .blue = 0.721123 },
+	{ .red = 0.791209, .green = 0.016606, .blue = 0.675214 },
+	{ .red = 0.844200, .green = 0.016850, .blue = 0.632234 },
+	{ .red = 0.884493, .green = 0.014164, .blue = 0.591209 },
+	{ .red = 0.914286, .green = 0.016361, .blue = 0.552625 },
+	{ .red = 0.936752, .green = 0.018559, .blue = 0.517460 },
+	{ .red = 0.958974, .green = 0.017827, .blue = 0.488156 },
+	{ .red = 0.981929, .green = 0.022222, .blue = 0.463492 },
+	{ .red = 0.990965, .green = 0.041026, .blue = 0.436386 },
+	{ .red = 0.998046, .green = 0.046642, .blue = 0.411477 },
+	{ .red = 0.999267, .green = 0.059341, .blue = 0.388034 },
+	{ .red = 0.000000, .green = 0.134554, .blue = 0.609035 },
+	{ .red = 0.122344, .green = 0.015873, .blue = 0.734310 },
+	{ .red = 0.281319, .green = 0.015873, .blue = 0.794628 },
+	{ .red = 0.441758, .green = 0.019048, .blue = 0.823932 },
+	{ .red = 0.561661, .green = 0.019292, .blue = 0.793895 },
+	{ .red = 0.650549, .green = 0.019048, .blue = 0.755311 },
+	{ .red = 0.767766, .green = 0.019292, .blue = 0.769475 },
+	{ .red = 0.839805, .green = 0.018803, .blue = 0.717216 },
+	{ .red = 0.891575, .green = 0.019292, .blue = 0.665446 },
+	{ .red = 0.927961, .green = 0.017094, .blue = 0.616850 },
+	{ .red = 0.954335, .green = 0.011722, .blue = 0.573138 },
+	{ .red = 0.970208, .green = 0.020513, .blue = 0.532357 },
+	{ .red = 0.979731, .green = 0.038095, .blue = 0.495726 },
+	{ .red = 0.987546, .green = 0.051282, .blue = 0.463980 },
+	{ .red = 0.995604, .green = 0.077900, .blue = 0.438339 },
+	{ .red = 0.999023, .green = 0.100122, .blue = 0.414896 },
+	{ .red = 0.999023, .green = 0.118926, .blue = 0.393407 },
+	{ .red = 0.003175, .green = 0.204884, .blue = 0.562393 },
+	{ .red = 0.129670, .green = 0.212943, .blue = 0.921856 },
+	{ .red = 0.304518, .green = 0.237118, .blue = 0.899389 },
+	{ .red = 0.467399, .green = 0.251282, .blue = 0.888645 },
+	{ .red = 0.628816, .green = 0.246642, .blue = 0.901343 },
+	{ .red = 0.791209, .green = 0.225641, .blue = 0.929426 },
+	{ .red = 0.954090, .green = 0.190476, .blue = 0.962637 },
+	{ .red = 0.999512, .green = 0.192430, .blue = 0.852259 },
+	{ .red = 0.999023, .green = 0.202930, .blue = 0.742613 },
+	{ .red = 0.998535, .green = 0.208791, .blue = 0.664713 },
+	{ .red = 0.998779, .green = 0.211966, .blue = 0.606105 },
+	{ .red = 0.999267, .green = 0.214408, .blue = 0.559707 },
+	{ .red = 0.999267, .green = 0.216606, .blue = 0.521368 },
+	{ .red = 0.999512, .green = 0.218071, .blue = 0.488889 },
+	{ .red = 0.998779, .green = 0.219292, .blue = 0.460317 },
+	{ .red = 0.999023, .green = 0.220269, .blue = 0.435409 },
+	{ .red = 0.999512, .green = 0.220024, .blue = 0.413187 },
+	{ .red = 0.000000, .green = 0.313797, .blue = 0.591941 },
+	{ .red = 0.010745, .green = 0.340904, .blue = 0.729915 },
+	{ .red = 0.288156, .green = 0.401465, .blue = 0.912332 },
+	{ .red = 0.457143, .green = 0.413187, .blue = 0.892308 },
+	{ .red = 0.619048, .green = 0.418071, .blue = 0.891819 },
+	{ .red = 0.781197, .green = 0.413675, .blue = 0.911844 },
+	{ .red = 0.944811, .green = 0.401221, .blue = 0.942613 },
+	{ .red = 0.999023, .green = 0.394139, .blue = 0.848107 },
+	{ .red = 0.999512, .green = 0.390965, .blue = 0.750427 },
+	{ .red = 0.999023, .green = 0.385592, .blue = 0.683516 },
+	{ .red = 0.998779, .green = 0.378755, .blue = 0.632967 },
+	{ .red = 0.998535, .green = 0.371184, .blue = 0.591941 },
+	{ .red = 0.999756, .green = 0.363126, .blue = 0.557509 },
+	{ .red = 0.999756, .green = 0.354579, .blue = 0.526252 },
+	{ .red = 0.999023, .green = 0.345543, .blue = 0.497680 },
+	{ .red = 0.999512, .green = 0.336508, .blue = 0.472039 },
+	{ .red = 0.999267, .green = 0.327717, .blue = 0.448107 },
+	{ .red = 0.024176, .green = 0.450305, .blue = 0.644444 },
+	{ .red = 0.017827, .green = 0.465934, .blue = 0.686935 },
+	{ .red = 0.168010, .green = 0.566056, .blue = 0.926496 },
+	{ .red = 0.436386, .green = 0.564347, .blue = 0.907937 },
+	{ .red = 0.604396, .green = 0.572894, .blue = 0.890110 },
+	{ .red = 0.765812, .green = 0.575580, .blue = 0.895726 },
+	{ .red = 0.923321, .green = 0.566545, .blue = 0.914530 },
+	{ .red = 0.998291, .green = 0.555311, .blue = 0.846886 },
+	{ .red = 0.998046, .green = 0.548718, .blue = 0.765812 },
+	{ .red = 0.999512, .green = 0.538706, .blue = 0.714042 },
+	{ .red = 0.998535, .green = 0.526740, .blue = 0.673260 },
+	{ .red = 0.998779, .green = 0.513065, .blue = 0.638828 },
+	{ .red = 0.998779, .green = 0.498413, .blue = 0.607082 },
+	{ .red = 0.998779, .green = 0.483028, .blue = 0.577534 },
+	{ .red = 0.999756, .green = 0.466911, .blue = 0.548962 },
+	{ .red = 0.999023, .green = 0.451038, .blue = 0.521856 },
+	{ .red = 0.999512, .green = 0.434921, .blue = 0.496215 },
+	{ .red = 0.023443, .green = 0.630525, .blue = 0.738217 },
+	{ .red = 0.021978, .green = 0.636386, .blue = 0.750672 },
+	{ .red = 0.027839, .green = 0.671795, .blue = 0.817338 },
+	{ .red = 0.306471, .green = 0.729426, .blue = 0.915751 },
+	{ .red = 0.558730, .green = 0.721123, .blue = 0.899634 },
+	{ .red = 0.734554, .green = 0.717460, .blue = 0.873748 },
+	{ .red = 0.883761, .green = 0.707692, .blue = 0.874969 },
+	{ .red = 0.998535, .green = 0.690110, .blue = 0.842491 },
+	{ .red = 0.999267, .green = 0.681807, .blue = 0.785348 },
+	{ .red = 0.998779, .green = 0.669353, .blue = 0.748718 },
+	{ .red = 0.998291, .green = 0.653968, .blue = 0.718437 },
+	{ .red = 0.998535, .green = 0.636874, .blue = 0.690110 },
+	{ .red = 0.999512, .green = 0.618071, .blue = 0.662027 },
+	{ .red = 0.998535, .green = 0.598291, .blue = 0.634188 },
+	{ .red = 0.997802, .green = 0.577778, .blue = 0.606105 },
+	{ .red = 0.999512, .green = 0.557265, .blue = 0.578755 },
+	{ .red = 0.999267, .green = 0.536752, .blue = 0.551160 },
+	{ .red = 0.036142, .green = 0.814164, .blue = 0.814164 },
+	{ .red = 0.035409, .green = 0.817338, .blue = 0.817582 },
+	{ .red = 0.031013, .green = 0.830037, .blue = 0.831746 },
+	{ .red = 0.028571, .green = 0.862271, .blue = 0.866911 },
+	{ .red = 0.431013, .green = 0.860562, .blue = 0.864225 },
+	{ .red = 0.649573, .green = 0.845665, .blue = 0.847375 },
+	{ .red = 0.827595, .green = 0.826374, .blue = 0.826618 },
+	{ .red = 0.982662, .green = 0.801954, .blue = 0.809280 },
+	{ .red = 0.998291, .green = 0.787057, .blue = 0.793651 },
+	{ .red = 0.998291, .green = 0.771917, .blue = 0.776557 },
+	{ .red = 0.998535, .green = 0.754823, .blue = 0.757265 },
+	{ .red = 0.999756, .green = 0.736020, .blue = 0.735531 },
+	{ .red = 0.998535, .green = 0.715995, .blue = 0.711844 },
+	{ .red = 0.998535, .green = 0.694505, .blue = 0.686691 },
+	{ .red = 0.998535, .green = 0.672283, .blue = 0.660317 },
+	{ .red = 0.998046, .green = 0.649573, .blue = 0.633455 },
+	{ .red = 0.998779, .green = 0.626618, .blue = 0.605861 },
+	{ .red = 0.026129, .green = 0.870085, .blue = 0.769231 },
+	{ .red = 0.029792, .green = 0.874237, .blue = 0.771184 },
+	{ .red = 0.037851, .green = 0.890110, .blue = 0.778755 },
+	{ .red = 0.036142, .green = 0.926740, .blue = 0.795849 },
+	{ .red = 0.293040, .green = 0.965324, .blue = 0.810989 },
+	{ .red = 0.560928, .green = 0.947497, .blue = 0.794872 },
+	{ .red = 0.752869, .green = 0.924542, .blue = 0.776313 },
+	{ .red = 0.904518, .green = 0.900366, .blue = 0.761905 },
+	{ .red = 0.998291, .green = 0.868376, .blue = 0.763370 },
+	{ .red = 0.999512, .green = 0.848840, .blue = 0.784615 },
+	{ .red = 0.999267, .green = 0.831502, .blue = 0.781929 },
+	{ .red = 0.998535, .green = 0.812210, .blue = 0.768987 },
+	{ .red = 0.999267, .green = 0.791697, .blue = 0.750672 },
+	{ .red = 0.998779, .green = 0.770452, .blue = 0.729426 },
+	{ .red = 0.999512, .green = 0.748230, .blue = 0.705495 },
+	{ .red = 0.999512, .green = 0.725275, .blue = 0.680342 },
+	{ .red = 0.998535, .green = 0.701832, .blue = 0.653968 },
+	{ .red = 0.037363, .green = 0.909646, .blue = 0.722833 },
+	{ .red = 0.033455, .green = 0.913797, .blue = 0.723565 },
+	{ .red = 0.019536, .green = 0.929915, .blue = 0.726740 },
+	{ .red = 0.049573, .green = 0.964103, .blue = 0.733822 },
+	{ .red = 0.287668, .green = 0.998779, .blue = 0.742125 },
+	{ .red = 0.514286, .green = 0.998779, .blue = 0.740171 },
+	{ .red = 0.675214, .green = 0.998779, .blue = 0.724054 },
+	{ .red = 0.831013, .green = 0.976557, .blue = 0.707204 },
+	{ .red = 0.958242, .green = 0.951404, .blue = 0.693773 },
+	{ .red = 0.999267, .green = 0.899878, .blue = 0.733333 },
+	{ .red = 0.998535, .green = 0.869597, .blue = 0.756288 },
+	{ .red = 0.998046, .green = 0.852015, .blue = 0.762882 },
+	{ .red = 0.998779, .green = 0.838828, .blue = 0.762149 },
+	{ .red = 0.999267, .green = 0.826862, .blue = 0.757021 },
+	{ .red = 0.999267, .green = 0.808547, .blue = 0.740659 },
+	{ .red = 0.999512, .green = 0.786081, .blue = 0.717460 },
+	{ .red = 0.998779, .green = 0.763370, .blue = 0.693284 },
+	{ .red = 0.031746, .green = 0.938462, .blue = 0.677411 },
+	{ .red = 0.035165, .green = 0.942125, .blue = 0.677656 },
+	{ .red = 0.025641, .green = 0.957021, .blue = 0.677900 },
+	{ .red = 0.087668, .green = 0.985104, .blue = 0.678632 },
+	{ .red = 0.352625, .green = 0.999023, .blue = 0.690110 },
+	{ .red = 0.535775, .green = 0.999512, .blue = 0.703053 },
+	{ .red = 0.675702, .green = 0.999512, .blue = 0.712088 },
+	{ .red = 0.793162, .green = 0.999512, .blue = 0.710134 },
+	{ .red = 0.881319, .green = 0.998291, .blue = 0.669597 },
+	{ .red = 0.995116, .green = 0.985836, .blue = 0.627350 },
+	{ .red = 0.998291, .green = 0.916239, .blue = 0.702076 },
+	{ .red = 0.998535, .green = 0.881074, .blue = 0.720879 },
+	{ .red = 0.999512, .green = 0.857387, .blue = 0.724786 },
+	{ .red = 0.998535, .green = 0.838339, .blue = 0.722344 },
+	{ .red = 0.998046, .green = 0.821978, .blue = 0.716239 },
+	{ .red = 0.999512, .green = 0.806838, .blue = 0.706471 },
+	{ .red = 0.998535, .green = 0.791697, .blue = 0.695238 },
+	{ .red = 0.035653, .green = 0.958486, .blue = 0.634676 },
+	{ .red = 0.034432, .green = 0.961905, .blue = 0.634432 },
+	{ .red = 0.055189, .green = 0.974359, .blue = 0.632967 },
+	{ .red = 0.150427, .green = 0.994628, .blue = 0.632234 },
+	{ .red = 0.390720, .green = 0.998779, .blue = 0.652747 },
+	{ .red = 0.547741, .green = 0.998291, .blue = 0.675214 },
+	{ .red = 0.672039, .green = 0.998535, .blue = 0.697680 },
+	{ .red = 0.776801, .green = 0.998535, .blue = 0.718193 },
+	{ .red = 0.839072, .green = 0.998535, .blue = 0.698413 },
+	{ .red = 0.908425, .green = 0.999267, .blue = 0.658608 },
+	{ .red = 0.999267, .green = 0.992918, .blue = 0.606838 },
+	{ .red = 0.999267, .green = 0.926496, .blue = 0.664713 },
+	{ .red = 0.998046, .green = 0.887424, .blue = 0.681074 },
+	{ .red = 0.998291, .green = 0.859829, .blue = 0.683761 },
+	{ .red = 0.998779, .green = 0.837118, .blue = 0.679609 },
+	{ .red = 0.998046, .green = 0.816850, .blue = 0.672039 },
+	{ .red = 0.999756, .green = 0.798291, .blue = 0.660317 },
+	{ .red = 0.021001, .green = 0.972894, .blue = 0.595116 },
+	{ .red = 0.021978, .green = 0.976068, .blue = 0.594383 },
+	{ .red = 0.088645, .green = 0.983883, .blue = 0.591941 },
+	{ .red = 0.222466, .green = 0.999023, .blue = 0.598046 },
+	{ .red = 0.411233, .green = 0.998535, .blue = 0.621978 },
+	{ .red = 0.547741, .green = 0.999023, .blue = 0.649328 },
+	{ .red = 0.662271, .green = 0.998291, .blue = 0.678877 },
+	{ .red = 0.758486, .green = 0.998535, .blue = 0.707937 },
+	{ .red = 0.818803, .green = 0.998291, .blue = 0.709646 },
+	{ .red = 0.860806, .green = 0.998535, .blue = 0.675458 },
+	{ .red = 0.921856, .green = 0.998535, .blue = 0.644200 },
+	{ .red = 0.999023, .green = 0.995116, .blue = 0.585836 },
+	{ .red = 0.999023, .green = 0.932601, .blue = 0.626374 },
+	{ .red = 0.998535, .green = 0.891819, .blue = 0.638339 },
+	{ .red = 0.998779, .green = 0.861050, .blue = 0.639560 },
+	{ .red = 0.999512, .green = 0.835897, .blue = 0.634921 },
+	{ .red = 0.998535, .green = 0.813187, .blue = 0.627595 },
+	{ .red = 0.042491, .green = 0.982173, .blue = 0.558242 },
+	{ .red = 0.062027, .green = 0.983883, .blue = 0.557509 },
+	{ .red = 0.101343, .green = 0.990476, .blue = 0.554823 },
+	{ .red = 0.265201, .green = 0.999267, .blue = 0.568254 },
+	{ .red = 0.417094, .green = 0.999756, .blue = 0.593407 },
+	{ .red = 0.540415, .green = 0.999267, .blue = 0.623199 },
+	{ .red = 0.645665, .green = 0.999267, .blue = 0.655189 },
+	{ .red = 0.737241, .green = 0.998535, .blue = 0.689133 },
+	{ .red = 0.801954, .green = 0.999756, .blue = 0.706716 },
+	{ .red = 0.830037, .green = 0.999023, .blue = 0.675702 },
+	{ .red = 0.872527, .green = 0.999267, .blue = 0.644200 },
+	{ .red = 0.929915, .green = 0.999756, .blue = 0.617582 },
+	{ .red = 0.999023, .green = 0.997070, .blue = 0.557753 },
+	{ .red = 0.999756, .green = 0.937485, .blue = 0.586081 },
+	{ .red = 0.999023, .green = 0.895238, .blue = 0.595604 },
+	{ .red = 0.999023, .green = 0.862271, .blue = 0.596093 },
+	{ .red = 0.998291, .green = 0.834676, .blue = 0.592186 },
+	{ .red = 0.088645, .green = 0.985592, .blue = 0.525031 },
+	{ .red = 0.088889, .green = 0.988034, .blue = 0.524298 },
+	{ .red = 0.123321, .green = 0.995360, .blue = 0.523077 },
+	{ .red = 0.288889, .green = 0.998779, .blue = 0.541148 },
+	{ .red = 0.416606, .green = 0.999512, .blue = 0.566056 },
+	{ .red = 0.528449, .green = 0.999267, .blue = 0.596337 },
+	{ .red = 0.626862, .green = 0.998779, .blue = 0.629792 },
+	{ .red = 0.713065, .green = 0.998779, .blue = 0.664713 },
+	{ .red = 0.785104, .green = 0.999512, .blue = 0.696703 },
+	{ .red = 0.805128, .green = 0.999756, .blue = 0.667399 },
+	{ .red = 0.836386, .green = 0.998535, .blue = 0.639316 },
+	{ .red = 0.879853, .green = 0.998779, .blue = 0.611966 },
+	{ .red = 0.934554, .green = 0.999512, .blue = 0.589499 },
+	{ .red = 0.997314, .green = 0.996825, .blue = 0.531380 },
+	{ .red = 0.998291, .green = 0.940171, .blue = 0.549695 },
+	{ .red = 0.998535, .green = 0.897924, .blue = 0.555556 },
+	{ .red = 0.999512, .green = 0.863980, .blue = 0.554823 },
+	{ .red = 0.098168, .green = 0.989011, .blue = 0.494750 },
+	{ .red = 0.103785, .green = 0.990476, .blue = 0.494017 },
+	{ .red = 0.157509, .green = 0.999756, .blue = 0.497192 },
+	{ .red = 0.296947, .green = 0.999023, .blue = 0.515263 },
+	{ .red = 0.410012, .green = 0.999512, .blue = 0.539438 },
+	{ .red = 0.512332, .green = 0.999267, .blue = 0.568987 },
+	{ .red = 0.605617, .green = 0.998291, .blue = 0.602686 },
+	{ .red = 0.687179, .green = 0.999023, .blue = 0.637363 },
+	{ .red = 0.759707, .green = 0.998291, .blue = 0.673016 },
+	{ .red = 0.782906, .green = 0.998535, .blue = 0.655678 },
+	{ .red = 0.806593, .green = 0.998779, .blue = 0.627350 },
+	{ .red = 0.840781, .green = 0.999023, .blue = 0.600488 },
+	{ .red = 0.884982, .green = 0.999023, .blue = 0.577045 },
+	{ .red = 0.936996, .green = 0.998291, .blue = 0.562149 },
+	{ .red = 0.996093, .green = 0.996337, .blue = 0.504518 },
+	{ .red = 0.999023, .green = 0.943346, .blue = 0.513065 },
+	{ .red = 0.999267, .green = 0.900855, .blue = 0.517949 },
+	{ .red = 0.117460, .green = 0.989499, .blue = 0.467399 },
+	{ .red = 0.123321, .green = 0.990476, .blue = 0.466667 },
+	{ .red = 0.188523, .green = 0.998779, .blue = 0.473748 },
+	{ .red = 0.297924, .green = 0.999512, .blue = 0.490354 },
+	{ .red = 0.400733, .green = 0.999023, .blue = 0.513797 },
+	{ .red = 0.495482, .green = 0.998535, .blue = 0.542369 },
+	{ .red = 0.581685, .green = 0.999023, .blue = 0.574359 },
+	{ .red = 0.660562, .green = 0.998779, .blue = 0.608791 },
+	{ .red = 0.731380, .green = 0.998779, .blue = 0.644200 },
+	{ .red = 0.760195, .green = 0.998291, .blue = 0.638095 },
+	{ .red = 0.779243, .green = 0.998779, .blue = 0.611477 },
+	{ .red = 0.807570, .green = 0.999023, .blue = 0.586081 },
+	{ .red = 0.844444, .green = 0.999512, .blue = 0.562393 },
+	{ .red = 0.889377, .green = 0.999267, .blue = 0.542613 },
+	{ .red = 0.940415, .green = 0.999512, .blue = 0.528205 },
+	{ .red = 0.994383, .green = 0.995604, .blue = 0.479121 },
+	{ .red = 0.999267, .green = 0.946276, .blue = 0.480342 },
+	{ .red = 0.118193, .green = 0.991941, .blue = 0.442247 },
+	{ .red = 0.134066, .green = 0.994872, .blue = 0.443956 },
+	{ .red = 0.198779, .green = 0.999756, .blue = 0.451282 },
+	{ .red = 0.295726, .green = 0.999512, .blue = 0.466911 },
+	{ .red = 0.388767, .green = 0.999023, .blue = 0.488889 },
+	{ .red = 0.475458, .green = 0.999512, .blue = 0.515507 },
+	{ .red = 0.557998, .green = 0.999023, .blue = 0.546276 },
+	{ .red = 0.634188, .green = 0.998535, .blue = 0.579976 },
+	{ .red = 0.702076, .green = 0.999267, .blue = 0.613431 },
+	{ .red = 0.736508, .green = 0.999023, .blue = 0.615873 },
+	{ .red = 0.753602, .green = 0.999023, .blue = 0.592918 },
+	{ .red = 0.777778, .green = 0.999267, .blue = 0.569475 },
+	{ .red = 0.809768, .green = 0.998535, .blue = 0.548718 },
+	{ .red = 0.848352, .green = 0.999023, .blue = 0.527961 },
+	{ .red = 0.893040, .green = 0.999023, .blue = 0.511355 },
+	{ .red = 0.942613, .green = 0.999512, .blue = 0.498413 },
+	{ .red = 0.993895, .green = 0.995360, .blue = 0.453480 },
+	{ .red = 0.000000, .green = 0.135287, .blue = 0.610745 },
+	{ .red = 0.102320, .green = 0.017338, .blue = 0.712088 },
+	{ .red = 0.236630, .green = 0.019292, .blue = 0.749451 },
+	{ .red = 0.374359, .green = 0.017338, .blue = 0.783639 },
+	{ .red = 0.493040, .green = 0.020757, .blue = 0.782173 },
+	{ .red = 0.587057, .green = 0.019292, .blue = 0.763614 },
+	{ .red = 0.674725, .green = 0.013187, .blue = 0.756288 },
+	{ .red = 0.786569, .green = 0.021490, .blue = 0.784860 },
+	{ .red = 0.844200, .green = 0.018071, .blue = 0.736996 },
+	{ .red = 0.884493, .green = 0.018559, .blue = 0.688156 },
+	{ .red = 0.915263, .green = 0.016361, .blue = 0.643468 },
+	{ .red = 0.937241, .green = 0.020024, .blue = 0.601954 },
+	{ .red = 0.956288, .green = 0.015140, .blue = 0.565568 },
+	{ .red = 0.968742, .green = 0.020269, .blue = 0.531380 },
+	{ .red = 0.976801, .green = 0.033700, .blue = 0.499389 },
+	{ .red = 0.985592, .green = 0.042979, .blue = 0.472283 },
+	{ .red = 0.991209, .green = 0.052259, .blue = 0.446886 },
+	{ .red = 0.007814, .green = 0.146764, .blue = 0.626129 },
+	{ .red = 0.107937, .green = 0.010256, .blue = 0.770696 },
+	{ .red = 0.253236, .green = 0.020024, .blue = 0.824908 },
+	{ .red = 0.410745, .green = 0.011966, .blue = 0.882051 },
+	{ .red = 0.538706, .green = 0.024420, .blue = 0.871306 },
+	{ .red = 0.632479, .green = 0.021245, .blue = 0.833455 },
+	{ .red = 0.716239, .green = 0.010501, .blue = 0.809035 },
+	{ .red = 0.829304, .green = 0.017827, .blue = 0.830525 },
+	{ .red = 0.886935, .green = 0.019048, .blue = 0.775092 },
+	{ .red = 0.925519, .green = 0.016117, .blue = 0.718926 },
+	{ .red = 0.952869, .green = 0.010989, .blue = 0.667643 },
+	{ .red = 0.970696, .green = 0.017827, .blue = 0.620757 },
+	{ .red = 0.985104, .green = 0.015873, .blue = 0.579976 },
+	{ .red = 0.989255, .green = 0.030281, .blue = 0.540171 },
+	{ .red = 0.998535, .green = 0.065934, .blue = 0.509646 },
+	{ .red = 0.999512, .green = 0.095238, .blue = 0.480586 },
+	{ .red = 0.998779, .green = 0.115018, .blue = 0.454945 },
+	{ .red = 0.000000, .green = 0.198779, .blue = 0.646154 },
+	{ .red = 0.129915, .green = 0.171917, .blue = 0.999023 },
+	{ .red = 0.293040, .green = 0.202442, .blue = 0.998291 },
+	{ .red = 0.453236, .green = 0.226862, .blue = 0.998291 },
+	{ .red = 0.607082, .green = 0.230525, .blue = 0.999512 },
+	{ .red = 0.747253, .green = 0.216361, .blue = 0.999023 },
+	{ .red = 0.874969, .green = 0.194139, .blue = 0.998779 },
+	{ .red = 0.992430, .green = 0.171673, .blue = 0.999023 },
+	{ .red = 0.999756, .green = 0.191209, .blue = 0.873016 },
+	{ .red = 0.999023, .green = 0.203907, .blue = 0.775092 },
+	{ .red = 0.999023, .green = 0.211233, .blue = 0.702808 },
+	{ .red = 0.999756, .green = 0.215140, .blue = 0.646886 },
+	{ .red = 0.999267, .green = 0.217582, .blue = 0.600488 },
+	{ .red = 0.999023, .green = 0.219048, .blue = 0.561661 },
+	{ .red = 0.999023, .green = 0.220269, .blue = 0.528449 },
+	{ .red = 0.999267, .green = 0.221245, .blue = 0.499389 },
+	{ .red = 0.999512, .green = 0.221490, .blue = 0.473748 },
+	{ .red = 0.000000, .green = 0.279365, .blue = 0.617582 },
+	{ .red = 0.000000, .green = 0.350916, .blue = 0.981441 },
+	{ .red = 0.285958, .green = 0.376557, .blue = 1.000000 },
+	{ .red = 0.446886, .green = 0.393407, .blue = 0.998291 },
+	{ .red = 0.604396, .green = 0.402930, .blue = 0.999023 },
+	{ .red = 0.750427, .green = 0.401954, .blue = 0.998046 },
+	{ .red = 0.884249, .green = 0.395604, .blue = 0.999512 },
+	{ .red = 0.999512, .green = 0.385836, .blue = 0.994872 },
+	{ .red = 0.998779, .green = 0.387057, .blue = 0.870085 },
+	{ .red = 0.999023, .green = 0.385348, .blue = 0.783150 },
+	{ .red = 0.998779, .green = 0.380952, .blue = 0.720147 },
+	{ .red = 0.999267, .green = 0.374603, .blue = 0.671062 },
+	{ .red = 0.998535, .green = 0.366789, .blue = 0.629304 },
+	{ .red = 0.999023, .green = 0.358242, .blue = 0.593895 },
+	{ .red = 0.998291, .green = 0.349451, .blue = 0.561416 },
+	{ .red = 0.999267, .green = 0.340171, .blue = 0.532845 },
+	{ .red = 0.998779, .green = 0.331380, .blue = 0.506227 },
+	{ .red = 0.018071, .green = 0.412698, .blue = 0.687179 },
+	{ .red = 0.008303, .green = 0.431502, .blue = 0.752381 },
+	{ .red = 0.230525, .green = 0.522344, .blue = 0.998291 },
+	{ .red = 0.439316, .green = 0.544078, .blue = 0.998291 },
+	{ .red = 0.597314, .green = 0.557021, .blue = 0.998046 },
+	{ .red = 0.749206, .green = 0.562393, .blue = 0.999267 },
+	{ .red = 0.886935, .green = 0.557753, .blue = 0.999267 },
+	{ .red = 0.998779, .green = 0.547741, .blue = 0.987302 },
+	{ .red = 0.998535, .green = 0.545299, .blue = 0.874237 },
+	{ .red = 0.999023, .green = 0.539438, .blue = 0.800977 },
+	{ .red = 0.999512, .green = 0.530159, .blue = 0.749695 },
+	{ .red = 0.999756, .green = 0.518193, .blue = 0.708181 },
+	{ .red = 0.998535, .green = 0.504274, .blue = 0.671795 },
+	{ .red = 0.999267, .green = 0.489133, .blue = 0.639072 },
+	{ .red = 0.998779, .green = 0.473260, .blue = 0.608059 },
+	{ .red = 0.999512, .green = 0.457143, .blue = 0.579243 },
+	{ .red = 0.999023, .green = 0.441270, .blue = 0.551404 },
+	{ .red = 0.026374, .green = 0.556532, .blue = 0.749206 },
+	{ .red = 0.024908, .green = 0.567277, .blue = 0.774603 },
+	{ .red = 0.018315, .green = 0.640049, .blue = 0.930403 },
+	{ .red = 0.372161, .green = 0.682540, .blue = 0.998291 },
+	{ .red = 0.584127, .green = 0.697436, .blue = 0.999512 },
+	{ .red = 0.733089, .green = 0.702808, .blue = 0.998046 },
+	{ .red = 0.877411, .green = 0.696947, .blue = 0.999023 },
+	{ .red = 0.998535, .green = 0.682051, .blue = 0.987057 },
+	{ .red = 0.998291, .green = 0.679121, .blue = 0.883028 },
+	{ .red = 0.998779, .green = 0.671306, .blue = 0.825153 },
+	{ .red = 0.998535, .green = 0.659096, .blue = 0.784860 },
+	{ .red = 0.998779, .green = 0.643468, .blue = 0.751160 },
+	{ .red = 0.998779, .green = 0.625641, .blue = 0.720147 },
+	{ .red = 0.998779, .green = 0.606593, .blue = 0.690354 },
+	{ .red = 0.999267, .green = 0.586081, .blue = 0.660806 },
+	{ .red = 0.998779, .green = 0.565324, .blue = 0.631746 },
+	{ .red = 0.999023, .green = 0.544322, .blue = 0.603175 },
+	{ .red = 0.031990, .green = 0.720391, .blue = 0.823199 },
+	{ .red = 0.032723, .green = 0.726007, .blue = 0.832967 },
+	{ .red = 0.024664, .green = 0.752381, .blue = 0.878144 },
+	{ .red = 0.148718, .green = 0.828083, .blue = 0.998535 },
+	{ .red = 0.467888, .green = 0.830525, .blue = 0.999267 },
+	{ .red = 0.672527, .green = 0.825153, .blue = 0.995604 },
+	{ .red = 0.829548, .green = 0.813187, .blue = 0.961172 },
+	{ .red = 0.961172, .green = 0.795849, .blue = 0.952381 },
+	{ .red = 0.998779, .green = 0.785836, .blue = 0.888645 },
+	{ .red = 0.998291, .green = 0.775824, .blue = 0.847131 },
+	{ .red = 0.999512, .green = 0.761416, .blue = 0.818071 },
+	{ .red = 0.999756, .green = 0.744322, .blue = 0.791697 },
+	{ .red = 0.998535, .green = 0.725031, .blue = 0.765079 },
+	{ .red = 0.999512, .green = 0.703785, .blue = 0.738462 },
+	{ .red = 0.999512, .green = 0.681563, .blue = 0.711111 },
+	{ .red = 0.999023, .green = 0.658608, .blue = 0.683028 },
+	{ .red = 0.998291, .green = 0.635409, .blue = 0.654457 },
+	{ .red = 0.025153, .green = 0.874725, .blue = 0.874725 },
+	{ .red = 0.025885, .green = 0.878144, .blue = 0.878388 },
+	{ .red = 0.028327, .green = 0.891087, .blue = 0.892308 },
+	{ .red = 0.031990, .green = 0.920391, .blue = 0.923810 },
+	{ .red = 0.272772, .green = 0.954090, .blue = 0.959219 },
+	{ .red = 0.546032, .green = 0.937241, .blue = 0.940659 },
+	{ .red = 0.735043, .green = 0.916239, .blue = 0.917949 },
+	{ .red = 0.893040, .green = 0.891819, .blue = 0.892063 },
+	{ .red = 0.998535, .green = 0.867643, .blue = 0.873016 },
+	{ .red = 0.998291, .green = 0.853724, .blue = 0.858364 },
+	{ .red = 0.998535, .green = 0.837851, .blue = 0.841270 },
+	{ .red = 0.998291, .green = 0.820024, .blue = 0.822222 },
+	{ .red = 0.998291, .green = 0.800733, .blue = 0.800977 },
+	{ .red = 0.999512, .green = 0.779731, .blue = 0.777778 },
+	{ .red = 0.998291, .green = 0.757509, .blue = 0.753114 },
+	{ .red = 0.999267, .green = 0.734554, .blue = 0.726984 },
+	{ .red = 0.999023, .green = 0.710867, .blue = 0.699878 },
+	{ .red = 0.031502, .green = 0.913309, .blue = 0.821245 },
+	{ .red = 0.029304, .green = 0.916728, .blue = 0.823199 },
+	{ .red = 0.015873, .green = 0.930647, .blue = 0.831502 },
+	{ .red = 0.066178, .green = 0.958974, .blue = 0.847619 },
+	{ .red = 0.225885, .green = 0.999512, .blue = 0.870818 },
+	{ .red = 0.480098, .green = 0.999023, .blue = 0.867888 },
+	{ .red = 0.644444, .green = 0.996825, .blue = 0.856166 },
+	{ .red = 0.812698, .green = 0.970696, .blue = 0.834432 },
+	{ .red = 0.947985, .green = 0.943834, .blue = 0.816606 },
+	{ .red = 0.998779, .green = 0.908425, .blue = 0.835409 },
+	{ .red = 0.999512, .green = 0.893284, .blue = 0.848352 },
+	{ .red = 0.999023, .green = 0.875946, .blue = 0.840537 },
+	{ .red = 0.998535, .green = 0.857143, .blue = 0.825397 },
+	{ .red = 0.999267, .green = 0.837118, .blue = 0.806349 },
+	{ .red = 0.999512, .green = 0.816117, .blue = 0.784860 },
+	{ .red = 0.999267, .green = 0.794139, .blue = 0.761416 },
+	{ .red = 0.999023, .green = 0.771673, .blue = 0.736508 },
+	{ .red = 0.035409, .green = 0.940415, .blue = 0.769719 },
+	{ .red = 0.037851, .green = 0.943834, .blue = 0.770940 },
+	{ .red = 0.032234, .green = 0.956777, .blue = 0.774847 },
+	{ .red = 0.093529, .green = 0.980708, .blue = 0.782173 },
+	{ .red = 0.324298, .green = 0.999512, .blue = 0.794139 },
+	{ .red = 0.518926, .green = 0.999267, .blue = 0.802442 },
+	{ .red = 0.659829, .green = 0.998779, .blue = 0.807082 },
+	{ .red = 0.775336, .green = 0.998779, .blue = 0.802930 },
+	{ .red = 0.875458, .green = 0.999512, .blue = 0.770208 },
+	{ .red = 0.986081, .green = 0.978999, .blue = 0.743346 },
+	{ .red = 0.999023, .green = 0.924786, .blue = 0.800244 },
+	{ .red = 0.998779, .green = 0.900611, .blue = 0.815140 },
+	{ .red = 0.998779, .green = 0.885470, .blue = 0.817094 },
+	{ .red = 0.998779, .green = 0.873260, .blue = 0.813919 },
+	{ .red = 0.999267, .green = 0.861538, .blue = 0.807082 },
+	{ .red = 0.999023, .green = 0.841026, .blue = 0.786569 },
+	{ .red = 0.998535, .green = 0.819780, .blue = 0.764591 },
+	{ .red = 0.018315, .green = 0.959951, .blue = 0.721856 },
+	{ .red = 0.022466, .green = 0.963126, .blue = 0.722344 },
+	{ .red = 0.060806, .green = 0.973382, .blue = 0.723565 },
+	{ .red = 0.133333, .green = 0.990720, .blue = 0.725031 },
+	{ .red = 0.376068, .green = 0.999267, .blue = 0.742369 },
+	{ .red = 0.536996, .green = 0.999267, .blue = 0.758974 },
+	{ .red = 0.662027, .green = 0.999512, .blue = 0.774603 },
+	{ .red = 0.766545, .green = 0.998535, .blue = 0.788034 },
+	{ .red = 0.854945, .green = 0.999267, .blue = 0.794872 },
+	{ .red = 0.911600, .green = 0.999267, .blue = 0.753846 },
+	{ .red = 0.999512, .green = 0.993162, .blue = 0.700855 },
+	{ .red = 0.999023, .green = 0.933333, .blue = 0.761905 },
+	{ .red = 0.998779, .green = 0.904029, .blue = 0.775580 },
+	{ .red = 0.998535, .green = 0.883516, .blue = 0.777045 },
+	{ .red = 0.998535, .green = 0.866667, .blue = 0.772405 },
+	{ .red = 0.999023, .green = 0.852015, .blue = 0.765079 },
+	{ .red = 0.998535, .green = 0.837851, .blue = 0.755800 },
+	{ .red = 0.023443, .green = 0.973626, .blue = 0.677656 },
+	{ .red = 0.025397, .green = 0.976313, .blue = 0.677411 },
+	{ .red = 0.088400, .green = 0.983639, .blue = 0.676923 },
+	{ .red = 0.201465, .green = 0.999512, .blue = 0.683028 },
+	{ .red = 0.404151, .green = 0.998779, .blue = 0.702320 },
+	{ .red = 0.543590, .green = 0.998535, .blue = 0.724298 },
+	{ .red = 0.657387, .green = 0.998291, .blue = 0.746764 },
+	{ .red = 0.751893, .green = 0.999023, .blue = 0.768010 },
+	{ .red = 0.833944, .green = 0.998779, .blue = 0.788767 },
+	{ .red = 0.877656, .green = 0.999756, .blue = 0.768987 },
+	{ .red = 0.927228, .green = 0.998779, .blue = 0.733089 },
+	{ .red = 0.998046, .green = 0.994383, .blue = 0.677900 },
+	{ .red = 0.998291, .green = 0.938217, .blue = 0.720879 },
+	{ .red = 0.999023, .green = 0.905495, .blue = 0.731868 },
+	{ .red = 0.998535, .green = 0.881074, .blue = 0.733333 },
+	{ .red = 0.999023, .green = 0.861294, .blue = 0.728449 },
+	{ .red = 0.998535, .green = 0.843223, .blue = 0.720635 },
+	{ .red = 0.065934, .green = 0.981441, .blue = 0.636630 },
+	{ .red = 0.073016, .green = 0.983394, .blue = 0.636142 },
+	{ .red = 0.106227, .green = 0.989499, .blue = 0.634921 },
+	{ .red = 0.258364, .green = 0.999023, .blue = 0.646398 },
+	{ .red = 0.415385, .green = 0.999023, .blue = 0.667643 },
+	{ .red = 0.539194, .green = 0.998779, .blue = 0.692063 },
+	{ .red = 0.644444, .green = 0.998535, .blue = 0.718437 },
+	{ .red = 0.733822, .green = 0.998535, .blue = 0.744811 },
+	{ .red = 0.810256, .green = 0.999512, .blue = 0.769963 },
+	{ .red = 0.858120, .green = 0.999512, .blue = 0.771673 },
+	{ .red = 0.887179, .green = 0.999267, .blue = 0.736264 },
+	{ .red = 0.934799, .green = 0.998291, .blue = 0.706960 },
+	{ .red = 0.998046, .green = 0.995849, .blue = 0.646642 },
+	{ .red = 0.999267, .green = 0.941880, .blue = 0.677167 },
+	{ .red = 0.998291, .green = 0.905983, .blue = 0.687668 },
+	{ .red = 0.999267, .green = 0.879365, .blue = 0.687668 },
+	{ .red = 0.999023, .green = 0.856899, .blue = 0.683516 },
+	{ .red = 0.051770, .green = 0.988767, .blue = 0.599267 },
+	{ .red = 0.070574, .green = 0.989744, .blue = 0.598779 },
+	{ .red = 0.114286, .green = 0.995116, .blue = 0.597802 },
+	{ .red = 0.285470, .green = 0.998779, .blue = 0.613919 },
+	{ .red = 0.417338, .green = 0.998535, .blue = 0.635653 },
+	{ .red = 0.528938, .green = 0.998535, .blue = 0.661294 },
+	{ .red = 0.625397, .green = 0.999267, .blue = 0.688645 },
+	{ .red = 0.711355, .green = 0.998535, .blue = 0.717705 },
+	{ .red = 0.785104, .green = 0.999267, .blue = 0.745788 },
+	{ .red = 0.842491, .green = 0.998779, .blue = 0.766545 },
+	{ .red = 0.859829, .green = 0.998291, .blue = 0.733333 },
+	{ .red = 0.892063, .green = 0.999267, .blue = 0.699389 },
+	{ .red = 0.938950, .green = 0.999023, .blue = 0.674481 },
+	{ .red = 0.997558, .green = 0.996581, .blue = 0.613187 },
+	{ .red = 0.998779, .green = 0.944322, .blue = 0.635409 },
+	{ .red = 0.999023, .green = 0.907448, .blue = 0.642979 },
+	{ .red = 0.998535, .green = 0.878144, .blue = 0.644200 },
+	{ .red = 0.107204, .green = 0.988523, .blue = 0.565324 },
+	{ .red = 0.114042, .green = 0.989499, .blue = 0.564835 },
+	{ .red = 0.167521, .green = 0.996825, .blue = 0.568498 },
+	{ .red = 0.295238, .green = 0.999512, .blue = 0.583883 },
+	{ .red = 0.411722, .green = 0.998779, .blue = 0.605128 },
+	{ .red = 0.512821, .green = 0.999512, .blue = 0.630525 },
+	{ .red = 0.604640, .green = 0.999267, .blue = 0.658608 },
+	{ .red = 0.686203, .green = 0.999023, .blue = 0.688156 },
+	{ .red = 0.758730, .green = 0.998535, .blue = 0.718681 },
+	{ .red = 0.819780, .green = 0.999512, .blue = 0.746276 },
+	{ .red = 0.836874, .green = 0.998291, .blue = 0.722344 },
+	{ .red = 0.859585, .green = 0.998535, .blue = 0.690598 },
+	{ .red = 0.894994, .green = 0.999756, .blue = 0.660073 },
+	{ .red = 0.941636, .green = 0.999023, .blue = 0.641026 },
+	{ .red = 0.998779, .green = 0.998291, .blue = 0.575336 },
+	{ .red = 0.999023, .green = 0.946764, .blue = 0.594872 },
+	{ .red = 0.999267, .green = 0.908669, .blue = 0.601709 },
+	{ .red = 0.098657, .green = 0.992430, .blue = 0.534310 },
+	{ .red = 0.107692, .green = 0.993162, .blue = 0.533822 },
+	{ .red = 0.185836, .green = 0.999512, .blue = 0.540904 },
+	{ .red = 0.301343, .green = 0.998535, .blue = 0.555800 },
+	{ .red = 0.401465, .green = 0.999267, .blue = 0.576068 },
+	{ .red = 0.494505, .green = 0.999756, .blue = 0.600244 },
+	{ .red = 0.582418, .green = 0.998535, .blue = 0.628816 },
+	{ .red = 0.659829, .green = 0.999267, .blue = 0.657631 },
+	{ .red = 0.730403, .green = 0.998779, .blue = 0.688400 },
+	{ .red = 0.792430, .green = 0.999023, .blue = 0.718926 },
+	{ .red = 0.814896, .green = 0.998291, .blue = 0.706471 },
+	{ .red = 0.831746, .green = 0.999023, .blue = 0.676190 },
+	{ .red = 0.859585, .green = 0.998535, .blue = 0.649328 },
+	{ .red = 0.897436, .green = 0.999267, .blue = 0.623687 },
+	{ .red = 0.943834, .green = 0.999512, .blue = 0.606349 },
+	{ .red = 0.997558, .green = 0.997558, .blue = 0.544811 },
+	{ .red = 0.999267, .green = 0.948962, .blue = 0.557509 },
+	{ .red = 0.123810, .green = 0.991453, .blue = 0.506716 },
+	{ .red = 0.141148, .green = 0.994139, .blue = 0.508669 },
+	{ .red = 0.203907, .green = 0.999023, .blue = 0.515507 },
+	{ .red = 0.299634, .green = 0.998291, .blue = 0.529426 },
+	{ .red = 0.389988, .green = 0.999023, .blue = 0.548474 },
+	{ .red = 0.477656, .green = 0.998779, .blue = 0.572161 },
+	{ .red = 0.558730, .green = 0.999023, .blue = 0.598779 },
+	{ .red = 0.633700, .green = 0.999023, .blue = 0.627839 },
+	{ .red = 0.701832, .green = 0.999023, .blue = 0.657631 },
+	{ .red = 0.763370, .green = 0.999023, .blue = 0.688400 },
+	{ .red = 0.792186, .green = 0.999512, .blue = 0.685714 },
+	{ .red = 0.806105, .green = 0.999756, .blue = 0.658364 },
+	{ .red = 0.829304, .green = 0.999023, .blue = 0.633455 },
+	{ .red = 0.860562, .green = 0.999267, .blue = 0.609280 },
+	{ .red = 0.899878, .green = 0.999267, .blue = 0.588278 },
+	{ .red = 0.945055, .green = 0.999023, .blue = 0.575092 },
+	{ .red = 0.996337, .green = 0.997070, .blue = 0.517216 },
+	{ .red = 0.005128, .green = 0.142125, .blue = 0.646154 },
+	{ .red = 0.093529, .green = 0.014896, .blue = 0.755067 },
+	{ .red = 0.219780, .green = 0.013431, .blue = 0.796093 },
+	{ .red = 0.352869, .green = 0.013675, .blue = 0.841026 },
+	{ .red = 0.476435, .green = 0.018071, .blue = 0.855189 },
+	{ .red = 0.575580, .green = 0.020757, .blue = 0.839560 },
+	{ .red = 0.653724, .green = 0.021245, .blue = 0.815140 },
+	{ .red = 0.737973, .green = 0.021734, .blue = 0.813919 },
+	{ .red = 0.840537, .green = 0.018071, .blue = 0.839316 },
+	{ .red = 0.884005, .green = 0.021978, .blue = 0.784860 },
+	{ .red = 0.915995, .green = 0.015873, .blue = 0.733822 },
+	{ .red = 0.938462, .green = 0.018315, .blue = 0.686203 },
+	{ .red = 0.956044, .green = 0.019048, .blue = 0.643712 },
+	{ .red = 0.970696, .green = 0.015140, .blue = 0.605861 },
+	{ .red = 0.980708, .green = 0.019048, .blue = 0.570452 },
+	{ .red = 0.984615, .green = 0.029792, .blue = 0.536508 },
+	{ .red = 0.983883, .green = 0.045177, .blue = 0.504518 },
+	{ .red = 0.010989, .green = 0.146520, .blue = 0.684249 },
+	{ .red = 0.099389, .green = 0.015140, .blue = 0.805372 },
+	{ .red = 0.232234, .green = 0.021978, .blue = 0.857631 },
+	{ .red = 0.380464, .green = 0.017582, .blue = 0.924542 },
+	{ .red = 0.518193, .green = 0.020024, .blue = 0.946032 },
+	{ .red = 0.622222, .green = 0.009035, .blue = 0.919658 },
+	{ .red = 0.695971, .green = 0.022466, .blue = 0.875214 },
+	{ .red = 0.777289, .green = 0.015873, .blue = 0.861783 },
+	{ .red = 0.876435, .green = 0.024420, .blue = 0.877411 },
+	{ .red = 0.920635, .green = 0.021001, .blue = 0.818315 },
+	{ .red = 0.949695, .green = 0.016117, .blue = 0.760440 },
+	{ .red = 0.968987, .green = 0.019048, .blue = 0.707204 },
+	{ .red = 0.977534, .green = 0.033211, .blue = 0.656410 },
+	{ .red = 0.984371, .green = 0.038339, .blue = 0.612698 },
+	{ .red = 0.995604, .green = 0.064957, .blue = 0.578510 },
+	{ .red = 0.999756, .green = 0.091087, .blue = 0.546276 },
+	{ .red = 0.999023, .green = 0.111111, .blue = 0.515995 },
+	{ .red = 0.000000, .green = 0.192186, .blue = 0.785348 },
+	{ .red = 0.121123, .green = 0.140904, .blue = 0.999023 },
+	{ .red = 0.261538, .green = 0.170452, .blue = 0.999023 },
+	{ .red = 0.403175, .green = 0.199756, .blue = 0.999023 },
+	{ .red = 0.541148, .green = 0.212943, .blue = 0.998291 },
+	{ .red = 0.670330, .green = 0.210745, .blue = 0.998535 },
+	{ .red = 0.788767, .green = 0.200488, .blue = 0.999023 },
+	{ .red = 0.896215, .green = 0.187302, .blue = 0.998779 },
+	{ .red = 0.993651, .green = 0.173871, .blue = 0.996825 },
+	{ .red = 0.999267, .green = 0.194139, .blue = 0.887424 },
+	{ .red = 0.999267, .green = 0.207326, .blue = 0.800000 },
+	{ .red = 0.999023, .green = 0.214652, .blue = 0.732845 },
+	{ .red = 0.998779, .green = 0.219048, .blue = 0.678632 },
+	{ .red = 0.999512, .green = 0.221001, .blue = 0.634188 },
+	{ .red = 0.999023, .green = 0.221734, .blue = 0.595360 },
+	{ .red = 0.999023, .green = 0.221978, .blue = 0.561905 },
+	{ .red = 0.999267, .green = 0.221978, .blue = 0.532601 },
+	{ .red = 0.006838, .green = 0.260073, .blue = 0.664713 },
+	{ .red = 0.093040, .green = 0.311844, .blue = 0.998291 },
+	{ .red = 0.270574, .green = 0.348474, .blue = 0.999267 },
+	{ .red = 0.409524, .green = 0.365324, .blue = 0.998535 },
+	{ .red = 0.548230, .green = 0.378999, .blue = 0.998291 },
+	{ .red = 0.680830, .green = 0.386325, .blue = 0.999267 },
+	{ .red = 0.802198, .green = 0.387546, .blue = 0.999512 },
+	{ .red = 0.910379, .green = 0.383883, .blue = 0.999267 },
+	{ .red = 0.999512, .green = 0.379243, .blue = 0.989744 },
+	{ .red = 0.999023, .green = 0.381929, .blue = 0.884737 },
+	{ .red = 0.999267, .green = 0.380708, .blue = 0.806838 },
+	{ .red = 0.998535, .green = 0.376557, .blue = 0.747497 },
+	{ .red = 0.998779, .green = 0.370208, .blue = 0.699878 },
+	{ .red = 0.999023, .green = 0.362149, .blue = 0.659341 },
+	{ .red = 0.998779, .green = 0.353114, .blue = 0.623443 },
+	{ .red = 0.999267, .green = 0.343834, .blue = 0.591453 },
+	{ .red = 0.999756, .green = 0.334554, .blue = 0.562393 },
+	{ .red = 0.004151, .green = 0.378755, .blue = 0.725519 },
+	{ .red = 0.006105, .green = 0.402442, .blue = 0.824176 },
+	{ .red = 0.266911, .green = 0.482540, .blue = 0.999756 },
+	{ .red = 0.427350, .green = 0.515263, .blue = 0.999512 },
+	{ .red = 0.561172, .green = 0.529915, .blue = 0.998535 },
+	{ .red = 0.691575, .green = 0.540171, .blue = 0.999267 },
+	{ .red = 0.812210, .green = 0.543590, .blue = 0.999512 },
+	{ .red = 0.919414, .green = 0.541392, .blue = 0.999023 },
+	{ .red = 0.999023, .green = 0.536996, .blue = 0.981441 },
+	{ .red = 0.999023, .green = 0.536020, .blue = 0.889621 },
+	{ .red = 0.999023, .green = 0.530159, .blue = 0.823199 },
+	{ .red = 0.998779, .green = 0.520879, .blue = 0.773626 },
+	{ .red = 0.999512, .green = 0.508669, .blue = 0.733333 },
+	{ .red = 0.999267, .green = 0.494261, .blue = 0.696947 },
+	{ .red = 0.999023, .green = 0.478877, .blue = 0.663736 },
+	{ .red = 0.999267, .green = 0.462759, .blue = 0.632723 },
+	{ .red = 0.998779, .green = 0.446642, .blue = 0.603175 },
+	{ .red = 0.010989, .green = 0.510867, .blue = 0.782662 },
+	{ .red = 0.021734, .green = 0.525031, .blue = 0.821734 },
+	{ .red = 0.158974, .green = 0.600000, .blue = 0.999267 },
+	{ .red = 0.416117, .green = 0.633700, .blue = 0.999023 },
+	{ .red = 0.580708, .green = 0.666422, .blue = 0.998291 },
+	{ .red = 0.700122, .green = 0.675458, .blue = 0.998535 },
+	{ .red = 0.815140, .green = 0.678632, .blue = 0.998291 },
+	{ .red = 0.920635, .green = 0.675702, .blue = 0.998291 },
+	{ .red = 0.998779, .green = 0.669353, .blue = 0.980952 },
+	{ .red = 0.999023, .green = 0.667643, .blue = 0.901343 },
+	{ .red = 0.999267, .green = 0.659585, .blue = 0.847619 },
+	{ .red = 0.998779, .green = 0.647131, .blue = 0.807326 },
+	{ .red = 0.998779, .green = 0.631258, .blue = 0.772650 },
+	{ .red = 0.999023, .green = 0.612943, .blue = 0.740904 },
+	{ .red = 0.998046, .green = 0.593407, .blue = 0.710134 },
+	{ .red = 0.998535, .green = 0.572894, .blue = 0.680342 },
+	{ .red = 0.999023, .green = 0.551893, .blue = 0.651282 },
+	{ .red = 0.023199, .green = 0.647619, .blue = 0.834188 },
+	{ .red = 0.023687, .green = 0.655678, .blue = 0.851282 },
+	{ .red = 0.025153, .green = 0.697192, .blue = 0.934554 },
+	{ .red = 0.323321, .green = 0.742369, .blue = 0.998046 },
+	{ .red = 0.536020, .green = 0.763858, .blue = 0.999023 },
+	{ .red = 0.705006, .green = 0.788523, .blue = 0.998291 },
+	{ .red = 0.810256, .green = 0.791209, .blue = 0.998535 },
+	{ .red = 0.914286, .green = 0.786325, .blue = 0.998291 },
+	{ .red = 0.999023, .green = 0.775824, .blue = 0.985592 },
+	{ .red = 0.999267, .green = 0.773626, .blue = 0.914530 },
+	{ .red = 0.999267, .green = 0.763858, .blue = 0.872527 },
+	{ .red = 0.998779, .green = 0.749451, .blue = 0.840293 },
+	{ .red = 0.998291, .green = 0.731868, .blue = 0.811722 },
+	{ .red = 0.999756, .green = 0.711600, .blue = 0.784127 },
+	{ .red = 0.998779, .green = 0.690110, .blue = 0.755800 },
+	{ .red = 0.999023, .green = 0.667399, .blue = 0.727473 },
+	{ .red = 0.999023, .green = 0.643956, .blue = 0.699145 },
+	{ .red = 0.024176, .green = 0.786081, .blue = 0.881807 },
+	{ .red = 0.025641, .green = 0.790720, .blue = 0.889377 },
+	{ .red = 0.031746, .green = 0.810745, .blue = 0.921123 },
+	{ .red = 0.104518, .green = 0.861783, .blue = 0.998779 },
+	{ .red = 0.436874, .green = 0.869841, .blue = 0.998779 },
+	{ .red = 0.620513, .green = 0.876190, .blue = 0.998291 },
+	{ .red = 0.771673, .green = 0.879609, .blue = 0.999023 },
+	{ .red = 0.890598, .green = 0.876923, .blue = 0.999512 },
+	{ .red = 0.998779, .green = 0.858608, .blue = 0.990476 },
+	{ .red = 0.999023, .green = 0.854212, .blue = 0.923077 },
+	{ .red = 0.998535, .green = 0.842735, .blue = 0.892063 },
+	{ .red = 0.998535, .green = 0.827106, .blue = 0.867643 },
+	{ .red = 0.999512, .green = 0.808791, .blue = 0.844200 },
+	{ .red = 0.998779, .green = 0.788523, .blue = 0.819780 },
+	{ .red = 0.998535, .green = 0.766789, .blue = 0.794628 },
+	{ .red = 0.998291, .green = 0.743834, .blue = 0.768254 },
+	{ .red = 0.998535, .green = 0.720147, .blue = 0.741392 },
+	{ .red = 0.029548, .green = 0.916484, .blue = 0.916239 },
+	{ .red = 0.029792, .green = 0.919658, .blue = 0.919658 },
+	{ .red = 0.030281, .green = 0.930891, .blue = 0.932112 },
+	{ .red = 0.064957, .green = 0.954579, .blue = 0.957265 },
+	{ .red = 0.185348, .green = 0.993407, .blue = 0.998291 },
+	{ .red = 0.453968, .green = 0.994872, .blue = 0.999023 },
+	{ .red = 0.630769, .green = 0.985592, .blue = 0.988767 },
+	{ .red = 0.795604, .green = 0.961661, .blue = 0.963126 },
+	{ .red = 0.936020, .green = 0.934799, .blue = 0.935043 },
+	{ .red = 0.999756, .green = 0.913309, .blue = 0.916972 },
+	{ .red = 0.999756, .green = 0.898901, .blue = 0.902320 },
+	{ .red = 0.999267, .green = 0.882784, .blue = 0.885714 },
+	{ .red = 0.998535, .green = 0.865201, .blue = 0.867155 },
+	{ .red = 0.998291, .green = 0.845910, .blue = 0.846642 },
+	{ .red = 0.998291, .green = 0.825153, .blue = 0.824420 },
+	{ .red = 0.998779, .green = 0.803175, .blue = 0.800733 },
+	{ .red = 0.999756, .green = 0.780220, .blue = 0.775580 },
+	{ .red = 0.029792, .green = 0.942613, .blue = 0.858608 },
+	{ .red = 0.029548, .green = 0.945788, .blue = 0.860562 },
+	{ .red = 0.029792, .green = 0.957265, .blue = 0.868132 },
+	{ .red = 0.035165, .green = 0.980952, .blue = 0.883516 },
+	{ .red = 0.296703, .green = 0.999512, .blue = 0.897680 },
+	{ .red = 0.505739, .green = 0.998779, .blue = 0.901099 },
+	{ .red = 0.646886, .green = 0.998046, .blue = 0.902320 },
+	{ .red = 0.757021, .green = 0.998291, .blue = 0.897924 },
+	{ .red = 0.854457, .green = 0.999267, .blue = 0.874481 },
+	{ .red = 0.975336, .green = 0.971184, .blue = 0.854701 },
+	{ .red = 0.999512, .green = 0.935775, .blue = 0.884493 },
+	{ .red = 0.999023, .green = 0.923077, .blue = 0.891575 },
+	{ .red = 0.999512, .green = 0.906227, .blue = 0.879853 },
+	{ .red = 0.999267, .green = 0.887912, .blue = 0.863736 },
+	{ .red = 0.998535, .green = 0.868864, .blue = 0.844933 },
+	{ .red = 0.998779, .green = 0.848596, .blue = 0.824176 },
+	{ .red = 0.998535, .green = 0.827595, .blue = 0.801709 },
+	{ .red = 0.058364, .green = 0.960440, .blue = 0.804884 },
+	{ .red = 0.063492, .green = 0.962882, .blue = 0.805861 },
+	{ .red = 0.084493, .green = 0.972161, .blue = 0.809524 },
+	{ .red = 0.133822, .green = 0.988523, .blue = 0.815629 },
+	{ .red = 0.367033, .green = 0.998291, .blue = 0.829792 },
+	{ .red = 0.531380, .green = 0.999267, .blue = 0.841514 },
+	{ .red = 0.656654, .green = 0.999267, .blue = 0.851526 },
+	{ .red = 0.757998, .green = 0.998779, .blue = 0.858608 },
+	{ .red = 0.842491, .green = 0.999512, .blue = 0.859829 },
+	{ .red = 0.914530, .green = 0.999023, .blue = 0.841758 },
+	{ .red = 0.998046, .green = 0.992186, .blue = 0.789988 },
+	{ .red = 0.999267, .green = 0.942125, .blue = 0.846886 },
+	{ .red = 0.998291, .green = 0.921856, .blue = 0.855922 },
+	{ .red = 0.999756, .green = 0.908425, .blue = 0.854212 },
+	{ .red = 0.999023, .green = 0.896703, .blue = 0.849573 },
+	{ .red = 0.999023, .green = 0.884737, .blue = 0.840537 },
+	{ .red = 0.999267, .green = 0.864469, .blue = 0.819536 },
+	{ .red = 0.037607, .green = 0.974115, .blue = 0.756288 },
+	{ .red = 0.044200, .green = 0.976557, .blue = 0.756777 },
+	{ .red = 0.071306, .green = 0.984615, .blue = 0.758486 },
+	{ .red = 0.185836, .green = 0.998535, .blue = 0.764835 },
+	{ .red = 0.399512, .green = 0.998779, .blue = 0.780220 },
+	{ .red = 0.541636, .green = 0.998779, .blue = 0.796825 },
+	{ .red = 0.653968, .green = 0.999267, .blue = 0.813431 },
+	{ .red = 0.747741, .green = 0.999023, .blue = 0.828327 },
+	{ .red = 0.826618, .green = 0.999512, .blue = 0.840781 },
+	{ .red = 0.896215, .green = 0.999267, .blue = 0.852503 },
+	{ .red = 0.932845, .green = 0.999267, .blue = 0.813675 },
+	{ .red = 0.999512, .green = 0.995360, .blue = 0.758974 },
+	{ .red = 0.998535, .green = 0.945055, .blue = 0.805617 },
+	{ .red = 0.998291, .green = 0.919902, .blue = 0.814652 },
+	{ .red = 0.998291, .green = 0.901832, .blue = 0.813675 },
+	{ .red = 0.999267, .green = 0.886691, .blue = 0.807570 },
+	{ .red = 0.998779, .green = 0.873260, .blue = 0.800488 },
+	{ .red = 0.033455, .green = 0.983394, .blue = 0.711600 },
+	{ .red = 0.036630, .green = 0.985592, .blue = 0.711844 },
+	{ .red = 0.078144, .green = 0.991941, .blue = 0.711844 },
+	{ .red = 0.252747, .green = 0.999023, .blue = 0.721612 },
+	{ .red = 0.414896, .green = 0.998779, .blue = 0.738950 },
+	{ .red = 0.538706, .green = 0.999267, .blue = 0.758730 },
+	{ .red = 0.643223, .green = 0.999267, .blue = 0.779243 },
+	{ .red = 0.731868, .green = 0.998779, .blue = 0.799512 },
+	{ .red = 0.806349, .green = 0.999267, .blue = 0.817827 },
+	{ .red = 0.872039, .green = 0.999267, .blue = 0.836874 },
+	{ .red = 0.904762, .green = 0.998291, .blue = 0.821245 },
+	{ .red = 0.940904, .green = 0.999512, .blue = 0.782173 },
+	{ .red = 0.998535, .green = 0.995604, .blue = 0.726984 },
+	{ .red = 0.998535, .green = 0.946764, .blue = 0.761172 },
+	{ .red = 0.999023, .green = 0.918193, .blue = 0.769475 },
+	{ .red = 0.999512, .green = 0.896947, .blue = 0.768987 },
+	{ .red = 0.998291, .green = 0.878877, .blue = 0.765079 },
+	{ .red = 0.094994, .green = 0.986081, .blue = 0.670085 },
+	{ .red = 0.094505, .green = 0.988278, .blue = 0.670085 },
+	{ .red = 0.109402, .green = 0.994139, .blue = 0.669597 },
+	{ .red = 0.284737, .green = 0.998535, .blue = 0.684005 },
+	{ .red = 0.418071, .green = 0.998779, .blue = 0.702320 },
+	{ .red = 0.530891, .green = 0.998291, .blue = 0.723810 },
+	{ .red = 0.627106, .green = 0.998535, .blue = 0.746520 },
+	{ .red = 0.710867, .green = 0.998535, .blue = 0.769475 },
+	{ .red = 0.784127, .green = 0.998046, .blue = 0.792430 },
+	{ .red = 0.846154, .green = 0.999267, .blue = 0.813675 },
+	{ .red = 0.885958, .green = 0.999023, .blue = 0.816361 },
+	{ .red = 0.905739, .green = 0.999267, .blue = 0.779731 },
+	{ .red = 0.944567, .green = 0.999267, .blue = 0.749206 },
+	{ .red = 0.997802, .green = 0.996093, .blue = 0.690354 },
+	{ .red = 0.998535, .green = 0.948230, .blue = 0.716728 },
+	{ .red = 0.999023, .green = 0.916972, .blue = 0.724542 },
+	{ .red = 0.998779, .green = 0.893040, .blue = 0.725275 },
+	{ .red = 0.111600, .green = 0.988523, .blue = 0.632723 },
+	{ .red = 0.118193, .green = 0.989499, .blue = 0.632479 },
+	{ .red = 0.163614, .green = 0.997070, .blue = 0.636142 },
+	{ .red = 0.297192, .green = 0.999023, .blue = 0.649817 },
+	{ .red = 0.412943, .green = 0.999023, .blue = 0.668376 },
+	{ .red = 0.514530, .green = 0.999267, .blue = 0.689866 },
+	{ .red = 0.605861, .green = 0.999023, .blue = 0.713797 },
+	{ .red = 0.686447, .green = 0.998779, .blue = 0.738217 },
+	{ .red = 0.757509, .green = 0.998535, .blue = 0.762882 },
+	{ .red = 0.819292, .green = 0.998779, .blue = 0.786813 },
+	{ .red = 0.869353, .green = 0.999023, .blue = 0.806349 },
+	{ .red = 0.880098, .green = 0.999512, .blue = 0.771184 },
+	{ .red = 0.905983, .green = 0.999267, .blue = 0.738706 },
+	{ .red = 0.946276, .green = 0.998779, .blue = 0.715018 },
+	{ .red = 0.997558, .green = 0.996825, .blue = 0.652991 },
+	{ .red = 0.998291, .green = 0.949451, .blue = 0.673748 },
+	{ .red = 0.999267, .green = 0.916728, .blue = 0.680586 },
+	{ .red = 0.095238, .green = 0.993162, .blue = 0.599023 },
+	{ .red = 0.103053, .green = 0.994139, .blue = 0.598535 },
+	{ .red = 0.186813, .green = 0.999267, .blue = 0.605372 },
+	{ .red = 0.302564, .green = 0.998535, .blue = 0.618559 },
+	{ .red = 0.404396, .green = 0.998291, .blue = 0.636142 },
+	{ .red = 0.498657, .green = 0.998291, .blue = 0.657875 },
+	{ .red = 0.582906, .green = 0.999267, .blue = 0.681563 },
+	{ .red = 0.660317, .green = 0.999267, .blue = 0.706471 },
+	{ .red = 0.730159, .green = 0.998535, .blue = 0.732357 },
+	{ .red = 0.790720, .green = 0.999023, .blue = 0.757021 },
+	{ .red = 0.844444, .green = 0.999267, .blue = 0.782173 },
+	{ .red = 0.858852, .green = 0.998291, .blue = 0.760195 },
+	{ .red = 0.876435, .green = 0.999267, .blue = 0.727473 },
+	{ .red = 0.906471, .green = 0.998779, .blue = 0.699878 },
+	{ .red = 0.947497, .green = 0.998779, .blue = 0.679609 },
+	{ .red = 0.997070, .green = 0.996825, .blue = 0.617338 },
+	{ .red = 0.999023, .green = 0.951404, .blue = 0.632723 },
+	{ .red = 0.125519, .green = 0.991453, .blue = 0.568254 },
+	{ .red = 0.142613, .green = 0.993895, .blue = 0.570208 },
+	{ .red = 0.205128, .green = 0.998779, .blue = 0.576801 },
+	{ .red = 0.297924, .green = 0.999512, .blue = 0.589011 },
+	{ .red = 0.392918, .green = 0.998291, .blue = 0.606105 },
+	{ .red = 0.478877, .green = 0.999023, .blue = 0.626862 },
+	{ .red = 0.559951, .green = 0.999023, .blue = 0.650061 },
+	{ .red = 0.633944, .green = 0.999267, .blue = 0.674969 },
+	{ .red = 0.701343, .green = 0.999267, .blue = 0.700611 },
+	{ .red = 0.762149, .green = 0.999023, .blue = 0.726740 },
+	{ .red = 0.816117, .green = 0.999267, .blue = 0.752381 },
+	{ .red = 0.837851, .green = 0.999023, .blue = 0.743101 },
+	{ .red = 0.851038, .green = 0.998779, .blue = 0.714042 },
+	{ .red = 0.874481, .green = 0.998535, .blue = 0.686935 },
+	{ .red = 0.907448, .green = 0.999512, .blue = 0.660562 },
+	{ .red = 0.948474, .green = 0.998779, .blue = 0.645421 },
+	{ .red = 0.998779, .green = 0.998535, .blue = 0.578999 },
+	{ .red = 0.013919, .green = 0.144078, .blue = 0.702808 },
+	{ .red = 0.089377, .green = 0.014896, .blue = 0.805128 },
+	{ .red = 0.205372, .green = 0.019780, .blue = 0.835409 },
+	{ .red = 0.332601, .green = 0.022466, .blue = 0.888889 },
+	{ .red = 0.461294, .green = 0.020757, .blue = 0.925519 },
+	{ .red = 0.566545, .green = 0.018803, .blue = 0.918681 },
+	{ .red = 0.650305, .green = 0.015629, .blue = 0.894994 },
+	{ .red = 0.711844, .green = 0.017094, .blue = 0.861050 },
+	{ .red = 0.792186, .green = 0.014896, .blue = 0.863492 },
+	{ .red = 0.879609, .green = 0.024908, .blue = 0.878632 },
+	{ .red = 0.914530, .green = 0.022955, .blue = 0.822711 },
+	{ .red = 0.938706, .green = 0.019292, .blue = 0.769963 },
+	{ .red = 0.956532, .green = 0.018803, .blue = 0.721856 },
+	{ .red = 0.971184, .green = 0.014408, .blue = 0.679121 },
+	{ .red = 0.976557, .green = 0.030281, .blue = 0.636630 },
+	{ .red = 0.985104, .green = 0.030281, .blue = 0.601465 },
+	{ .red = 0.994139, .green = 0.026374, .blue = 0.570696 },
+	{ .red = 0.016850, .green = 0.143834, .blue = 0.760440 },
+	{ .red = 0.096215, .green = 0.019048, .blue = 0.854457 },
+	{ .red = 0.215629, .green = 0.017338, .blue = 0.889621 },
+	{ .red = 0.353114, .green = 0.023199, .blue = 0.958730 },
+	{ .red = 0.490354, .green = 0.042735, .blue = 0.996581 },
+	{ .red = 0.603663, .green = 0.040537, .blue = 0.989255 },
+	{ .red = 0.691819, .green = 0.021490, .blue = 0.960684 },
+	{ .red = 0.750183, .green = 0.020269, .blue = 0.913065 },
+	{ .red = 0.825885, .green = 0.011477, .blue = 0.903541 },
+	{ .red = 0.911355, .green = 0.023932, .blue = 0.912332 },
+	{ .red = 0.944567, .green = 0.024420, .blue = 0.850794 },
+	{ .red = 0.967033, .green = 0.019048, .blue = 0.792918 },
+	{ .red = 0.979243, .green = 0.028327, .blue = 0.738217 },
+	{ .red = 0.993162, .green = 0.020269, .blue = 0.693284 },
+	{ .red = 0.994383, .green = 0.064469, .blue = 0.647619 },
+	{ .red = 0.999023, .green = 0.092063, .blue = 0.610989 },
+	{ .red = 0.999756, .green = 0.110867, .blue = 0.577289 },
+	{ .red = 0.008791, .green = 0.174359, .blue = 0.940904 },
+	{ .red = 0.113309, .green = 0.120635, .blue = 0.999267 },
+	{ .red = 0.236386, .green = 0.146764, .blue = 0.998535 },
+	{ .red = 0.362882, .green = 0.178510, .blue = 0.999267 },
+	{ .red = 0.488156, .green = 0.198779, .blue = 0.998046 },
+	{ .red = 0.608547, .green = 0.205861, .blue = 0.999267 },
+	{ .red = 0.719170, .green = 0.204396, .blue = 0.998779 },
+	{ .red = 0.820269, .green = 0.196825, .blue = 0.999267 },
+	{ .red = 0.912821, .green = 0.187302, .blue = 0.999512 },
+	{ .red = 0.994628, .green = 0.180220, .blue = 0.995360 },
+	{ .red = 0.998535, .green = 0.199756, .blue = 0.897924 },
+	{ .red = 0.999267, .green = 0.211722, .blue = 0.819536 },
+	{ .red = 0.999267, .green = 0.218803, .blue = 0.756777 },
+	{ .red = 0.999023, .green = 0.222466, .blue = 0.705250 },
+	{ .red = 0.998535, .green = 0.224176, .blue = 0.661294 },
+	{ .red = 0.999023, .green = 0.224420, .blue = 0.623932 },
+	{ .red = 0.998779, .green = 0.223687, .blue = 0.590720 },
+	{ .red = 0.002930, .green = 0.263980, .blue = 0.793162 },
+	{ .red = 0.130891, .green = 0.305495, .blue = 0.998779 },
+	{ .red = 0.255433, .green = 0.327228, .blue = 0.999023 },
+	{ .red = 0.377534, .green = 0.344078, .blue = 0.998779 },
+	{ .red = 0.502564, .green = 0.359951, .blue = 0.998291 },
+	{ .red = 0.624176, .green = 0.371917, .blue = 0.999023 },
+	{ .red = 0.736020, .green = 0.377534, .blue = 0.998779 },
+	{ .red = 0.837363, .green = 0.378510, .blue = 0.999267 },
+	{ .red = 0.927717, .green = 0.376557, .blue = 0.998291 },
+	{ .red = 0.999267, .green = 0.375092, .blue = 0.986081 },
+	{ .red = 0.999023, .green = 0.377778, .blue = 0.895238 },
+	{ .red = 0.999023, .green = 0.376313, .blue = 0.824420 },
+	{ .red = 0.998779, .green = 0.371917, .blue = 0.768987 },
+	{ .red = 0.999023, .green = 0.365079, .blue = 0.723077 },
+	{ .red = 0.998779, .green = 0.357021, .blue = 0.683516 },
+	{ .red = 0.999023, .green = 0.347741, .blue = 0.648107 },
+	{ .red = 0.999023, .green = 0.337973, .blue = 0.616117 },
+	{ .red = 0.012454, .green = 0.347741, .blue = 0.757509 },
+	{ .red = 0.010745, .green = 0.383150, .blue = 0.922100 },
+	{ .red = 0.307937, .green = 0.484005, .blue = 0.999267 },
+	{ .red = 0.411233, .green = 0.492552, .blue = 0.998535 },
+	{ .red = 0.528449, .green = 0.507448, .blue = 0.999267 },
+	{ .red = 0.644444, .green = 0.519414, .blue = 0.998779 },
+	{ .red = 0.753846, .green = 0.526984, .blue = 0.999512 },
+	{ .red = 0.852015, .green = 0.530159, .blue = 0.998779 },
+	{ .red = 0.940171, .green = 0.529182, .blue = 0.998535 },
+	{ .red = 0.998535, .green = 0.528205, .blue = 0.976557 },
+	{ .red = 0.998535, .green = 0.526984, .blue = 0.898657 },
+	{ .red = 0.999023, .green = 0.520635, .blue = 0.838828 },
+	{ .red = 0.999267, .green = 0.510623, .blue = 0.791941 },
+	{ .red = 0.998779, .green = 0.498168, .blue = 0.751893 },
+	{ .red = 0.998779, .green = 0.483516, .blue = 0.715995 },
+	{ .red = 0.999267, .green = 0.467643, .blue = 0.683516 },
+	{ .red = 0.998779, .green = 0.451282, .blue = 0.652259 },
+	{ .red = 0.021734, .green = 0.473016, .blue = 0.816850 },
+	{ .red = 0.009768, .green = 0.491087, .blue = 0.874969 },
+	{ .red = 0.224908, .green = 0.552137, .blue = 0.998535 },
+	{ .red = 0.465201, .green = 0.628571, .blue = 0.998291 },
+	{ .red = 0.565812, .green = 0.640781, .blue = 0.998291 },
+	{ .red = 0.668620, .green = 0.651038, .blue = 0.998535 },
+	{ .red = 0.769475, .green = 0.658120, .blue = 0.999267 },
+	{ .red = 0.862027, .green = 0.661050, .blue = 0.998535 },
+	{ .red = 0.946276, .green = 0.659585, .blue = 0.999512 },
+	{ .red = 0.998535, .green = 0.657387, .blue = 0.975824 },
+	{ .red = 0.999512, .green = 0.655433, .blue = 0.911111 },
+	{ .red = 0.999023, .green = 0.646642, .blue = 0.860806 },
+	{ .red = 0.999512, .green = 0.633700, .blue = 0.822222 },
+	{ .red = 0.999756, .green = 0.617338, .blue = 0.788034 },
+	{ .red = 0.998779, .green = 0.598779, .blue = 0.755800 },
+	{ .red = 0.998535, .green = 0.578510, .blue = 0.724786 },
+	{ .red = 0.999267, .green = 0.557753, .blue = 0.695238 },
+	{ .red = 0.026129, .green = 0.591697, .blue = 0.851282 },
+	{ .red = 0.020269, .green = 0.603419, .blue = 0.878388 },
+	{ .red = 0.092308, .green = 0.655433, .blue = 0.995604 },
+	{ .red = 0.377534, .green = 0.689621, .blue = 0.998046 },
+	{ .red = 0.569475, .green = 0.731868, .blue = 0.998291 },
+	{ .red = 0.696703, .green = 0.762393, .blue = 0.999023 },
+	{ .red = 0.783150, .green = 0.767766, .blue = 0.998535 },
+	{ .red = 0.867399, .green = 0.769719, .blue = 0.998046 },
+	{ .red = 0.946032, .green = 0.767033, .blue = 0.999023 },
+	{ .red = 0.999023, .green = 0.762637, .blue = 0.980708 },
+	{ .red = 0.998535, .green = 0.760195, .blue = 0.925031 },
+	{ .red = 0.999512, .green = 0.749939, .blue = 0.885470 },
+	{ .red = 0.998535, .green = 0.735287, .blue = 0.853236 },
+	{ .red = 0.999023, .green = 0.716972, .blue = 0.823932 },
+	{ .red = 0.999023, .green = 0.696459, .blue = 0.795604 },
+	{ .red = 0.998779, .green = 0.674237, .blue = 0.767033 },
+	{ .red = 0.998535, .green = 0.651282, .blue = 0.738706 },
+	{ .red = 0.019536, .green = 0.715018, .blue = 0.890354 },
+	{ .red = 0.010745, .green = 0.721368, .blue = 0.902808 },
+	{ .red = 0.023199, .green = 0.749206, .blue = 0.955311 },
+	{ .red = 0.298413, .green = 0.784615, .blue = 0.998535 },
+	{ .red = 0.503785, .green = 0.806593, .blue = 0.998779 },
+	{ .red = 0.663736, .green = 0.829304, .blue = 0.999267 },
+	{ .red = 0.795604, .green = 0.854945, .blue = 0.999023 },
+	{ .red = 0.868132, .green = 0.855922, .blue = 0.998046 },
+	{ .red = 0.941636, .green = 0.852015, .blue = 0.999023 },
+	{ .red = 0.997802, .green = 0.844933, .blue = 0.985836 },
+	{ .red = 0.999267, .green = 0.841026, .blue = 0.938706 },
+	{ .red = 0.998291, .green = 0.829792, .blue = 0.906471 },
+	{ .red = 0.998779, .green = 0.813919, .blue = 0.880830 },
+	{ .red = 0.998535, .green = 0.795116, .blue = 0.855678 },
+	{ .red = 0.998291, .green = 0.774115, .blue = 0.830525 },
+	{ .red = 0.998535, .green = 0.751648, .blue = 0.804640 },
+	{ .red = 0.999023, .green = 0.728205, .blue = 0.778022 },
+	{ .red = 0.027350, .green = 0.832967, .blue = 0.921612 },
+	{ .red = 0.028816, .green = 0.836874, .blue = 0.927473 },
+	{ .red = 0.041514, .green = 0.852015, .blue = 0.950672 },
+	{ .red = 0.139683, .green = 0.885714, .blue = 0.998779 },
+	{ .red = 0.431502, .green = 0.895726, .blue = 0.998779 },
+	{ .red = 0.600000, .green = 0.905250, .blue = 0.999023 },
+	{ .red = 0.732601, .green = 0.912332, .blue = 0.998779 },
+	{ .red = 0.844444, .green = 0.917949, .blue = 0.999023 },
+	{ .red = 0.927717, .green = 0.918926, .blue = 0.998779 },
+	{ .red = 0.998291, .green = 0.906960, .blue = 0.991697 },
+	{ .red = 0.999512, .green = 0.901099, .blue = 0.947497 },
+	{ .red = 0.998535, .green = 0.888156, .blue = 0.923077 },
+	{ .red = 0.999023, .green = 0.871795, .blue = 0.901832 },
+	{ .red = 0.998535, .green = 0.853480, .blue = 0.880586 },
+	{ .red = 0.999267, .green = 0.832967, .blue = 0.858120 },
+	{ .red = 0.999267, .green = 0.811477, .blue = 0.834676 },
+	{ .red = 0.998535, .green = 0.789011, .blue = 0.810012 },
+	{ .red = 0.045910, .green = 0.944567, .blue = 0.944567 },
+	{ .red = 0.049817, .green = 0.947009, .blue = 0.947253 },
+	{ .red = 0.062515, .green = 0.956288, .blue = 0.957265 },
+	{ .red = 0.084982, .green = 0.975580, .blue = 0.977534 },
+	{ .red = 0.284005, .green = 0.995849, .blue = 0.998535 },
+	{ .red = 0.497924, .green = 0.996581, .blue = 0.998779 },
+	{ .red = 0.636874, .green = 0.997070, .blue = 0.998779 },
+	{ .red = 0.741392, .green = 0.996825, .blue = 0.998535 },
+	{ .red = 0.838339, .green = 0.989744, .blue = 0.991209 },
+	{ .red = 0.963370, .green = 0.962149, .blue = 0.962393 },
+	{ .red = 0.999756, .green = 0.943590, .blue = 0.946032 },
+	{ .red = 0.999756, .green = 0.929182, .blue = 0.931624 },
+	{ .red = 0.999756, .green = 0.913065, .blue = 0.915263 },
+	{ .red = 0.999756, .green = 0.895482, .blue = 0.897436 },
+	{ .red = 0.999023, .green = 0.876679, .blue = 0.877900 },
+	{ .red = 0.998291, .green = 0.856899, .blue = 0.856899 },
+	{ .red = 0.998291, .green = 0.835653, .blue = 0.834676 },
+	{ .red = 0.032479, .green = 0.962637, .blue = 0.885958 },
+	{ .red = 0.033455, .green = 0.965324, .blue = 0.887668 },
+	{ .red = 0.030769, .green = 0.974847, .blue = 0.894505 },
+	{ .red = 0.130403, .green = 0.987790, .blue = 0.903053 },
+	{ .red = 0.359219, .green = 0.998779, .blue = 0.915751 },
+	{ .red = 0.530891, .green = 0.999756, .blue = 0.922344 },
+	{ .red = 0.658608, .green = 0.998779, .blue = 0.926740 },
+	{ .red = 0.755556, .green = 0.998779, .blue = 0.929915 },
+	{ .red = 0.835165, .green = 0.998291, .blue = 0.928938 },
+	{ .red = 0.906227, .green = 0.998291, .blue = 0.917705 },
+	{ .red = 0.992186, .green = 0.988034, .blue = 0.881563 },
+	{ .red = 0.999023, .green = 0.953602, .blue = 0.917705 },
+	{ .red = 0.999267, .green = 0.942613, .blue = 0.919414 },
+	{ .red = 0.998779, .green = 0.926496, .blue = 0.906471 },
+	{ .red = 0.999512, .green = 0.908913, .blue = 0.889866 },
+	{ .red = 0.999023, .green = 0.890598, .blue = 0.871551 },
+	{ .red = 0.999512, .green = 0.871551, .blue = 0.851526 },
+	{ .red = 0.027106, .green = 0.975336, .blue = 0.832234 },
+	{ .red = 0.027595, .green = 0.977778, .blue = 0.833455 },
+	{ .red = 0.030769, .green = 0.986325, .blue = 0.837363 },
+	{ .red = 0.168010, .green = 0.998535, .blue = 0.844689 },
+	{ .red = 0.398779, .green = 0.999267, .blue = 0.855922 },
+	{ .red = 0.544567, .green = 0.999267, .blue = 0.867643 },
+	{ .red = 0.657875, .green = 0.999023, .blue = 0.878877 },
+	{ .red = 0.748718, .green = 0.999023, .blue = 0.888400 },
+	{ .red = 0.823932, .green = 0.998779, .blue = 0.895482 },
+	{ .red = 0.888400, .green = 0.999023, .blue = 0.899389 },
+	{ .red = 0.940171, .green = 0.999267, .blue = 0.888645 },
+	{ .red = 0.998779, .green = 0.994628, .blue = 0.837851 },
+	{ .red = 0.998779, .green = 0.953602, .blue = 0.878632 },
+	{ .red = 0.998046, .green = 0.936264, .blue = 0.883272 },
+	{ .red = 0.998779, .green = 0.923810, .blue = 0.880098 },
+	{ .red = 0.999512, .green = 0.913065, .blue = 0.873748 },
+	{ .red = 0.998779, .green = 0.900366, .blue = 0.863248 },
+	{ .red = 0.094994, .green = 0.980708, .blue = 0.782173 },
+	{ .red = 0.100122, .green = 0.982418, .blue = 0.782418 },
+	{ .red = 0.120635, .green = 0.988034, .blue = 0.783883 },
+	{ .red = 0.249573, .green = 0.998779, .blue = 0.794139 },
+	{ .red = 0.418803, .green = 0.998291, .blue = 0.807814 },
+	{ .red = 0.544567, .green = 0.998535, .blue = 0.823443 },
+	{ .red = 0.647375, .green = 0.999023, .blue = 0.839072 },
+	{ .red = 0.733333, .green = 0.998779, .blue = 0.853480 },
+	{ .red = 0.805861, .green = 0.998779, .blue = 0.866422 },
+	{ .red = 0.867399, .green = 0.999267, .blue = 0.877656 },
+	{ .red = 0.923077, .green = 0.998779, .blue = 0.890842 },
+	{ .red = 0.947253, .green = 0.999023, .blue = 0.853968 },
+	{ .red = 0.998291, .green = 0.995360, .blue = 0.802686 },
+	{ .red = 0.999267, .green = 0.953358, .blue = 0.834921 },
+	{ .red = 0.999023, .green = 0.931380, .blue = 0.841270 },
+	{ .red = 0.999023, .green = 0.915018, .blue = 0.839316 },
+	{ .red = 0.999756, .green = 0.901343, .blue = 0.832967 },
+	{ .red = 0.033944, .green = 0.990232, .blue = 0.739194 },
+	{ .red = 0.050549, .green = 0.991453, .blue = 0.739194 },
+	{ .red = 0.086691, .green = 0.996337, .blue = 0.739438 },
+	{ .red = 0.285226, .green = 0.998535, .blue = 0.751404 },
+	{ .red = 0.421490, .green = 0.998779, .blue = 0.766789 },
+	{ .red = 0.533578, .green = 0.999267, .blue = 0.784371 },
+	{ .red = 0.630281, .green = 0.998779, .blue = 0.802442 },
+	{ .red = 0.712088, .green = 0.999023, .blue = 0.820024 },
+	{ .red = 0.782906, .green = 0.998779, .blue = 0.836874 },
+	{ .red = 0.844444, .green = 0.998291, .blue = 0.853236 },
+	{ .red = 0.897192, .green = 0.999023, .blue = 0.869109 },
+	{ .red = 0.922344, .green = 0.998535, .blue = 0.854212 },
+	{ .red = 0.949939, .green = 0.998779, .blue = 0.818559 },
+	{ .red = 0.999267, .green = 0.996825, .blue = 0.760440 },
+	{ .red = 0.998779, .green = 0.953114, .blue = 0.790476 },
+	{ .red = 0.998779, .green = 0.927473, .blue = 0.797802 },
+	{ .red = 0.998291, .green = 0.908425, .blue = 0.797558 },
+	{ .red = 0.116728, .green = 0.988523, .blue = 0.697436 },
+	{ .red = 0.120391, .green = 0.989744, .blue = 0.697436 },
+	{ .red = 0.163370, .green = 0.997070, .blue = 0.701343 },
+	{ .red = 0.300366, .green = 0.998535, .blue = 0.713553 },
+	{ .red = 0.416361, .green = 0.999023, .blue = 0.729182 },
+	{ .red = 0.518681, .green = 0.999023, .blue = 0.747497 },
+	{ .red = 0.609035, .green = 0.998779, .blue = 0.767277 },
+	{ .red = 0.687912, .green = 0.999023, .blue = 0.787057 },
+	{ .red = 0.757021, .green = 0.999023, .blue = 0.806105 },
+	{ .red = 0.817582, .green = 0.998779, .blue = 0.824908 },
+	{ .red = 0.870330, .green = 0.999023, .blue = 0.843468 },
+	{ .red = 0.904029, .green = 0.999267, .blue = 0.845910 },
+	{ .red = 0.918681, .green = 0.999267, .blue = 0.810256 },
+	{ .red = 0.951160, .green = 0.998535, .blue = 0.781929 },
+	{ .red = 0.998291, .green = 0.996825, .blue = 0.721856 },
+	{ .red = 0.999023, .green = 0.953358, .blue = 0.745788 },
+	{ .red = 0.999267, .green = 0.925275, .blue = 0.753358 },
+	{ .red = 0.102808, .green = 0.992674, .blue = 0.661050 },
+	{ .red = 0.110134, .green = 0.993407, .blue = 0.660806 },
+	{ .red = 0.188523, .green = 0.999023, .blue = 0.667399 },
+	{ .red = 0.303785, .green = 0.999023, .blue = 0.678877 },
+	{ .red = 0.406105, .green = 0.999267, .blue = 0.694261 },
+	{ .red = 0.501832, .green = 0.998291, .blue = 0.713065 },
+	{ .red = 0.585836, .green = 0.999023, .blue = 0.733089 },
+	{ .red = 0.661783, .green = 0.999267, .blue = 0.753846 },
+	{ .red = 0.730403, .green = 0.998535, .blue = 0.775092 },
+	{ .red = 0.790232, .green = 0.998535, .blue = 0.795604 },
+	{ .red = 0.841758, .green = 0.999756, .blue = 0.814408 },
+	{ .red = 0.887668, .green = 0.999023, .blue = 0.833944 },
+	{ .red = 0.895238, .green = 0.999267, .blue = 0.800244 },
+	{ .red = 0.916484, .green = 0.999023, .blue = 0.768498 },
+	{ .red = 0.952137, .green = 0.999756, .blue = 0.742613 },
+	{ .red = 0.997070, .green = 0.996337, .blue = 0.685470 },
+	{ .red = 0.999023, .green = 0.954335, .blue = 0.703297 },
+	{ .red = 0.126984, .green = 0.991941, .blue = 0.627595 },
+	{ .red = 0.145543, .green = 0.994139, .blue = 0.629548 },
+	{ .red = 0.209280, .green = 0.998291, .blue = 0.636142 },
+	{ .red = 0.302808, .green = 0.998779, .blue = 0.646886 },
+	{ .red = 0.395116, .green = 0.998779, .blue = 0.661783 },
+	{ .red = 0.481074, .green = 0.999267, .blue = 0.679853 },
+	{ .red = 0.562393, .green = 0.998779, .blue = 0.700122 },
+	{ .red = 0.635653, .green = 0.999023, .blue = 0.721612 },
+	{ .red = 0.701343, .green = 0.999512, .blue = 0.742857 },
+	{ .red = 0.761661, .green = 0.998779, .blue = 0.764835 },
+	{ .red = 0.814896, .green = 0.998779, .blue = 0.786325 },
+	{ .red = 0.861294, .green = 0.999756, .blue = 0.806838 },
+	{ .red = 0.875214, .green = 0.998535, .blue = 0.788278 },
+	{ .red = 0.889377, .green = 0.998779, .blue = 0.757021 },
+	{ .red = 0.915507, .green = 0.998535, .blue = 0.730159 },
+	{ .red = 0.952137, .green = 0.998535, .blue = 0.710134 },
+	{ .red = 0.997070, .green = 0.996825, .blue = 0.648352 },
+	{ .red = 0.020269, .green = 0.141148, .blue = 0.786569 },
+	{ .red = 0.089866, .green = 0.018559, .blue = 0.868864 },
+	{ .red = 0.193407, .green = 0.018803, .blue = 0.872283 },
+	{ .red = 0.315263, .green = 0.021245, .blue = 0.934554 },
+	{ .red = 0.441514, .green = 0.028816, .blue = 0.979487 },
+	{ .red = 0.553602, .green = 0.037118, .blue = 0.988523 },
+	{ .red = 0.644933, .green = 0.019292, .blue = 0.973382 },
+	{ .red = 0.708913, .green = 0.015873, .blue = 0.935287 },
+	{ .red = 0.755311, .green = 0.016117, .blue = 0.893040 },
+	{ .red = 0.833455, .green = 0.014164, .blue = 0.900122 },
+	{ .red = 0.910134, .green = 0.024176, .blue = 0.909402 },
+	{ .red = 0.937241, .green = 0.025153, .blue = 0.852259 },
+	{ .red = 0.956777, .green = 0.019292, .blue = 0.799756 },
+	{ .red = 0.970940, .green = 0.017094, .blue = 0.751648 },
+	{ .red = 0.981441, .green = 0.019048, .blue = 0.707937 },
+	{ .red = 0.982418, .green = 0.036386, .blue = 0.663736 },
+	{ .red = 0.983394, .green = 0.043468, .blue = 0.625153 },
+	{ .red = 0.026862, .green = 0.124054, .blue = 0.891331 },
+	{ .red = 0.096215, .green = 0.022955, .blue = 0.912576 },
+	{ .red = 0.202198, .green = 0.019292, .blue = 0.919902 },
+	{ .red = 0.332601, .green = 0.021734, .blue = 0.996825 },
+	{ .red = 0.447375, .green = 0.075946, .blue = 0.999267 },
+	{ .red = 0.556044, .green = 0.086935, .blue = 0.997558 },
+	{ .red = 0.656166, .green = 0.071795, .blue = 0.995116 },
+	{ .red = 0.738706, .green = 0.039316, .blue = 0.980220 },
+	{ .red = 0.786813, .green = 0.024176, .blue = 0.934310 },
+	{ .red = 0.860806, .green = 0.020513, .blue = 0.932357 },
+	{ .red = 0.937485, .green = 0.021001, .blue = 0.938462 },
+	{ .red = 0.962882, .green = 0.025153, .blue = 0.876679 },
+	{ .red = 0.980708, .green = 0.018071, .blue = 0.819780 },
+	{ .red = 0.981197, .green = 0.043468, .blue = 0.758974 },
+	{ .red = 0.992918, .green = 0.062271, .blue = 0.715751 },
+	{ .red = 0.999756, .green = 0.091819, .blue = 0.676190 },
+	{ .red = 0.999023, .green = 0.112576, .blue = 0.637363 },
+	{ .red = 0.045421, .green = 0.169963, .blue = 0.976068 },
+	{ .red = 0.108181, .green = 0.120391, .blue = 0.999023 },
+	{ .red = 0.216361, .green = 0.133333, .blue = 0.999023 },
+	{ .red = 0.329915, .green = 0.165324, .blue = 0.998046 },
+	{ .red = 0.445177, .green = 0.189499, .blue = 0.998779 },
+	{ .red = 0.556777, .green = 0.203175, .blue = 0.999023 },
+	{ .red = 0.660806, .green = 0.207326, .blue = 0.998291 },
+	{ .red = 0.757021, .green = 0.204640, .blue = 0.999512 },
+	{ .red = 0.843712, .green = 0.197558, .blue = 0.999023 },
+	{ .red = 0.924786, .green = 0.191941, .blue = 0.999023 },
+	{ .red = 0.995604, .green = 0.188767, .blue = 0.993895 },
+	{ .red = 0.998535, .green = 0.206105, .blue = 0.906716 },
+	{ .red = 0.999023, .green = 0.216606, .blue = 0.834676 },
+	{ .red = 0.998779, .green = 0.222711, .blue = 0.775824 },
+	{ .red = 0.999023, .green = 0.225641, .blue = 0.726984 },
+	{ .red = 0.999023, .green = 0.226618, .blue = 0.684982 },
+	{ .red = 0.999267, .green = 0.226374, .blue = 0.648596 },
+	{ .red = 0.027839, .green = 0.265690, .blue = 0.957021 },
+	{ .red = 0.155311, .green = 0.313553, .blue = 0.998779 },
+	{ .red = 0.242247, .green = 0.313065, .blue = 0.999023 },
+	{ .red = 0.351404, .green = 0.329182, .blue = 0.999023 },
+	{ .red = 0.464957, .green = 0.346276, .blue = 0.998779 },
+	{ .red = 0.576801, .green = 0.359951, .blue = 0.999512 },
+	{ .red = 0.681074, .green = 0.368254, .blue = 0.999023 },
+	{ .red = 0.776313, .green = 0.372161, .blue = 0.998535 },
+	{ .red = 0.863004, .green = 0.372894, .blue = 0.998779 },
+	{ .red = 0.941148, .green = 0.371673, .blue = 0.998535 },
+	{ .red = 0.999267, .green = 0.371917, .blue = 0.983394 },
+	{ .red = 0.999023, .green = 0.373871, .blue = 0.903053 },
+	{ .red = 0.999512, .green = 0.371673, .blue = 0.838584 },
+	{ .red = 0.998779, .green = 0.366789, .blue = 0.785836 },
+	{ .red = 0.999267, .green = 0.359463, .blue = 0.742369 },
+	{ .red = 0.998779, .green = 0.350916, .blue = 0.703297 },
+	{ .red = 0.999512, .green = 0.341636, .blue = 0.669109 },
+	{ .red = 0.000000, .green = 0.325763, .blue = 0.804884 },
+	{ .red = 0.081074, .green = 0.369475, .blue = 0.997802 },
+	{ .red = 0.303785, .green = 0.465934, .blue = 0.999023 },
+	{ .red = 0.394872, .green = 0.474725, .blue = 0.998535 },
+	{ .red = 0.498657, .green = 0.488645, .blue = 0.998291 },
+	{ .red = 0.603907, .green = 0.501099, .blue = 0.998291 },
+	{ .red = 0.704762, .green = 0.510867, .blue = 0.998779 },
+	{ .red = 0.796825, .green = 0.516972, .blue = 0.998046 },
+	{ .red = 0.880830, .green = 0.519658, .blue = 0.999512 },
+	{ .red = 0.955067, .green = 0.519170, .blue = 0.999023 },
+	{ .red = 0.999023, .green = 0.519658, .blue = 0.973871 },
+	{ .red = 0.998535, .green = 0.517460, .blue = 0.905250 },
+	{ .red = 0.999023, .green = 0.510134, .blue = 0.850305 },
+	{ .red = 0.998535, .green = 0.499634, .blue = 0.805128 },
+	{ .red = 0.999512, .green = 0.486447, .blue = 0.767033 },
+	{ .red = 0.998535, .green = 0.471551, .blue = 0.731380 },
+	{ .red = 0.998291, .green = 0.455678, .blue = 0.698901 },
+	{ .red = 0.013675, .green = 0.440537, .blue = 0.852015 },
+	{ .red = 0.007326, .green = 0.462271, .blue = 0.932601 },
+	{ .red = 0.257143, .green = 0.522344, .blue = 0.999267 },
+	{ .red = 0.463248, .green = 0.609768, .blue = 0.998291 },
+	{ .red = 0.547497, .green = 0.619292, .blue = 0.998535 },
+	{ .red = 0.639072, .green = 0.629548, .blue = 0.998291 },
+	{ .red = 0.730159, .green = 0.638339, .blue = 0.998779 },
+	{ .red = 0.815385, .green = 0.644200, .blue = 0.998779 },
+	{ .red = 0.892796, .green = 0.646886, .blue = 0.998535 },
+	{ .red = 0.961905, .green = 0.645910, .blue = 0.998779 },
+	{ .red = 0.998779, .green = 0.645421, .blue = 0.972161 },
+	{ .red = 0.998291, .green = 0.642491, .blue = 0.915263 },
+	{ .red = 0.999023, .green = 0.632479, .blue = 0.869841 },
+	{ .red = 0.999267, .green = 0.618803, .blue = 0.831990 },
+	{ .red = 0.999023, .green = 0.601954, .blue = 0.798291 },
+	{ .red = 0.998779, .green = 0.583150, .blue = 0.766545 },
+	{ .red = 0.998291, .green = 0.562882, .blue = 0.736020 },
+	{ .red = 0.020024, .green = 0.550427, .blue = 0.878144 },
+	{ .red = 0.019292, .green = 0.562882, .blue = 0.912821 },
+	{ .red = 0.193651, .green = 0.608791, .blue = 0.998779 },
+	{ .red = 0.405861, .green = 0.656410, .blue = 0.998779 },
+	{ .red = 0.610745, .green = 0.734310, .blue = 0.999023 },
+	{ .red = 0.680586, .green = 0.739683, .blue = 0.998535 },
+	{ .red = 0.757021, .green = 0.746276, .blue = 0.999023 },
+	{ .red = 0.831746, .green = 0.750916, .blue = 0.999267 },
+	{ .red = 0.901099, .green = 0.752625, .blue = 0.999023 },
+	{ .red = 0.963858, .green = 0.750672, .blue = 0.998779 },
+	{ .red = 0.998535, .green = 0.748962, .blue = 0.976557 },
+	{ .red = 0.998291, .green = 0.745788, .blue = 0.929670 },
+	{ .red = 0.999512, .green = 0.734310, .blue = 0.892552 },
+	{ .red = 0.998535, .green = 0.718926, .blue = 0.860562 },
+	{ .red = 0.999267, .green = 0.700122, .blue = 0.831746 },
+	{ .red = 0.998779, .green = 0.679365, .blue = 0.802930 },
+	{ .red = 0.999023, .green = 0.656899, .blue = 0.774847 },
+	{ .red = 0.026862, .green = 0.656654, .blue = 0.900366 },
+	{ .red = 0.030281, .green = 0.664469, .blue = 0.917460 },
+	{ .red = 0.067888, .green = 0.696703, .blue = 0.987546 },
+	{ .red = 0.355311, .green = 0.732845, .blue = 0.999267 },
+	{ .red = 0.533822, .green = 0.767766, .blue = 0.998535 },
+	{ .red = 0.690354, .green = 0.808791, .blue = 0.999023 },
+	{ .red = 0.784860, .green = 0.832723, .blue = 0.999512 },
+	{ .red = 0.846398, .green = 0.835897, .blue = 0.999267 },
+	{ .red = 0.906471, .green = 0.836630, .blue = 0.999023 },
+	{ .red = 0.963370, .green = 0.833700, .blue = 0.999512 },
+	{ .red = 0.999756, .green = 0.830037, .blue = 0.984127 },
+	{ .red = 0.998535, .green = 0.826374, .blue = 0.944078 },
+	{ .red = 0.998779, .green = 0.814164, .blue = 0.913309 },
+	{ .red = 0.998535, .green = 0.798046, .blue = 0.886935 },
+	{ .red = 0.998535, .green = 0.778999, .blue = 0.861783 },
+	{ .red = 0.999023, .green = 0.757265, .blue = 0.836386 },
+	{ .red = 0.999023, .green = 0.734554, .blue = 0.810256 },
+	{ .red = 0.026374, .green = 0.764835, .blue = 0.927961 },
+	{ .red = 0.033700, .green = 0.769475, .blue = 0.936508 },
+	{ .red = 0.054212, .green = 0.788278, .blue = 0.970696 },
+	{ .red = 0.294994, .green = 0.816606, .blue = 0.999023 },
+	{ .red = 0.489133, .green = 0.837363, .blue = 0.998779 },
+	{ .red = 0.637363, .green = 0.857631, .blue = 0.997802 },
+	{ .red = 0.759219, .green = 0.877900, .blue = 0.998779 },
+	{ .red = 0.860073, .green = 0.900611, .blue = 0.998291 },
+	{ .red = 0.909646, .green = 0.901099, .blue = 0.998779 },
+	{ .red = 0.960195, .green = 0.897924, .blue = 0.999023 },
+	{ .red = 0.999512, .green = 0.892063, .blue = 0.989988 },
+	{ .red = 0.998779, .green = 0.887179, .blue = 0.955556 },
+	{ .red = 0.999267, .green = 0.874481, .blue = 0.931136 },
+	{ .red = 0.998291, .green = 0.858120, .blue = 0.908669 },
+	{ .red = 0.999756, .green = 0.838828, .blue = 0.886691 },
+	{ .red = 0.998535, .green = 0.818315, .blue = 0.863736 },
+	{ .red = 0.998535, .green = 0.796093, .blue = 0.840049 },
+	{ .red = 0.029548, .green = 0.866667, .blue = 0.948718 },
+	{ .red = 0.029792, .green = 0.869841, .blue = 0.953358 },
+	{ .red = 0.032479, .green = 0.882295, .blue = 0.971429 },
+	{ .red = 0.199267, .green = 0.903541, .blue = 0.998535 },
+	{ .red = 0.441270, .green = 0.914286, .blue = 0.998779 },
+	{ .red = 0.596093, .green = 0.924054, .blue = 0.999023 },
+	{ .red = 0.716484, .green = 0.931624, .blue = 0.998535 },
+	{ .red = 0.812454, .green = 0.938462, .blue = 0.999023 },
+	{ .red = 0.894750, .green = 0.944322, .blue = 0.999023 },
+	{ .red = 0.953114, .green = 0.947253, .blue = 0.998535 },
+	{ .red = 0.998291, .green = 0.939194, .blue = 0.993162 },
+	{ .red = 0.999512, .green = 0.931868, .blue = 0.963614 },
+	{ .red = 0.999023, .green = 0.918437, .blue = 0.943590 },
+	{ .red = 0.998779, .green = 0.902076, .blue = 0.925031 },
+	{ .red = 0.999023, .green = 0.883761, .blue = 0.905495 },
+	{ .red = 0.999267, .green = 0.863980, .blue = 0.884737 },
+	{ .red = 0.999512, .green = 0.843223, .blue = 0.863004 },
+	{ .red = 0.067399, .green = 0.963126, .blue = 0.963126 },
+	{ .red = 0.069597, .green = 0.965324, .blue = 0.965568 },
+	{ .red = 0.078144, .green = 0.972894, .blue = 0.973871 },
+	{ .red = 0.094505, .green = 0.988523, .blue = 0.990232 },
+	{ .red = 0.361416, .green = 0.997070, .blue = 0.998291 },
+	{ .red = 0.541636, .green = 0.997558, .blue = 0.998046 },
+	{ .red = 0.664225, .green = 0.998779, .blue = 0.999267 },
+	{ .red = 0.761905, .green = 0.997558, .blue = 0.998291 },
+	{ .red = 0.833700, .green = 0.998046, .blue = 0.998779 },
+	{ .red = 0.889377, .green = 0.998291, .blue = 0.999267 },
+	{ .red = 0.980464, .green = 0.978999, .blue = 0.979243 },
+	{ .red = 0.998535, .green = 0.963126, .blue = 0.964835 },
+	{ .red = 0.999512, .green = 0.948718, .blue = 0.950427 },
+	{ .red = 0.999756, .green = 0.932845, .blue = 0.934799 },
+	{ .red = 0.999512, .green = 0.915995, .blue = 0.917705 },
+	{ .red = 0.999756, .green = 0.897924, .blue = 0.899145 },
+	{ .red = 0.999023, .green = 0.878877, .blue = 0.879609 },
+	{ .red = 0.083028, .green = 0.974359, .blue = 0.904274 },
+	{ .red = 0.090354, .green = 0.976068, .blue = 0.905495 },
+	{ .red = 0.114286, .green = 0.981929, .blue = 0.909646 },
+	{ .red = 0.169719, .green = 0.995849, .blue = 0.920635 },
+	{ .red = 0.405861, .green = 0.999267, .blue = 0.929182 },
+	{ .red = 0.557265, .green = 0.999023, .blue = 0.935287 },
+	{ .red = 0.671795, .green = 0.998291, .blue = 0.941148 },
+	{ .red = 0.758486, .green = 0.999267, .blue = 0.946520 },
+	{ .red = 0.827595, .green = 0.999512, .blue = 0.949939 },
+	{ .red = 0.885958, .green = 0.999023, .blue = 0.950183 },
+	{ .red = 0.939194, .green = 0.998291, .blue = 0.945788 },
+	{ .red = 0.998535, .green = 0.995116, .blue = 0.907937 },
+	{ .red = 0.998535, .green = 0.965324, .blue = 0.938950 },
+	{ .red = 0.999023, .green = 0.955311, .blue = 0.937485 },
+	{ .red = 0.998779, .green = 0.939683, .blue = 0.923810 },
+	{ .red = 0.998535, .green = 0.923321, .blue = 0.907692 },
+	{ .red = 0.999267, .green = 0.905983, .blue = 0.890110 },
+	{ .red = 0.112332, .green = 0.980220, .blue = 0.850061 },
+	{ .red = 0.116728, .green = 0.981685, .blue = 0.850794 },
+	{ .red = 0.133333, .green = 0.986813, .blue = 0.853480 },
+	{ .red = 0.246398, .green = 0.999512, .blue = 0.864713 },
+	{ .red = 0.424908, .green = 0.999267, .blue = 0.874725 },
+	{ .red = 0.552625, .green = 1.000000, .blue = 0.886203 },
+	{ .red = 0.656654, .green = 0.999512, .blue = 0.896703 },
+	{ .red = 0.740415, .green = 0.999512, .blue = 0.906471 },
+	{ .red = 0.809524, .green = 0.999023, .blue = 0.914286 },
+	{ .red = 0.868620, .green = 0.998046, .blue = 0.920879 },
+	{ .red = 0.918193, .green = 0.998535, .blue = 0.925763 },
+	{ .red = 0.956288, .green = 0.999512, .blue = 0.918193 },
+	{ .red = 0.998291, .green = 0.995360, .blue = 0.871795 },
+	{ .red = 0.998779, .green = 0.961416, .blue = 0.900122 },
+	{ .red = 0.999023, .green = 0.946032, .blue = 0.901343 },
+	{ .red = 0.998535, .green = 0.934554, .blue = 0.897680 },
+	{ .red = 0.999512, .green = 0.924298, .blue = 0.890842 },
+	{ .red = 0.094017, .green = 0.987546, .blue = 0.803663 },
+	{ .red = 0.097192, .green = 0.989011, .blue = 0.804151 },
+	{ .red = 0.112576, .green = 0.993895, .blue = 0.805617 },
+	{ .red = 0.286691, .green = 0.999267, .blue = 0.816850 },
+	{ .red = 0.429304, .green = 0.998779, .blue = 0.828816 },
+	{ .red = 0.541636, .green = 0.999512, .blue = 0.842735 },
+	{ .red = 0.638584, .green = 0.998779, .blue = 0.856654 },
+	{ .red = 0.717949, .green = 0.999267, .blue = 0.869841 },
+	{ .red = 0.785348, .green = 0.999512, .blue = 0.881563 },
+	{ .red = 0.843223, .green = 0.999267, .blue = 0.892063 },
+	{ .red = 0.894017, .green = 0.999023, .blue = 0.902076 },
+	{ .red = 0.939438, .green = 0.999023, .blue = 0.913797 },
+	{ .red = 0.956532, .green = 0.999267, .blue = 0.879609 },
+	{ .red = 0.998535, .green = 0.995849, .blue = 0.830525 },
+	{ .red = 0.999023, .green = 0.958974, .blue = 0.856654 },
+	{ .red = 0.998779, .green = 0.939194, .blue = 0.861050 },
+	{ .red = 0.999023, .green = 0.924542, .blue = 0.858364 },
+	{ .red = 0.102808, .green = 0.990476, .blue = 0.760195 },
+	{ .red = 0.108913, .green = 0.991453, .blue = 0.760195 },
+	{ .red = 0.152381, .green = 0.998779, .blue = 0.764835 },
+	{ .red = 0.304762, .green = 0.998535, .blue = 0.774603 },
+	{ .red = 0.424176, .green = 0.998291, .blue = 0.787790 },
+	{ .red = 0.525031, .green = 0.999267, .blue = 0.803175 },
+	{ .red = 0.613919, .green = 0.999756, .blue = 0.819048 },
+	{ .red = 0.693284, .green = 0.998779, .blue = 0.834921 },
+	{ .red = 0.760195, .green = 0.998779, .blue = 0.849573 },
+	{ .red = 0.818071, .green = 0.998535, .blue = 0.863248 },
+	{ .red = 0.868376, .green = 0.999023, .blue = 0.876190 },
+	{ .red = 0.914042, .green = 0.998535, .blue = 0.890842 },
+	{ .red = 0.934066, .green = 0.998779, .blue = 0.875946 },
+	{ .red = 0.956532, .green = 0.998779, .blue = 0.842002 },
+	{ .red = 0.998046, .green = 0.995849, .blue = 0.789499 },
+	{ .red = 0.999023, .green = 0.957753, .blue = 0.812454 },
+	{ .red = 0.998535, .green = 0.934554, .blue = 0.819292 },
+	{ .red = 0.123321, .green = 0.990965, .blue = 0.720391 },
+	{ .red = 0.125519, .green = 0.991941, .blue = 0.720391 },
+	{ .red = 0.190476, .green = 0.999023, .blue = 0.727228 },
+	{ .red = 0.307692, .green = 0.999023, .blue = 0.736996 },
+	{ .red = 0.411477, .green = 0.999267, .blue = 0.750427 },
+	{ .red = 0.506227, .green = 0.998779, .blue = 0.766300 },
+	{ .red = 0.590232, .green = 0.999267, .blue = 0.783150 },
+	{ .red = 0.665934, .green = 0.999023, .blue = 0.800488 },
+	{ .red = 0.731868, .green = 0.999023, .blue = 0.817094 },
+	{ .red = 0.789499, .green = 0.999267, .blue = 0.832723 },
+	{ .red = 0.842247, .green = 0.998291, .blue = 0.849084 },
+	{ .red = 0.887424, .green = 0.998535, .blue = 0.864469 },
+	{ .red = 0.917216, .green = 0.998535, .blue = 0.867399 },
+	{ .red = 0.927717, .green = 0.999267, .blue = 0.831746 },
+	{ .red = 0.956288, .green = 0.999267, .blue = 0.803175 },
+	{ .red = 0.999023, .green = 0.997314, .blue = 0.745788 },
+	{ .red = 0.999512, .green = 0.957753, .blue = 0.768742 },
+	{ .red = 0.107204, .green = 0.994872, .blue = 0.685226 },
+	{ .red = 0.118681, .green = 0.998535, .blue = 0.687424 },
+	{ .red = 0.209524, .green = 0.999023, .blue = 0.693040 },
+	{ .red = 0.304762, .green = 0.999512, .blue = 0.702564 },
+	{ .red = 0.398046, .green = 0.999267, .blue = 0.715507 },
+	{ .red = 0.487668, .green = 0.998046, .blue = 0.731624 },
+	{ .red = 0.566789, .green = 0.998535, .blue = 0.748962 },
+	{ .red = 0.638584, .green = 0.999023, .blue = 0.766789 },
+	{ .red = 0.704029, .green = 0.998779, .blue = 0.784860 },
+	{ .red = 0.763126, .green = 0.998046, .blue = 0.802930 },
+	{ .red = 0.813919, .green = 0.998535, .blue = 0.819536 },
+	{ .red = 0.859829, .green = 0.999267, .blue = 0.836142 },
+	{ .red = 0.900611, .green = 0.998779, .blue = 0.853480 },
+	{ .red = 0.906471, .green = 0.998291, .blue = 0.822955 },
+	{ .red = 0.924542, .green = 0.999512, .blue = 0.789744 },
+	{ .red = 0.956288, .green = 0.999267, .blue = 0.766789 },
+	{ .red = 0.999023, .green = 0.997802, .blue = 0.706227 },
+	{ .red = 0.035897, .green = 0.070330, .blue = 0.999267 },
+	{ .red = 0.091575, .green = 0.021734, .blue = 0.930159 },
+	{ .red = 0.184860, .green = 0.016850, .blue = 0.913309 },
+	{ .red = 0.300366, .green = 0.012698, .blue = 0.977045 },
+	{ .red = 0.411722, .green = 0.066911, .blue = 0.998535 },
+	{ .red = 0.513065, .green = 0.082784, .blue = 0.996825 },
+	{ .red = 0.608303, .green = 0.079609, .blue = 0.995360 },
+	{ .red = 0.699389, .green = 0.045421, .blue = 1.000000 },
+	{ .red = 0.751648, .green = 0.024908, .blue = 0.959951 },
+	{ .red = 0.786813, .green = 0.024420, .blue = 0.913797 },
+	{ .red = 0.864225, .green = 0.021490, .blue = 0.926496 },
+	{ .red = 0.933822, .green = 0.021245, .blue = 0.933578 },
+	{ .red = 0.954823, .green = 0.026129, .blue = 0.875946 },
+	{ .red = 0.971429, .green = 0.015385, .blue = 0.824664 },
+	{ .red = 0.978022, .green = 0.030525, .blue = 0.773138 },
+	{ .red = 0.984371, .green = 0.034432, .blue = 0.728694 },
+	{ .red = 0.996093, .green = 0.023443, .blue = 0.693529 },
+	{ .red = 0.044689, .green = 0.100855, .blue = 0.999756 },
+	{ .red = 0.097924, .green = 0.025397, .blue = 0.969475 },
+	{ .red = 0.192186, .green = 0.021978, .blue = 0.954335 },
+	{ .red = 0.303541, .green = 0.061050, .blue = 0.992674 },
+	{ .red = 0.410012, .green = 0.095238, .blue = 0.998779 },
+	{ .red = 0.511844, .green = 0.107448, .blue = 0.998535 },
+	{ .red = 0.607814, .green = 0.104029, .blue = 0.998291 },
+	{ .red = 0.697680, .green = 0.084982, .blue = 0.999756 },
+	{ .red = 0.775092, .green = 0.045665, .blue = 0.994139 },
+	{ .red = 0.814896, .green = 0.024176, .blue = 0.949695 },
+	{ .red = 0.886691, .green = 0.027839, .blue = 0.952625 },
+	{ .red = 0.957021, .green = 0.018559, .blue = 0.957998 },
+	{ .red = 0.977534, .green = 0.022955, .blue = 0.897680 },
+	{ .red = 0.983883, .green = 0.038584, .blue = 0.835165 },
+	{ .red = 0.999756, .green = 0.048352, .blue = 0.790232 },
+	{ .red = 0.998779, .green = 0.092063, .blue = 0.739683 },
+	{ .red = 0.999267, .green = 0.113553, .blue = 0.697680 },
+	{ .red = 0.059341, .green = 0.171917, .blue = 0.992430 },
+	{ .red = 0.104518, .green = 0.126252, .blue = 0.999023 },
+	{ .red = 0.200733, .green = 0.131868, .blue = 0.999023 },
+	{ .red = 0.304274, .green = 0.161172, .blue = 0.999512 },
+	{ .red = 0.409768, .green = 0.186813, .blue = 0.998779 },
+	{ .red = 0.513553, .green = 0.203663, .blue = 0.998779 },
+	{ .red = 0.611722, .green = 0.211233, .blue = 0.999023 },
+	{ .red = 0.702320, .green = 0.211966, .blue = 0.998535 },
+	{ .red = 0.786081, .green = 0.208303, .blue = 0.999267 },
+	{ .red = 0.862515, .green = 0.201465, .blue = 0.998779 },
+	{ .red = 0.935043, .green = 0.198779, .blue = 0.999267 },
+	{ .red = 0.996337, .green = 0.197802, .blue = 0.992918 },
+	{ .red = 0.999023, .green = 0.212698, .blue = 0.914042 },
+	{ .red = 0.999267, .green = 0.221490, .blue = 0.847375 },
+	{ .red = 0.999023, .green = 0.226374, .blue = 0.792186 },
+	{ .red = 0.999023, .green = 0.228327, .blue = 0.745543 },
+	{ .red = 0.999023, .green = 0.228571, .blue = 0.705250 },
+	{ .red = 0.059829, .green = 0.254457, .blue = 0.999023 },
+	{ .red = 0.158730, .green = 0.309158, .blue = 0.998779 },
+	{ .red = 0.231746, .green = 0.305495, .blue = 0.998535 },
+	{ .red = 0.329915, .green = 0.320879, .blue = 0.998779 },
+	{ .red = 0.432967, .green = 0.336752, .blue = 0.998046 },
+	{ .red = 0.536020, .green = 0.350672, .blue = 0.998535 },
+	{ .red = 0.634188, .green = 0.360195, .blue = 0.999023 },
+	{ .red = 0.724786, .green = 0.366056, .blue = 0.999023 },
+	{ .red = 0.807082, .green = 0.368742, .blue = 0.998291 },
+	{ .red = 0.882784, .green = 0.368742, .blue = 0.999023 },
+	{ .red = 0.951404, .green = 0.368254, .blue = 0.998779 },
+	{ .red = 0.999267, .green = 0.368987, .blue = 0.981441 },
+	{ .red = 0.998779, .green = 0.369963, .blue = 0.908913 },
+	{ .red = 0.999267, .green = 0.366545, .blue = 0.849817 },
+	{ .red = 0.998779, .green = 0.360928, .blue = 0.800000 },
+	{ .red = 0.998779, .green = 0.353358, .blue = 0.757753 },
+	{ .red = 0.999756, .green = 0.344567, .blue = 0.720879 },
+	{ .red = 0.021245, .green = 0.335531, .blue = 0.952625 },
+	{ .red = 0.125031, .green = 0.357509, .blue = 0.998779 },
+	{ .red = 0.298901, .green = 0.453236, .blue = 0.999023 },
+	{ .red = 0.379243, .green = 0.461294, .blue = 0.998779 },
+	{ .red = 0.472772, .green = 0.473993, .blue = 0.998535 },
+	{ .red = 0.569231, .green = 0.486447, .blue = 0.999023 },
+	{ .red = 0.662515, .green = 0.496703, .blue = 0.998779 },
+	{ .red = 0.750427, .green = 0.504274, .blue = 0.999756 },
+	{ .red = 0.829060, .green = 0.509158, .blue = 0.998291 },
+	{ .red = 0.901587, .green = 0.510867, .blue = 0.999512 },
+	{ .red = 0.965812, .green = 0.510379, .blue = 0.999023 },
+	{ .red = 0.999512, .green = 0.510867, .blue = 0.972161 },
+	{ .red = 0.999267, .green = 0.507448, .blue = 0.910623 },
+	{ .red = 0.999267, .green = 0.498901, .blue = 0.859096 },
+	{ .red = 0.998779, .green = 0.487424, .blue = 0.815873 },
+	{ .red = 0.999023, .green = 0.473748, .blue = 0.778510 },
+	{ .red = 0.998291, .green = 0.459096, .blue = 0.744078 },
+	{ .red = 0.016361, .green = 0.411477, .blue = 0.885714 },
+	{ .red = 0.041514, .green = 0.436386, .blue = 0.987302 },
+	{ .red = 0.283028, .green = 0.508913, .blue = 0.998535 },
+	{ .red = 0.452259, .green = 0.591209, .blue = 0.997802 },
+	{ .red = 0.528694, .green = 0.600977, .blue = 0.998535 },
+	{ .red = 0.611966, .green = 0.611233, .blue = 0.999023 },
+	{ .red = 0.695238, .green = 0.620269, .blue = 0.997802 },
+	{ .red = 0.775336, .green = 0.627595, .blue = 0.999023 },
+	{ .red = 0.848107, .green = 0.632479, .blue = 0.998046 },
+	{ .red = 0.914530, .green = 0.634432, .blue = 0.999023 },
+	{ .red = 0.973871, .green = 0.632967, .blue = 0.999267 },
+	{ .red = 0.998779, .green = 0.632967, .blue = 0.969231 },
+	{ .red = 0.998291, .green = 0.628571, .blue = 0.918681 },
+	{ .red = 0.998535, .green = 0.617094, .blue = 0.875458 },
+	{ .red = 0.999267, .green = 0.602442, .blue = 0.839316 },
+	{ .red = 0.999756, .green = 0.585104, .blue = 0.806349 },
+	{ .red = 0.998779, .green = 0.566300, .blue = 0.774847 },
+	{ .red = 0.010745, .green = 0.514530, .blue = 0.904274 },
+	{ .red = 0.016606, .green = 0.527961, .blue = 0.947497 },
+	{ .red = 0.233211, .green = 0.574115, .blue = 0.999512 },
+	{ .red = 0.426374, .green = 0.637118, .blue = 0.998779 },
+	{ .red = 0.596337, .green = 0.712088, .blue = 0.998779 },
+	{ .red = 0.662271, .green = 0.719414, .blue = 0.999023 },
+	{ .red = 0.731624, .green = 0.726496, .blue = 0.999023 },
+	{ .red = 0.800000, .green = 0.732357, .blue = 0.998535 },
+	{ .red = 0.864225, .green = 0.736264, .blue = 0.998535 },
+	{ .red = 0.922833, .green = 0.737485, .blue = 0.998535 },
+	{ .red = 0.976313, .green = 0.735287, .blue = 0.999267 },
+	{ .red = 0.998291, .green = 0.734310, .blue = 0.972894 },
+	{ .red = 0.999023, .green = 0.729670, .blue = 0.932357 },
+	{ .red = 0.998779, .green = 0.716972, .blue = 0.895971 },
+	{ .red = 0.998535, .green = 0.700855, .blue = 0.864957 },
+	{ .red = 0.999267, .green = 0.681563, .blue = 0.836142 },
+	{ .red = 0.998535, .green = 0.660562, .blue = 0.807814 },
+	{ .red = 0.023932, .green = 0.611966, .blue = 0.918681 },
+	{ .red = 0.026129, .green = 0.620757, .blue = 0.940904 },
+	{ .red = 0.177045, .green = 0.654945, .blue = 0.998779 },
+	{ .red = 0.384860, .green = 0.695482, .blue = 0.998046 },
+	{ .red = 0.552625, .green = 0.743590, .blue = 0.998535 },
+	{ .red = 0.716972, .green = 0.808547, .blue = 0.999267 },
+	{ .red = 0.768987, .green = 0.812698, .blue = 0.999756 },
+	{ .red = 0.824176, .green = 0.816850, .blue = 0.998779 },
+	{ .red = 0.878388, .green = 0.819536, .blue = 0.999512 },
+	{ .red = 0.928449, .green = 0.820024, .blue = 0.998291 },
+	{ .red = 0.974603, .green = 0.817094, .blue = 0.998046 },
+	{ .red = 0.998779, .green = 0.814652, .blue = 0.979976 },
+	{ .red = 0.999023, .green = 0.809768, .blue = 0.946276 },
+	{ .red = 0.998535, .green = 0.796825, .blue = 0.915995 },
+	{ .red = 0.998535, .green = 0.780220, .blue = 0.889621 },
+	{ .red = 0.998779, .green = 0.760440, .blue = 0.864469 },
+	{ .red = 0.998046, .green = 0.738950, .blue = 0.838828 },
+	{ .red = 0.022466, .green = 0.708425, .blue = 0.936508 },
+	{ .red = 0.021490, .green = 0.714286, .blue = 0.948718 },
+	{ .red = 0.048596, .green = 0.739438, .blue = 0.999023 },
+	{ .red = 0.347985, .green = 0.766056, .blue = 0.998046 },
+	{ .red = 0.515263, .green = 0.797070, .blue = 0.998291 },
+	{ .red = 0.654457, .green = 0.828327, .blue = 0.998291 },
+	{ .red = 0.780464, .green = 0.864225, .blue = 0.998535 },
+	{ .red = 0.848107, .green = 0.881807, .blue = 0.998779 },
+	{ .red = 0.891087, .green = 0.883516, .blue = 0.998291 },
+	{ .red = 0.933578, .green = 0.883516, .blue = 0.999023 },
+	{ .red = 0.973871, .green = 0.880586, .blue = 0.999023 },
+	{ .red = 0.999023, .green = 0.876679, .blue = 0.986569 },
+	{ .red = 0.999023, .green = 0.871306, .blue = 0.957998 },
+	{ .red = 0.999267, .green = 0.858120, .blue = 0.933578 },
+	{ .red = 0.999023, .green = 0.841514, .blue = 0.911111 },
+	{ .red = 0.999023, .green = 0.822222, .blue = 0.888889 },
+	{ .red = 0.998535, .green = 0.801221, .blue = 0.865690 },
+	{ .red = 0.033944, .green = 0.801954, .blue = 0.953358 },
+	{ .red = 0.043956, .green = 0.805128, .blue = 0.959219 },
+	{ .red = 0.084005, .green = 0.816850, .blue = 0.979731 },
+	{ .red = 0.306960, .green = 0.841026, .blue = 0.998779 },
+	{ .red = 0.484737, .green = 0.860806, .blue = 0.999512 },
+	{ .red = 0.622711, .green = 0.878877, .blue = 0.998535 },
+	{ .red = 0.734066, .green = 0.895726, .blue = 0.998779 },
+	{ .red = 0.827350, .green = 0.911844, .blue = 0.998291 },
+	{ .red = 0.904029, .green = 0.931380, .blue = 0.998291 },
+	{ .red = 0.937729, .green = 0.931380, .blue = 0.998779 },
+	{ .red = 0.972650, .green = 0.928938, .blue = 0.999267 },
+	{ .red = 0.998779, .green = 0.924054, .blue = 0.991453 },
+	{ .red = 0.998779, .green = 0.917705, .blue = 0.967033 },
+	{ .red = 0.998291, .green = 0.904518, .blue = 0.947009 },
+	{ .red = 0.998291, .green = 0.887912, .blue = 0.927717 },
+	{ .red = 0.998779, .green = 0.869109, .blue = 0.907937 },
+	{ .red = 0.999023, .green = 0.849084, .blue = 0.887179 },
+	{ .red = 0.052259, .green = 0.890598, .blue = 0.966056 },
+	{ .red = 0.062515, .green = 0.892552, .blue = 0.968987 },
+	{ .red = 0.096703, .green = 0.899878, .blue = 0.979487 },
+	{ .red = 0.254212, .green = 0.917705, .blue = 0.998535 },
+	{ .red = 0.456410, .green = 0.928205, .blue = 0.999512 },
+	{ .red = 0.599267, .green = 0.936752, .blue = 0.998779 },
+	{ .red = 0.709158, .green = 0.944811, .blue = 0.999023 },
+	{ .red = 0.796581, .green = 0.950916, .blue = 0.999023 },
+	{ .red = 0.867643, .green = 0.955800, .blue = 0.998535 },
+	{ .red = 0.927961, .green = 0.961661, .blue = 0.999512 },
+	{ .red = 0.969475, .green = 0.965324, .blue = 0.999023 },
+	{ .red = 0.999756, .green = 0.959463, .blue = 0.995849 },
+	{ .red = 0.998779, .green = 0.951893, .blue = 0.973626 },
+	{ .red = 0.998535, .green = 0.937973, .blue = 0.957021 },
+	{ .red = 0.998779, .green = 0.921856, .blue = 0.940171 },
+	{ .red = 0.999023, .green = 0.904274, .blue = 0.922344 },
+	{ .red = 0.998779, .green = 0.885470, .blue = 0.903297 },
+	{ .red = 0.078388, .green = 0.975580, .blue = 0.975580 },
+	{ .red = 0.079853, .green = 0.977534, .blue = 0.977534 },
+	{ .red = 0.086691, .green = 0.983883, .blue = 0.984615 },
+	{ .red = 0.136264, .green = 0.997314, .blue = 0.998535 },
+	{ .red = 0.424176, .green = 0.997314, .blue = 0.997314 },
+	{ .red = 0.578999, .green = 0.997802, .blue = 0.997314 },
+	{ .red = 0.688645, .green = 0.999512, .blue = 0.999023 },
+	{ .red = 0.779243, .green = 0.997802, .blue = 0.997558 },
+	{ .red = 0.844444, .green = 0.998291, .blue = 0.998291 },
+	{ .red = 0.894261, .green = 0.998779, .blue = 0.999267 },
+	{ .red = 0.934799, .green = 0.998779, .blue = 0.999267 },
+	{ .red = 0.990476, .green = 0.989255, .blue = 0.989499 },
+	{ .red = 0.999023, .green = 0.975092, .blue = 0.976068 },
+	{ .red = 0.998779, .green = 0.961172, .blue = 0.962393 },
+	{ .red = 0.999512, .green = 0.945788, .blue = 0.947497 },
+	{ .red = 0.999756, .green = 0.929670, .blue = 0.931136 },
+	{ .red = 0.999756, .green = 0.912576, .blue = 0.914042 },
+	{ .red = 0.119658, .green = 0.980464, .blue = 0.916484 },
+	{ .red = 0.123565, .green = 0.981929, .blue = 0.917460 },
+	{ .red = 0.137241, .green = 0.987057, .blue = 0.921368 },
+	{ .red = 0.252259, .green = 0.999267, .blue = 0.933089 },
+	{ .red = 0.443468, .green = 0.998535, .blue = 0.938217 },
+	{ .red = 0.577045, .green = 0.998291, .blue = 0.944078 },
+	{ .red = 0.680830, .green = 0.998046, .blue = 0.950183 },
+	{ .red = 0.760195, .green = 0.999023, .blue = 0.956044 },
+	{ .red = 0.823443, .green = 0.999512, .blue = 0.960440 },
+	{ .red = 0.874481, .green = 0.999756, .blue = 0.963126 },
+	{ .red = 0.917216, .green = 0.999756, .blue = 0.963858 },
+	{ .red = 0.957753, .green = 0.999267, .blue = 0.962149 },
+	{ .red = 0.999023, .green = 0.996337, .blue = 0.932601 },
+	{ .red = 0.998779, .green = 0.972405, .blue = 0.952137 },
+	{ .red = 0.999023, .green = 0.963370, .blue = 0.949206 },
+	{ .red = 0.998535, .green = 0.948474, .blue = 0.935287 },
+	{ .red = 0.999267, .green = 0.933089, .blue = 0.919658 },
+	{ .red = 0.115018, .green = 0.986325, .blue = 0.865934 },
+	{ .red = 0.118193, .green = 0.987546, .blue = 0.866667 },
+	{ .red = 0.129670, .green = 0.992186, .blue = 0.869109 },
+	{ .red = 0.292796, .green = 0.999756, .blue = 0.880098 },
+	{ .red = 0.442247, .green = 0.999023, .blue = 0.888645 },
+	{ .red = 0.560684, .green = 0.997802, .blue = 0.898168 },
+	{ .red = 0.654701, .green = 0.998291, .blue = 0.908425 },
+	{ .red = 0.731136, .green = 0.999267, .blue = 0.917705 },
+	{ .red = 0.796337, .green = 0.998779, .blue = 0.925519 },
+	{ .red = 0.849817, .green = 0.998779, .blue = 0.931868 },
+	{ .red = 0.894750, .green = 0.999023, .blue = 0.936752 },
+	{ .red = 0.936264, .green = 0.998535, .blue = 0.941880 },
+	{ .red = 0.966300, .green = 0.999023, .blue = 0.936996 },
+	{ .red = 0.998535, .green = 0.995849, .blue = 0.893040 },
+	{ .red = 0.998779, .green = 0.966545, .blue = 0.913797 },
+	{ .red = 0.999512, .green = 0.952625, .blue = 0.913553 },
+	{ .red = 0.998291, .green = 0.942125, .blue = 0.909890 },
+	{ .red = 0.126007, .green = 0.988767, .blue = 0.819292 },
+	{ .red = 0.129670, .green = 0.989744, .blue = 0.819780 },
+	{ .red = 0.155556, .green = 0.998291, .blue = 0.825641 },
+	{ .red = 0.311600, .green = 0.999023, .blue = 0.833944 },
+	{ .red = 0.434188, .green = 0.998535, .blue = 0.844444 },
+	{ .red = 0.538217, .green = 0.998535, .blue = 0.856654 },
+	{ .red = 0.625641, .green = 0.999512, .blue = 0.869353 },
+	{ .red = 0.703053, .green = 0.998779, .blue = 0.881074 },
+	{ .red = 0.765812, .green = 0.999512, .blue = 0.891819 },
+	{ .red = 0.822466, .green = 0.998291, .blue = 0.901343 },
+	{ .red = 0.869597, .green = 0.998535, .blue = 0.909890 },
+	{ .red = 0.910379, .green = 0.999512, .blue = 0.917216 },
+	{ .red = 0.949695, .green = 0.999023, .blue = 0.928205 },
+	{ .red = 0.962882, .green = 0.998291, .blue = 0.898413 },
+	{ .red = 0.998535, .green = 0.996093, .blue = 0.849817 },
+	{ .red = 0.999267, .green = 0.963126, .blue = 0.871551 },
+	{ .red = 0.998779, .green = 0.945055, .blue = 0.875458 },
+	{ .red = 0.133333, .green = 0.990232, .blue = 0.777289 },
+	{ .red = 0.136508, .green = 0.990965, .blue = 0.777534 },
+	{ .red = 0.196825, .green = 0.998535, .blue = 0.784860 },
+	{ .red = 0.313065, .green = 0.999267, .blue = 0.793407 },
+	{ .red = 0.421001, .green = 0.998535, .blue = 0.804640 },
+	{ .red = 0.514286, .green = 0.999023, .blue = 0.817827 },
+	{ .red = 0.598291, .green = 0.999267, .blue = 0.831746 },
+	{ .red = 0.673260, .green = 0.998535, .blue = 0.845421 },
+	{ .red = 0.736752, .green = 0.999023, .blue = 0.858364 },
+	{ .red = 0.791941, .green = 0.999756, .blue = 0.870085 },
+	{ .red = 0.842247, .green = 0.998535, .blue = 0.881563 },
+	{ .red = 0.885470, .green = 0.998779, .blue = 0.892308 },
+	{ .red = 0.925519, .green = 0.998046, .blue = 0.905739 },
+	{ .red = 0.941636, .green = 0.999267, .blue = 0.889866 },
+	{ .red = 0.960928, .green = 0.998779, .blue = 0.858120 },
+	{ .red = 0.998046, .green = 0.996093, .blue = 0.808547 },
+	{ .red = 0.998535, .green = 0.960928, .blue = 0.830281 },
+	{ .red = 0.089377, .green = 0.996825, .blue = 0.741148 },
+	{ .red = 0.127473, .green = 0.997558, .blue = 0.742857 },
+	{ .red = 0.214652, .green = 0.998535, .blue = 0.747985 },
+	{ .red = 0.312332, .green = 0.998535, .blue = 0.756288 },
+	{ .red = 0.404151, .green = 0.999267, .blue = 0.767766 },
+	{ .red = 0.491331, .green = 0.999512, .blue = 0.781197 },
+	{ .red = 0.572405, .green = 0.998779, .blue = 0.795849 },
+	{ .red = 0.643223, .green = 0.999512, .blue = 0.810989 },
+	{ .red = 0.707937, .green = 0.998779, .blue = 0.825641 },
+	{ .red = 0.764347, .green = 0.998779, .blue = 0.839560 },
+	{ .red = 0.813919, .green = 0.999023, .blue = 0.852503 },
+	{ .red = 0.858852, .green = 0.998535, .blue = 0.865690 },
+	{ .red = 0.898413, .green = 0.999023, .blue = 0.878388 },
+	{ .red = 0.925519, .green = 0.999023, .blue = 0.880830 },
+	{ .red = 0.934799, .green = 0.998291, .blue = 0.849328 },
+	{ .red = 0.960195, .green = 0.999023, .blue = 0.820513 },
+	{ .red = 0.999023, .green = 0.997314, .blue = 0.765812 },
+	{ .red = 0.048352, .green = 0.112576, .blue = 0.999756 },
+	{ .red = 0.094505, .green = 0.028571, .blue = 0.988278 },
+	{ .red = 0.178266, .green = 0.020269, .blue = 0.953358 },
+	{ .red = 0.283028, .green = 0.049328, .blue = 0.998535 },
+	{ .red = 0.379976, .green = 0.090110, .blue = 0.998046 },
+	{ .red = 0.475458, .green = 0.106227, .blue = 0.998779 },
+	{ .red = 0.565568, .green = 0.104518, .blue = 0.998291 },
+	{ .red = 0.650061, .green = 0.092552, .blue = 0.998535 },
+	{ .red = 0.724786, .green = 0.070085, .blue = 0.993407 },
+	{ .red = 0.787546, .green = 0.022711, .blue = 0.980708 },
+	{ .red = 0.818315, .green = 0.025885, .blue = 0.937241 },
+	{ .red = 0.889377, .green = 0.023199, .blue = 0.947497 },
+	{ .red = 0.952625, .green = 0.016606, .blue = 0.952381 },
+	{ .red = 0.969475, .green = 0.023932, .blue = 0.895726 },
+	{ .red = 0.978510, .green = 0.030525, .blue = 0.841270 },
+	{ .red = 0.988767, .green = 0.025641, .blue = 0.795604 },
+	{ .red = 0.983150, .green = 0.047619, .blue = 0.744078 },
+	{ .red = 0.054457, .green = 0.128938, .blue = 0.999756 },
+	{ .red = 0.097436, .green = 0.063492, .blue = 0.998535 },
+	{ .red = 0.184615, .green = 0.026129, .blue = 0.989255 },
+	{ .red = 0.282295, .green = 0.079121, .blue = 0.999267 },
+	{ .red = 0.378510, .green = 0.107448, .blue = 0.998535 },
+	{ .red = 0.473504, .green = 0.121612, .blue = 0.998535 },
+	{ .red = 0.564103, .green = 0.120879, .blue = 0.998779 },
+	{ .red = 0.649084, .green = 0.110623, .blue = 0.999512 },
+	{ .red = 0.726740, .green = 0.091575, .blue = 0.998291 },
+	{ .red = 0.793162, .green = 0.060562, .blue = 0.989744 },
+	{ .red = 0.842491, .green = 0.019780, .blue = 0.967521 },
+	{ .red = 0.909402, .green = 0.025397, .blue = 0.970696 },
+	{ .red = 0.970696, .green = 0.023687, .blue = 0.971429 },
+	{ .red = 0.988523, .green = 0.022955, .blue = 0.914042 },
+	{ .red = 0.985592, .green = 0.056654, .blue = 0.847375 },
+	{ .red = 0.998535, .green = 0.090842, .blue = 0.803663 },
+	{ .red = 0.999023, .green = 0.114774, .blue = 0.757021 },
+	{ .red = 0.068376, .green = 0.177289, .blue = 0.998779 },
+	{ .red = 0.103541, .green = 0.143834, .blue = 0.998779 },
+	{ .red = 0.188767, .green = 0.142125, .blue = 0.999023 },
+	{ .red = 0.283761, .green = 0.167277, .blue = 0.999023 },
+	{ .red = 0.380952, .green = 0.189988, .blue = 0.999267 },
+	{ .red = 0.476923, .green = 0.206349, .blue = 0.998535 },
+	{ .red = 0.569475, .green = 0.216117, .blue = 0.998779 },
+	{ .red = 0.655433, .green = 0.219292, .blue = 0.998291 },
+	{ .red = 0.735775, .green = 0.218071, .blue = 0.998779 },
+	{ .red = 0.809524, .green = 0.213675, .blue = 0.999023 },
+	{ .red = 0.877900, .green = 0.207326, .blue = 0.998779 },
+	{ .red = 0.943101, .green = 0.206838, .blue = 0.999023 },
+	{ .red = 0.997070, .green = 0.206593, .blue = 0.991697 },
+	{ .red = 0.999512, .green = 0.219048, .blue = 0.919902 },
+	{ .red = 0.999267, .green = 0.225885, .blue = 0.857875 },
+	{ .red = 0.999512, .green = 0.229304, .blue = 0.806349 },
+	{ .red = 0.999512, .green = 0.230281, .blue = 0.761661 },
+	{ .red = 0.080342, .green = 0.250061, .blue = 0.998779 },
+	{ .red = 0.163370, .green = 0.311111, .blue = 0.998779 },
+	{ .red = 0.224176, .green = 0.303785, .blue = 0.998291 },
+	{ .red = 0.312332, .green = 0.316728, .blue = 0.998535 },
+	{ .red = 0.406349, .green = 0.331136, .blue = 0.998046 },
+	{ .red = 0.501587, .green = 0.344322, .blue = 0.998779 },
+	{ .red = 0.593407, .green = 0.354579, .blue = 0.999023 },
+	{ .red = 0.679609, .green = 0.361661, .blue = 0.998779 },
+	{ .red = 0.759463, .green = 0.365568, .blue = 0.999267 },
+	{ .red = 0.831502, .green = 0.366789, .blue = 0.998535 },
+	{ .red = 0.897924, .green = 0.365568, .blue = 0.999023 },
+	{ .red = 0.959463, .green = 0.365568, .blue = 0.998535 },
+	{ .red = 0.999023, .green = 0.365812, .blue = 0.979976 },
+	{ .red = 0.999023, .green = 0.365324, .blue = 0.914286 },
+	{ .red = 0.999023, .green = 0.361172, .blue = 0.858608 },
+	{ .red = 0.998779, .green = 0.354579, .blue = 0.811722 },
+	{ .red = 0.999023, .green = 0.346764, .blue = 0.771429 },
+	{ .red = 0.060317, .green = 0.321368, .blue = 0.991941 },
+	{ .red = 0.151160, .green = 0.356288, .blue = 0.998535 },
+	{ .red = 0.294017, .green = 0.444444, .blue = 0.998779 },
+	{ .red = 0.365324, .green = 0.451282, .blue = 0.998779 },
+	{ .red = 0.450061, .green = 0.462759, .blue = 0.998779 },
+	{ .red = 0.538217, .green = 0.474237, .blue = 0.998291 },
+	{ .red = 0.625885, .green = 0.484737, .blue = 0.998535 },
+	{ .red = 0.708913, .green = 0.493040, .blue = 0.999512 },
+	{ .red = 0.784860, .green = 0.498657, .blue = 0.998779 },
+	{ .red = 0.854457, .green = 0.502076, .blue = 0.999512 },
+	{ .red = 0.916239, .green = 0.502564, .blue = 0.998291 },
+	{ .red = 0.973382, .green = 0.501587, .blue = 0.998291 },
+	{ .red = 0.999756, .green = 0.501343, .blue = 0.970696 },
+	{ .red = 0.998535, .green = 0.496459, .blue = 0.914042 },
+	{ .red = 0.998291, .green = 0.486691, .blue = 0.865446 },
+	{ .red = 0.999023, .green = 0.474481, .blue = 0.824908 },
+	{ .red = 0.999267, .green = 0.460806, .blue = 0.788767 },
+	{ .red = 0.011233, .green = 0.386569, .blue = 0.918681 },
+	{ .red = 0.100611, .green = 0.415629, .blue = 0.998779 },
+	{ .red = 0.306716, .green = 0.509158, .blue = 0.999512 },
+	{ .red = 0.441514, .green = 0.577045, .blue = 0.998535 },
+	{ .red = 0.510867, .green = 0.586081, .blue = 0.999023 },
+	{ .red = 0.586569, .green = 0.595116, .blue = 0.998046 },
+	{ .red = 0.664225, .green = 0.604151, .blue = 0.998046 },
+	{ .red = 0.739683, .green = 0.612210, .blue = 0.999023 },
+	{ .red = 0.809524, .green = 0.618071, .blue = 0.998779 },
+	{ .red = 0.872772, .green = 0.621734, .blue = 0.998535 },
+	{ .red = 0.929670, .green = 0.622222, .blue = 0.998291 },
+	{ .red = 0.981685, .green = 0.620024, .blue = 0.998535 },
+	{ .red = 0.999756, .green = 0.619536, .blue = 0.968010 },
+	{ .red = 0.998291, .green = 0.613431, .blue = 0.920635 },
+	{ .red = 0.998779, .green = 0.600733, .blue = 0.879853 },
+	{ .red = 0.999023, .green = 0.585104, .blue = 0.844444 },
+	{ .red = 0.999023, .green = 0.567766, .blue = 0.812210 },
+	{ .red = 0.017827, .green = 0.481319, .blue = 0.926007 },
+	{ .red = 0.031746, .green = 0.494750, .blue = 0.975580 },
+	{ .red = 0.256166, .green = 0.548474, .blue = 0.998046 },
+	{ .red = 0.450305, .green = 0.633455, .blue = 0.998779 },
+	{ .red = 0.583150, .green = 0.694750, .blue = 0.998779 },
+	{ .red = 0.643223, .green = 0.701587, .blue = 0.998291 },
+	{ .red = 0.707204, .green = 0.708669, .blue = 0.998291 },
+	{ .red = 0.771429, .green = 0.715018, .blue = 0.999512 },
+	{ .red = 0.831990, .green = 0.719902, .blue = 0.998779 },
+	{ .red = 0.887668, .green = 0.722589, .blue = 0.998535 },
+	{ .red = 0.938950, .green = 0.722833, .blue = 0.999267 },
+	{ .red = 0.984615, .green = 0.719658, .blue = 0.998779 },
+	{ .red = 0.999023, .green = 0.718681, .blue = 0.970696 },
+	{ .red = 0.999023, .green = 0.712332, .blue = 0.933089 },
+	{ .red = 0.998535, .green = 0.698413, .blue = 0.898168 },
+	{ .red = 0.999267, .green = 0.681319, .blue = 0.867888 },
+	{ .red = 0.999512, .green = 0.661783, .blue = 0.839316 },
+	{ .red = 0.017827, .green = 0.573626, .blue = 0.937729 },
+	{ .red = 0.014164, .green = 0.583639, .blue = 0.966056 },
+	{ .red = 0.222222, .green = 0.618315, .blue = 0.998291 },
+	{ .red = 0.402686, .green = 0.668864, .blue = 0.998046 },
+	{ .red = 0.570452, .green = 0.731868, .blue = 0.998535 },
+	{ .red = 0.702320, .green = 0.789499, .blue = 0.999512 },
+	{ .red = 0.751404, .green = 0.794139, .blue = 0.998535 },
+	{ .red = 0.802442, .green = 0.798779, .blue = 0.999023 },
+	{ .red = 0.852503, .green = 0.802198, .blue = 0.998535 },
+	{ .red = 0.900122, .green = 0.804151, .blue = 0.998535 },
+	{ .red = 0.944078, .green = 0.803907, .blue = 0.999023 },
+	{ .red = 0.983883, .green = 0.800244, .blue = 0.998779 },
+	{ .red = 0.999512, .green = 0.798046, .blue = 0.977534 },
+	{ .red = 0.998779, .green = 0.792186, .blue = 0.946032 },
+	{ .red = 0.999267, .green = 0.777778, .blue = 0.917216 },
+	{ .red = 0.999023, .green = 0.760440, .blue = 0.890842 },
+	{ .red = 0.999267, .green = 0.740659, .blue = 0.865446 },
+	{ .red = 0.021734, .green = 0.661294, .blue = 0.947741 },
+	{ .red = 0.030525, .green = 0.667643, .blue = 0.962637 },
+	{ .red = 0.178755, .green = 0.693773, .blue = 0.999512 },
+	{ .red = 0.374359, .green = 0.728694, .blue = 0.999512 },
+	{ .red = 0.529915, .green = 0.768498, .blue = 0.998535 },
+	{ .red = 0.666911, .green = 0.810745, .blue = 0.999512 },
+	{ .red = 0.794872, .green = 0.861538, .blue = 0.999023 },
+	{ .red = 0.832967, .green = 0.864225, .blue = 0.999023 },
+	{ .red = 0.872527, .green = 0.866667, .blue = 0.999023 },
+	{ .red = 0.911355, .green = 0.867888, .blue = 0.998779 },
+	{ .red = 0.948230, .green = 0.866911, .blue = 0.999267 },
+	{ .red = 0.981685, .green = 0.863492, .blue = 0.998046 },
+	{ .red = 0.999756, .green = 0.860073, .blue = 0.984127 },
+	{ .red = 1.000000, .green = 0.853968, .blue = 0.958486 },
+	{ .red = 0.998779, .green = 0.840293, .blue = 0.933333 },
+	{ .red = 0.998779, .green = 0.822955, .blue = 0.910867 },
+	{ .red = 0.999023, .green = 0.803419, .blue = 0.888645 },
+	{ .red = 0.036142, .green = 0.747009, .blue = 0.959463 },
+	{ .red = 0.045665, .green = 0.750916, .blue = 0.967033 },
+	{ .red = 0.113309, .green = 0.769719, .blue = 0.999023 },
+	{ .red = 0.348962, .green = 0.793407, .blue = 0.999023 },
+	{ .red = 0.505006, .green = 0.820269, .blue = 0.998535 },
+	{ .red = 0.634188, .green = 0.846886, .blue = 0.998291 },
+	{ .red = 0.743101, .green = 0.872527, .blue = 0.998535 },
+	{ .red = 0.842979, .green = 0.902808, .blue = 0.999512 },
+	{ .red = 0.891575, .green = 0.915263, .blue = 0.998291 },
+	{ .red = 0.921856, .green = 0.915995, .blue = 0.999267 },
+	{ .red = 0.951648, .green = 0.915263, .blue = 0.998291 },
+	{ .red = 0.980708, .green = 0.912088, .blue = 0.998535 },
+	{ .red = 0.999267, .green = 0.907937, .blue = 0.989255 },
+	{ .red = 0.999023, .green = 0.901587, .blue = 0.967521 },
+	{ .red = 0.998779, .green = 0.887912, .blue = 0.947253 },
+	{ .red = 0.999512, .green = 0.871306, .blue = 0.927961 },
+	{ .red = 0.999512, .green = 0.852503, .blue = 0.907937 },
+	{ .red = 0.032234, .green = 0.830281, .blue = 0.970940 },
+	{ .red = 0.045910, .green = 0.832723, .blue = 0.975092 },
+	{ .red = 0.090110, .green = 0.840537, .blue = 0.988767 },
+	{ .red = 0.325519, .green = 0.860317, .blue = 0.998291 },
+	{ .red = 0.486447, .green = 0.877900, .blue = 0.999023 },
+	{ .red = 0.613919, .green = 0.894505, .blue = 0.998779 },
+	{ .red = 0.717949, .green = 0.908913, .blue = 0.998046 },
+	{ .red = 0.802198, .green = 0.922344, .blue = 0.998779 },
+	{ .red = 0.873016, .green = 0.935287, .blue = 0.999512 },
+	{ .red = 0.932601, .green = 0.951648, .blue = 0.999023 },
+	{ .red = 0.956044, .green = 0.951404, .blue = 0.999023 },
+	{ .red = 0.980220, .green = 0.948962, .blue = 0.998779 },
+	{ .red = 0.998779, .green = 0.944567, .blue = 0.992918 },
+	{ .red = 0.998779, .green = 0.937485, .blue = 0.974603 },
+	{ .red = 0.998535, .green = 0.924054, .blue = 0.957753 },
+	{ .red = 0.998779, .green = 0.907937, .blue = 0.940904 },
+	{ .red = 0.998535, .green = 0.890110, .blue = 0.922833 },
+	{ .red = 0.092552, .green = 0.905983, .blue = 0.975092 },
+	{ .red = 0.097924, .green = 0.907448, .blue = 0.977289 },
+	{ .red = 0.117949, .green = 0.913309, .blue = 0.985592 },
+	{ .red = 0.298901, .green = 0.929426, .blue = 0.999267 },
+	{ .red = 0.473993, .green = 0.937973, .blue = 0.998535 },
+	{ .red = 0.604151, .green = 0.945788, .blue = 0.998046 },
+	{ .red = 0.704762, .green = 0.953602, .blue = 0.999267 },
+	{ .red = 0.786813, .green = 0.958730, .blue = 0.998291 },
+	{ .red = 0.850794, .green = 0.963614, .blue = 0.999023 },
+	{ .red = 0.902808, .green = 0.968010, .blue = 0.999756 },
+	{ .red = 0.949206, .green = 0.972894, .blue = 0.999756 },
+	{ .red = 0.979731, .green = 0.976557, .blue = 0.999023 },
+	{ .red = 0.999267, .green = 0.972405, .blue = 0.996337 },
+	{ .red = 0.998535, .green = 0.964103, .blue = 0.979976 },
+	{ .red = 0.998535, .green = 0.950427, .blue = 0.965568 },
+	{ .red = 0.998535, .green = 0.935043, .blue = 0.950183 },
+	{ .red = 0.998535, .green = 0.918437, .blue = 0.933822 },
+	{ .red = 0.084982, .green = 0.983883, .blue = 0.983883 },
+	{ .red = 0.086203, .green = 0.985592, .blue = 0.985592 },
+	{ .red = 0.091575, .green = 0.990965, .blue = 0.991453 },
+	{ .red = 0.266178, .green = 0.998291, .blue = 0.998535 },
+	{ .red = 0.469353, .green = 0.998046, .blue = 0.997314 },
+	{ .red = 0.605861, .green = 0.998535, .blue = 0.997070 },
+	{ .red = 0.707204, .green = 0.999267, .blue = 0.998046 },
+	{ .red = 0.789255, .green = 0.998046, .blue = 0.997070 },
+	{ .red = 0.849084, .green = 0.998535, .blue = 0.998046 },
+	{ .red = 0.895482, .green = 0.999023, .blue = 0.998779 },
+	{ .red = 0.933089, .green = 0.998779, .blue = 0.999023 },
+	{ .red = 0.963126, .green = 0.998535, .blue = 0.999023 },
+	{ .red = 0.996337, .green = 0.994872, .blue = 0.995360 },
+	{ .red = 0.999512, .green = 0.981929, .blue = 0.982906 },
+	{ .red = 0.998291, .green = 0.968742, .blue = 0.969963 },
+	{ .red = 0.999267, .green = 0.954090, .blue = 0.955556 },
+	{ .red = 0.999756, .green = 0.938950, .blue = 0.940415 },
+	{ .red = 0.130891, .green = 0.985348, .blue = 0.926252 },
+	{ .red = 0.133578, .green = 0.986569, .blue = 0.927228 },
+	{ .red = 0.143101, .green = 0.990965, .blue = 0.930647 },
+	{ .red = 0.309402, .green = 0.999512, .blue = 0.940659 },
+	{ .red = 0.464469, .green = 0.999267, .blue = 0.945543 },
+	{ .red = 0.584615, .green = 0.999267, .blue = 0.951160 },
+	{ .red = 0.679853, .green = 0.999267, .blue = 0.956777 },
+	{ .red = 0.757753, .green = 0.998779, .blue = 0.961416 },
+	{ .red = 0.817094, .green = 0.999267, .blue = 0.966300 },
+	{ .red = 0.865446, .green = 0.999512, .blue = 0.969475 },
+	{ .red = 0.906471, .green = 0.998535, .blue = 0.971429 },
+	{ .red = 0.936996, .green = 0.999756, .blue = 0.972405 },
+	{ .red = 0.968987, .green = 0.999512, .blue = 0.971917 },
+	{ .red = 0.998779, .green = 0.996581, .blue = 0.948718 },
+	{ .red = 0.999023, .green = 0.976801, .blue = 0.959951 },
+	{ .red = 0.999023, .green = 0.968254, .blue = 0.956288 },
+	{ .red = 0.998779, .green = 0.954579, .blue = 0.943101 },
+	{ .red = 0.093773, .green = 0.992430, .blue = 0.879609 },
+	{ .red = 0.096215, .green = 0.993407, .blue = 0.880342 },
+	{ .red = 0.155800, .green = 0.999023, .blue = 0.885226 },
+	{ .red = 0.321123, .green = 0.999756, .blue = 0.891819 },
+	{ .red = 0.449573, .green = 0.999267, .blue = 0.899145 },
+	{ .red = 0.558486, .green = 0.997802, .blue = 0.907204 },
+	{ .red = 0.646398, .green = 0.998535, .blue = 0.916484 },
+	{ .red = 0.721123, .green = 0.998291, .blue = 0.925031 },
+	{ .red = 0.780952, .green = 0.999267, .blue = 0.932601 },
+	{ .red = 0.832234, .green = 0.999023, .blue = 0.938462 },
+	{ .red = 0.874481, .green = 0.999512, .blue = 0.943346 },
+	{ .red = 0.912088, .green = 0.999267, .blue = 0.947253 },
+	{ .red = 0.947253, .green = 0.998535, .blue = 0.951648 },
+	{ .red = 0.972161, .green = 0.999267, .blue = 0.947497 },
+	{ .red = 0.998291, .green = 0.995849, .blue = 0.907204 },
+	{ .red = 0.998779, .green = 0.969963, .blue = 0.923565 },
+	{ .red = 0.999756, .green = 0.957265, .blue = 0.922344 },
+	{ .red = 0.084737, .green = 0.995360, .blue = 0.835653 },
+	{ .red = 0.088156, .green = 0.996337, .blue = 0.835897 },
+	{ .red = 0.200977, .green = 0.998779, .blue = 0.840781 },
+	{ .red = 0.323321, .green = 0.999267, .blue = 0.847863 },
+	{ .red = 0.432234, .green = 0.999023, .blue = 0.856899 },
+	{ .red = 0.527717, .green = 0.999267, .blue = 0.867399 },
+	{ .red = 0.612698, .green = 0.998779, .blue = 0.878144 },
+	{ .red = 0.683761, .green = 0.999512, .blue = 0.889133 },
+	{ .red = 0.747497, .green = 0.998779, .blue = 0.898657 },
+	{ .red = 0.799756, .green = 0.999267, .blue = 0.907204 },
+	{ .red = 0.846398, .green = 0.998535, .blue = 0.914774 },
+	{ .red = 0.886203, .green = 0.998779, .blue = 0.921368 },
+	{ .red = 0.923077, .green = 0.998046, .blue = 0.928938 },
+	{ .red = 0.956288, .green = 0.998779, .blue = 0.937729 },
+	{ .red = 0.966789, .green = 0.998535, .blue = 0.908913 },
+	{ .red = 0.998779, .green = 0.996337, .blue = 0.863492 },
+	{ .red = 0.999512, .green = 0.966300, .blue = 0.883028 },
+	{ .red = 0.111844, .green = 0.994872, .blue = 0.794383 },
+	{ .red = 0.119170, .green = 0.999023, .blue = 0.797070 },
+	{ .red = 0.215873, .green = 0.999512, .blue = 0.801465 },
+	{ .red = 0.320147, .green = 0.998535, .blue = 0.808303 },
+	{ .red = 0.413431, .green = 0.999267, .blue = 0.818071 },
+	{ .red = 0.503541, .green = 0.998291, .blue = 0.829060 },
+	{ .red = 0.581441, .green = 0.999023, .blue = 0.841514 },
+	{ .red = 0.654212, .green = 0.998046, .blue = 0.853724 },
+	{ .red = 0.714774, .green = 0.999023, .blue = 0.865201 },
+	{ .red = 0.768254, .green = 0.999512, .blue = 0.875946 },
+	{ .red = 0.815873, .green = 0.999512, .blue = 0.885470 },
+	{ .red = 0.859096, .green = 0.998779, .blue = 0.894750 },
+	{ .red = 0.896947, .green = 0.999023, .blue = 0.903541 },
+	{ .red = 0.932357, .green = 0.998535, .blue = 0.914530 },
+	{ .red = 0.947253, .green = 0.999023, .blue = 0.900855 },
+	{ .red = 0.964347, .green = 0.999023, .blue = 0.870085 },
+	{ .red = 0.998535, .green = 0.996337, .blue = 0.822955 },
+	{ .red = 0.057631, .green = 0.137973, .blue = 0.999756 },
+	{ .red = 0.093773, .green = 0.086203, .blue = 0.999023 },
+	{ .red = 0.171429, .green = 0.036386, .blue = 0.984127 },
+	{ .red = 0.262515, .green = 0.076190, .blue = 0.996825 },
+	{ .red = 0.352625, .green = 0.102076, .blue = 0.998779 },
+	{ .red = 0.441270, .green = 0.116728, .blue = 0.998535 },
+	{ .red = 0.526740, .green = 0.119902, .blue = 0.998535 },
+	{ .red = 0.607082, .green = 0.114530, .blue = 0.998291 },
+	{ .red = 0.683272, .green = 0.100122, .blue = 0.999512 },
+	{ .red = 0.752869, .green = 0.071551, .blue = 0.999267 },
+	{ .red = 0.803907, .green = 0.040781, .blue = 0.980220 },
+	{ .red = 0.847131, .green = 0.021001, .blue = 0.958730 },
+	{ .red = 0.910379, .green = 0.020757, .blue = 0.964835 },
+	{ .red = 0.965812, .green = 0.021001, .blue = 0.965568 },
+	{ .red = 0.981441, .green = 0.021001, .blue = 0.912088 },
+	{ .red = 0.979976, .green = 0.045421, .blue = 0.851770 },
+	{ .red = 0.994383, .green = 0.030281, .blue = 0.812454 },
+	{ .red = 0.062271, .green = 0.148718, .blue = 0.999756 },
+	{ .red = 0.095726, .green = 0.103297, .blue = 0.999023 },
+	{ .red = 0.173871, .green = 0.056410, .blue = 0.998535 },
+	{ .red = 0.262271, .green = 0.092308, .blue = 0.999023 },
+	{ .red = 0.351648, .green = 0.114530, .blue = 0.999267 },
+	{ .red = 0.439805, .green = 0.127961, .blue = 0.998535 },
+	{ .red = 0.525031, .green = 0.130891, .blue = 0.998535 },
+	{ .red = 0.605372, .green = 0.126007, .blue = 0.998291 },
+	{ .red = 0.681563, .green = 0.113553, .blue = 0.999267 },
+	{ .red = 0.751893, .green = 0.090598, .blue = 0.999512 },
+	{ .red = 0.812943, .green = 0.060317, .blue = 0.993162 },
+	{ .red = 0.863248, .green = 0.031013, .blue = 0.978999 },
+	{ .red = 0.926984, .green = 0.025153, .blue = 0.984127 },
+	{ .red = 0.981197, .green = 0.026862, .blue = 0.981929 },
+	{ .red = 0.987790, .green = 0.046154, .blue = 0.918437 },
+	{ .red = 0.999023, .green = 0.088645, .blue = 0.868132 },
+	{ .red = 0.998779, .green = 0.115995, .blue = 0.816117 },
+	{ .red = 0.077656, .green = 0.189744, .blue = 0.998535 },
+	{ .red = 0.107204, .green = 0.171184, .blue = 0.999267 },
+	{ .red = 0.180220, .green = 0.159707, .blue = 0.999023 },
+	{ .red = 0.267155, .green = 0.178999, .blue = 0.999023 },
+	{ .red = 0.356777, .green = 0.198046, .blue = 0.999023 },
+	{ .red = 0.446154, .green = 0.212943, .blue = 0.998779 },
+	{ .red = 0.532845, .green = 0.222711, .blue = 0.998535 },
+	{ .red = 0.615385, .green = 0.227595, .blue = 0.998779 },
+	{ .red = 0.691819, .green = 0.227595, .blue = 0.998779 },
+	{ .red = 0.763614, .green = 0.225153, .blue = 0.999267 },
+	{ .red = 0.829548, .green = 0.220757, .blue = 0.999023 },
+	{ .red = 0.891087, .green = 0.215140, .blue = 0.998779 },
+	{ .red = 0.949939, .green = 0.214896, .blue = 0.999023 },
+	{ .red = 0.997558, .green = 0.214652, .blue = 0.990720 },
+	{ .red = 0.999512, .green = 0.224664, .blue = 0.924542 },
+	{ .red = 0.999267, .green = 0.229792, .blue = 0.866667 },
+	{ .red = 0.999267, .green = 0.231990, .blue = 0.817827 },
+	{ .red = 0.112821, .green = 0.277411, .blue = 0.998535 },
+	{ .red = 0.168742, .green = 0.317460, .blue = 0.998779 },
+	{ .red = 0.218315, .green = 0.305739, .blue = 0.998291 },
+	{ .red = 0.297680, .green = 0.316239, .blue = 0.998535 },
+	{ .red = 0.384371, .green = 0.329182, .blue = 0.999512 },
+	{ .red = 0.471795, .green = 0.341148, .blue = 0.998291 },
+	{ .red = 0.558242, .green = 0.351404, .blue = 0.998535 },
+	{ .red = 0.640293, .green = 0.358242, .blue = 0.999023 },
+	{ .red = 0.716972, .green = 0.363126, .blue = 0.999512 },
+	{ .red = 0.787302, .green = 0.365324, .blue = 0.999512 },
+	{ .red = 0.851282, .green = 0.365079, .blue = 0.999267 },
+	{ .red = 0.910623, .green = 0.362637, .blue = 0.999512 },
+	{ .red = 0.965568, .green = 0.362393, .blue = 0.998535 },
+	{ .red = 0.999023, .green = 0.362149, .blue = 0.978999 },
+	{ .red = 0.999023, .green = 0.360440, .blue = 0.918681 },
+	{ .red = 0.999267, .green = 0.355067, .blue = 0.866667 },
+	{ .red = 0.998779, .green = 0.347985, .blue = 0.821978 },
+	{ .red = 0.076435, .green = 0.305250, .blue = 0.997802 },
+	{ .red = 0.187546, .green = 0.379731, .blue = 0.998779 },
+	{ .red = 0.290354, .green = 0.439316, .blue = 0.998535 },
+	{ .red = 0.353358, .green = 0.444689, .blue = 0.998779 },
+	{ .red = 0.430037, .green = 0.454701, .blue = 0.998535 },
+	{ .red = 0.511844, .green = 0.465446, .blue = 0.999023 },
+	{ .red = 0.593407, .green = 0.474969, .blue = 0.999023 },
+	{ .red = 0.671795, .green = 0.483272, .blue = 0.998535 },
+	{ .red = 0.745055, .green = 0.489377, .blue = 0.998779 },
+	{ .red = 0.812210, .green = 0.493529, .blue = 0.998535 },
+	{ .red = 0.873748, .green = 0.495238, .blue = 0.999512 },
+	{ .red = 0.928205, .green = 0.493773, .blue = 0.998535 },
+	{ .red = 0.979243, .green = 0.492308, .blue = 0.998291 },
+	{ .red = 0.999512, .green = 0.491331, .blue = 0.969719 },
+	{ .red = 0.999267, .green = 0.484737, .blue = 0.917705 },
+	{ .red = 0.998535, .green = 0.473993, .blue = 0.871551 },
+	{ .red = 0.999756, .green = 0.461294, .blue = 0.832967 },
+	{ .red = 0.028816, .green = 0.370208, .blue = 0.960195 },
+	{ .red = 0.129182, .green = 0.401221, .blue = 0.998779 },
+	{ .red = 0.346032, .green = 0.531868, .blue = 0.998779 },
+	{ .red = 0.431502, .green = 0.565812, .blue = 0.998291 },
+	{ .red = 0.494261, .green = 0.573626, .blue = 0.998046 },
+	{ .red = 0.564347, .green = 0.582173, .blue = 0.998779 },
+	{ .red = 0.636386, .green = 0.590720, .blue = 0.998779 },
+	{ .red = 0.706960, .green = 0.598291, .blue = 0.997802 },
+	{ .red = 0.774359, .green = 0.604640, .blue = 0.999023 },
+	{ .red = 0.836142, .green = 0.608791, .blue = 0.999512 },
+	{ .red = 0.891819, .green = 0.610745, .blue = 0.999756 },
+	{ .red = 0.942125, .green = 0.609524, .blue = 0.999267 },
+	{ .red = 0.988034, .green = 0.606593, .blue = 0.998779 },
+	{ .red = 0.999023, .green = 0.605128, .blue = 0.965812 },
+	{ .red = 0.998779, .green = 0.597070, .blue = 0.922833 },
+	{ .red = 0.998535, .green = 0.583394, .blue = 0.883272 },
+	{ .red = 0.998779, .green = 0.567277, .blue = 0.848840 },
+	{ .red = 0.000000, .green = 0.453968, .blue = 0.951160 },
+	{ .red = 0.079609, .green = 0.471306, .blue = 0.999267 },
+	{ .red = 0.270574, .green = 0.530891, .blue = 0.999023 },
+	{ .red = 0.495238, .green = 0.655189, .blue = 0.999023 },
+	{ .red = 0.569475, .green = 0.679609, .blue = 0.998291 },
+	{ .red = 0.624908, .green = 0.685958, .blue = 0.999023 },
+	{ .red = 0.684249, .green = 0.692552, .blue = 0.999023 },
+	{ .red = 0.744322, .green = 0.698657, .blue = 0.998779 },
+	{ .red = 0.802198, .green = 0.704029, .blue = 0.998779 },
+	{ .red = 0.855922, .green = 0.707692, .blue = 0.998291 },
+	{ .red = 0.905495, .green = 0.709158, .blue = 0.999023 },
+	{ .red = 0.950427, .green = 0.707692, .blue = 0.999512 },
+	{ .red = 0.990476, .green = 0.703541, .blue = 0.998046 },
+	{ .red = 0.998779, .green = 0.701832, .blue = 0.968254 },
+	{ .red = 0.999267, .green = 0.693773, .blue = 0.933333 },
+	{ .red = 0.999023, .green = 0.678632, .blue = 0.899389 },
+	{ .red = 0.998535, .green = 0.661050, .blue = 0.869109 },
+	{ .red = 0.016850, .green = 0.538950, .blue = 0.954823 },
+	{ .red = 0.042002, .green = 0.545788, .blue = 0.978755 },
+	{ .red = 0.245665, .green = 0.589988, .blue = 0.999267 },
+	{ .red = 0.415140, .green = 0.650794, .blue = 0.998779 },
+	{ .red = 0.598046, .green = 0.736264, .blue = 0.998291 },
+	{ .red = 0.687668, .green = 0.772650, .blue = 0.998291 },
+	{ .red = 0.733333, .green = 0.777289, .blue = 0.999267 },
+	{ .red = 0.780952, .green = 0.781929, .blue = 0.998535 },
+	{ .red = 0.828816, .green = 0.785836, .blue = 0.999023 },
+	{ .red = 0.873993, .green = 0.788278, .blue = 0.998779 },
+	{ .red = 0.915995, .green = 0.789255, .blue = 0.998535 },
+	{ .red = 0.954090, .green = 0.787546, .blue = 0.998046 },
+	{ .red = 0.990476, .green = 0.782662, .blue = 0.998779 },
+	{ .red = 0.999267, .green = 0.780220, .blue = 0.974359 },
+	{ .red = 0.999267, .green = 0.772894, .blue = 0.945543 },
+	{ .red = 0.998779, .green = 0.757509, .blue = 0.916484 },
+	{ .red = 0.999267, .green = 0.739683, .blue = 0.890354 },
+	{ .red = 0.024908, .green = 0.621245, .blue = 0.960928 },
+	{ .red = 0.028083, .green = 0.628327, .blue = 0.979243 },
+	{ .red = 0.222222, .green = 0.656654, .blue = 0.998535 },
+	{ .red = 0.390476, .green = 0.698901, .blue = 0.998291 },
+	{ .red = 0.539927, .green = 0.747985, .blue = 0.998535 },
+	{ .red = 0.683028, .green = 0.803419, .blue = 0.998535 },
+	{ .red = 0.780464, .green = 0.844689, .blue = 0.998535 },
+	{ .red = 0.816361, .green = 0.847619, .blue = 0.998291 },
+	{ .red = 0.853480, .green = 0.850305, .blue = 0.999267 },
+	{ .red = 0.890354, .green = 0.852015, .blue = 0.999023 },
+	{ .red = 0.925031, .green = 0.852259, .blue = 0.998291 },
+	{ .red = 0.957509, .green = 0.850549, .blue = 0.998291 },
+	{ .red = 0.989499, .green = 0.845665, .blue = 0.999756 },
+	{ .red = 0.998046, .green = 0.842735, .blue = 0.979731 },
+	{ .red = 0.999267, .green = 0.835409, .blue = 0.956777 },
+	{ .red = 0.999512, .green = 0.820513, .blue = 0.932601 },
+	{ .red = 0.998779, .green = 0.803175, .blue = 0.909646 },
+	{ .red = 0.039560, .green = 0.699634, .blue = 0.966300 },
+	{ .red = 0.051282, .green = 0.703785, .blue = 0.975336 },
+	{ .red = 0.195360, .green = 0.725763, .blue = 0.998535 },
+	{ .red = 0.371184, .green = 0.755800, .blue = 0.999512 },
+	{ .red = 0.515263, .green = 0.789988, .blue = 0.999267 },
+	{ .red = 0.640781, .green = 0.824176, .blue = 0.999267 },
+	{ .red = 0.750916, .green = 0.858120, .blue = 0.998535 },
+	{ .red = 0.849817, .green = 0.897924, .blue = 0.998046 },
+	{ .red = 0.876923, .green = 0.899634, .blue = 0.999023 },
+	{ .red = 0.905495, .green = 0.900611, .blue = 0.999267 },
+	{ .red = 0.933822, .green = 0.900611, .blue = 0.999512 },
+	{ .red = 0.960928, .green = 0.899145, .blue = 0.998779 },
+	{ .red = 0.986325, .green = 0.894994, .blue = 0.998291 },
+	{ .red = 0.999267, .green = 0.890842, .blue = 0.986569 },
+	{ .red = 0.999023, .green = 0.884005, .blue = 0.966300 },
+	{ .red = 0.998779, .green = 0.869841, .blue = 0.945543 },
+	{ .red = 0.999023, .green = 0.852991, .blue = 0.926007 },
+	{ .red = 0.037363, .green = 0.777534, .blue = 0.975580 },
+	{ .red = 0.054212, .green = 0.779731, .blue = 0.980220 },
+	{ .red = 0.164103, .green = 0.794628, .blue = 0.998535 },
+	{ .red = 0.355311, .green = 0.815629, .blue = 0.999512 },
+	{ .red = 0.499145, .green = 0.838584, .blue = 0.998535 },
+	{ .red = 0.619048, .green = 0.862027, .blue = 0.999023 },
+	{ .red = 0.720147, .green = 0.883028, .blue = 0.998291 },
+	{ .red = 0.804884, .green = 0.903053, .blue = 0.998779 },
+	{ .red = 0.885958, .green = 0.928938, .blue = 0.999512 },
+	{ .red = 0.920391, .green = 0.937241, .blue = 0.998535 },
+	{ .red = 0.941880, .green = 0.937241, .blue = 0.998779 },
+	{ .red = 0.964103, .green = 0.936020, .blue = 0.999023 },
+	{ .red = 0.985592, .green = 0.932601, .blue = 0.999023 },
+	{ .red = 0.999023, .green = 0.928449, .blue = 0.990965 },
+	{ .red = 0.999023, .green = 0.921368, .blue = 0.973871 },
+	{ .red = 0.998779, .green = 0.907937, .blue = 0.956532 },
+	{ .red = 0.999267, .green = 0.891819, .blue = 0.939438 },
+	{ .red = 0.062515, .green = 0.850061, .blue = 0.980220 },
+	{ .red = 0.069109, .green = 0.852015, .blue = 0.983394 },
+	{ .red = 0.122100, .green = 0.863492, .blue = 0.999267 },
+	{ .red = 0.343346, .green = 0.876190, .blue = 0.998535 },
+	{ .red = 0.488889, .green = 0.891331, .blue = 0.998779 },
+	{ .red = 0.606838, .green = 0.906227, .blue = 0.999267 },
+	{ .red = 0.704029, .green = 0.918926, .blue = 0.998779 },
+	{ .red = 0.783150, .green = 0.930159, .blue = 0.999023 },
+	{ .red = 0.848352, .green = 0.940171, .blue = 0.999023 },
+	{ .red = 0.903785, .green = 0.950427, .blue = 0.999023 },
+	{ .red = 0.950916, .green = 0.964591, .blue = 0.999023 },
+	{ .red = 0.967766, .green = 0.963858, .blue = 0.999267 },
+	{ .red = 0.985592, .green = 0.961661, .blue = 0.999267 },
+	{ .red = 0.999023, .green = 0.957265, .blue = 0.994628 },
+	{ .red = 0.999023, .green = 0.949939, .blue = 0.979731 },
+	{ .red = 0.999023, .green = 0.936752, .blue = 0.965079 },
+	{ .red = 0.999512, .green = 0.921368, .blue = 0.949695 },
+	{ .red = 0.090354, .green = 0.919414, .blue = 0.983883 },
+	{ .red = 0.094017, .green = 0.920879, .blue = 0.985836 },
+	{ .red = 0.107204, .green = 0.926252, .blue = 0.993162 },
+	{ .red = 0.335775, .green = 0.937485, .blue = 0.998535 },
+	{ .red = 0.486447, .green = 0.945543, .blue = 0.998535 },
+	{ .red = 0.604884, .green = 0.953114, .blue = 0.998779 },
+	{ .red = 0.699878, .green = 0.959463, .blue = 0.999023 },
+	{ .red = 0.776313, .green = 0.964347, .blue = 0.998779 },
+	{ .red = 0.836386, .green = 0.968987, .blue = 0.999512 },
+	{ .red = 0.886447, .green = 0.971917, .blue = 0.998535 },
+	{ .red = 0.926740, .green = 0.975092, .blue = 0.998779 },
+	{ .red = 0.962637, .green = 0.979487, .blue = 0.999512 },
+	{ .red = 0.986081, .green = 0.983394, .blue = 0.999267 },
+	{ .red = 0.998779, .green = 0.980220, .blue = 0.996581 },
+	{ .red = 0.998535, .green = 0.971673, .blue = 0.983883 },
+	{ .red = 0.998535, .green = 0.958486, .blue = 0.970940 },
+	{ .red = 0.998779, .green = 0.943834, .blue = 0.957021 },
+	{ .red = 0.089133, .green = 0.989499, .blue = 0.989499 },
+	{ .red = 0.090110, .green = 0.990720, .blue = 0.990965 },
+	{ .red = 0.094261, .green = 0.995360, .blue = 0.995849 },
+	{ .red = 0.334310, .green = 0.998779, .blue = 0.998291 },
+	{ .red = 0.499389, .green = 0.998779, .blue = 0.997314 },
+	{ .red = 0.621490, .green = 0.999023, .blue = 0.997070 },
+	{ .red = 0.715995, .green = 0.999023, .blue = 0.997314 },
+	{ .red = 0.791941, .green = 0.998046, .blue = 0.996825 },
+	{ .red = 0.848107, .green = 0.998535, .blue = 0.997558 },
+	{ .red = 0.891087, .green = 0.999023, .blue = 0.998779 },
+	{ .red = 0.927473, .green = 0.998779, .blue = 0.998779 },
+	{ .red = 0.955800, .green = 0.998535, .blue = 0.998779 },
+	{ .red = 0.978022, .green = 0.998779, .blue = 0.999267 },
+	{ .red = 0.999267, .green = 0.998046, .blue = 0.998291 },
+	{ .red = 0.999756, .green = 0.985836, .blue = 0.986569 },
+	{ .red = 0.998779, .green = 0.973382, .blue = 0.974359 },
+	{ .red = 0.998779, .green = 0.959707, .blue = 0.960928 },
+	{ .red = 0.135287, .green = 0.989011, .blue = 0.933822 },
+	{ .red = 0.137241, .green = 0.989988, .blue = 0.934554 },
+	{ .red = 0.165812, .green = 0.998535, .blue = 0.942613 },
+	{ .red = 0.344567, .green = 0.999023, .blue = 0.946032 },
+	{ .red = 0.478388, .green = 0.998535, .blue = 0.949939 },
+	{ .red = 0.585104, .green = 0.999512, .blue = 0.955800 },
+	{ .red = 0.674725, .green = 0.999512, .blue = 0.960684 },
+	{ .red = 0.750427, .green = 0.998291, .blue = 0.964591 },
+	{ .red = 0.807326, .green = 0.999023, .blue = 0.969231 },
+	{ .red = 0.854457, .green = 0.999023, .blue = 0.972650 },
+	{ .red = 0.892063, .green = 0.999023, .blue = 0.975336 },
+	{ .red = 0.925275, .green = 0.998046, .blue = 0.976557 },
+	{ .red = 0.948962, .green = 0.999512, .blue = 0.977534 },
+	{ .red = 0.975336, .green = 0.999756, .blue = 0.977534 },
+	{ .red = 0.998779, .green = 0.996581, .blue = 0.957998 },
+	{ .red = 0.999267, .green = 0.979731, .blue = 0.964835 },
+	{ .red = 0.999023, .green = 0.971673, .blue = 0.960928 },
+	{ .red = 0.059341, .green = 0.997070, .blue = 0.891331 },
+	{ .red = 0.062271, .green = 0.998046, .blue = 0.891819 },
+	{ .red = 0.207814, .green = 0.999267, .blue = 0.895238 },
+	{ .red = 0.337241, .green = 0.999512, .blue = 0.900611 },
+	{ .red = 0.450305, .green = 0.999267, .blue = 0.906960 },
+	{ .red = 0.547253, .green = 0.999512, .blue = 0.915018 },
+	{ .red = 0.634432, .green = 0.998291, .blue = 0.922100 },
+	{ .red = 0.705495, .green = 0.998535, .blue = 0.929915 },
+	{ .red = 0.764103, .green = 0.999267, .blue = 0.936996 },
+	{ .red = 0.813431, .green = 0.999512, .blue = 0.942613 },
+	{ .red = 0.857143, .green = 0.998535, .blue = 0.947253 },
+	{ .red = 0.892063, .green = 0.999023, .blue = 0.950916 },
+	{ .red = 0.924298, .green = 0.998535, .blue = 0.954090 },
+	{ .red = 0.953602, .green = 0.998779, .blue = 0.957509 },
+	{ .red = 0.975336, .green = 0.999512, .blue = 0.953358 },
+	{ .red = 0.998046, .green = 0.995849, .blue = 0.916972 },
+	{ .red = 0.998779, .green = 0.972405, .blue = 0.930403 },
+	{ .red = 0.126252, .green = 0.993651, .blue = 0.845421 },
+	{ .red = 0.152381, .green = 0.995360, .blue = 0.847375 },
+	{ .red = 0.226618, .green = 0.999023, .blue = 0.852991 },
+	{ .red = 0.327473, .green = 0.999756, .blue = 0.859096 },
+	{ .red = 0.426374, .green = 0.999267, .blue = 0.866667 },
+	{ .red = 0.515018, .green = 0.999512, .blue = 0.875946 },
+	{ .red = 0.595360, .green = 0.999267, .blue = 0.885470 },
+	{ .red = 0.666178, .green = 0.999023, .blue = 0.894750 },
+	{ .red = 0.726496, .green = 0.999267, .blue = 0.903541 },
+	{ .red = 0.778999, .green = 0.998779, .blue = 0.911600 },
+	{ .red = 0.822955, .green = 0.999512, .blue = 0.918437 },
+	{ .red = 0.863248, .green = 0.998779, .blue = 0.924542 },
+	{ .red = 0.897924, .green = 0.998779, .blue = 0.929670 },
+	{ .red = 0.930159, .green = 0.998535, .blue = 0.935531 },
+	{ .red = 0.960195, .green = 0.998779, .blue = 0.943590 },
+	{ .red = 0.969719, .green = 0.998779, .blue = 0.916239 },
+	{ .red = 0.998291, .green = 0.996093, .blue = 0.875214 },
+	{ .red = 0.064957, .green = 0.155800, .blue = 0.999512 },
+	{ .red = 0.093040, .green = 0.117949, .blue = 0.999267 },
+	{ .red = 0.162393, .green = 0.059585, .blue = 0.994872 },
+	{ .red = 0.245177, .green = 0.088156, .blue = 0.998046 },
+	{ .red = 0.328694, .green = 0.111355, .blue = 0.999512 },
+	{ .red = 0.411233, .green = 0.124298, .blue = 0.998535 },
+	{ .red = 0.492063, .green = 0.131380, .blue = 0.998779 },
+	{ .red = 0.568742, .green = 0.127228, .blue = 0.998291 },
+	{ .red = 0.641758, .green = 0.119170, .blue = 0.998779 },
+	{ .red = 0.710134, .green = 0.102808, .blue = 0.999512 },
+	{ .red = 0.772650, .green = 0.078144, .blue = 0.998291 },
+	{ .red = 0.823687, .green = 0.038828, .blue = 0.987302 },
+	{ .red = 0.868132, .green = 0.026374, .blue = 0.972894 },
+	{ .red = 0.927473, .green = 0.017582, .blue = 0.978999 },
+	{ .red = 0.976313, .green = 0.024664, .blue = 0.976068 },
+	{ .red = 0.985348, .green = 0.037118, .blue = 0.920391 },
+	{ .red = 0.983883, .green = 0.051038, .blue = 0.863004 },
+	{ .red = 0.068620, .green = 0.163370, .blue = 0.999267 },
+	{ .red = 0.094994, .green = 0.128205, .blue = 0.999267 },
+	{ .red = 0.163126, .green = 0.075702, .blue = 0.998535 },
+	{ .red = 0.244689, .green = 0.099878, .blue = 0.998535 },
+	{ .red = 0.327717, .green = 0.120635, .blue = 0.999267 },
+	{ .red = 0.409768, .green = 0.132357, .blue = 0.998291 },
+	{ .red = 0.490842, .green = 0.139683, .blue = 0.999023 },
+	{ .red = 0.567521, .green = 0.136508, .blue = 0.998535 },
+	{ .red = 0.640049, .green = 0.128938, .blue = 0.998535 },
+	{ .red = 0.708913, .green = 0.114042, .blue = 0.999512 },
+	{ .red = 0.772161, .green = 0.092796, .blue = 0.998779 },
+	{ .red = 0.831746, .green = 0.055922, .blue = 0.998535 },
+	{ .red = 0.875458, .green = 0.046642, .blue = 0.981929 },
+	{ .red = 0.932601, .green = 0.046398, .blue = 0.984860 },
+	{ .red = 0.989744, .green = 0.028816, .blue = 0.990232 },
+	{ .red = 0.994628, .green = 0.089133, .blue = 0.928694 },
+	{ .red = 0.999267, .green = 0.116484, .blue = 0.876190 },
+	{ .red = 0.092552, .green = 0.216606, .blue = 0.999267 },
+	{ .red = 0.113309, .green = 0.199756, .blue = 0.999267 },
+	{ .red = 0.174115, .green = 0.180220, .blue = 0.998779 },
+	{ .red = 0.253480, .green = 0.193651, .blue = 0.998291 },
+	{ .red = 0.336752, .green = 0.209035, .blue = 0.999267 },
+	{ .red = 0.420024, .green = 0.222222, .blue = 0.999023 },
+	{ .red = 0.501832, .green = 0.232234, .blue = 0.999023 },
+	{ .red = 0.579976, .green = 0.237118, .blue = 0.998535 },
+	{ .red = 0.653968, .green = 0.238339, .blue = 0.999267 },
+	{ .red = 0.722344, .green = 0.237363, .blue = 0.998291 },
+	{ .red = 0.786569, .green = 0.233211, .blue = 0.999023 },
+	{ .red = 0.845665, .green = 0.227595, .blue = 0.998535 },
+	{ .red = 0.902808, .green = 0.222955, .blue = 0.999512 },
+	{ .red = 0.955800, .green = 0.222466, .blue = 0.998779 },
+	{ .red = 0.998046, .green = 0.221734, .blue = 0.989988 },
+	{ .red = 0.999756, .green = 0.229548, .blue = 0.928449 },
+	{ .red = 0.999267, .green = 0.232967, .blue = 0.874237 },
+	{ .red = 0.130891, .green = 0.296459, .blue = 0.999267 },
+	{ .red = 0.175336, .green = 0.327473, .blue = 0.999267 },
+	{ .red = 0.214652, .green = 0.311111, .blue = 0.998046 },
+	{ .red = 0.286203, .green = 0.319414, .blue = 0.998779 },
+	{ .red = 0.365324, .green = 0.330403, .blue = 0.998779 },
+	{ .red = 0.447131, .green = 0.341392, .blue = 0.999267 },
+	{ .red = 0.527717, .green = 0.350183, .blue = 0.999023 },
+	{ .red = 0.605617, .green = 0.357265, .blue = 0.998779 },
+	{ .red = 0.678877, .green = 0.362149, .blue = 0.998779 },
+	{ .red = 0.747009, .green = 0.364591, .blue = 0.999023 },
+	{ .red = 0.809035, .green = 0.364835, .blue = 0.998291 },
+	{ .red = 0.866911, .green = 0.363126, .blue = 0.999023 },
+	{ .red = 0.920635, .green = 0.360195, .blue = 0.999267 },
+	{ .red = 0.970940, .green = 0.358730, .blue = 0.999023 },
+	{ .red = 0.999023, .green = 0.357753, .blue = 0.978266 },
+	{ .red = 0.999023, .green = 0.354823, .blue = 0.922344 },
+	{ .red = 0.999756, .green = 0.348718, .blue = 0.873993 },
+	{ .red = 0.087668, .green = 0.297192, .blue = 0.996337 },
+	{ .red = 0.211477, .green = 0.399023, .blue = 0.998535 },
+	{ .red = 0.287912, .green = 0.438339, .blue = 0.998779 },
+	{ .red = 0.343346, .green = 0.441514, .blue = 0.999512 },
+	{ .red = 0.413675, .green = 0.450061, .blue = 0.999512 },
+	{ .red = 0.488645, .green = 0.459096, .blue = 0.999267 },
+	{ .red = 0.564835, .green = 0.467888, .blue = 0.998535 },
+	{ .red = 0.639560, .green = 0.475458, .blue = 0.999267 },
+	{ .red = 0.709646, .green = 0.481807, .blue = 0.998779 },
+	{ .red = 0.774603, .green = 0.485714, .blue = 0.998779 },
+	{ .red = 0.834188, .green = 0.488156, .blue = 0.999023 },
+	{ .red = 0.887912, .green = 0.487668, .blue = 0.998535 },
+	{ .red = 0.937729, .green = 0.484737, .blue = 0.998779 },
+	{ .red = 0.984371, .green = 0.482051, .blue = 0.998779 },
+	{ .red = 0.999023, .green = 0.480342, .blue = 0.968498 },
+	{ .red = 0.999267, .green = 0.472283, .blue = 0.920635 },
+	{ .red = 0.998046, .green = 0.461050, .blue = 0.876190 },
+	{ .red = 0.054701, .green = 0.358974, .blue = 0.994628 },
+	{ .red = 0.147497, .green = 0.392918, .blue = 0.998046 },
+	{ .red = 0.382906, .green = 0.557998, .blue = 0.998779 },
+	{ .red = 0.422222, .green = 0.557021, .blue = 0.999023 },
+	{ .red = 0.479121, .green = 0.563614, .blue = 0.998535 },
+	{ .red = 0.543834, .green = 0.571429, .blue = 0.999023 },
+	{ .red = 0.610989, .green = 0.578999, .blue = 0.998779 },
+	{ .red = 0.678144, .green = 0.586325, .blue = 0.998779 },
+	{ .red = 0.742125, .green = 0.592430, .blue = 0.998779 },
+	{ .red = 0.801709, .green = 0.596825, .blue = 0.999023 },
+	{ .red = 0.855678, .green = 0.599267, .blue = 0.998046 },
+	{ .red = 0.905250, .green = 0.599267, .blue = 0.998291 },
+	{ .red = 0.950916, .green = 0.596337, .blue = 0.999023 },
+	{ .red = 0.991941, .green = 0.592186, .blue = 0.997802 },
+	{ .red = 0.999267, .green = 0.589499, .blue = 0.964835 },
+	{ .red = 0.998779, .green = 0.580220, .blue = 0.924054 },
+	{ .red = 0.999267, .green = 0.565568, .blue = 0.886691 },
+	{ .red = 0.025397, .green = 0.424908, .blue = 0.960195 },
+	{ .red = 0.112088, .green = 0.448840, .blue = 0.999267 },
+	{ .red = 0.284737, .green = 0.521612, .blue = 0.998779 },
+	{ .red = 0.524054, .green = 0.670818, .blue = 0.999023 },
+	{ .red = 0.556044, .green = 0.666422, .blue = 0.998046 },
+	{ .red = 0.607326, .green = 0.672039, .blue = 0.997802 },
+	{ .red = 0.662515, .green = 0.678144, .blue = 0.998291 },
+	{ .red = 0.719170, .green = 0.684005, .blue = 0.998535 },
+	{ .red = 0.774603, .green = 0.689133, .blue = 0.999023 },
+	{ .red = 0.826374, .green = 0.693040, .blue = 0.998046 },
+	{ .red = 0.874481, .green = 0.694994, .blue = 0.998535 },
+	{ .red = 0.918681, .green = 0.694750, .blue = 0.999023 },
+	{ .red = 0.958974, .green = 0.691819, .blue = 0.999023 },
+	{ .red = 0.995604, .green = 0.686447, .blue = 0.998046 },
+	{ .red = 0.999756, .green = 0.683516, .blue = 0.967033 },
+	{ .red = 0.998779, .green = 0.674237, .blue = 0.932845 },
+	{ .red = 0.998535, .green = 0.658120, .blue = 0.899878 },
+	{ .red = 0.030037, .green = 0.506227, .blue = 0.965324 },
+	{ .red = 0.082540, .green = 0.520391, .blue = 0.997314 },
+	{ .red = 0.260806, .green = 0.567521, .blue = 0.999023 },
+	{ .red = 0.425397, .green = 0.638584, .blue = 0.998779 },
+	{ .red = 0.642979, .green = 0.759707, .blue = 0.998046 },
+	{ .red = 0.672283, .green = 0.757753, .blue = 0.999512 },
+	{ .red = 0.715263, .green = 0.761905, .blue = 0.999023 },
+	{ .red = 0.760440, .green = 0.766056, .blue = 0.998779 },
+	{ .red = 0.805617, .green = 0.769963, .blue = 0.998779 },
+	{ .red = 0.849328, .green = 0.772894, .blue = 0.999023 },
+	{ .red = 0.890354, .green = 0.774115, .blue = 0.999023 },
+	{ .red = 0.928205, .green = 0.773626, .blue = 0.999267 },
+	{ .red = 0.962393, .green = 0.770452, .blue = 0.998046 },
+	{ .red = 0.995604, .green = 0.764347, .blue = 0.998535 },
+	{ .red = 0.998779, .green = 0.761416, .blue = 0.971184 },
+	{ .red = 0.999512, .green = 0.752381, .blue = 0.944078 },
+	{ .red = 0.998779, .green = 0.736264, .blue = 0.915507 },
+	{ .red = 0.020269, .green = 0.586325, .blue = 0.974847 },
+	{ .red = 0.053480, .green = 0.588767, .blue = 0.984615 },
+	{ .red = 0.245421, .green = 0.626862, .blue = 0.998779 },
+	{ .red = 0.400488, .green = 0.676190, .blue = 0.998779 },
+	{ .red = 0.548474, .green = 0.733822, .blue = 0.998535 },
+	{ .red = 0.725763, .green = 0.821490, .blue = 0.999267 },
+	{ .red = 0.765324, .green = 0.829060, .blue = 0.998046 },
+	{ .red = 0.799267, .green = 0.831990, .blue = 0.999267 },
+	{ .red = 0.834676, .green = 0.834432, .blue = 0.999023 },
+	{ .red = 0.870085, .green = 0.836386, .blue = 0.999023 },
+	{ .red = 0.903785, .green = 0.837118, .blue = 0.999023 },
+	{ .red = 0.935287, .green = 0.836142, .blue = 0.998291 },
+	{ .red = 0.965079, .green = 0.833211, .blue = 0.998535 },
+	{ .red = 0.994139, .green = 0.827106, .blue = 0.999267 },
+	{ .red = 0.999756, .green = 0.823443, .blue = 0.978266 },
+	{ .red = 0.997802, .green = 0.815873, .blue = 0.953846 },
+	{ .red = 0.999512, .green = 0.799756, .blue = 0.930647 },
+	{ .red = 0.043712, .green = 0.659096, .blue = 0.974603 },
+	{ .red = 0.058120, .green = 0.662271, .blue = 0.983639 },
+	{ .red = 0.230525, .green = 0.689621, .blue = 0.999023 },
+	{ .red = 0.384127, .green = 0.725275, .blue = 0.999023 },
+	{ .red = 0.521856, .green = 0.765568, .blue = 0.998291 },
+	{ .red = 0.646154, .green = 0.807082, .blue = 0.998046 },
+	{ .red = 0.765568, .green = 0.854457, .blue = 0.998535 },
+	{ .red = 0.835165, .green = 0.883028, .blue = 0.999023 },
+	{ .red = 0.861538, .green = 0.884493, .blue = 0.999267 },
+	{ .red = 0.888889, .green = 0.885714, .blue = 0.999023 },
+	{ .red = 0.916239, .green = 0.885958, .blue = 0.999512 },
+	{ .red = 0.942613, .green = 0.884982, .blue = 0.999512 },
+	{ .red = 0.967277, .green = 0.882295, .blue = 0.998779 },
+	{ .red = 0.991697, .green = 0.876679, .blue = 0.999267 },
+	{ .red = 0.998779, .green = 0.872772, .blue = 0.983150 },
+	{ .red = 0.998535, .green = 0.865446, .blue = 0.963858 },
+	{ .red = 0.999023, .green = 0.850549, .blue = 0.943346 },
+	{ .red = 0.027350, .green = 0.732601, .blue = 0.982662 },
+	{ .red = 0.032967, .green = 0.736264, .blue = 0.990476 },
+	{ .red = 0.215629, .green = 0.753114, .blue = 0.999267 },
+	{ .red = 0.371917, .green = 0.778266, .blue = 0.998779 },
+	{ .red = 0.505006, .green = 0.807082, .blue = 0.998535 },
+	{ .red = 0.620757, .green = 0.836630, .blue = 0.999512 },
+	{ .red = 0.721368, .green = 0.863980, .blue = 0.999267 },
+	{ .red = 0.809524, .green = 0.891331, .blue = 0.999023 },
+	{ .red = 0.886691, .green = 0.922589, .blue = 0.998291 },
+	{ .red = 0.906716, .green = 0.923321, .blue = 0.998779 },
+	{ .red = 0.927717, .green = 0.923321, .blue = 0.999512 },
+	{ .red = 0.948474, .green = 0.922589, .blue = 0.998535 },
+	{ .red = 0.969475, .green = 0.920391, .blue = 0.999512 },
+	{ .red = 0.989988, .green = 0.915751, .blue = 0.999512 },
+	{ .red = 0.999267, .green = 0.911355, .blue = 0.988767 },
+	{ .red = 0.999023, .green = 0.904274, .blue = 0.971917 },
+	{ .red = 0.999512, .green = 0.890110, .blue = 0.954579 },
+	{ .red = 0.070818, .green = 0.798779, .blue = 0.981929 },
+	{ .red = 0.080342, .green = 0.800244, .blue = 0.985104 },
+	{ .red = 0.203663, .green = 0.815140, .blue = 0.998046 },
+	{ .red = 0.362637, .green = 0.833211, .blue = 0.999023 },
+	{ .red = 0.494017, .green = 0.853480, .blue = 0.998779 },
+	{ .red = 0.606593, .green = 0.873016, .blue = 0.998046 },
+	{ .red = 0.700855, .green = 0.891819, .blue = 0.998535 },
+	{ .red = 0.779976, .green = 0.908425, .blue = 0.999023 },
+	{ .red = 0.847375, .green = 0.923810, .blue = 0.998779 },
+	{ .red = 0.914286, .green = 0.945788, .blue = 0.998535 },
+	{ .red = 0.938950, .green = 0.951648, .blue = 0.998779 },
+	{ .red = 0.955067, .green = 0.951160, .blue = 0.999023 },
+	{ .red = 0.971917, .green = 0.949451, .blue = 0.999512 },
+	{ .red = 0.988767, .green = 0.946032, .blue = 0.999267 },
+	{ .red = 0.999023, .green = 0.941392, .blue = 0.992430 },
+	{ .red = 0.998291, .green = 0.934554, .blue = 0.977778 },
+	{ .red = 0.999267, .green = 0.921368, .blue = 0.963126 },
+	{ .red = 0.076435, .green = 0.865690, .blue = 0.986569 },
+	{ .red = 0.085714, .green = 0.866667, .blue = 0.988523 },
+	{ .red = 0.191941, .green = 0.876923, .blue = 0.998046 },
+	{ .red = 0.357753, .green = 0.888889, .blue = 0.999023 },
+	{ .red = 0.489133, .green = 0.901832, .blue = 0.999023 },
+	{ .red = 0.599512, .green = 0.914530, .blue = 0.998779 },
+	{ .red = 0.690354, .green = 0.926252, .blue = 0.999267 },
+	{ .red = 0.765812, .green = 0.936020, .blue = 0.999023 },
+	{ .red = 0.827595, .green = 0.944567, .blue = 0.999267 },
+	{ .red = 0.879121, .green = 0.951893, .blue = 0.998535 },
+	{ .red = 0.923565, .green = 0.960440, .blue = 0.999267 },
+	{ .red = 0.962393, .green = 0.972650, .blue = 0.999512 },
+	{ .red = 0.974847, .green = 0.971673, .blue = 0.999023 },
+	{ .red = 0.988278, .green = 0.969475, .blue = 0.999023 },
+	{ .red = 0.999267, .green = 0.965324, .blue = 0.995360 },
+	{ .red = 0.998779, .green = 0.957998, .blue = 0.982662 },
+	{ .red = 0.999023, .green = 0.945299, .blue = 0.969719 },
+	{ .red = 0.078388, .green = 0.930647, .blue = 0.990720 },
+	{ .red = 0.081319, .green = 0.931868, .blue = 0.992430 },
+	{ .red = 0.182906, .green = 0.938217, .blue = 0.998535 },
+	{ .red = 0.359463, .green = 0.944567, .blue = 0.998779 },
+	{ .red = 0.492063, .green = 0.951648, .blue = 0.999267 },
+	{ .red = 0.600977, .green = 0.958242, .blue = 0.999512 },
+	{ .red = 0.691331, .green = 0.963614, .blue = 0.999023 },
+	{ .red = 0.764347, .green = 0.968010, .blue = 0.998779 },
+	{ .red = 0.823199, .green = 0.971673, .blue = 0.998535 },
+	{ .red = 0.870574, .green = 0.974603, .blue = 0.998535 },
+	{ .red = 0.909158, .green = 0.977045, .blue = 0.998535 },
+	{ .red = 0.941148, .green = 0.979487, .blue = 0.998779 },
+	{ .red = 0.970452, .green = 0.983639, .blue = 0.999267 },
+	{ .red = 0.989499, .green = 0.987302, .blue = 0.999512 },
+	{ .red = 0.999267, .green = 0.984127, .blue = 0.997314 },
+	{ .red = 0.998779, .green = 0.976068, .blue = 0.986569 },
+	{ .red = 0.998535, .green = 0.963614, .blue = 0.974603 },
+	{ .red = 0.091575, .green = 0.992918, .blue = 0.992918 },
+	{ .red = 0.092552, .green = 0.994139, .blue = 0.994139 },
+	{ .red = 0.176557, .green = 0.998779, .blue = 0.998779 },
+	{ .red = 0.374847, .green = 0.998779, .blue = 0.997802 },
+	{ .red = 0.515018, .green = 0.999023, .blue = 0.997070 },
+	{ .red = 0.626374, .green = 0.999023, .blue = 0.996825 },
+	{ .red = 0.715263, .green = 0.998779, .blue = 0.996825 },
+	{ .red = 0.786813, .green = 0.998046, .blue = 0.996337 },
+	{ .red = 0.841270, .green = 0.998291, .blue = 0.997070 },
+	{ .red = 0.881319, .green = 0.999512, .blue = 0.999023 },
+	{ .red = 0.917949, .green = 0.998535, .blue = 0.998291 },
+	{ .red = 0.945055, .green = 0.998779, .blue = 0.998779 },
+	{ .red = 0.968254, .green = 0.998535, .blue = 0.998779 },
+	{ .red = 0.985104, .green = 0.999267, .blue = 0.999512 },
+	{ .red = 1.000000, .green = 0.999267, .blue = 0.999512 },
+	{ .red = 1.000000, .green = 0.988034, .blue = 0.988523 },
+	{ .red = 0.999023, .green = 0.976068, .blue = 0.977045 },
+	{ .red = 0.135287, .green = 0.991453, .blue = 0.939927 },
+	{ .red = 0.136996, .green = 0.992430, .blue = 0.940659 },
+	{ .red = 0.225397, .green = 0.998535, .blue = 0.947497 },
+	{ .red = 0.363614, .green = 0.998535, .blue = 0.949939 },
+	{ .red = 0.478632, .green = 0.999267, .blue = 0.954335 },
+	{ .red = 0.579487, .green = 0.999267, .blue = 0.958730 },
+	{ .red = 0.664713, .green = 0.999267, .blue = 0.963126 },
+	{ .red = 0.736996, .green = 0.998535, .blue = 0.966789 },
+	{ .red = 0.793407, .green = 0.998779, .blue = 0.970940 },
+	{ .red = 0.840781, .green = 0.998535, .blue = 0.974115 },
+	{ .red = 0.876190, .green = 0.999756, .blue = 0.977289 },
+	{ .red = 0.910379, .green = 0.998046, .blue = 0.978510 },
+	{ .red = 0.936264, .green = 0.998046, .blue = 0.979976 },
+	{ .red = 0.956044, .green = 0.999512, .blue = 0.980464 },
+	{ .red = 0.978510, .green = 0.999756, .blue = 0.980464 },
+	{ .red = 0.998779, .green = 0.996825, .blue = 0.962637 },
+	{ .red = 0.999267, .green = 0.981441, .blue = 0.968010 },
+	{ .red = 0.121368, .green = 0.994628, .blue = 0.896703 },
+	{ .red = 0.153846, .green = 0.996093, .blue = 0.898413 },
+	{ .red = 0.237118, .green = 0.999267, .blue = 0.903053 },
+	{ .red = 0.344811, .green = 0.999267, .blue = 0.907448 },
+	{ .red = 0.446154, .green = 0.999023, .blue = 0.913065 },
+	{ .red = 0.536020, .green = 0.999512, .blue = 0.920147 },
+	{ .red = 0.619536, .green = 0.998291, .blue = 0.926252 },
+	{ .red = 0.687912, .green = 0.998779, .blue = 0.933333 },
+	{ .red = 0.746520, .green = 0.998779, .blue = 0.939683 },
+	{ .red = 0.794383, .green = 0.999756, .blue = 0.945299 },
+	{ .red = 0.836874, .green = 0.999267, .blue = 0.949939 },
+	{ .red = 0.872527, .green = 0.999267, .blue = 0.953358 },
+	{ .red = 0.903053, .green = 0.999267, .blue = 0.956288 },
+	{ .red = 0.931624, .green = 0.998535, .blue = 0.958730 },
+	{ .red = 0.957509, .green = 0.999023, .blue = 0.961172 },
+	{ .red = 0.977534, .green = 0.999756, .blue = 0.957021 },
+	{ .red = 0.998535, .green = 0.996337, .blue = 0.922589 },
+	{ .red = 0.068620, .green = 0.170940, .blue = 0.999023 },
+	{ .red = 0.092063, .green = 0.140415, .blue = 0.999267 },
+	{ .red = 0.152869, .green = 0.076923, .blue = 0.998779 },
+	{ .red = 0.229304, .green = 0.097436, .blue = 0.998535 },
+	{ .red = 0.307204, .green = 0.116239, .blue = 0.999023 },
+	{ .red = 0.384860, .green = 0.130891, .blue = 0.999023 },
+	{ .red = 0.461050, .green = 0.136020, .blue = 0.999267 },
+	{ .red = 0.534554, .green = 0.136508, .blue = 0.999023 },
+	{ .red = 0.604151, .green = 0.130647, .blue = 0.998291 },
+	{ .red = 0.670330, .green = 0.118681, .blue = 0.999023 },
+	{ .red = 0.732357, .green = 0.104274, .blue = 0.998779 },
+	{ .red = 0.787790, .green = 0.079365, .blue = 0.995604 },
+	{ .red = 0.841514, .green = 0.033211, .blue = 0.994383 },
+	{ .red = 0.881563, .green = 0.039805, .blue = 0.978999 },
+	{ .red = 0.934554, .green = 0.039560, .blue = 0.982173 },
+	{ .red = 0.985104, .green = 0.027106, .blue = 0.984615 },
+	{ .red = 0.985836, .green = 0.050549, .blue = 0.924542 },
+	{ .red = 0.071551, .green = 0.176557, .blue = 0.998779 },
+	{ .red = 0.093529, .green = 0.147497, .blue = 0.999023 },
+	{ .red = 0.153114, .green = 0.088889, .blue = 0.998779 },
+	{ .red = 0.229060, .green = 0.106471, .blue = 0.998779 },
+	{ .red = 0.306227, .green = 0.123810, .blue = 0.999267 },
+	{ .red = 0.383639, .green = 0.137241, .blue = 0.998779 },
+	{ .red = 0.460317, .green = 0.145543, .blue = 0.999512 },
+	{ .red = 0.534554, .green = 0.148962, .blue = 0.999512 },
+	{ .red = 0.604396, .green = 0.146520, .blue = 0.998535 },
+	{ .red = 0.670818, .green = 0.138706, .blue = 0.998779 },
+	{ .red = 0.733089, .green = 0.128938, .blue = 0.998779 },
+	{ .red = 0.791941, .green = 0.111844, .blue = 0.999756 },
+	{ .red = 0.845421, .green = 0.091575, .blue = 0.997558 },
+	{ .red = 0.899878, .green = 0.082295, .blue = 0.999023 },
+	{ .red = 0.947253, .green = 0.084982, .blue = 0.995116 },
+	{ .red = 0.994139, .green = 0.081807, .blue = 0.993407 },
+	{ .red = 0.999023, .green = 0.117460, .blue = 0.935775 },
+	{ .red = 0.107204, .green = 0.245177, .blue = 0.998291 },
+	{ .red = 0.121612, .green = 0.229060, .blue = 0.999023 },
+	{ .red = 0.170208, .green = 0.202686, .blue = 0.998779 },
+	{ .red = 0.242979, .green = 0.211966, .blue = 0.998291 },
+	{ .red = 0.319902, .green = 0.223932, .blue = 0.998779 },
+	{ .red = 0.397558, .green = 0.234676, .blue = 0.998779 },
+	{ .red = 0.474969, .green = 0.242491, .blue = 0.999756 },
+	{ .red = 0.549206, .green = 0.247375, .blue = 0.999267 },
+	{ .red = 0.620024, .green = 0.249817, .blue = 0.998291 },
+	{ .red = 0.686447, .green = 0.248596, .blue = 0.998779 },
+	{ .red = 0.748474, .green = 0.246154, .blue = 0.998779 },
+	{ .red = 0.806349, .green = 0.241026, .blue = 0.999023 },
+	{ .red = 0.859829, .green = 0.234188, .blue = 0.998535 },
+	{ .red = 0.912332, .green = 0.230525, .blue = 0.999756 },
+	{ .red = 0.961172, .green = 0.229060, .blue = 0.999023 },
+	{ .red = 0.998535, .green = 0.227839, .blue = 0.989011 },
+	{ .red = 0.999756, .green = 0.233700, .blue = 0.931624 },
+	{ .red = 0.140415, .green = 0.307937, .blue = 0.999023 },
+	{ .red = 0.183639, .green = 0.340659, .blue = 0.999512 },
+	{ .red = 0.212454, .green = 0.319414, .blue = 0.998291 },
+	{ .red = 0.277167, .green = 0.326252, .blue = 0.998779 },
+	{ .red = 0.349939, .green = 0.335287, .blue = 0.999023 },
+	{ .red = 0.425397, .green = 0.343834, .blue = 0.998046 },
+	{ .red = 0.501099, .green = 0.351648, .blue = 0.998046 },
+	{ .red = 0.575580, .green = 0.358486, .blue = 0.999267 },
+	{ .red = 0.645177, .green = 0.362393, .blue = 0.998535 },
+	{ .red = 0.711600, .green = 0.365079, .blue = 0.999512 },
+	{ .red = 0.771673, .green = 0.365812, .blue = 0.998291 },
+	{ .red = 0.827595, .green = 0.364347, .blue = 0.998535 },
+	{ .red = 0.879365, .green = 0.360684, .blue = 0.998046 },
+	{ .red = 0.929182, .green = 0.357265, .blue = 0.999512 },
+	{ .red = 0.975580, .green = 0.354823, .blue = 0.999512 },
+	{ .red = 0.999023, .green = 0.352625, .blue = 0.978022 },
+	{ .red = 0.999023, .green = 0.348718, .blue = 0.925519 },
+	{ .red = 0.088889, .green = 0.288889, .blue = 0.996825 },
+	{ .red = 0.222466, .green = 0.408547, .blue = 0.999023 },
+	{ .red = 0.287179, .green = 0.440537, .blue = 0.999023 },
+	{ .red = 0.335531, .green = 0.440781, .blue = 1.000000 },
+	{ .red = 0.399267, .green = 0.447619, .blue = 0.999023 },
+	{ .red = 0.468864, .green = 0.455433, .blue = 0.998535 },
+	{ .red = 0.539927, .green = 0.462759, .blue = 0.999023 },
+	{ .red = 0.610012, .green = 0.469841, .blue = 0.998046 },
+	{ .red = 0.677656, .green = 0.475458, .blue = 0.999023 },
+	{ .red = 0.740659, .green = 0.479365, .blue = 0.999512 },
+	{ .red = 0.798779, .green = 0.481807, .blue = 0.999512 },
+	{ .red = 0.851526, .green = 0.481563, .blue = 0.999267 },
+	{ .red = 0.900122, .green = 0.479365, .blue = 0.999023 },
+	{ .red = 0.945299, .green = 0.475214, .blue = 0.999023 },
+	{ .red = 0.988034, .green = 0.471551, .blue = 0.999023 },
+	{ .red = 0.998535, .green = 0.468620, .blue = 0.967766 },
+	{ .red = 0.999267, .green = 0.459585, .blue = 0.923321 },
+	{ .red = 0.068864, .green = 0.342125, .blue = 0.990720 },
+	{ .red = 0.156777, .green = 0.386081, .blue = 0.998535 },
+	{ .red = 0.391941, .green = 0.562393, .blue = 0.998535 },
+	{ .red = 0.414164, .green = 0.550672, .blue = 0.999267 },
+	{ .red = 0.465934, .green = 0.556044, .blue = 0.998291 },
+	{ .red = 0.525519, .green = 0.562393, .blue = 0.998535 },
+	{ .red = 0.588278, .green = 0.569231, .blue = 0.998291 },
+	{ .red = 0.651526, .green = 0.575580, .blue = 0.998535 },
+	{ .red = 0.712576, .green = 0.581197, .blue = 0.998535 },
+	{ .red = 0.770208, .green = 0.585592, .blue = 0.998535 },
+	{ .red = 0.822955, .green = 0.588034, .blue = 0.998046 },
+	{ .red = 0.872527, .green = 0.588767, .blue = 0.999267 },
+	{ .red = 0.916484, .green = 0.586813, .blue = 0.998779 },
+	{ .red = 0.957998, .green = 0.581929, .blue = 0.999023 },
+	{ .red = 0.995360, .green = 0.577045, .blue = 0.997558 },
+	{ .red = 0.998535, .green = 0.573382, .blue = 0.963370 },
+	{ .red = 0.999023, .green = 0.562637, .blue = 0.925275 },
+	{ .red = 0.035165, .green = 0.398291, .blue = 0.961905 },
+	{ .red = 0.128938, .green = 0.430525, .blue = 0.998046 },
+	{ .red = 0.298168, .green = 0.518193, .blue = 0.998291 },
+	{ .red = 0.513065, .green = 0.658608, .blue = 0.998535 },
+	{ .red = 0.543590, .green = 0.655433, .blue = 0.999512 },
+	{ .red = 0.590965, .green = 0.660317, .blue = 0.998535 },
+	{ .red = 0.642735, .green = 0.665690, .blue = 0.999023 },
+	{ .red = 0.695971, .green = 0.670818, .blue = 0.998291 },
+	{ .red = 0.748962, .green = 0.675702, .blue = 0.999023 },
+	{ .red = 0.799267, .green = 0.679365, .blue = 0.999267 },
+	{ .red = 0.845665, .green = 0.681563, .blue = 0.998046 },
+	{ .red = 0.888889, .green = 0.681807, .blue = 0.998291 },
+	{ .red = 0.928694, .green = 0.679853, .blue = 0.998779 },
+	{ .red = 0.964835, .green = 0.674969, .blue = 0.998291 },
+	{ .red = 0.997802, .green = 0.668864, .blue = 0.996337 },
+	{ .red = 0.999023, .green = 0.664713, .blue = 0.964591 },
+	{ .red = 0.999267, .green = 0.653968, .blue = 0.932601 },
+	{ .red = 0.028571, .green = 0.478632, .blue = 0.979243 },
+	{ .red = 0.116484, .green = 0.496459, .blue = 0.998291 },
+	{ .red = 0.269353, .green = 0.548962, .blue = 0.997802 },
+	{ .red = 0.438095, .green = 0.633944, .blue = 0.998046 },
+	{ .red = 0.626129, .green = 0.743590, .blue = 0.999023 },
+	{ .red = 0.657387, .green = 0.743834, .blue = 0.999512 },
+	{ .red = 0.697680, .green = 0.747741, .blue = 0.998291 },
+	{ .red = 0.740171, .green = 0.751404, .blue = 0.998779 },
+	{ .red = 0.783639, .green = 0.755067, .blue = 0.999267 },
+	{ .red = 0.825641, .green = 0.757753, .blue = 0.998779 },
+	{ .red = 0.865446, .green = 0.759219, .blue = 0.998291 },
+	{ .red = 0.902564, .green = 0.759219, .blue = 0.998291 },
+	{ .red = 0.937485, .green = 0.757021, .blue = 0.999023 },
+	{ .red = 0.969231, .green = 0.752381, .blue = 0.998535 },
+	{ .red = 0.998535, .green = 0.745543, .blue = 0.997070 },
+	{ .red = 0.999023, .green = 0.741392, .blue = 0.968987 },
+	{ .red = 0.998535, .green = 0.731624, .blue = 0.941880 },
+	{ .red = 0.041270, .green = 0.550916, .blue = 0.978266 },
+	{ .red = 0.103297, .green = 0.564835, .blue = 0.998535 },
+	{ .red = 0.258852, .green = 0.602198, .blue = 0.998779 },
+	{ .red = 0.406838, .green = 0.658364, .blue = 0.999023 },
+	{ .red = 0.557021, .green = 0.725275, .blue = 0.997558 },
+	{ .red = 0.723321, .green = 0.814652, .blue = 0.999512 },
+	{ .red = 0.749695, .green = 0.814408, .blue = 0.998046 },
+	{ .red = 0.782173, .green = 0.817094, .blue = 0.999512 },
+	{ .red = 0.816117, .green = 0.819292, .blue = 0.998291 },
+	{ .red = 0.850061, .green = 0.821245, .blue = 0.998779 },
+	{ .red = 0.883028, .green = 0.822222, .blue = 0.998779 },
+	{ .red = 0.914286, .green = 0.821734, .blue = 0.999023 },
+	{ .red = 0.943590, .green = 0.819536, .blue = 0.998779 },
+	{ .red = 0.970696, .green = 0.814896, .blue = 0.998046 },
+	{ .red = 0.998779, .green = 0.807570, .blue = 0.999512 },
+	{ .red = 0.999267, .green = 0.803907, .blue = 0.975092 },
+	{ .red = 0.999512, .green = 0.794872, .blue = 0.952869 },
+	{ .red = 0.051282, .green = 0.621490, .blue = 0.980220 },
+	{ .red = 0.091087, .green = 0.631013, .blue = 0.995849 },
+	{ .red = 0.250061, .green = 0.658852, .blue = 0.998535 },
+	{ .red = 0.391941, .green = 0.699634, .blue = 0.998535 },
+	{ .red = 0.526007, .green = 0.746764, .blue = 0.998535 },
+	{ .red = 0.651526, .green = 0.796093, .blue = 0.998291 },
+	{ .red = 0.801954, .green = 0.870818, .blue = 0.999023 },
+	{ .red = 0.820269, .green = 0.868620, .blue = 0.999512 },
+	{ .red = 0.845910, .green = 0.869841, .blue = 0.998535 },
+	{ .red = 0.872283, .green = 0.871062, .blue = 1.000000 },
+	{ .red = 0.898657, .green = 0.871551, .blue = 0.998779 },
+	{ .red = 0.924542, .green = 0.870818, .blue = 0.999023 },
+	{ .red = 0.948962, .green = 0.868620, .blue = 0.999267 },
+	{ .red = 0.972650, .green = 0.864713, .blue = 0.999267 },
+	{ .red = 0.995849, .green = 0.857875, .blue = 0.999512 },
+	{ .red = 0.999267, .green = 0.853724, .blue = 0.980952 },
+	{ .red = 0.998535, .green = 0.845910, .blue = 0.961416 },
+	{ .red = 0.056899, .green = 0.689866, .blue = 0.983883 },
+	{ .red = 0.083516, .green = 0.694505, .blue = 0.991941 },
+	{ .red = 0.242491, .green = 0.717460, .blue = 0.999267 },
+	{ .red = 0.380952, .green = 0.747253, .blue = 0.999267 },
+	{ .red = 0.507692, .green = 0.781197, .blue = 0.998535 },
+	{ .red = 0.621978, .green = 0.816361, .blue = 0.999267 },
+	{ .red = 0.723321, .green = 0.850061, .blue = 0.999267 },
+	{ .red = 0.823199, .green = 0.889621, .blue = 0.998535 },
+	{ .red = 0.872772, .green = 0.908913, .blue = 0.998535 },
+	{ .red = 0.892308, .green = 0.909402, .blue = 0.998291 },
+	{ .red = 0.913065, .green = 0.909646, .blue = 0.999756 },
+	{ .red = 0.933578, .green = 0.908913, .blue = 0.999267 },
+	{ .red = 0.953602, .green = 0.907204, .blue = 0.998779 },
+	{ .red = 0.973138, .green = 0.903785, .blue = 0.998779 },
+	{ .red = 0.993407, .green = 0.897924, .blue = 0.999512 },
+	{ .red = 0.999023, .green = 0.893284, .blue = 0.985836 },
+	{ .red = 0.999023, .green = 0.885958, .blue = 0.969719 },
+	{ .red = 0.071062, .green = 0.754335, .blue = 0.985348 },
+	{ .red = 0.081807, .green = 0.756288, .blue = 0.989255 },
+	{ .red = 0.237363, .green = 0.774847, .blue = 0.998046 },
+	{ .red = 0.373138, .green = 0.796581, .blue = 0.998779 },
+	{ .red = 0.495971, .green = 0.821245, .blue = 0.998291 },
+	{ .red = 0.603663, .green = 0.846886, .blue = 0.999512 },
+	{ .red = 0.697924, .green = 0.869841, .blue = 0.998779 },
+	{ .red = 0.778266, .green = 0.891819, .blue = 0.999267 },
+	{ .red = 0.849817, .green = 0.913797, .blue = 0.998779 },
+	{ .red = 0.911111, .green = 0.938950, .blue = 0.998535 },
+	{ .red = 0.926252, .green = 0.938950, .blue = 0.998779 },
+	{ .red = 0.942125, .green = 0.938217, .blue = 0.998779 },
+	{ .red = 0.958486, .green = 0.936996, .blue = 0.999023 },
+	{ .red = 0.974847, .green = 0.934310, .blue = 0.999023 },
+	{ .red = 0.991941, .green = 0.929426, .blue = 0.999756 },
+	{ .red = 0.999267, .green = 0.924786, .blue = 0.990232 },
+	{ .red = 0.999512, .green = 0.917705, .blue = 0.976313 },
+	{ .red = 0.089621, .green = 0.815629, .blue = 0.985836 },
+	{ .red = 0.096459, .green = 0.816850, .blue = 0.988278 },
+	{ .red = 0.231502, .green = 0.832967, .blue = 0.999267 },
+	{ .red = 0.368010, .green = 0.847863, .blue = 0.999267 },
+	{ .red = 0.488156, .green = 0.864957, .blue = 0.999267 },
+	{ .red = 0.593651, .green = 0.882051, .blue = 0.998291 },
+	{ .red = 0.682540, .green = 0.898413, .blue = 0.999023 },
+	{ .red = 0.757753, .green = 0.912821, .blue = 0.999512 },
+	{ .red = 0.821490, .green = 0.925275, .blue = 0.999023 },
+	{ .red = 0.875946, .green = 0.937729, .blue = 0.999023 },
+	{ .red = 0.935043, .green = 0.958486, .blue = 0.998535 },
+	{ .red = 0.950916, .green = 0.960684, .blue = 0.998779 },
+	{ .red = 0.963614, .green = 0.959951, .blue = 0.999267 },
+	{ .red = 0.977045, .green = 0.957998, .blue = 0.999756 },
+	{ .red = 0.990232, .green = 0.954579, .blue = 0.999023 },
+	{ .red = 0.998779, .green = 0.949939, .blue = 0.993162 },
+	{ .red = 0.999023, .green = 0.943101, .blue = 0.980952 },
+	{ .red = 0.109402, .green = 0.874969, .blue = 0.986813 },
+	{ .red = 0.114042, .green = 0.875946, .blue = 0.988523 },
+	{ .red = 0.230281, .green = 0.889133, .blue = 0.998779 },
+	{ .red = 0.367277, .green = 0.899145, .blue = 0.999267 },
+	{ .red = 0.486935, .green = 0.909646, .blue = 0.998535 },
+	{ .red = 0.589255, .green = 0.921123, .blue = 0.999023 },
+	{ .red = 0.675214, .green = 0.931624, .blue = 0.999756 },
+	{ .red = 0.748718, .green = 0.939683, .blue = 0.998535 },
+	{ .red = 0.808059, .green = 0.947497, .blue = 0.999023 },
+	{ .red = 0.857143, .green = 0.954090, .blue = 0.999756 },
+	{ .red = 0.899389, .green = 0.959951, .blue = 0.999023 },
+	{ .red = 0.936264, .green = 0.966789, .blue = 0.999512 },
+	{ .red = 0.969231, .green = 0.977534, .blue = 0.999756 },
+	{ .red = 0.979243, .green = 0.976313, .blue = 0.999023 },
+	{ .red = 0.990232, .green = 0.974115, .blue = 0.998779 },
+	{ .red = 0.999267, .green = 0.970208, .blue = 0.995849 },
+	{ .red = 0.998779, .green = 0.963126, .blue = 0.984615 },
+	{ .red = 0.056654, .green = 0.939438, .blue = 0.996093 },
+	{ .red = 0.059585, .green = 0.940659, .blue = 0.997558 },
+	{ .red = 0.231746, .green = 0.944811, .blue = 0.999023 },
+	{ .red = 0.372405, .green = 0.950183, .blue = 0.999512 },
+	{ .red = 0.491819, .green = 0.956044, .blue = 0.999512 },
+	{ .red = 0.595116, .green = 0.960928, .blue = 0.998535 },
+	{ .red = 0.678877, .green = 0.966545, .blue = 0.999267 },
+	{ .red = 0.748962, .green = 0.970696, .blue = 0.999267 },
+	{ .red = 0.808059, .green = 0.973138, .blue = 0.998046 },
+	{ .red = 0.853480, .green = 0.976557, .blue = 0.999023 },
+	{ .red = 0.891819, .green = 0.978510, .blue = 0.998779 },
+	{ .red = 0.923077, .green = 0.980464, .blue = 0.998779 },
+	{ .red = 0.950183, .green = 0.982418, .blue = 0.998779 },
+	{ .red = 0.975092, .green = 0.986081, .blue = 0.999512 },
+	{ .red = 0.991453, .green = 0.989255, .blue = 0.999512 },
+	{ .red = 0.999512, .green = 0.986569, .blue = 0.997802 },
+	{ .red = 0.999023, .green = 0.978510, .blue = 0.988034 },
+	{ .red = 0.093284, .green = 0.995360, .blue = 0.995360 },
+	{ .red = 0.094017, .green = 0.996337, .blue = 0.996337 },
+	{ .red = 0.243468, .green = 0.999267, .blue = 0.998779 },
+	{ .red = 0.395849, .green = 0.998779, .blue = 0.997314 },
+	{ .red = 0.518926, .green = 0.999023, .blue = 0.997070 },
+	{ .red = 0.621978, .green = 0.999023, .blue = 0.996581 },
+	{ .red = 0.706471, .green = 0.998779, .blue = 0.996337 },
+	{ .red = 0.775092, .green = 0.998291, .blue = 0.996337 },
+	{ .red = 0.828083, .green = 0.998535, .blue = 0.997070 },
+	{ .red = 0.868376, .green = 0.999512, .blue = 0.998535 },
+	{ .red = 0.904762, .green = 0.998535, .blue = 0.998046 },
+	{ .red = 0.932112, .green = 0.998779, .blue = 0.998535 },
+	{ .red = 0.955067, .green = 0.998535, .blue = 0.998779 },
+	{ .red = 0.973871, .green = 0.998779, .blue = 0.999023 },
+	{ .red = 0.988278, .green = 0.999267, .blue = 0.999512 },
+	{ .red = 1.000000, .green = 0.999756, .blue = 1.000000 },
+	{ .red = 1.000000, .green = 0.989011, .blue = 0.989744 },
+	{ .red = 0.132357, .green = 0.993651, .blue = 0.945299 },
+	{ .red = 0.139683, .green = 0.998779, .blue = 0.949939 },
+	{ .red = 0.257143, .green = 0.998535, .blue = 0.951160 },
+	{ .red = 0.369963, .green = 0.998779, .blue = 0.953602 },
+	{ .red = 0.473993, .green = 0.999267, .blue = 0.957265 },
+	{ .red = 0.568254, .green = 0.999267, .blue = 0.960928 },
+	{ .red = 0.650305, .green = 0.999023, .blue = 0.964591 },
+	{ .red = 0.719658, .green = 0.998779, .blue = 0.968254 },
+	{ .red = 0.777045, .green = 0.998535, .blue = 0.971673 },
+	{ .red = 0.823443, .green = 0.998779, .blue = 0.974847 },
+	{ .red = 0.861050, .green = 0.999023, .blue = 0.977778 },
+	{ .red = 0.893284, .green = 0.998779, .blue = 0.979731 },
+	{ .red = 0.920879, .green = 0.998046, .blue = 0.980952 },
+	{ .red = 0.942857, .green = 0.998046, .blue = 0.981929 },
+	{ .red = 0.960440, .green = 0.999267, .blue = 0.982173 },
+	{ .red = 0.980220, .green = 0.999756, .blue = 0.981929 },
+	{ .red = 0.998779, .green = 0.997070, .blue = 0.965568 },
+	{ .red = 0.070330, .green = 0.183883, .blue = 0.997802 },
+	{ .red = 0.090842, .green = 0.157753, .blue = 0.999267 },
+	{ .red = 0.143590, .green = 0.090842, .blue = 0.999512 },
+	{ .red = 0.214896, .green = 0.106716, .blue = 0.998535 },
+	{ .red = 0.287912, .green = 0.123321, .blue = 0.999023 },
+	{ .red = 0.360928, .green = 0.135043, .blue = 0.999267 },
+	{ .red = 0.433211, .green = 0.142369, .blue = 0.998535 },
+	{ .red = 0.503785, .green = 0.145055, .blue = 0.998779 },
+	{ .red = 0.570696, .green = 0.139927, .blue = 0.998535 },
+	{ .red = 0.634432, .green = 0.133089, .blue = 0.998291 },
+	{ .red = 0.695482, .green = 0.121123, .blue = 0.999512 },
+	{ .red = 0.751893, .green = 0.101832, .blue = 0.999512 },
+	{ .red = 0.804884, .green = 0.080342, .blue = 0.998291 },
+	{ .red = 0.849328, .green = 0.043223, .blue = 0.990965 },
+	{ .red = 0.897436, .green = 0.040049, .blue = 0.989499 },
+	{ .red = 0.939683, .green = 0.051770, .blue = 0.983883 },
+	{ .red = 0.992430, .green = 0.028816, .blue = 0.991941 },
+	{ .red = 0.082295, .green = 0.205372, .blue = 0.998291 },
+	{ .red = 0.099634, .green = 0.184615, .blue = 0.999023 },
+	{ .red = 0.148230, .green = 0.134799, .blue = 0.999023 },
+	{ .red = 0.218803, .green = 0.145299, .blue = 0.999023 },
+	{ .red = 0.291575, .green = 0.158242, .blue = 0.998779 },
+	{ .red = 0.364835, .green = 0.167766, .blue = 0.999267 },
+	{ .red = 0.437118, .green = 0.174603, .blue = 0.998535 },
+	{ .red = 0.507937, .green = 0.177778, .blue = 0.998535 },
+	{ .red = 0.575336, .green = 0.175336, .blue = 0.999023 },
+	{ .red = 0.639316, .green = 0.170940, .blue = 0.998779 },
+	{ .red = 0.699389, .green = 0.163614, .blue = 0.998779 },
+	{ .red = 0.756288, .green = 0.151404, .blue = 0.999267 },
+	{ .red = 0.809280, .green = 0.139683, .blue = 0.998779 },
+	{ .red = 0.859585, .green = 0.121856, .blue = 0.999023 },
+	{ .red = 0.909402, .green = 0.118681, .blue = 0.999512 },
+	{ .red = 0.956288, .green = 0.117949, .blue = 0.999023 },
+	{ .red = 0.995604, .green = 0.116972, .blue = 0.992918 },
+	{ .red = 0.110379, .green = 0.256899, .blue = 0.998046 },
+	{ .red = 0.132601, .green = 0.259585, .blue = 0.998291 },
+	{ .red = 0.168254, .green = 0.226374, .blue = 0.999756 },
+	{ .red = 0.234921, .green = 0.232967, .blue = 0.998535 },
+	{ .red = 0.306716, .green = 0.242002, .blue = 0.999023 },
+	{ .red = 0.379243, .green = 0.249084, .blue = 0.999267 },
+	{ .red = 0.451770, .green = 0.255922, .blue = 0.998535 },
+	{ .red = 0.522833, .green = 0.260317, .blue = 0.998779 },
+	{ .red = 0.590476, .green = 0.261783, .blue = 0.998535 },
+	{ .red = 0.654701, .green = 0.260806, .blue = 0.999023 },
+	{ .red = 0.714286, .green = 0.258852, .blue = 0.998291 },
+	{ .red = 0.770696, .green = 0.253968, .blue = 0.999023 },
+	{ .red = 0.823443, .green = 0.248352, .blue = 0.999512 },
+	{ .red = 0.872527, .green = 0.240049, .blue = 0.999267 },
+	{ .red = 0.920391, .green = 0.237118, .blue = 0.999512 },
+	{ .red = 0.965812, .green = 0.234921, .blue = 0.999267 },
+	{ .red = 0.998779, .green = 0.232967, .blue = 0.988278 },
+	{ .red = 0.133089, .green = 0.302320, .blue = 0.999023 },
+	{ .red = 0.193651, .green = 0.357509, .blue = 0.998779 },
+	{ .red = 0.213675, .green = 0.332601, .blue = 0.998779 },
+	{ .red = 0.270574, .green = 0.335287, .blue = 0.998535 },
+	{ .red = 0.337485, .green = 0.342125, .blue = 0.998535 },
+	{ .red = 0.408059, .green = 0.349206, .blue = 0.999512 },
+	{ .red = 0.478877, .green = 0.355067, .blue = 0.999267 },
+	{ .red = 0.548718, .green = 0.360928, .blue = 0.998291 },
+	{ .red = 0.615873, .green = 0.364347, .blue = 0.999023 },
+	{ .red = 0.679121, .green = 0.366789, .blue = 0.999023 },
+	{ .red = 0.737729, .green = 0.366789, .blue = 0.998535 },
+	{ .red = 0.793407, .green = 0.366300, .blue = 0.999756 },
+	{ .red = 0.842979, .green = 0.362637, .blue = 0.998291 },
+	{ .red = 0.890354, .green = 0.357509, .blue = 0.998535 },
+	{ .red = 0.936020, .green = 0.353846, .blue = 0.999512 },
+	{ .red = 0.978999, .green = 0.350183, .blue = 0.999756 },
+	{ .red = 0.998779, .green = 0.347253, .blue = 0.977778 },
+	{ .red = 0.093040, .green = 0.288156, .blue = 0.998046 },
+	{ .red = 0.226618, .green = 0.412210, .blue = 0.999023 },
+	{ .red = 0.288400, .green = 0.444933, .blue = 0.999023 },
+	{ .red = 0.329426, .green = 0.441758, .blue = 0.999756 },
+	{ .red = 0.387546, .green = 0.447131, .blue = 0.998535 },
+	{ .red = 0.451526, .green = 0.453480, .blue = 0.998535 },
+	{ .red = 0.518437, .green = 0.459829, .blue = 0.998779 },
+	{ .red = 0.584615, .green = 0.465446, .blue = 0.999023 },
+	{ .red = 0.648596, .green = 0.470330, .blue = 0.998535 },
+	{ .red = 0.709402, .green = 0.474237, .blue = 0.999023 },
+	{ .red = 0.765812, .green = 0.476190, .blue = 0.999267 },
+	{ .red = 0.817338, .green = 0.476435, .blue = 0.998535 },
+	{ .red = 0.865201, .green = 0.474481, .blue = 0.998535 },
+	{ .red = 0.909646, .green = 0.470085, .blue = 0.999267 },
+	{ .red = 0.950672, .green = 0.465446, .blue = 0.998535 },
+	{ .red = 0.990965, .green = 0.460317, .blue = 0.999267 },
+	{ .red = 0.998779, .green = 0.456410, .blue = 0.968010 },
+	{ .red = 0.077411, .green = 0.331380, .blue = 0.993407 },
+	{ .red = 0.165812, .green = 0.384127, .blue = 0.998535 },
+	{ .red = 0.389988, .green = 0.559707, .blue = 0.998535 },
+	{ .red = 0.407326, .green = 0.546032, .blue = 0.998535 },
+	{ .red = 0.454701, .green = 0.550427, .blue = 0.998779 },
+	{ .red = 0.509646, .green = 0.555800, .blue = 0.999023 },
+	{ .red = 0.567766, .green = 0.561416, .blue = 0.997802 },
+	{ .red = 0.627839, .green = 0.567033, .blue = 0.999023 },
+	{ .red = 0.685958, .green = 0.572161, .blue = 0.998779 },
+	{ .red = 0.741148, .green = 0.575580, .blue = 0.998291 },
+	{ .red = 0.793651, .green = 0.578266, .blue = 0.999512 },
+	{ .red = 0.840781, .green = 0.578999, .blue = 0.998291 },
+	{ .red = 0.884982, .green = 0.577289, .blue = 0.999023 },
+	{ .red = 0.926007, .green = 0.573382, .blue = 0.999756 },
+	{ .red = 0.963614, .green = 0.567521, .blue = 0.999267 },
+	{ .red = 0.998291, .green = 0.561172, .blue = 0.997802 },
+	{ .red = 0.999023, .green = 0.556532, .blue = 0.963370 },
+	{ .red = 0.039560, .green = 0.384371, .blue = 0.989499 },
+	{ .red = 0.142369, .green = 0.418803, .blue = 0.998535 },
+	{ .red = 0.308425, .green = 0.517216, .blue = 0.998046 },
+	{ .red = 0.503053, .green = 0.648596, .blue = 0.998046 },
+	{ .red = 0.531868, .green = 0.645665, .blue = 0.998291 },
+	{ .red = 0.575580, .green = 0.650061, .blue = 0.999023 },
+	{ .red = 0.623932, .green = 0.654457, .blue = 0.998779 },
+	{ .red = 0.674237, .green = 0.658852, .blue = 0.998535 },
+	{ .red = 0.724542, .green = 0.663004, .blue = 0.998535 },
+	{ .red = 0.773626, .green = 0.666422, .blue = 0.999512 },
+	{ .red = 0.819048, .green = 0.668620, .blue = 0.998779 },
+	{ .red = 0.861294, .green = 0.668864, .blue = 0.998535 },
+	{ .red = 0.901099, .green = 0.667643, .blue = 0.999512 },
+	{ .red = 0.937241, .green = 0.663736, .blue = 0.999267 },
+	{ .red = 0.970208, .green = 0.657143, .blue = 0.998291 },
+	{ .red = 0.999023, .green = 0.650549, .blue = 0.994139 },
+	{ .red = 0.998291, .green = 0.645421, .blue = 0.962637 },
+	{ .red = 0.046886, .green = 0.449573, .blue = 0.975336 },
+	{ .red = 0.131868, .green = 0.475702, .blue = 0.999512 },
+	{ .red = 0.275214, .green = 0.535287, .blue = 0.998779 },
+	{ .red = 0.451770, .green = 0.634676, .blue = 0.998779 },
+	{ .red = 0.612454, .green = 0.730647, .blue = 0.999267 },
+	{ .red = 0.642735, .green = 0.731380, .blue = 0.998291 },
+	{ .red = 0.680586, .green = 0.734799, .blue = 0.998535 },
+	{ .red = 0.720879, .green = 0.737973, .blue = 0.998535 },
+	{ .red = 0.762393, .green = 0.741148, .blue = 0.999023 },
+	{ .red = 0.803419, .green = 0.743590, .blue = 0.999023 },
+	{ .red = 0.841758, .green = 0.745055, .blue = 0.998046 },
+	{ .red = 0.878388, .green = 0.745299, .blue = 0.998046 },
+	{ .red = 0.913553, .green = 0.743590, .blue = 0.999756 },
+	{ .red = 0.944811, .green = 0.739683, .blue = 0.999023 },
+	{ .red = 0.974847, .green = 0.733333, .blue = 0.999267 },
+	{ .red = 0.999267, .green = 0.726007, .blue = 0.994139 },
+	{ .red = 0.998779, .green = 0.720879, .blue = 0.966545 },
+	{ .red = 0.029548, .green = 0.525031, .blue = 0.994628 },
+	{ .red = 0.130647, .green = 0.539683, .blue = 0.999267 },
+	{ .red = 0.266667, .green = 0.581197, .blue = 0.998779 },
+	{ .red = 0.411477, .green = 0.644200, .blue = 0.999023 },
+	{ .red = 0.571429, .green = 0.725519, .blue = 0.999023 },
+	{ .red = 0.706960, .green = 0.799756, .blue = 0.999267 },
+	{ .red = 0.734066, .green = 0.800733, .blue = 0.999023 },
+	{ .red = 0.765079, .green = 0.802930, .blue = 0.999023 },
+	{ .red = 0.797802, .green = 0.804884, .blue = 0.998535 },
+	{ .red = 0.830525, .green = 0.806593, .blue = 0.998779 },
+	{ .red = 0.862759, .green = 0.807326, .blue = 0.998779 },
+	{ .red = 0.894017, .green = 0.807082, .blue = 0.999756 },
+	{ .red = 0.922344, .green = 0.805372, .blue = 0.998535 },
+	{ .red = 0.949939, .green = 0.801709, .blue = 0.998779 },
+	{ .red = 0.976068, .green = 0.795849, .blue = 0.998779 },
+	{ .red = 0.999023, .green = 0.788278, .blue = 0.995849 },
+	{ .red = 0.998779, .green = 0.783394, .blue = 0.972161 },
+	{ .red = 0.057387, .green = 0.588523, .blue = 0.986081 },
+	{ .red = 0.130891, .green = 0.603175, .blue = 0.998779 },
+	{ .red = 0.261783, .green = 0.633211, .blue = 0.999023 },
+	{ .red = 0.395849, .green = 0.678877, .blue = 0.999023 },
+	{ .red = 0.528694, .green = 0.732112, .blue = 0.998535 },
+	{ .red = 0.660073, .green = 0.790965, .blue = 0.998779 },
+	{ .red = 0.783394, .green = 0.854457, .blue = 0.998779 },
+	{ .red = 0.804884, .green = 0.854701, .blue = 0.999267 },
+	{ .red = 0.829792, .green = 0.855922, .blue = 0.998291 },
+	{ .red = 0.855433, .green = 0.856654, .blue = 0.998291 },
+	{ .red = 0.881319, .green = 0.857143, .blue = 0.998535 },
+	{ .red = 0.906471, .green = 0.856654, .blue = 0.998779 },
+	{ .red = 0.931136, .green = 0.854945, .blue = 0.999267 },
+	{ .red = 0.954579, .green = 0.851526, .blue = 0.999512 },
+	{ .red = 0.976801, .green = 0.846154, .blue = 0.999023 },
+	{ .red = 0.998291, .green = 0.838828, .blue = 0.998046 },
+	{ .red = 0.999023, .green = 0.834188, .blue = 0.977778 },
+	{ .red = 0.065201, .green = 0.652991, .blue = 0.987546 },
+	{ .red = 0.130159, .green = 0.664957, .blue = 0.998779 },
+	{ .red = 0.258120, .green = 0.686691, .blue = 0.998779 },
+	{ .red = 0.386081, .green = 0.720391, .blue = 0.998535 },
+	{ .red = 0.508913, .green = 0.759707, .blue = 0.998291 },
+	{ .red = 0.622711, .green = 0.800244, .blue = 0.998779 },
+	{ .red = 0.726740, .green = 0.840781, .blue = 0.999756 },
+	{ .red = 0.843223, .green = 0.896947, .blue = 0.998291 },
+	{ .red = 0.858364, .green = 0.895726, .blue = 0.998291 },
+	{ .red = 0.877656, .green = 0.895971, .blue = 0.999023 },
+	{ .red = 0.897924, .green = 0.895971, .blue = 0.999023 },
+	{ .red = 0.918193, .green = 0.895482, .blue = 0.998291 },
+	{ .red = 0.938217, .green = 0.893773, .blue = 0.998779 },
+	{ .red = 0.957753, .green = 0.891087, .blue = 0.999023 },
+	{ .red = 0.977045, .green = 0.886203, .blue = 0.999023 },
+	{ .red = 0.996581, .green = 0.879365, .blue = 0.999023 },
+	{ .red = 0.998535, .green = 0.874969, .blue = 0.982906 },
+	{ .red = 0.066667, .green = 0.716239, .blue = 0.991453 },
+	{ .red = 0.130891, .green = 0.724786, .blue = 0.998535 },
+	{ .red = 0.255433, .green = 0.740659, .blue = 0.998535 },
+	{ .red = 0.378755, .green = 0.765568, .blue = 0.998779 },
+	{ .red = 0.494994, .green = 0.794872, .blue = 0.999756 },
+	{ .red = 0.601709, .green = 0.823932, .blue = 0.998046 },
+	{ .red = 0.695482, .green = 0.852747, .blue = 0.999512 },
+	{ .red = 0.778510, .green = 0.879365, .blue = 0.998779 },
+	{ .red = 0.863248, .green = 0.913797, .blue = 0.998046 },
+	{ .red = 0.897924, .green = 0.926496, .blue = 0.998046 },
+	{ .red = 0.912821, .green = 0.926252, .blue = 0.999512 },
+	{ .red = 0.928938, .green = 0.925519, .blue = 0.999512 },
+	{ .red = 0.945299, .green = 0.924298, .blue = 0.999756 },
+	{ .red = 0.961172, .green = 0.922100, .blue = 0.998535 },
+	{ .red = 0.977045, .green = 0.918193, .blue = 0.998535 },
+	{ .red = 0.993895, .green = 0.912332, .blue = 0.998779 },
+	{ .red = 0.999023, .green = 0.907692, .blue = 0.987546 },
+	{ .red = 0.082051, .green = 0.774359, .blue = 0.990232 },
+	{ .red = 0.133578, .green = 0.781929, .blue = 0.997314 },
+	{ .red = 0.252747, .green = 0.794628, .blue = 0.999756 },
+	{ .red = 0.373871, .green = 0.811722, .blue = 0.998535 },
+	{ .red = 0.485714, .green = 0.833211, .blue = 0.999267 },
+	{ .red = 0.587546, .green = 0.854701, .blue = 0.998535 },
+	{ .red = 0.676190, .green = 0.875214, .blue = 0.999023 },
+	{ .red = 0.752381, .green = 0.893529, .blue = 0.998779 },
+	{ .red = 0.817827, .green = 0.910867, .blue = 0.999512 },
+	{ .red = 0.876923, .green = 0.928938, .blue = 0.999023 },
+	{ .red = 0.927228, .green = 0.949695, .blue = 0.999023 },
+	{ .red = 0.938950, .green = 0.948962, .blue = 0.998535 },
+	{ .red = 0.951648, .green = 0.947985, .blue = 0.999023 },
+	{ .red = 0.964835, .green = 0.946520, .blue = 0.999023 },
+	{ .red = 0.978266, .green = 0.943590, .blue = 0.998779 },
+	{ .red = 0.992918, .green = 0.938706, .blue = 0.999512 },
+	{ .red = 0.999267, .green = 0.934066, .blue = 0.991453 },
+	{ .red = 0.082295, .green = 0.832967, .blue = 0.993407 },
+	{ .red = 0.131380, .green = 0.839072, .blue = 0.999023 },
+	{ .red = 0.254457, .green = 0.846398, .blue = 0.998291 },
+	{ .red = 0.370940, .green = 0.859341, .blue = 0.999267 },
+	{ .red = 0.480830, .green = 0.874237, .blue = 0.999267 },
+	{ .red = 0.579976, .green = 0.888400, .blue = 0.997802 },
+	{ .red = 0.664957, .green = 0.902808, .blue = 0.998046 },
+	{ .red = 0.736752, .green = 0.915751, .blue = 0.998779 },
+	{ .red = 0.798291, .green = 0.926740, .blue = 0.998535 },
+	{ .red = 0.849817, .green = 0.936996, .blue = 0.999023 },
+	{ .red = 0.895238, .green = 0.947009, .blue = 0.998779 },
+	{ .red = 0.948230, .green = 0.966545, .blue = 0.998779 },
+	{ .red = 0.958486, .green = 0.966545, .blue = 0.999023 },
+	{ .red = 0.968742, .green = 0.965568, .blue = 0.999267 },
+	{ .red = 0.979976, .green = 0.963370, .blue = 0.999512 },
+	{ .red = 0.991209, .green = 0.959951, .blue = 0.998779 },
+	{ .red = 0.998779, .green = 0.955556, .blue = 0.993651 },
+	{ .red = 0.100855, .green = 0.887424, .blue = 0.992674 },
+	{ .red = 0.133578, .green = 0.893529, .blue = 0.999023 },
+	{ .red = 0.255678, .green = 0.898413, .blue = 0.998779 },
+	{ .red = 0.371673, .green = 0.906960, .blue = 0.999756 },
+	{ .red = 0.481319, .green = 0.915995, .blue = 0.998535 },
+	{ .red = 0.577289, .green = 0.925519, .blue = 0.998535 },
+	{ .red = 0.658852, .green = 0.935531, .blue = 0.999756 },
+	{ .red = 0.729426, .green = 0.942857, .blue = 0.999267 },
+	{ .red = 0.788034, .green = 0.949695, .blue = 0.999023 },
+	{ .red = 0.837118, .green = 0.955067, .blue = 0.998779 },
+	{ .red = 0.877411, .green = 0.960440, .blue = 0.999512 },
+	{ .red = 0.912821, .green = 0.965079, .blue = 0.999023 },
+	{ .red = 0.944567, .green = 0.970940, .blue = 0.999512 },
+	{ .red = 0.973382, .green = 0.980464, .blue = 1.000000 },
+	{ .red = 0.981929, .green = 0.979243, .blue = 0.999023 },
+	{ .red = 0.991209, .green = 0.977045, .blue = 0.998535 },
+	{ .red = 0.999023, .green = 0.973138, .blue = 0.996093 },
+	{ .red = 0.094017, .green = 0.943101, .blue = 0.995604 },
+	{ .red = 0.147253, .green = 0.945299, .blue = 0.997314 },
+	{ .red = 0.258364, .green = 0.950183, .blue = 0.999756 },
+	{ .red = 0.379243, .green = 0.953846, .blue = 0.999267 },
+	{ .red = 0.487668, .green = 0.958974, .blue = 0.999023 },
+	{ .red = 0.582662, .green = 0.963858, .blue = 0.999023 },
+	{ .red = 0.664225, .green = 0.968254, .blue = 0.999023 },
+	{ .red = 0.731868, .green = 0.972161, .blue = 0.999267 },
+	{ .red = 0.788523, .green = 0.975092, .blue = 0.999023 },
+	{ .red = 0.835653, .green = 0.977289, .blue = 0.998535 },
+	{ .red = 0.873260, .green = 0.979731, .blue = 0.999267 },
+	{ .red = 0.905739, .green = 0.981197, .blue = 0.998779 },
+	{ .red = 0.932112, .green = 0.982906, .blue = 0.999023 },
+	{ .red = 0.955800, .green = 0.984371, .blue = 0.998779 },
+	{ .red = 0.977778, .green = 0.987546, .blue = 0.999512 },
+	{ .red = 0.992430, .green = 0.990476, .blue = 0.999512 },
+	{ .red = 0.999756, .green = 0.987546, .blue = 0.998046 },
+	{ .red = 0.094261, .green = 0.996825, .blue = 0.996825 },
+	{ .red = 0.148962, .green = 0.998779, .blue = 0.998535 },
+	{ .red = 0.276679, .green = 0.999267, .blue = 0.998535 },
+	{ .red = 0.403663, .green = 0.998779, .blue = 0.997070 },
+	{ .red = 0.513797, .green = 0.999267, .blue = 0.996825 },
+	{ .red = 0.611233, .green = 0.998779, .blue = 0.996093 },
+	{ .red = 0.691575, .green = 0.998535, .blue = 0.996093 },
+	{ .red = 0.756532, .green = 0.999023, .blue = 0.996825 },
+	{ .red = 0.811233, .green = 0.998535, .blue = 0.996825 },
+	{ .red = 0.853480, .green = 0.998779, .blue = 0.997558 },
+	{ .red = 0.886935, .green = 0.999267, .blue = 0.998535 },
+	{ .red = 0.917216, .green = 0.998535, .blue = 0.998291 },
+	{ .red = 0.940415, .green = 0.998779, .blue = 0.998779 },
+	{ .red = 0.960440, .green = 0.998535, .blue = 0.998779 },
+	{ .red = 0.976557, .green = 0.998779, .blue = 0.999023 },
+	{ .red = 0.989499, .green = 0.999267, .blue = 0.999512 },
+	{ .red = 1.000000, .green = 0.999756, .blue = 1.000000 },
+} };
+
+#endif
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 2ff70808b..e9ec75eb8 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -713,6 +713,8 @@ const char * const igt_colorop_prop_names[IGT_NUM_COLOROP_PROPS] = {
 	[IGT_COLOROP_SIZE] = "SIZE",
 	[IGT_COLOROP_DATA] = "DATA",
 	[IGT_COLOROP_MULTIPLIER] = "MULTIPLIER",
+	[IGT_COLOROP_COLOR_DEPTH] = "COLOR_DEPTH",
+	[IGT_COLOROP_LUT3D_INTERPOLATION] = "LUT3D_INTERPOLATION",
 	[IGT_COLOROP_NEXT] = "NEXT",
 };
 
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index cd64fd38f..a95293f50 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -377,6 +377,8 @@ enum igt_atomic_colorop_properties {
 	IGT_COLOROP_SIZE,
 	IGT_COLOROP_DATA,
 	IGT_COLOROP_MULTIPLIER,
+	IGT_COLOROP_COLOR_DEPTH,
+	IGT_COLOROP_LUT3D_INTERPOLATION,
 	IGT_COLOROP_NEXT,
 	IGT_NUM_COLOROP_PROPS
 };
diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 50cbc1a9d..06b89264a 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -71,6 +71,7 @@
  * @ctm_3x4_bt709_dec_enc:		BT709 decoding matrix, followed by encoding matrix
  * @multiply_125:			Multiplier by 125
  * @multiply_inv_125:			Multiplier by inverse of 125
+ * @3dlut_17_12_rgb:			3D LUT with length 17, color depth 12, and traversal order = RGB
  *
  */
 
@@ -241,6 +242,7 @@ static bool can_use_colorop(igt_display_t *display, igt_colorop_t *colorop, kms_
 	case KMS_COLOROP_MULTIPLIER:
 		return (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_MULTIPLIER);
 	case KMS_COLOROP_LUT3D:
+		return (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_3D_LUT);
 	default:
 		return false;
 	}
@@ -329,16 +331,37 @@ static void fill_custom_1dlut(igt_display_t *display, kms_colorop_t *colorop)
 	}
 }
 
+static void configure_3dlut(igt_display_t *display, kms_colorop_t *colorop, uint64_t size)
+{
+	uint64_t lut_size = 0;
+	uint64_t i;
+	igt_3dlut_norm_t *igt_3dlut;
+
+	/* Convert 3DLUT floating points to u16 required by colorop API */
+	lut_size = size * size * size;
+	igt_3dlut = (igt_3dlut_norm_t *) malloc(sizeof(struct drm_color_lut32) * lut_size);
+	for (i = 0; i < lut_size; i++) {
+		struct igt_color_lut_float *lut_f = &colorop->lut3d->lut[i];
+
+		igt_3dlut->lut[i].red = round((double)lut_f->red * UINT_MAX);
+		igt_3dlut->lut[i].green = round((double)lut_f->green * UINT_MAX);
+		igt_3dlut->lut[i].blue = round((double)lut_f->blue * UINT_MAX);
+	}
+
+	igt_colorop_set_3dlut(display, colorop->colorop, igt_3dlut, lut_size * sizeof(struct drm_color_lut32));
+	free(igt_3dlut);
+}
+
 static void set_colorop(igt_display_t *display,
 			kms_colorop_t *colorop)
 {
+	enum drm_colorop_lut3d_interpolation_type interpolation;
 	uint64_t lut_size = 0;
 	uint64_t mult = 1;
 
 	igt_assert(colorop->colorop);
 	igt_colorop_set_prop_value(colorop->colorop, IGT_COLOROP_BYPASS, 0);
 
-	/* Set to desired value from kms_colorop_t */
 	switch (colorop->type) {
 	case KMS_COLOROP_ENUMERATED_LUT1D:
 		igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, kms_colorop_lut1d_tf_names[colorop->enumerated_lut1d_info.tf]);
@@ -356,6 +379,15 @@ static void set_colorop(igt_display_t *display,
 		igt_colorop_set_prop_value(colorop->colorop, IGT_COLOROP_MULTIPLIER, mult);
 		break;
 	case KMS_COLOROP_LUT3D:
+		lut_size = igt_colorop_get_prop(display, colorop->colorop, IGT_COLOROP_SIZE);
+		interpolation = igt_colorop_get_prop(display, colorop->colorop, IGT_COLOROP_LUT3D_INTERPOLATION);
+
+		/* Check driver's lut size, color depth and interpolation with kms_colorop */
+		igt_skip_on(colorop->lut3d_info.size != lut_size);
+		igt_skip_on(colorop->lut3d_info.interpolation != interpolation);
+
+		configure_3dlut(display, colorop, lut_size);
+		break;
 	default:
 		igt_fail(IGT_EXIT_FAILURE);
 	}
@@ -547,6 +579,7 @@ igt_main
 		{ { &kms_colorop_ctm_3x4_bt709_dec, &kms_colorop_ctm_3x4_bt709_enc, NULL }, "ctm_3x4_bt709_dec_enc" },
 		{ { &kms_colorop_multiply_125, NULL }, "multiply_125" },
 		{ { &kms_colorop_multiply_inv_125, NULL }, "multiply_inv_125" },
+		{ { &kms_colorop_3dlut_17_12_rgb, NULL }, "3dlut_17_12_rgb" },
 	};
 
 	struct {
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
index b0371aff7..7fc88d6ca 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -68,16 +68,24 @@ typedef struct kms_colorop_enumerated_lut1d_info {
 	kms_colorop_lut1d_tf_t tf;
 } kms_colorop_enumerated_lut1d_info_t;
 
+typedef struct kms_colorop_lut3d_info {
+	uint32_t size;
+	enum drm_colorop_lut3d_interpolation_type interpolation;
+} kms_colorop_lut3d_info_t;
+
 typedef struct kms_colorop {
 	kms_colorop_type_t type;
 
 	union {
 		kms_colorop_enumerated_lut1d_info_t enumerated_lut1d_info;
 		igt_1dlut_t *lut1d;
+		igt_3dlut_t *lut3d;
 		const igt_matrix_3x4_t *matrix_3x4;
 		double multiplier;
 	};
 
+	kms_colorop_lut3d_info_t lut3d_info;
+
 	const char *name;
 
 	igt_pixel_transform transform;
@@ -240,4 +248,15 @@ kms_colorop_t kms_colorop_multiply_inv_125 = {
 	.transform = &igt_color_multiply_inv_125
 };
 
+kms_colorop_t kms_colorop_3dlut_17_12_rgb = {
+	.type =	KMS_COLOROP_LUT3D,
+	.lut3d = &igt_3dlut_17_rgb,
+	.lut3d_info = {
+		.size = 17,
+		.interpolation = DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL,
+	},
+	.name = "3dlut with traversal order RGB",
+	.transform = &igt_color_3dlut_17_12_rgb,
+};
+
 #endif /* __KMS_COLOROP_H__ */
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 28/30] drm-uapi: Update kernel doc for drm_colorop_type
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (26 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 27/30] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-09-03 16:41   ` Kamil Konieczny
  2025-08-15  4:06 ` [PATCH V10 29/30] drm-uapi: Sync up definition with kernel colorop implementation Alex Hung
                   ` (5 subsequent siblings)
  33 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

Sync up with kernel documents.

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 include/drm-uapi/drm_mode.h | 44 +++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index 009bb3e7f..e00b21067 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -886,11 +886,55 @@ struct drm_color_lut32 {
 	__u32 reserved;
 };
 
+/**
+ * enum drm_colorop_type - Type of color operation
+ *
+ *
+ * drm_colorops can be of many different types. Each type behaves differently
+ * and defines a different set of properties. This enum defines all types and
+ * gives a high-level description.
+ */
 enum drm_colorop_type {
+	/**
+	 * @DRM_COLOROP_1D_CURVE:
+	 *
+	 * A 1D curve that is being applied to all color channels. The
+	 * curve is specified via tha CURVE_1D_TYPE colorop property.
+	 */
 	DRM_COLOROP_1D_CURVE,
+
+	/**
+	 * @DRM_COLOROP_1D_LUT:
+	 *
+	 * A simple 1D LUT of uniformly spaced &drm_color_lut32 entries,
+	 * packed into a blob via the DATA property. The driver's expected
+	 * LUT size is advertised via the SIZE property.
+	 */
 	DRM_COLOROP_1D_LUT,
+
+	/**
+	 * @DRM_COLOROP_CTM_3X4:
+	 *
+	 * A 3x4 matrix. Its values are specified via the
+	 * &drm_color_ctm_3x4 struct provided via the DATA property.
+	 */
 	DRM_COLOROP_CTM_3X4,
+
+	/**
+	 * @DRM_COLOROP_MULTIPLIER:
+	 *
+	 * A simple multiplier, applied to all color values. The
+	 * multiplier is specified as a S31.32 via the MULTIPLIER
+	 * property.
+	 */
 	DRM_COLOROP_MULTIPLIER,
+	/**
+	 * @DRM_COLOROP_3D_LUT:
+	 *
+	 * A 3D LUT of &drm_color_lut entries,
+	 * packed into a blob via the DATA property. The driver's expected
+	 * LUT size is advertised via the SIZE property.
+	 */
 	DRM_COLOROP_3D_LUT,
 };
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 29/30] drm-uapi: Sync up definition with kernel colorop implementation
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (27 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 28/30] drm-uapi: Update kernel doc for drm_colorop_type Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  4:06 ` [PATCH V10 30/30] tests/kms_colorop: Add a colorop uniqueness subtest Alex Hung
                   ` (4 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

Add drm_colorop_lut1d_interpolation_type to IGT.

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 include/drm-uapi/drm_mode.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index e00b21067..696b76d3f 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -968,6 +968,19 @@ struct drm_plane_size_hint {
 	__u16 height;
 };
 
+/**
+ * enum drm_colorop_lut1d_interpolation_type - type of interpolation for 1D LUTs
+ */
+enum drm_colorop_lut1d_interpolation_type {
+	/**
+	 * @DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR:
+	 *
+	 * Linear interpolation. Values between points of the LUT will be
+	 * linearly interpolated.
+	 */
+	DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR,
+};
+
 /**
  * struct hdr_metadata_infoframe - HDR Metadata Infoframe Data.
  *
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH V10 30/30] tests/kms_colorop: Add a colorop uniqueness subtest
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (28 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 29/30] drm-uapi: Sync up definition with kernel colorop implementation Alex Hung
@ 2025-08-15  4:06 ` Alex Hung
  2025-08-15  5:24 ` ✓ i915.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev10) Patchwork
                   ` (3 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-08-15  4:06 UTC (permalink / raw)
  To: igt-dev; +Cc: alex.hung, harry.wentland, leo.liu

A colorop should have unique ID.

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 tests/kms_colorop.c | 50 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 06b89264a..2ae854c5c 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -26,11 +26,16 @@
 #include "sw_sync.h"
 #include "kms_colorop.h"
 
+#include <glib.h>
+
 /**
  * TEST: kms colorop
  * Category: Display
  * Description: Test to validate the retrieving and setting of DRM colorops
  *
+ * SUBTEST: check_plane_colorop_ids
+ * Description: Verify that all igt_colorop_t IDs are unique across planes
+ *
  * SUBTEST: plane-%s-%s
  * Description: Tests DRM colorop properties on a plane
  * Driver requirement: amdgpu
@@ -546,6 +551,47 @@ static void colorop_plane_test(igt_display_t *display,
 
 }
 
+static void check_plane_colorop_ids(igt_display_t *display)
+{
+	igt_plane_t *plane;
+	int colorop_idx;
+	igt_colorop_t *next;
+	int prop_val = 0, pipe = 0;
+
+	/* Use hash tables to track drm_planes and unique IDs */
+	GHashTable *plane_set = g_hash_table_new(g_direct_hash, g_direct_equal);
+	GHashTable *id_set = g_hash_table_new(g_direct_hash, g_direct_equal);
+
+	for_each_pipe(display, pipe) {
+		for_each_plane_on_pipe(display, pipe, plane) {
+			/* Skip when a drm_plane is already scanned */
+			if (g_hash_table_contains(plane_set, GINT_TO_POINTER(plane->drm_plane->plane_id)))
+				continue;
+
+			g_hash_table_add(plane_set, GINT_TO_POINTER(plane->drm_plane->plane_id));
+
+			for (colorop_idx = 0; colorop_idx < plane->num_color_pipelines; colorop_idx++) {
+				next = plane->color_pipelines[colorop_idx];
+				while (next) {
+					/* Check if the ID already exists in the set */
+					if (g_hash_table_contains(id_set, GINT_TO_POINTER(next->id))) {
+						igt_fail_on_f(true, "Duplicate colorop ID %u found on plane %d\n",
+						next->id, plane->drm_plane->plane_id);
+					}
+
+					g_hash_table_add(id_set, GINT_TO_POINTER(next->id));
+					prop_val = igt_colorop_get_prop(display, next, IGT_COLOROP_NEXT);
+					next = igt_find_colorop(display, prop_val);
+				}
+			}
+		}
+	}
+
+	g_hash_table_destroy(id_set);
+	g_hash_table_destroy(plane_set);
+	igt_info("All igt_colorop_t IDs are unique across planes\n");
+}
+
 igt_main
 {
 
@@ -613,6 +659,10 @@ igt_main
 		igt_require(display.is_atomic);
 	}
 
+	igt_subtest_f("check_plane_colorop_ids") {
+		check_plane_colorop_ids(&display);
+	}
+
 	for (j = 0; j < ARRAY_SIZE(formats); j++) {
 		igt_output_t *output;
 		igt_plane_t *plane;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* ✓ i915.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev10)
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (29 preceding siblings ...)
  2025-08-15  4:06 ` [PATCH V10 30/30] tests/kms_colorop: Add a colorop uniqueness subtest Alex Hung
@ 2025-08-15  5:24 ` Patchwork
  2025-08-15  5:33 ` ✓ Xe.CI.BAT: " Patchwork
                   ` (2 subsequent siblings)
  33 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-08-15  5:24 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 8201 bytes --]

== Series Details ==

Series: IGT tests for the KMS Color Pipeline API (rev10)
URL   : https://patchwork.freedesktop.org/series/123448/
State : success

== Summary ==

CI Bug Log - changes from IGT_8494 -> IGTPW_13586
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/index.html

Participating hosts (43 -> 42)
------------------------------

  Missing    (1): fi-snb-2520m 

Known issues
------------

  Here are the changes found in IGTPW_13586 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@core_hotunplug@unbind-rebind:
    - bat-rplp-1:         [PASS][1] -> [ABORT][2] ([i915#14804])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-rplp-1/igt@core_hotunplug@unbind-rebind.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-rplp-1/igt@core_hotunplug@unbind-rebind.html

  * igt@dmabuf@all-tests@dma_fence_chain:
    - fi-bsw-n3050:       [PASS][3] -> [ABORT][4] ([i915#12904]) +1 other test abort
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/fi-bsw-n3050/igt@dmabuf@all-tests@dma_fence_chain.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/fi-bsw-n3050/igt@dmabuf@all-tests@dma_fence_chain.html

  * igt@gem_lmem_swapping@basic:
    - bat-arls-5:         NOTRUN -> [SKIP][5] ([i915#10213] / [i915#11671]) +3 other tests skip
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-arls-5/igt@gem_lmem_swapping@basic.html

  * igt@gem_lmem_swapping@parallel-random-engines:
    - bat-arls-6:         NOTRUN -> [SKIP][6] ([i915#10213] / [i915#11671]) +3 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-arls-6/igt@gem_lmem_swapping@parallel-random-engines.html
    - bat-jsl-1:          NOTRUN -> [SKIP][7] ([i915#4613]) +3 other tests skip
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-jsl-1/igt@gem_lmem_swapping@parallel-random-engines.html
    - bat-arlh-3:         NOTRUN -> [SKIP][8] ([i915#11671]) +3 other tests skip
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-arlh-3/igt@gem_lmem_swapping@parallel-random-engines.html
    - fi-glk-j4005:       NOTRUN -> [SKIP][9] ([i915#4613]) +3 other tests skip
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/fi-glk-j4005/igt@gem_lmem_swapping@parallel-random-engines.html

  * igt@i915_selftest@live@guc_multi_lrc:
    - bat-dg2-11:         [PASS][10] -> [ABORT][11] ([i915#14201])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-dg2-11/igt@i915_selftest@live@guc_multi_lrc.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-dg2-11/igt@i915_selftest@live@guc_multi_lrc.html

  * igt@i915_selftest@live@workarounds:
    - bat-arls-5:         NOTRUN -> [DMESG-FAIL][12] ([i915#12061]) +1 other test dmesg-fail
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-arls-5/igt@i915_selftest@live@workarounds.html
    - bat-dg2-9:          [PASS][13] -> [DMESG-FAIL][14] ([i915#12061]) +1 other test dmesg-fail
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-dg2-9/igt@i915_selftest@live@workarounds.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-dg2-9/igt@i915_selftest@live@workarounds.html
    - bat-arls-6:         NOTRUN -> [DMESG-FAIL][15] ([i915#12061]) +1 other test dmesg-fail
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-arls-6/igt@i915_selftest@live@workarounds.html

  * igt@kms_psr@psr-primary-page-flip:
    - fi-glk-j4005:       NOTRUN -> [SKIP][16] +6 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/fi-glk-j4005/igt@kms_psr@psr-primary-page-flip.html

  
#### Possible fixes ####

  * igt@core_hotunplug@unbind-rebind:
    - bat-arls-6:         [ABORT][17] ([i915#14804]) -> [PASS][18]
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-arls-6/igt@core_hotunplug@unbind-rebind.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-arls-6/igt@core_hotunplug@unbind-rebind.html
    - bat-jsl-1:          [ABORT][19] ([i915#14804]) -> [PASS][20]
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-jsl-1/igt@core_hotunplug@unbind-rebind.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-jsl-1/igt@core_hotunplug@unbind-rebind.html
    - bat-arls-5:         [ABORT][21] ([i915#14804]) -> [PASS][22]
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-arls-5/igt@core_hotunplug@unbind-rebind.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-arls-5/igt@core_hotunplug@unbind-rebind.html

  * igt@dmabuf@all-tests@dma_fence_chain:
    - fi-bsw-nick:        [ABORT][23] ([i915#12904]) -> [PASS][24] +1 other test pass
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/fi-bsw-nick/igt@dmabuf@all-tests@dma_fence_chain.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/fi-bsw-nick/igt@dmabuf@all-tests@dma_fence_chain.html

  * igt@i915_module_load@reload:
    - bat-arlh-3:         [ABORT][25] ([i915#14804]) -> [PASS][26]
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-arlh-3/igt@i915_module_load@reload.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-arlh-3/igt@i915_module_load@reload.html

  * igt@i915_selftest@live:
    - bat-dg2-8:          [DMESG-FAIL][27] ([i915#12061]) -> [PASS][28] +1 other test pass
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-dg2-8/igt@i915_selftest@live.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-dg2-8/igt@i915_selftest@live.html

  * igt@i915_selftest@live@workarounds:
    - bat-mtlp-6:         [DMESG-FAIL][29] ([i915#12061]) -> [PASS][30] +1 other test pass
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-mtlp-6/igt@i915_selftest@live@workarounds.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-mtlp-6/igt@i915_selftest@live@workarounds.html
    - bat-mtlp-9:         [DMESG-FAIL][31] ([i915#12061]) -> [PASS][32] +1 other test pass
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-mtlp-9/igt@i915_selftest@live@workarounds.html

  * igt@kms_flip@basic-flip-vs-dpms@b-hdmi-a2:
    - fi-glk-j4005:       [ABORT][33] ([i915#14804]) -> [PASS][34] +1 other test pass
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/fi-glk-j4005/igt@kms_flip@basic-flip-vs-dpms@b-hdmi-a2.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/fi-glk-j4005/igt@kms_flip@basic-flip-vs-dpms@b-hdmi-a2.html

  
#### Warnings ####

  * igt@i915_selftest@live:
    - bat-dg2-11:         [DMESG-FAIL][35] ([i915#12061]) -> [ABORT][36] ([i915#12061])
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8494/bat-dg2-11/igt@i915_selftest@live.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/bat-dg2-11/igt@i915_selftest@live.html

  
  [i915#10213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10213
  [i915#11671]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11671
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#12904]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12904
  [i915#14201]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14201
  [i915#14804]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14804
  [i915#4613]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4613


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_8494 -> IGTPW_13586
  * Linux: CI_DRM_17000 -> CI_DRM_17004

  CI-20190529: 20190529
  CI_DRM_17000: 7f1ecbbddf3bf50bf5338e86514bf77c32eb4edb @ git://anongit.freedesktop.org/gfx-ci/linux
  CI_DRM_17004: 90b26f76462c96e29198988df41d6bd86d92c656 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_13586: 12c4cafd059541b6bd4dd2e4347bafda874323dd @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_8494: 8494

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/index.html

[-- Attachment #2: Type: text/html, Size: 10465 bytes --]

^ permalink raw reply	[flat|nested] 49+ messages in thread

* ✓ Xe.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev10)
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (30 preceding siblings ...)
  2025-08-15  5:24 ` ✓ i915.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev10) Patchwork
@ 2025-08-15  5:33 ` Patchwork
  2025-08-15  6:34 ` ✗ Xe.CI.Full: failure " Patchwork
  2025-08-15 17:06 ` ✗ i915.CI.Full: " Patchwork
  33 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-08-15  5:33 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 2487 bytes --]

== Series Details ==

Series: IGT tests for the KMS Color Pipeline API (rev10)
URL   : https://patchwork.freedesktop.org/series/123448/
State : success

== Summary ==

CI Bug Log - changes from XEIGT_8494_BAT -> XEIGTPW_13586_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (9 -> 9)
------------------------------

  No changes in participating hosts

Known issues
------------

  Here are the changes found in XEIGTPW_13586_BAT that come from known issues:

### IGT changes ###

#### Possible fixes ####

  * igt@kms_flip@basic-plain-flip@b-edp1:
    - bat-adlp-7:         [DMESG-WARN][1] ([Intel XE#4543]) -> [PASS][2] +1 other test pass
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/bat-adlp-7/igt@kms_flip@basic-plain-flip@b-edp1.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/bat-adlp-7/igt@kms_flip@basic-plain-flip@b-edp1.html

  * igt@xe_vm@bind-execqueues-independent:
    - {bat-ptl-1}:        [FAIL][3] ([Intel XE#5783]) -> [PASS][4]
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/bat-ptl-1/igt@xe_vm@bind-execqueues-independent.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/bat-ptl-1/igt@xe_vm@bind-execqueues-independent.html
    - {bat-ptl-2}:        [FAIL][5] ([Intel XE#5783]) -> [PASS][6]
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/bat-ptl-2/igt@xe_vm@bind-execqueues-independent.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/bat-ptl-2/igt@xe_vm@bind-execqueues-independent.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#5783]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5783


Build changes
-------------

  * IGT: IGT_8494 -> IGTPW_13586
  * Linux: xe-3545-7f1ecbbddf3bf50bf5338e86514bf77c32eb4edb -> xe-3549-90b26f76462c96e29198988df41d6bd86d92c656

  IGTPW_13586: 12c4cafd059541b6bd4dd2e4347bafda874323dd @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_8494: 8494
  xe-3545-7f1ecbbddf3bf50bf5338e86514bf77c32eb4edb: 7f1ecbbddf3bf50bf5338e86514bf77c32eb4edb
  xe-3549-90b26f76462c96e29198988df41d6bd86d92c656: 90b26f76462c96e29198988df41d6bd86d92c656

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/index.html

[-- Attachment #2: Type: text/html, Size: 3184 bytes --]

^ permalink raw reply	[flat|nested] 49+ messages in thread

* ✗ Xe.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev10)
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (31 preceding siblings ...)
  2025-08-15  5:33 ` ✓ Xe.CI.BAT: " Patchwork
@ 2025-08-15  6:34 ` Patchwork
  2025-08-15 17:06 ` ✗ i915.CI.Full: " Patchwork
  33 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-08-15  6:34 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 78063 bytes --]

== Series Details ==

Series: IGT tests for the KMS Color Pipeline API (rev10)
URL   : https://patchwork.freedesktop.org/series/123448/
State : failure

== Summary ==

CI Bug Log - changes from XEIGT_8494_FULL -> XEIGTPW_13586_FULL
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with XEIGTPW_13586_FULL absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in XEIGTPW_13586_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.

  

Participating hosts (4 -> 3)
------------------------------

  Missing    (1): shard-adlp 

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in XEIGTPW_13586_FULL:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_colorop@plane-xr24-xr24-bt2020_oetf (NEW):
    - shard-lnl:          NOTRUN -> [SKIP][1] +43 other tests skip
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-2/igt@kms_colorop@plane-xr24-xr24-bt2020_oetf.html

  * igt@kms_colorop@plane-xr24-xr24-pq_eotf-pq_inv_eotf (NEW):
    - shard-bmg:          NOTRUN -> [SKIP][2] +39 other tests skip
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_colorop@plane-xr24-xr24-pq_eotf-pq_inv_eotf.html

  * igt@kms_colorop@plane-xr30-xr30-pq_125_inv_eotf (NEW):
    - shard-dg2-set2:     NOTRUN -> [SKIP][3] +41 other tests skip
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-436/igt@kms_colorop@plane-xr30-xr30-pq_125_inv_eotf.html

  * igt@xe_ccs@suspend-resume:
    - shard-bmg:          [PASS][4] -> [INCOMPLETE][5] +1 other test incomplete
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-1/igt@xe_ccs@suspend-resume.html
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-3/igt@xe_ccs@suspend-resume.html

  
New tests
---------

  New tests have been introduced between XEIGT_8494_FULL and XEIGTPW_13586_FULL:

### New IGT tests (95) ###

  * igt@kms_colorop@check_plane_colorop_ids:
    - Statuses : 3 pass(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-3dlut_17_12_rgb:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bt2020_inv_oetf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bt2020_inv_oetf-bt2020_oetf:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bt2020_oetf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bypass:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_50_desat:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_dec:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_dec_enc:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_enc:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_enc_dec:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_overdrive:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_oversaturate:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-multiply_125:
    - Statuses : 1 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-multiply_inv_125:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_eotf-pq_125_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_eotf-pq_125_inv_eotf-pq_125_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_eotf:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr24-xr24-pq_eotf-pq_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf-srgb_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_inv_eotf:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_inv_eotf_lut:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_inv_eotf_lut-srgb_eotf_lut:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-3dlut_17_12_rgb:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf-bt2020_oetf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-bt2020_oetf:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-bypass:
    - Statuses : 1 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_50_desat:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_dec:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_dec_enc:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_enc:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_enc_dec:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_overdrive:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_oversaturate:
    - Statuses : 1 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-multiply_125:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr30-xr30-multiply_inv_125:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_125_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_125_eotf-pq_125_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_125_eotf-pq_125_inv_eotf-pq_125_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_125_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_eotf-pq_inv_eotf:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr30-xr30-pq_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_eotf:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_eotf-srgb_inv_eotf:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_eotf-srgb_inv_eotf-srgb_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_inv_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_inv_eotf_lut:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_inv_eotf_lut-srgb_eotf_lut:
    - Statuses : 1 skip(s)
    - Exec time: [0.0] s

  * igt@kms_properties@colorop-properties-atomic:
    - Statuses : 3 pass(s)
    - Exec time: [1.31, 2.52] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.17] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.21] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.38] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.16] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-hdmi-a-6:
    - Statuses : 1 pass(s)
    - Exec time: [0.30] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.18] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.17] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.09] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-hdmi-a-6:
    - Statuses : 1 pass(s)
    - Exec time: [0.16] s

  * igt@kms_properties@colorop-properties-atomic@pipe-c-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.18] s

  * igt@kms_properties@colorop-properties-atomic@pipe-c-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.18] s

  * igt@kms_properties@colorop-properties-atomic@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.05] s

  * igt@kms_properties@colorop-properties-atomic@pipe-c-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-atomic@pipe-c-hdmi-a-6:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-atomic@pipe-d-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.18] s

  * igt@kms_properties@colorop-properties-atomic@pipe-d-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.16] s

  * igt@kms_properties@colorop-properties-atomic@pipe-d-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-atomic@pipe-d-hdmi-a-6:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-legacy:
    - Statuses : 3 pass(s)
    - Exec time: [1.28, 2.56] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.15] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.19] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.35] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-hdmi-a-6:
    - Statuses : 1 pass(s)
    - Exec time: [0.20] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.19] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.18] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.11] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-hdmi-a-6:
    - Statuses : 1 pass(s)
    - Exec time: [0.13] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.17] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.17] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.09] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.15] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-hdmi-a-6:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.18] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.17] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-hdmi-a-6:
    - Statuses : 1 pass(s)
    - Exec time: [0.15] s

  

Known issues
------------

  Here are the changes found in XEIGTPW_13586_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@core_hotunplug@unplug-rescan:
    - shard-lnl:          [PASS][6] -> [ABORT][7] ([Intel XE#5826])
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-lnl-3/igt@core_hotunplug@unplug-rescan.html
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@core_hotunplug@unplug-rescan.html

  * igt@intel_hwmon@hwmon-write:
    - shard-bmg:          [PASS][8] -> [FAIL][9] ([Intel XE#4665])
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-5/igt@intel_hwmon@hwmon-write.html
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-2/igt@intel_hwmon@hwmon-write.html

  * igt@kms_async_flips@test-cursor:
    - shard-lnl:          NOTRUN -> [SKIP][10] ([Intel XE#664])
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-3/igt@kms_async_flips@test-cursor.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-lnl:          NOTRUN -> [SKIP][11] ([Intel XE#3658])
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-3/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-0-hflip:
    - shard-lnl:          NOTRUN -> [SKIP][12] ([Intel XE#1407]) +1 other test skip
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip.html

  * igt@kms_big_fb@x-tiled-32bpp-rotate-90:
    - shard-bmg:          NOTRUN -> [SKIP][13] ([Intel XE#2327]) +1 other test skip
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_big_fb@x-tiled-32bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-64bpp-rotate-90:
    - shard-dg2-set2:     NOTRUN -> [SKIP][14] ([Intel XE#316]) +4 other tests skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-433/igt@kms_big_fb@x-tiled-64bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-16bpp-rotate-0:
    - shard-bmg:          NOTRUN -> [SKIP][15] ([Intel XE#1124]) +9 other tests skip
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-3/igt@kms_big_fb@y-tiled-16bpp-rotate-0.html

  * igt@kms_big_fb@y-tiled-16bpp-rotate-90:
    - shard-lnl:          NOTRUN -> [SKIP][16] ([Intel XE#1124]) +4 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-2/igt@kms_big_fb@y-tiled-16bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-addfb:
    - shard-dg2-set2:     NOTRUN -> [SKIP][17] ([Intel XE#619])
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-463/igt@kms_big_fb@y-tiled-addfb.html

  * igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
    - shard-dg2-set2:     NOTRUN -> [SKIP][18] ([Intel XE#607])
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@kms_big_fb@y-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip:
    - shard-dg2-set2:     NOTRUN -> [SKIP][19] ([Intel XE#1124]) +14 other tests skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-434/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip.html

  * igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p:
    - shard-bmg:          [PASS][20] -> [SKIP][21] ([Intel XE#2314] / [Intel XE#2894])
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-2/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html

  * igt@kms_bw@connected-linear-tiling-3-displays-2160x1440p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][22] ([Intel XE#2191]) +2 other tests skip
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@kms_bw@connected-linear-tiling-3-displays-2160x1440p.html
    - shard-lnl:          NOTRUN -> [SKIP][23] ([Intel XE#2191]) +1 other test skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@kms_bw@connected-linear-tiling-3-displays-2160x1440p.html

  * igt@kms_bw@connected-linear-tiling-3-displays-3840x2160p:
    - shard-bmg:          NOTRUN -> [SKIP][24] ([Intel XE#2314] / [Intel XE#2894]) +1 other test skip
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@kms_bw@connected-linear-tiling-3-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-1-displays-1920x1080p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][25] ([Intel XE#367]) +2 other tests skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-433/igt@kms_bw@linear-tiling-1-displays-1920x1080p.html

  * igt@kms_bw@linear-tiling-4-displays-2160x1440p:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#367]) +1 other test skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_bw@linear-tiling-4-displays-2160x1440p.html

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs@pipe-a-dp-2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][27] ([Intel XE#787]) +153 other tests skip
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs@pipe-a-dp-2.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2:
    - shard-bmg:          NOTRUN -> [SKIP][28] ([Intel XE#2652] / [Intel XE#787]) +17 other tests skip
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][29] ([Intel XE#2887]) +13 other tests skip
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc@pipe-d-dp-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][30] ([Intel XE#455] / [Intel XE#787]) +35 other tests skip
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc@pipe-d-dp-4.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][31] ([Intel XE#3432]) +1 other test skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-2/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][32] ([Intel XE#2887]) +7 other tests skip
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-c-dp-2:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][33] ([Intel XE#1727] / [Intel XE#3113])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-c-dp-2.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4:
    - shard-dg2-set2:     [PASS][34] -> [INCOMPLETE][35] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4522])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4.html
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][36] ([Intel XE#2907]) +2 other tests skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html

  * igt@kms_cdclk@plane-scaling@pipe-b-dp-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][37] ([Intel XE#4416]) +3 other tests skip
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-436/igt@kms_cdclk@plane-scaling@pipe-b-dp-4.html

  * igt@kms_chamelium_audio@dp-audio:
    - shard-dg2-set2:     NOTRUN -> [SKIP][38] ([Intel XE#373]) +15 other tests skip
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-463/igt@kms_chamelium_audio@dp-audio.html

  * igt@kms_chamelium_color@ctm-0-25:
    - shard-bmg:          NOTRUN -> [SKIP][39] ([Intel XE#2325]) +1 other test skip
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_chamelium_color@ctm-0-25.html

  * igt@kms_chamelium_color@gamma:
    - shard-dg2-set2:     NOTRUN -> [SKIP][40] ([Intel XE#306]) +2 other tests skip
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@kms_chamelium_color@gamma.html
    - shard-lnl:          NOTRUN -> [SKIP][41] ([Intel XE#306]) +1 other test skip
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@kms_chamelium_color@gamma.html

  * igt@kms_chamelium_hpd@hdmi-hpd-storm:
    - shard-lnl:          NOTRUN -> [SKIP][42] ([Intel XE#373]) +10 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@kms_chamelium_hpd@hdmi-hpd-storm.html

  * igt@kms_chamelium_hpd@vga-hpd-for-each-pipe:
    - shard-bmg:          NOTRUN -> [SKIP][43] ([Intel XE#2252]) +11 other tests skip
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_chamelium_hpd@vga-hpd-for-each-pipe.html

  * igt@kms_content_protection@dp-mst-type-1:
    - shard-bmg:          NOTRUN -> [SKIP][44] ([Intel XE#2390])
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-2/igt@kms_content_protection@dp-mst-type-1.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][45] ([Intel XE#307]) +1 other test skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-435/igt@kms_content_protection@dp-mst-type-1.html
    - shard-lnl:          NOTRUN -> [SKIP][46] ([Intel XE#307])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@kms_content_protection@dp-mst-type-1.html

  * igt@kms_content_protection@lic-type-0:
    - shard-dg2-set2:     NOTRUN -> [FAIL][47] ([Intel XE#1178]) +2 other tests fail
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@kms_content_protection@lic-type-0.html
    - shard-lnl:          NOTRUN -> [SKIP][48] ([Intel XE#3278]) +1 other test skip
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-3/igt@kms_content_protection@lic-type-0.html

  * igt@kms_content_protection@lic-type-0@pipe-a-dp-4:
    - shard-dg2-set2:     NOTRUN -> [FAIL][49] ([Intel XE#3304])
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@kms_content_protection@lic-type-0@pipe-a-dp-4.html

  * igt@kms_content_protection@mei-interface:
    - shard-bmg:          NOTRUN -> [SKIP][50] ([Intel XE#2341])
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@kms_content_protection@mei-interface.html

  * igt@kms_cursor_crc@cursor-random-32x32:
    - shard-bmg:          NOTRUN -> [SKIP][51] ([Intel XE#2320]) +8 other tests skip
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-2/igt@kms_cursor_crc@cursor-random-32x32.html

  * igt@kms_cursor_crc@cursor-rapid-movement-512x170:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#2321])
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@kms_cursor_crc@cursor-rapid-movement-512x170.html

  * igt@kms_cursor_crc@cursor-rapid-movement-64x21:
    - shard-lnl:          NOTRUN -> [SKIP][53] ([Intel XE#1424]) +3 other tests skip
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@kms_cursor_crc@cursor-rapid-movement-64x21.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-legacy:
    - shard-bmg:          [PASS][54] -> [SKIP][55] ([Intel XE#2291]) +3 other tests skip
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-4/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
    - shard-lnl:          NOTRUN -> [SKIP][56] ([Intel XE#309]) +1 other test skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-5/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-legacy:
    - shard-bmg:          NOTRUN -> [SKIP][57] ([Intel XE#2291])
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
    - shard-bmg:          [PASS][58] -> [FAIL][59] ([Intel XE#1475])
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-6/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc:
    - shard-bmg:          [PASS][60] -> [SKIP][61] ([Intel XE#1340])
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-5/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][62] ([Intel XE#4494])
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-2.html

  * igt@kms_dsc@dsc-fractional-bpp-with-bpc:
    - shard-bmg:          NOTRUN -> [SKIP][63] ([Intel XE#2244])
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html
    - shard-lnl:          NOTRUN -> [SKIP][64] ([Intel XE#2244])
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area:
    - shard-bmg:          NOTRUN -> [SKIP][65] ([Intel XE#4422])
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][66] ([Intel XE#4422])
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-434/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area.html

  * igt@kms_feature_discovery@display-4x:
    - shard-dg2-set2:     NOTRUN -> [SKIP][67] ([Intel XE#1138])
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-434/igt@kms_feature_discovery@display-4x.html

  * igt@kms_feature_discovery@psr2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][68] ([Intel XE#1135])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@kms_feature_discovery@psr2.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank:
    - shard-bmg:          NOTRUN -> [SKIP][69] ([Intel XE#2316])
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_flip@2x-flip-vs-absolute-wf_vblank.html

  * igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible:
    - shard-bmg:          [PASS][70] -> [SKIP][71] ([Intel XE#2316]) +3 other tests skip
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-8/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html

  * igt@kms_flip@2x-flip-vs-rmfb-interruptible:
    - shard-lnl:          NOTRUN -> [SKIP][72] ([Intel XE#1421]) +4 other tests skip
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@kms_flip@2x-flip-vs-rmfb-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank@a-edp1:
    - shard-lnl:          [PASS][73] -> [FAIL][74] ([Intel XE#301]) +1 other test fail
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling:
    - shard-bmg:          NOTRUN -> [SKIP][75] ([Intel XE#2293] / [Intel XE#2380]) +5 other tests skip
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling@pipe-a-valid-mode:
    - shard-bmg:          NOTRUN -> [SKIP][76] ([Intel XE#2293]) +5 other tests skip
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling:
    - shard-lnl:          NOTRUN -> [SKIP][77] ([Intel XE#1401] / [Intel XE#1745]) +2 other tests skip
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling@pipe-a-default-mode:
    - shard-lnl:          NOTRUN -> [SKIP][78] ([Intel XE#1401]) +2 other tests skip
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling@pipe-a-default-mode.html

  * igt@kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][79] ([Intel XE#2311]) +27 other tests skip
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-shrfb-plflip-blt:
    - shard-lnl:          NOTRUN -> [SKIP][80] ([Intel XE#656]) +21 other tests skip
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-5/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-suspend:
    - shard-dg2-set2:     NOTRUN -> [SKIP][81] ([Intel XE#651]) +31 other tests skip
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@kms_frontbuffer_tracking@drrs-suspend.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][82] ([Intel XE#5390]) +19 other tests skip
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-rte:
    - shard-bmg:          NOTRUN -> [SKIP][83] ([Intel XE#5427])
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-rte.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][84] ([Intel XE#651]) +9 other tests skip
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-2/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-move:
    - shard-bmg:          NOTRUN -> [SKIP][85] ([Intel XE#2312]) +2 other tests skip
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-move.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-plflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][86] ([Intel XE#2313]) +32 other tests skip
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@pipe-fbc-rte:
    - shard-bmg:          NOTRUN -> [SKIP][87] ([Intel XE#5672])
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psr-slowdraw:
    - shard-dg2-set2:     NOTRUN -> [SKIP][88] ([Intel XE#653]) +40 other tests skip
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@kms_frontbuffer_tracking@psr-slowdraw.html

  * igt@kms_hdr@static-toggle:
    - shard-lnl:          NOTRUN -> [SKIP][89] ([Intel XE#1503])
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-3/igt@kms_hdr@static-toggle.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-bmg:          [PASS][90] -> [SKIP][91] ([Intel XE#1503])
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-7/igt@kms_hdr@static-toggle-dpms.html
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_joiner@basic-ultra-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][92] ([Intel XE#2927])
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-3/igt@kms_joiner@basic-ultra-joiner.html
    - shard-lnl:          NOTRUN -> [SKIP][93] ([Intel XE#2927])
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@kms_joiner@basic-ultra-joiner.html

  * igt@kms_joiner@invalid-modeset-ultra-joiner:
    - shard-dg2-set2:     NOTRUN -> [SKIP][94] ([Intel XE#2927]) +1 other test skip
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-435/igt@kms_joiner@invalid-modeset-ultra-joiner.html

  * igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][95] ([Intel XE#4090])
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-1/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html

  * igt@kms_pipe_stress@stress-xrgb8888-ytiled:
    - shard-bmg:          NOTRUN -> [SKIP][96] ([Intel XE#4329])
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_pipe_stress@stress-xrgb8888-ytiled.html

  * igt@kms_plane@pixel-format-source-clamping@pipe-a-plane-0:
    - shard-lnl:          NOTRUN -> [FAIL][97] ([Intel XE#5195]) +2 other tests fail
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@kms_plane@pixel-format-source-clamping@pipe-a-plane-0.html

  * igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64:
    - shard-dg2-set2:     [PASS][98] -> [FAIL][99] ([Intel XE#616]) +1 other test fail
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-436/igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64.html
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-463/igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64.html

  * igt@kms_plane_cursor@primary@pipe-a-hdmi-a-6-size-256:
    - shard-dg2-set2:     NOTRUN -> [FAIL][100] ([Intel XE#616]) +4 other tests fail
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-433/igt@kms_plane_cursor@primary@pipe-a-hdmi-a-6-size-256.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-a:
    - shard-bmg:          NOTRUN -> [SKIP][101] ([Intel XE#2763]) +4 other tests skip
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-a.html

  * igt@kms_pm_backlight@basic-brightness:
    - shard-bmg:          NOTRUN -> [SKIP][102] ([Intel XE#870])
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-dg2-set2:     NOTRUN -> [SKIP][103] ([Intel XE#870]) +1 other test skip
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-435/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-lnl:          [PASS][104] -> [FAIL][105] ([Intel XE#718])
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-lnl-2/igt@kms_pm_dc@dc5-psr.html
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_pm_rpm@dpms-lpsp:
    - shard-bmg:          NOTRUN -> [SKIP][106] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#836]) +1 other test skip
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_pm_rpm@dpms-lpsp.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-sf:
    - shard-lnl:          NOTRUN -> [SKIP][107] ([Intel XE#2893] / [Intel XE#5899])
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-3/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf:
    - shard-lnl:          NOTRUN -> [SKIP][108] ([Intel XE#2893] / [Intel XE#4608] / [Intel XE#5899])
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-5/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][109] ([Intel XE#4608] / [Intel XE#5899]) +1 other test skip
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-5/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf@pipe-a-edp-1.html

  * igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-fully-sf:
    - shard-bmg:          NOTRUN -> [SKIP][110] ([Intel XE#1489] / [Intel XE#5899]) +8 other tests skip
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-3/igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@psr2-overlay-primary-update-sf-dmg-area:
    - shard-dg2-set2:     NOTRUN -> [SKIP][111] ([Intel XE#1489] / [Intel XE#5899]) +8 other tests skip
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@kms_psr2_sf@psr2-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr2_su@frontbuffer-xrgb8888:
    - shard-bmg:          NOTRUN -> [SKIP][112] ([Intel XE#2387] / [Intel XE#5899])
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-5/igt@kms_psr2_su@frontbuffer-xrgb8888.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-dg2-set2:     NOTRUN -> [SKIP][113] ([Intel XE#1122] / [Intel XE#5899])
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@kms_psr2_su@page_flip-p010.html
    - shard-lnl:          NOTRUN -> [SKIP][114] ([Intel XE#1128] / [Intel XE#5899])
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr@fbc-psr2-sprite-blt@edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][115] ([Intel XE#4609] / [Intel XE#5899]) +1 other test skip
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@kms_psr@fbc-psr2-sprite-blt@edp-1.html

  * igt@kms_psr@fbc-psr2-sprite-plane-onoff:
    - shard-dg2-set2:     NOTRUN -> [SKIP][116] ([Intel XE#2850] / [Intel XE#5899] / [Intel XE#929]) +13 other tests skip
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-436/igt@kms_psr@fbc-psr2-sprite-plane-onoff.html

  * igt@kms_psr@fbc-psr2-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][117] ([Intel XE#2234] / [Intel XE#2850] / [Intel XE#5899]) +10 other tests skip
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_psr@fbc-psr2-suspend.html
    - shard-lnl:          NOTRUN -> [SKIP][118] ([Intel XE#1406] / [Intel XE#5899]) +2 other tests skip
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@kms_psr@fbc-psr2-suspend.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-bmg:          NOTRUN -> [SKIP][119] ([Intel XE#2414] / [Intel XE#5899])
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-1/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][120] ([Intel XE#2939] / [Intel XE#5899])
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-180:
    - shard-bmg:          NOTRUN -> [SKIP][121] ([Intel XE#2330]) +1 other test skip
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-3/igt@kms_rotation_crc@primary-y-tiled-reflect-x-180.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][122] ([Intel XE#1127])
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@kms_rotation_crc@primary-y-tiled-reflect-x-180.html
    - shard-lnl:          NOTRUN -> [SKIP][123] ([Intel XE#1127])
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@kms_rotation_crc@primary-y-tiled-reflect-x-180.html

  * igt@kms_rotation_crc@sprite-rotation-270:
    - shard-dg2-set2:     NOTRUN -> [SKIP][124] ([Intel XE#3414]) +2 other tests skip
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@kms_rotation_crc@sprite-rotation-270.html

  * igt@kms_rotation_crc@sprite-rotation-90-pos-100-0:
    - shard-bmg:          NOTRUN -> [SKIP][125] ([Intel XE#3414] / [Intel XE#3904]) +1 other test skip
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@kms_rotation_crc@sprite-rotation-90-pos-100-0.html
    - shard-lnl:          NOTRUN -> [SKIP][126] ([Intel XE#3414] / [Intel XE#3904])
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-2/igt@kms_rotation_crc@sprite-rotation-90-pos-100-0.html

  * igt@kms_scaling_modes@scaling-mode-full-aspect:
    - shard-bmg:          NOTRUN -> [SKIP][127] ([Intel XE#2413]) +1 other test skip
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_scaling_modes@scaling-mode-full-aspect.html

  * igt@kms_setmode@clone-exclusive-crtc:
    - shard-lnl:          NOTRUN -> [SKIP][128] ([Intel XE#1435]) +1 other test skip
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@kms_setmode@clone-exclusive-crtc.html

  * igt@kms_vrr@flipline:
    - shard-dg2-set2:     NOTRUN -> [SKIP][129] ([Intel XE#455]) +15 other tests skip
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-434/igt@kms_vrr@flipline.html

  * igt@xe_compute_preempt@compute-preempt-many-all-ram@engine-drm_xe_engine_class_compute:
    - shard-dg2-set2:     NOTRUN -> [FAIL][130] ([Intel XE#5890]) +1 other test fail
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@xe_compute_preempt@compute-preempt-many-all-ram@engine-drm_xe_engine_class_compute.html

  * igt@xe_compute_preempt@compute-threadgroup-preempt@engine-drm_xe_engine_class_compute:
    - shard-dg2-set2:     NOTRUN -> [SKIP][131] ([Intel XE#1280] / [Intel XE#455]) +1 other test skip
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@xe_compute_preempt@compute-threadgroup-preempt@engine-drm_xe_engine_class_compute.html

  * igt@xe_copy_basic@mem-copy-linear-0xfffe:
    - shard-dg2-set2:     NOTRUN -> [SKIP][132] ([Intel XE#1123]) +2 other tests skip
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@xe_copy_basic@mem-copy-linear-0xfffe.html

  * igt@xe_copy_basic@mem-set-linear-0xfffe:
    - shard-dg2-set2:     NOTRUN -> [SKIP][133] ([Intel XE#1126]) +1 other test skip
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-463/igt@xe_copy_basic@mem-set-linear-0xfffe.html

  * igt@xe_eu_stall@invalid-sampling-rate:
    - shard-dg2-set2:     NOTRUN -> [SKIP][134] ([Intel XE#5626]) +1 other test skip
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-436/igt@xe_eu_stall@invalid-sampling-rate.html

  * igt@xe_eudebug@basic-close:
    - shard-dg2-set2:     NOTRUN -> [SKIP][135] ([Intel XE#4837]) +16 other tests skip
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-463/igt@xe_eudebug@basic-close.html

  * igt@xe_eudebug@basic-vm-bind-metadata-discovery:
    - shard-bmg:          NOTRUN -> [SKIP][136] ([Intel XE#4837]) +13 other tests skip
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-5/igt@xe_eudebug@basic-vm-bind-metadata-discovery.html

  * igt@xe_eudebug@discovery-empty-clients:
    - shard-lnl:          NOTRUN -> [SKIP][137] ([Intel XE#4837]) +7 other tests skip
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-5/igt@xe_eudebug@discovery-empty-clients.html

  * igt@xe_eudebug_sriov@deny-eudebug:
    - shard-dg2-set2:     NOTRUN -> [SKIP][138] ([Intel XE#4518])
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@xe_eudebug_sriov@deny-eudebug.html

  * igt@xe_evict@evict-beng-large-external-cm:
    - shard-lnl:          NOTRUN -> [SKIP][139] ([Intel XE#688]) +2 other tests skip
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@xe_evict@evict-beng-large-external-cm.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-invalidate-race:
    - shard-bmg:          NOTRUN -> [SKIP][140] ([Intel XE#2322]) +6 other tests skip
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-2/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-invalidate-race.html

  * igt@xe_exec_basic@multigpu-no-exec-null-defer-bind:
    - shard-lnl:          NOTRUN -> [SKIP][141] ([Intel XE#1392]) +3 other tests skip
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@xe_exec_basic@multigpu-no-exec-null-defer-bind.html

  * igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate-race:
    - shard-dg2-set2:     [PASS][142] -> [SKIP][143] ([Intel XE#1392]) +2 other tests skip
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-434/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate-race.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate-race.html

  * igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate-race:
    - shard-dg2-set2:     NOTRUN -> [SKIP][144] ([Intel XE#288]) +32 other tests skip
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-434/igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate-race.html

  * igt@xe_exec_mix_modes@exec-simple-batch-store-dma-fence:
    - shard-dg2-set2:     NOTRUN -> [SKIP][145] ([Intel XE#2360])
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-463/igt@xe_exec_mix_modes@exec-simple-batch-store-dma-fence.html

  * igt@xe_exec_system_allocator@evict-malloc:
    - shard-bmg:          [PASS][146] -> [ABORT][147] ([Intel XE#3970])
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-3/igt@xe_exec_system_allocator@evict-malloc.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-1/igt@xe_exec_system_allocator@evict-malloc.html

  * igt@xe_exec_system_allocator@many-execqueues-mmap-huge-nomemset:
    - shard-bmg:          NOTRUN -> [SKIP][148] ([Intel XE#4943]) +17 other tests skip
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@xe_exec_system_allocator@many-execqueues-mmap-huge-nomemset.html

  * igt@xe_exec_system_allocator@once-mmap-free-huge-nomemset:
    - shard-lnl:          NOTRUN -> [SKIP][149] ([Intel XE#4943]) +11 other tests skip
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-3/igt@xe_exec_system_allocator@once-mmap-free-huge-nomemset.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-remap-eocheck:
    - shard-dg2-set2:     NOTRUN -> [SKIP][150] ([Intel XE#4915]) +265 other tests skip
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-435/igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-remap-eocheck.html

  * igt@xe_fault_injection@probe-fail-guc-xe_guc_ct_send_recv:
    - shard-dg2-set2:     NOTRUN -> [ABORT][151] ([Intel XE#4917])
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-434/igt@xe_fault_injection@probe-fail-guc-xe_guc_ct_send_recv.html

  * igt@xe_live_ktest@xe_eudebug:
    - shard-bmg:          NOTRUN -> [SKIP][152] ([Intel XE#2833])
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@xe_live_ktest@xe_eudebug.html

  * igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit:
    - shard-dg2-set2:     NOTRUN -> [SKIP][153] ([Intel XE#2229])
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit.html
    - shard-lnl:          NOTRUN -> [SKIP][154] ([Intel XE#2229])
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit.html

  * igt@xe_media_fill@media-fill:
    - shard-dg2-set2:     NOTRUN -> [SKIP][155] ([Intel XE#560])
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@xe_media_fill@media-fill.html

  * igt@xe_mmap@small-bar:
    - shard-bmg:          NOTRUN -> [SKIP][156] ([Intel XE#586])
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@xe_mmap@small-bar.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][157] ([Intel XE#512])
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@xe_mmap@small-bar.html
    - shard-lnl:          NOTRUN -> [SKIP][158] ([Intel XE#512])
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@xe_mmap@small-bar.html

  * igt@xe_mmap@vram:
    - shard-lnl:          NOTRUN -> [SKIP][159] ([Intel XE#1416])
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-4/igt@xe_mmap@vram.html

  * igt@xe_oa@closed-fd-and-unmapped-access:
    - shard-dg2-set2:     NOTRUN -> [SKIP][160] ([Intel XE#3573]) +9 other tests skip
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-435/igt@xe_oa@closed-fd-and-unmapped-access.html

  * igt@xe_oa@mmio-triggered-reports-read:
    - shard-dg2-set2:     NOTRUN -> [SKIP][161] ([Intel XE#5103])
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@xe_oa@mmio-triggered-reports-read.html

  * igt@xe_pat@pat-index-xehpc:
    - shard-bmg:          NOTRUN -> [SKIP][162] ([Intel XE#1420])
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-3/igt@xe_pat@pat-index-xehpc.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][163] ([Intel XE#2838] / [Intel XE#979])
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@xe_pat@pat-index-xehpc.html

  * igt@xe_pat@pat-index-xelp:
    - shard-bmg:          NOTRUN -> [SKIP][164] ([Intel XE#2245])
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@xe_pat@pat-index-xelp.html

  * igt@xe_pm@d3cold-basic:
    - shard-lnl:          NOTRUN -> [SKIP][165] ([Intel XE#2284] / [Intel XE#366]) +1 other test skip
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@xe_pm@d3cold-basic.html

  * igt@xe_pm@d3cold-basic-exec:
    - shard-dg2-set2:     NOTRUN -> [SKIP][166] ([Intel XE#2284] / [Intel XE#366]) +2 other tests skip
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@xe_pm@d3cold-basic-exec.html

  * igt@xe_pm@s2idle-d3cold-basic-exec:
    - shard-bmg:          NOTRUN -> [SKIP][167] ([Intel XE#2284]) +1 other test skip
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@xe_pm@s2idle-d3cold-basic-exec.html

  * igt@xe_pm@s3-vm-bind-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][168] ([Intel XE#584])
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-3/igt@xe_pm@s3-vm-bind-userptr.html

  * igt@xe_pmu@gt-frequency:
    - shard-dg2-set2:     [PASS][169] -> [FAIL][170] ([Intel XE#5166]) +1 other test fail
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-432/igt@xe_pmu@gt-frequency.html
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-435/igt@xe_pmu@gt-frequency.html

  * igt@xe_pxp@pxp-stale-bo-bind-post-suspend:
    - shard-dg2-set2:     NOTRUN -> [SKIP][171] ([Intel XE#4733]) +2 other tests skip
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@xe_pxp@pxp-stale-bo-bind-post-suspend.html

  * igt@xe_pxp@pxp-stale-bo-exec-post-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][172] ([Intel XE#4733]) +1 other test skip
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@xe_pxp@pxp-stale-bo-exec-post-suspend.html

  * igt@xe_query@multigpu-query-invalid-extension:
    - shard-bmg:          NOTRUN -> [SKIP][173] ([Intel XE#944]) +1 other test skip
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@xe_query@multigpu-query-invalid-extension.html

  * igt@xe_query@multigpu-query-uc-fw-version-huc:
    - shard-dg2-set2:     NOTRUN -> [SKIP][174] ([Intel XE#944])
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@xe_query@multigpu-query-uc-fw-version-huc.html
    - shard-lnl:          NOTRUN -> [SKIP][175] ([Intel XE#944])
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-7/igt@xe_query@multigpu-query-uc-fw-version-huc.html

  * igt@xe_render_copy@render-stress-4-copies:
    - shard-dg2-set2:     NOTRUN -> [SKIP][176] ([Intel XE#4814]) +1 other test skip
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-433/igt@xe_render_copy@render-stress-4-copies.html

  * igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling:
    - shard-dg2-set2:     NOTRUN -> [SKIP][177] ([Intel XE#4130]) +1 other test skip
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling.html
    - shard-lnl:          NOTRUN -> [SKIP][178] ([Intel XE#4130])
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-8/igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling.html

  
#### Possible fixes ####

  * igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p:
    - shard-bmg:          [SKIP][179] ([Intel XE#2314] / [Intel XE#2894]) -> [PASS][180] +1 other test pass
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-2/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
    - shard-bmg:          [INCOMPLETE][181] ([Intel XE#3862]) -> [PASS][182] +1 other test pass
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-1/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-2/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4:
    - shard-dg2-set2:     [INCOMPLETE][183] ([Intel XE#3862]) -> [PASS][184] +1 other test pass
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-435/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4.html
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-434/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size:
    - shard-bmg:          [SKIP][185] ([Intel XE#2291]) -> [PASS][186] +2 other tests pass
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-1/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html
    - shard-dg2-set2:     [ABORT][187] -> [PASS][188]
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-435/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-464/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset:
    - shard-bmg:          [SKIP][189] ([Intel XE#2316]) -> [PASS][190] +1 other test pass
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset.html
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset.html

  * igt@kms_flip@2x-flip-vs-suspend@bc-dp2-hdmi-a3:
    - shard-bmg:          [INCOMPLETE][191] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][192] +1 other test pass
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-1/igt@kms_flip@2x-flip-vs-suspend@bc-dp2-hdmi-a3.html
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_flip@2x-flip-vs-suspend@bc-dp2-hdmi-a3.html

  * igt@kms_flip@2x-flip-vs-suspend@bc-hdmi-a6-dp4:
    - shard-dg2-set2:     [INCOMPLETE][193] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][194] +1 other test pass
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-463/igt@kms_flip@2x-flip-vs-suspend@bc-hdmi-a6-dp4.html
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-436/igt@kms_flip@2x-flip-vs-suspend@bc-hdmi-a6-dp4.html

  * igt@kms_flip@bo-too-big-interruptible:
    - shard-bmg:          [ABORT][195] ([Intel XE#5826]) -> [PASS][196] +1 other test pass
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-4/igt@kms_flip@bo-too-big-interruptible.html
   [196]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-7/igt@kms_flip@bo-too-big-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1:
    - shard-lnl:          [FAIL][197] ([Intel XE#301]) -> [PASS][198] +2 other tests pass
   [197]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html
   [198]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html

  * igt@kms_joiner@basic-force-big-joiner:
    - shard-bmg:          [SKIP][199] ([Intel XE#3012]) -> [PASS][200]
   [199]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-6/igt@kms_joiner@basic-force-big-joiner.html
   [200]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@kms_joiner@basic-force-big-joiner.html

  * igt@kms_pm_dc@dc5-dpms:
    - shard-lnl:          [FAIL][201] ([Intel XE#718]) -> [PASS][202]
   [201]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-lnl-1/igt@kms_pm_dc@dc5-dpms.html
   [202]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-7/igt@kms_pm_dc@dc5-dpms.html

  * igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap:
    - shard-dg2-set2:     [SKIP][203] ([Intel XE#1392]) -> [PASS][204] +5 other tests pass
   [203]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-432/igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap.html
   [204]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-466/igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap.html

  * igt@xe_exec_system_allocator@process-many-large-mmap-remap-dontunmap:
    - shard-bmg:          [ABORT][205] -> [PASS][206]
   [205]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-1/igt@xe_exec_system_allocator@process-many-large-mmap-remap-dontunmap.html
   [206]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-5/igt@xe_exec_system_allocator@process-many-large-mmap-remap-dontunmap.html

  * igt@xe_exec_system_allocator@threads-many-large-malloc-bo-unmap:
    - shard-bmg:          [FAIL][207] -> [PASS][208]
   [207]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-7/igt@xe_exec_system_allocator@threads-many-large-malloc-bo-unmap.html
   [208]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@xe_exec_system_allocator@threads-many-large-malloc-bo-unmap.html

  * igt@xe_pm@s3-mocs:
    - shard-bmg:          [DMESG-FAIL][209] ([Intel XE#5545]) -> [PASS][210]
   [209]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-1/igt@xe_pm@s3-mocs.html
   [210]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@xe_pm@s3-mocs.html

  
#### Warnings ####

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs:
    - shard-dg2-set2:     [INCOMPLETE][211] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124] / [Intel XE#4345]) -> [INCOMPLETE][212] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345])
   [211]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
   [212]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
    - shard-dg2-set2:     [INCOMPLETE][213] ([Intel XE#2705] / [Intel XE#4212]) -> [INCOMPLETE][214] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4522])
   [213]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
   [214]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-lnl:          [FAIL][215] ([Intel XE#301] / [Intel XE#3149]) -> [FAIL][216] ([Intel XE#301])
   [215]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [216]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][217] ([Intel XE#5390]) -> [SKIP][218] ([Intel XE#2312]) +2 other tests skip
   [217]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html
   [218]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render:
    - shard-bmg:          [SKIP][219] ([Intel XE#2312]) -> [SKIP][220] ([Intel XE#5390]) +6 other tests skip
   [219]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html
   [220]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render:
    - shard-bmg:          [SKIP][221] ([Intel XE#2311]) -> [SKIP][222] ([Intel XE#2312]) +8 other tests skip
   [221]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render.html
   [222]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][223] ([Intel XE#2312]) -> [SKIP][224] ([Intel XE#2311]) +5 other tests skip
   [223]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html
   [224]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][225] ([Intel XE#2313]) -> [SKIP][226] ([Intel XE#2312]) +7 other tests skip
   [225]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc.html
   [226]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen:
    - shard-bmg:          [SKIP][227] ([Intel XE#2312]) -> [SKIP][228] ([Intel XE#2313]) +10 other tests skip
   [227]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen.html
   [228]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-1/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-bmg:          [SKIP][229] ([Intel XE#2509]) -> [SKIP][230] ([Intel XE#2426])
   [229]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8494/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [230]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/shard-bmg-6/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [Intel XE#1122]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1122
  [Intel XE#1123]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1123
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1126]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1126
  [Intel XE#1127]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1127
  [Intel XE#1128]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1128
  [Intel XE#1135]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1135
  [Intel XE#1138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1138
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1280]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1280
  [Intel XE#1340]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1340
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1401]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1401
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
  [Intel XE#1416]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1416
  [Intel XE#1420]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1420
  [Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
  [Intel XE#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
  [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
  [Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
  [Intel XE#1475]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1475
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#2245]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2245
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2293
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
  [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2330
  [Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2360
  [Intel XE#2380]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2380
  [Intel XE#2387]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2387
  [Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
  [Intel XE#2413]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2413
  [Intel XE#2414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2414
  [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
  [Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2705
  [Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
  [Intel XE#2833]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2833
  [Intel XE#2838]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2838
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2893
  [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
  [Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
  [Intel XE#2927]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2927
  [Intel XE#2939]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2939
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#3012]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3012
  [Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
  [Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#3124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3124
  [Intel XE#3141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3141
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#3278]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3278
  [Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#3658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3658
  [Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#3862]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3862
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#3970]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3970
  [Intel XE#4090]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4090
  [Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
  [Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
  [Intel XE#4329]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4329
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4416]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4416
  [Intel XE#4422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4422
  [Intel XE#4494]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4494
  [Intel XE#4518]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4518
  [Intel XE#4522]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4522
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4608]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4608
  [Intel XE#4609]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4609
  [Intel XE#4665]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4665
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4814]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4814
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
  [Intel XE#4917]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4917
  [Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
  [Intel XE#5007]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5007
  [Intel XE#5103]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5103
  [Intel XE#512]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/512
  [Intel XE#5166]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5166
  [Intel XE#5191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5191
  [Intel XE#5195]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5195
  [Intel XE#5390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5390
  [Intel XE#5427]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5427
  [Intel XE#5545]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5545
  [Intel XE#560]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/560
  [Intel XE#5626]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5626
  [Intel XE#5672]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5672
  [Intel XE#5826]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5826
  [Intel XE#584]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/584
  [Intel XE#586]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/586
  [Intel XE#5890]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5890
  [Intel XE#5899]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5899
  [Intel XE#607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/607
  [Intel XE#616]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/616
  [Intel XE#619]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/619
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#664]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/664
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/718
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836
  [Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
  [Intel XE#979]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/979


Build changes
-------------

  * IGT: IGT_8494 -> IGTPW_13586
  * Linux: xe-3545-7f1ecbbddf3bf50bf5338e86514bf77c32eb4edb -> xe-3549-90b26f76462c96e29198988df41d6bd86d92c656

  IGTPW_13586: 12c4cafd059541b6bd4dd2e4347bafda874323dd @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_8494: 8494
  xe-3545-7f1ecbbddf3bf50bf5338e86514bf77c32eb4edb: 7f1ecbbddf3bf50bf5338e86514bf77c32eb4edb
  xe-3549-90b26f76462c96e29198988df41d6bd86d92c656: 90b26f76462c96e29198988df41d6bd86d92c656

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_13586/index.html

[-- Attachment #2: Type: text/html, Size: 91879 bytes --]

^ permalink raw reply	[flat|nested] 49+ messages in thread

* ✗ i915.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev10)
  2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (32 preceding siblings ...)
  2025-08-15  6:34 ` ✗ Xe.CI.Full: failure " Patchwork
@ 2025-08-15 17:06 ` Patchwork
  33 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-08-15 17:06 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 198076 bytes --]

== Series Details ==

Series: IGT tests for the KMS Color Pipeline API (rev10)
URL   : https://patchwork.freedesktop.org/series/123448/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_17004_full -> IGTPW_13586_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with IGTPW_13586_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in IGTPW_13586_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_13586/index.html

Participating hosts (13 -> 12)
------------------------------

  Missing    (1): shard-dg2-set2 

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in IGTPW_13586_full:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_enc (NEW):
    - shard-tglu:         NOTRUN -> [SKIP][1] +45 other tests skip
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_enc.html

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf (NEW):
    - shard-dg2-9:        NOTRUN -> [SKIP][2] +3 other tests skip
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf.html

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf-srgb_eotf (NEW):
    - shard-rkl:          NOTRUN -> [SKIP][3] +37 other tests skip
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf-srgb_eotf.html

  * igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf (NEW):
    - shard-dg1:          NOTRUN -> [SKIP][4] +49 other tests skip
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf.html

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_dec (NEW):
    - shard-mtlp:         NOTRUN -> [SKIP][5] +47 other tests skip
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_dec.html

  * igt@kms_colorop@plane-xr30-xr30-srgb_inv_eotf (NEW):
    - shard-dg2:          NOTRUN -> [SKIP][6] +41 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_colorop@plane-xr30-xr30-srgb_inv_eotf.html

  * igt@kms_fb_coherency@memset-crc:
    - shard-dg2:          [PASS][7] -> [CRASH][8] +1 other test crash
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-5/igt@kms_fb_coherency@memset-crc.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-5/igt@kms_fb_coherency@memset-crc.html

  * igt@kms_fb_coherency@memset-crc@mmap-gtt:
    - shard-rkl:          [PASS][9] -> [CRASH][10] +1 other test crash
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-4/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
    - shard-snb:          [PASS][11] -> [CRASH][12] +1 other test crash
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-snb5/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-snb5/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
    - shard-tglu:         [PASS][13] -> [CRASH][14] +1 other test crash
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-tglu-10/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@kms_fb_coherency@memset-crc@mmap-gtt.html

  * igt@kms_fb_coherency@memset-crc@mmap-offset-fixed:
    - shard-dg1:          [PASS][15] -> [CRASH][16] +1 other test crash
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-14/igt@kms_fb_coherency@memset-crc@mmap-offset-fixed.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@kms_fb_coherency@memset-crc@mmap-offset-fixed.html

  * igt@kms_fb_coherency@memset-crc@mmap-offset-wc:
    - shard-mtlp:         [PASS][17] -> [CRASH][18] +1 other test crash
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-mtlp-7/igt@kms_fb_coherency@memset-crc@mmap-offset-wc.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-2/igt@kms_fb_coherency@memset-crc@mmap-offset-wc.html

  * igt@runner@aborted:
    - shard-glk:          NOTRUN -> [FAIL][19]
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk8/igt@runner@aborted.html

  
New tests
---------

  New tests have been introduced between CI_DRM_17004_full and IGTPW_13586_full:

### New IGT tests (86) ###

  * igt@kms_colorop@check_plane_colorop_ids:
    - Statuses : 6 pass(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-3dlut_17_12_rgb:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bt2020_inv_oetf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bt2020_inv_oetf-bt2020_oetf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bt2020_oetf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bypass:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_50_desat:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_dec:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_dec_enc:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_enc:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_bt709_enc_dec:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_overdrive:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_oversaturate:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-multiply_125:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-multiply_inv_125:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_eotf:
    - Statuses : 4 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_eotf-pq_125_inv_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_eotf-pq_125_inv_eotf-pq_125_eotf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_inv_eotf:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_eotf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_eotf-pq_inv_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_inv_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf-srgb_eotf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_inv_eotf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_inv_eotf_lut:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-srgb_inv_eotf_lut-srgb_eotf_lut:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr30-xr30-3dlut_17_12_rgb:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf-bt2020_oetf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-bt2020_oetf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-bypass:
    - Statuses : 4 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_50_desat:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_dec:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_dec_enc:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_enc:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_enc_dec:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_overdrive:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_oversaturate:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-multiply_125:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-multiply_inv_125:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_125_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_125_eotf-pq_125_inv_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_125_eotf-pq_125_inv_eotf-pq_125_eotf:
    - Statuses :
    - Exec time: [None] s

  * igt@kms_colorop@plane-xr30-xr30-pq_125_inv_eotf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_eotf-pq_inv_eotf:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_inv_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_eotf:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_eotf-srgb_inv_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_eotf-srgb_inv_eotf-srgb_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_inv_eotf:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_inv_eotf_lut:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_inv_eotf_lut-srgb_eotf_lut:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@kms_properties@colorop-properties-atomic:
    - Statuses : 4 pass(s)
    - Exec time: [0.23, 0.44] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.13] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.06] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.12] s

  * igt@kms_properties@colorop-properties-atomic@pipe-a-hdmi-a-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.10] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.21] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.07] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.12] s

  * igt@kms_properties@colorop-properties-atomic@pipe-b-hdmi-a-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.11] s

  * igt@kms_properties@colorop-properties-atomic@pipe-c-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.09] s

  * igt@kms_properties@colorop-properties-atomic@pipe-c-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.10] s

  * igt@kms_properties@colorop-properties-atomic@pipe-c-hdmi-a-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.11] s

  * igt@kms_properties@colorop-properties-atomic@pipe-d-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.09] s

  * igt@kms_properties@colorop-properties-atomic@pipe-d-hdmi-a-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.10] s

  * igt@kms_properties@colorop-properties-legacy:
    - Statuses : 5 pass(s)
    - Exec time: [0.33, 3.46] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-dp-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.14] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.34] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-hdmi-a-1:
    - Statuses : 2 pass(s)
    - Exec time: [0.07, 0.13] s

  * igt@kms_properties@colorop-properties-legacy@pipe-a-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.10] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-dp-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.20] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.06] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-hdmi-a-1:
    - Statuses : 2 pass(s)
    - Exec time: [0.09, 0.20] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.09] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-dp-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.20] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.02] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.11] s

  * igt@kms_properties@colorop-properties-legacy@pipe-c-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.12] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-dp-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.18] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.03] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.13] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.11] s

  

Known issues
------------

  Here are the changes found in IGTPW_13586_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@api_intel_bb@blit-reloc-keep-cache:
    - shard-rkl:          NOTRUN -> [SKIP][20] ([i915#14544] / [i915#8411])
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@api_intel_bb@blit-reloc-keep-cache.html

  * igt@api_intel_bb@blit-reloc-purge-cache:
    - shard-dg1:          NOTRUN -> [SKIP][21] ([i915#8411]) +2 other tests skip
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-17/igt@api_intel_bb@blit-reloc-purge-cache.html

  * igt@api_intel_bb@object-reloc-purge-cache:
    - shard-mtlp:         NOTRUN -> [SKIP][22] ([i915#8411]) +2 other tests skip
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-2/igt@api_intel_bb@object-reloc-purge-cache.html
    - shard-dg2:          NOTRUN -> [SKIP][23] ([i915#8411]) +2 other tests skip
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-5/igt@api_intel_bb@object-reloc-purge-cache.html
    - shard-rkl:          NOTRUN -> [SKIP][24] ([i915#8411]) +1 other test skip
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@api_intel_bb@object-reloc-purge-cache.html

  * igt@core_hotunplug@unbind-rebind:
    - shard-mtlp:         [PASS][25] -> [ABORT][26] ([i915#14804])
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-mtlp-6/igt@core_hotunplug@unbind-rebind.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@core_hotunplug@unbind-rebind.html

  * igt@device_reset@unbind-cold-reset-rebind:
    - shard-dg2-9:        NOTRUN -> [SKIP][27] ([i915#11078])
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@device_reset@unbind-cold-reset-rebind.html

  * igt@fbdev@unaligned-read:
    - shard-rkl:          [PASS][28] -> [SKIP][29] ([i915#14544] / [i915#2582]) +1 other test skip
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@fbdev@unaligned-read.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@fbdev@unaligned-read.html

  * igt@gem_basic@multigpu-create-close:
    - shard-dg2-9:        NOTRUN -> [SKIP][30] ([i915#7697])
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_basic@multigpu-create-close.html

  * igt@gem_ccs@large-ctrl-surf-copy:
    - shard-tglu:         NOTRUN -> [SKIP][31] ([i915#13008])
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@gem_ccs@large-ctrl-surf-copy.html

  * igt@gem_ccs@suspend-resume:
    - shard-tglu:         NOTRUN -> [SKIP][32] ([i915#9323])
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@gem_ccs@suspend-resume.html

  * igt@gem_create@create-ext-cpu-access-big:
    - shard-dg2:          NOTRUN -> [ABORT][33] ([i915#13427])
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-5/igt@gem_create@create-ext-cpu-access-big.html
    - shard-rkl:          NOTRUN -> [SKIP][34] ([i915#6335])
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@gem_create@create-ext-cpu-access-big.html

  * igt@gem_create@create-ext-set-pat:
    - shard-dg2-9:        NOTRUN -> [SKIP][35] ([i915#8562])
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_create@create-ext-set-pat.html
    - shard-rkl:          NOTRUN -> [SKIP][36] ([i915#14544] / [i915#8562])
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_create@create-ext-set-pat.html
    - shard-dg1:          NOTRUN -> [SKIP][37] ([i915#8562])
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@gem_create@create-ext-set-pat.html
    - shard-tglu:         NOTRUN -> [SKIP][38] ([i915#8562])
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-3/igt@gem_create@create-ext-set-pat.html

  * igt@gem_ctx_isolation@preservation-s3:
    - shard-rkl:          [PASS][39] -> [INCOMPLETE][40] ([i915#12353]) +1 other test incomplete
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@gem_ctx_isolation@preservation-s3.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-3/igt@gem_ctx_isolation@preservation-s3.html

  * igt@gem_ctx_isolation@preservation-s3@bcs0:
    - shard-glk:          NOTRUN -> [INCOMPLETE][41] ([i915#12353]) +1 other test incomplete
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk6/igt@gem_ctx_isolation@preservation-s3@bcs0.html

  * igt@gem_ctx_persistence@hang:
    - shard-dg2-9:        NOTRUN -> [SKIP][42] ([i915#8555])
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_ctx_persistence@hang.html

  * igt@gem_ctx_persistence@heartbeat-hang:
    - shard-dg2:          NOTRUN -> [SKIP][43] ([i915#8555]) +1 other test skip
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@gem_ctx_persistence@heartbeat-hang.html

  * igt@gem_ctx_persistence@heartbeat-many:
    - shard-dg1:          NOTRUN -> [SKIP][44] ([i915#8555]) +1 other test skip
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-18/igt@gem_ctx_persistence@heartbeat-many.html
    - shard-mtlp:         NOTRUN -> [SKIP][45] ([i915#8555]) +1 other test skip
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@gem_ctx_persistence@heartbeat-many.html

  * igt@gem_ctx_persistence@legacy-engines-cleanup:
    - shard-snb:          NOTRUN -> [SKIP][46] ([i915#1099])
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-snb4/igt@gem_ctx_persistence@legacy-engines-cleanup.html

  * igt@gem_ctx_sseu@engines:
    - shard-tglu:         NOTRUN -> [SKIP][47] ([i915#280])
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@gem_ctx_sseu@engines.html
    - shard-dg2:          NOTRUN -> [SKIP][48] ([i915#280])
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-5/igt@gem_ctx_sseu@engines.html

  * igt@gem_ctx_sseu@mmap-args:
    - shard-dg2-9:        NOTRUN -> [SKIP][49] ([i915#280])
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_ctx_sseu@mmap-args.html

  * igt@gem_eio@kms:
    - shard-dg1:          [PASS][50] -> [FAIL][51] ([i915#5784])
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-14/igt@gem_eio@kms.html
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@gem_eio@kms.html

  * igt@gem_exec_balancer@bonded-false-hang:
    - shard-dg2:          NOTRUN -> [SKIP][52] ([i915#4812]) +1 other test skip
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-7/igt@gem_exec_balancer@bonded-false-hang.html
    - shard-dg1:          NOTRUN -> [SKIP][53] ([i915#4812])
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@gem_exec_balancer@bonded-false-hang.html
    - shard-mtlp:         NOTRUN -> [SKIP][54] ([i915#4812])
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-2/igt@gem_exec_balancer@bonded-false-hang.html

  * igt@gem_exec_balancer@bonded-pair:
    - shard-dg2-9:        NOTRUN -> [SKIP][55] ([i915#4771])
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_exec_balancer@bonded-pair.html

  * igt@gem_exec_balancer@parallel-keep-in-fence:
    - shard-rkl:          NOTRUN -> [SKIP][56] ([i915#4525])
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@gem_exec_balancer@parallel-keep-in-fence.html

  * igt@gem_exec_balancer@parallel-out-fence:
    - shard-tglu:         NOTRUN -> [SKIP][57] ([i915#4525]) +1 other test skip
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-7/igt@gem_exec_balancer@parallel-out-fence.html

  * igt@gem_exec_big@single:
    - shard-tglu:         [PASS][58] -> [ABORT][59] ([i915#11713] / [i915#14756])
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-tglu-7/igt@gem_exec_big@single.html
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-10/igt@gem_exec_big@single.html

  * igt@gem_exec_capture@capture:
    - shard-mtlp:         NOTRUN -> [FAIL][60] ([i915#11965]) +1 other test fail
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-4/igt@gem_exec_capture@capture.html

  * igt@gem_exec_capture@capture-invisible:
    - shard-dg1:          NOTRUN -> [SKIP][61] ([i915#6334]) +2 other tests skip
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@gem_exec_capture@capture-invisible.html

  * igt@gem_exec_capture@capture@vecs0-lmem0:
    - shard-dg2:          NOTRUN -> [FAIL][62] ([i915#11965]) +4 other tests fail
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@gem_exec_capture@capture@vecs0-lmem0.html
    - shard-dg1:          NOTRUN -> [FAIL][63] ([i915#11965]) +2 other tests fail
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-16/igt@gem_exec_capture@capture@vecs0-lmem0.html

  * igt@gem_exec_flush@basic-batch-kernel-default-uc:
    - shard-dg2:          NOTRUN -> [SKIP][64] ([i915#3539] / [i915#4852]) +2 other tests skip
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@gem_exec_flush@basic-batch-kernel-default-uc.html

  * igt@gem_exec_flush@basic-wb-rw-before-default:
    - shard-dg1:          NOTRUN -> [SKIP][65] ([i915#3539] / [i915#4852])
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-16/igt@gem_exec_flush@basic-wb-rw-before-default.html

  * igt@gem_exec_params@secure-non-master:
    - shard-dg2:          NOTRUN -> [SKIP][66] +10 other tests skip
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@gem_exec_params@secure-non-master.html

  * igt@gem_exec_reloc@basic-cpu-active:
    - shard-mtlp:         NOTRUN -> [SKIP][67] ([i915#3281]) +7 other tests skip
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-4/igt@gem_exec_reloc@basic-cpu-active.html

  * igt@gem_exec_reloc@basic-cpu-gtt-noreloc:
    - shard-dg2:          NOTRUN -> [SKIP][68] ([i915#3281]) +13 other tests skip
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@gem_exec_reloc@basic-cpu-gtt-noreloc.html

  * igt@gem_exec_reloc@basic-range:
    - shard-dg2-9:        NOTRUN -> [SKIP][69] ([i915#3281]) +1 other test skip
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_exec_reloc@basic-range.html

  * igt@gem_exec_reloc@basic-scanout:
    - shard-rkl:          NOTRUN -> [SKIP][70] ([i915#14544] / [i915#3281]) +1 other test skip
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_exec_reloc@basic-scanout.html

  * igt@gem_exec_reloc@basic-write-gtt-active:
    - shard-dg1:          NOTRUN -> [SKIP][71] ([i915#3281]) +7 other tests skip
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@gem_exec_reloc@basic-write-gtt-active.html

  * igt@gem_exec_reloc@basic-write-read-noreloc:
    - shard-rkl:          NOTRUN -> [SKIP][72] ([i915#3281]) +5 other tests skip
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@gem_exec_reloc@basic-write-read-noreloc.html

  * igt@gem_exec_schedule@reorder-wide:
    - shard-dg2:          NOTRUN -> [SKIP][73] ([i915#4537] / [i915#4812]) +1 other test skip
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-11/igt@gem_exec_schedule@reorder-wide.html

  * igt@gem_exec_suspend@basic-s3:
    - shard-rkl:          NOTRUN -> [INCOMPLETE][74] ([i915#13304]) +1 other test incomplete
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@gem_exec_suspend@basic-s3.html
    - shard-glk11:        NOTRUN -> [INCOMPLETE][75] ([i915#11441] / [i915#13196]) +1 other test incomplete
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk11/igt@gem_exec_suspend@basic-s3.html

  * igt@gem_fenced_exec_thrash@no-spare-fences:
    - shard-dg2:          NOTRUN -> [SKIP][76] ([i915#4860]) +1 other test skip
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-8/igt@gem_fenced_exec_thrash@no-spare-fences.html

  * igt@gem_fenced_exec_thrash@no-spare-fences-busy:
    - shard-dg1:          NOTRUN -> [SKIP][77] ([i915#4860]) +1 other test skip
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-18/igt@gem_fenced_exec_thrash@no-spare-fences-busy.html
    - shard-mtlp:         NOTRUN -> [SKIP][78] ([i915#4860])
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-2/igt@gem_fenced_exec_thrash@no-spare-fences-busy.html

  * igt@gem_lmem_swapping@heavy-multi:
    - shard-rkl:          NOTRUN -> [SKIP][79] ([i915#4613])
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@gem_lmem_swapping@heavy-multi.html

  * igt@gem_lmem_swapping@heavy-random:
    - shard-glk:          NOTRUN -> [SKIP][80] ([i915#4613]) +3 other tests skip
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk6/igt@gem_lmem_swapping@heavy-random.html

  * igt@gem_lmem_swapping@parallel-multi:
    - shard-rkl:          NOTRUN -> [SKIP][81] ([i915#14544] / [i915#4613])
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_lmem_swapping@parallel-multi.html
    - shard-mtlp:         NOTRUN -> [SKIP][82] ([i915#4613]) +1 other test skip
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@gem_lmem_swapping@parallel-multi.html

  * igt@gem_lmem_swapping@smem-oom:
    - shard-tglu:         NOTRUN -> [SKIP][83] ([i915#4613]) +3 other tests skip
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@gem_lmem_swapping@smem-oom.html

  * igt@gem_media_fill@media-fill:
    - shard-mtlp:         NOTRUN -> [SKIP][84] ([i915#8289])
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-6/igt@gem_media_fill@media-fill.html
    - shard-dg2:          NOTRUN -> [SKIP][85] ([i915#8289])
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@gem_media_fill@media-fill.html

  * igt@gem_mmap@short-mmap:
    - shard-mtlp:         NOTRUN -> [SKIP][86] ([i915#4083])
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@gem_mmap@short-mmap.html

  * igt@gem_mmap_gtt@bad-object:
    - shard-dg2:          NOTRUN -> [SKIP][87] ([i915#4077]) +9 other tests skip
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@gem_mmap_gtt@bad-object.html

  * igt@gem_mmap_gtt@basic-write-gtt:
    - shard-dg2-9:        NOTRUN -> [SKIP][88] ([i915#4077]) +4 other tests skip
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_mmap_gtt@basic-write-gtt.html

  * igt@gem_mmap_gtt@coherency:
    - shard-glk11:        NOTRUN -> [SKIP][89] +206 other tests skip
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk11/igt@gem_mmap_gtt@coherency.html

  * igt@gem_mmap_gtt@cpuset-basic-small-copy-odd:
    - shard-dg1:          NOTRUN -> [SKIP][90] ([i915#4077])
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-18/igt@gem_mmap_gtt@cpuset-basic-small-copy-odd.html
    - shard-mtlp:         NOTRUN -> [SKIP][91] ([i915#4077]) +1 other test skip
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-6/igt@gem_mmap_gtt@cpuset-basic-small-copy-odd.html

  * igt@gem_mmap_offset@open-flood:
    - shard-rkl:          [PASS][92] -> [DMESG-WARN][93] ([i915#12964] / [i915#14602])
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@gem_mmap_offset@open-flood.html
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@gem_mmap_offset@open-flood.html

  * igt@gem_mmap_wc@coherency:
    - shard-dg2-9:        NOTRUN -> [SKIP][94] ([i915#4083]) +2 other tests skip
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_mmap_wc@coherency.html

  * igt@gem_mmap_wc@fault-concurrent:
    - shard-dg2:          NOTRUN -> [SKIP][95] ([i915#4083]) +8 other tests skip
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@gem_mmap_wc@fault-concurrent.html

  * igt@gem_mmap_wc@read:
    - shard-dg1:          NOTRUN -> [SKIP][96] ([i915#4083]) +2 other tests skip
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@gem_mmap_wc@read.html

  * igt@gem_mmap_wc@set-cache-level:
    - shard-rkl:          [PASS][97] -> [SKIP][98] ([i915#14544] / [i915#1850])
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@gem_mmap_wc@set-cache-level.html
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_mmap_wc@set-cache-level.html

  * igt@gem_partial_pwrite_pread@reads-uncached:
    - shard-dg2:          NOTRUN -> [SKIP][99] ([i915#3282]) +10 other tests skip
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@gem_partial_pwrite_pread@reads-uncached.html

  * igt@gem_partial_pwrite_pread@write-uncached:
    - shard-mtlp:         NOTRUN -> [SKIP][100] ([i915#3282]) +1 other test skip
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-3/igt@gem_partial_pwrite_pread@write-uncached.html

  * igt@gem_partial_pwrite_pread@writes-after-reads-uncached:
    - shard-rkl:          NOTRUN -> [SKIP][101] ([i915#3282]) +5 other tests skip
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@gem_partial_pwrite_pread@writes-after-reads-uncached.html
    - shard-dg1:          NOTRUN -> [SKIP][102] ([i915#3282]) +4 other tests skip
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@gem_partial_pwrite_pread@writes-after-reads-uncached.html

  * igt@gem_pread@exhaustion:
    - shard-glk:          NOTRUN -> [WARN][103] ([i915#2658])
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk9/igt@gem_pread@exhaustion.html

  * igt@gem_pwrite@basic-exhaustion:
    - shard-tglu:         NOTRUN -> [WARN][104] ([i915#2658])
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-5/igt@gem_pwrite@basic-exhaustion.html

  * igt@gem_pwrite@basic-self:
    - shard-dg2-9:        NOTRUN -> [SKIP][105] ([i915#3282])
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_pwrite@basic-self.html

  * igt@gem_pxp@display-protected-crc:
    - shard-rkl:          NOTRUN -> [TIMEOUT][106] ([i915#12917] / [i915#12964]) +3 other tests timeout
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_pxp@display-protected-crc.html

  * igt@gem_pxp@reject-modify-context-protection-on:
    - shard-rkl:          [PASS][107] -> [SKIP][108] ([i915#4270])
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@gem_pxp@reject-modify-context-protection-on.html
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@gem_pxp@reject-modify-context-protection-on.html

  * igt@gem_pxp@verify-pxp-execution-after-suspend-resume:
    - shard-dg2:          NOTRUN -> [SKIP][109] ([i915#4270]) +3 other tests skip
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@gem_pxp@verify-pxp-execution-after-suspend-resume.html

  * igt@gem_pxp@verify-pxp-stale-ctx-execution:
    - shard-dg1:          NOTRUN -> [SKIP][110] ([i915#4270]) +4 other tests skip
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@gem_pxp@verify-pxp-stale-ctx-execution.html

  * igt@gem_render_copy@y-tiled-ccs-to-x-tiled:
    - shard-dg2-9:        NOTRUN -> [SKIP][111] ([i915#5190] / [i915#8428]) +1 other test skip
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_render_copy@y-tiled-ccs-to-x-tiled.html

  * igt@gem_render_copy@yf-tiled-mc-ccs-to-vebox-y-tiled:
    - shard-dg2:          NOTRUN -> [SKIP][112] ([i915#5190] / [i915#8428]) +7 other tests skip
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@gem_render_copy@yf-tiled-mc-ccs-to-vebox-y-tiled.html

  * igt@gem_render_copy@yf-tiled-mc-ccs-to-vebox-yf-tiled:
    - shard-mtlp:         NOTRUN -> [SKIP][113] ([i915#8428]) +7 other tests skip
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@gem_render_copy@yf-tiled-mc-ccs-to-vebox-yf-tiled.html

  * igt@gem_tiled_pread_pwrite:
    - shard-dg2:          NOTRUN -> [SKIP][114] ([i915#4079])
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-8/igt@gem_tiled_pread_pwrite.html

  * igt@gem_userptr_blits@coherency-unsync:
    - shard-tglu-1:       NOTRUN -> [SKIP][115] ([i915#3297])
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-1/igt@gem_userptr_blits@coherency-unsync.html

  * igt@gem_userptr_blits@create-destroy-unsync:
    - shard-dg2:          NOTRUN -> [SKIP][116] ([i915#3297]) +2 other tests skip
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-11/igt@gem_userptr_blits@create-destroy-unsync.html
    - shard-dg1:          NOTRUN -> [SKIP][117] ([i915#3297]) +1 other test skip
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@gem_userptr_blits@create-destroy-unsync.html
    - shard-tglu:         NOTRUN -> [SKIP][118] ([i915#3297]) +4 other tests skip
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@gem_userptr_blits@create-destroy-unsync.html

  * igt@gem_userptr_blits@dmabuf-sync:
    - shard-tglu:         NOTRUN -> [SKIP][119] ([i915#3297] / [i915#3323])
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@gem_userptr_blits@dmabuf-sync.html

  * igt@gem_userptr_blits@forbidden-operations:
    - shard-dg2:          NOTRUN -> [SKIP][120] ([i915#3282] / [i915#3297])
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@gem_userptr_blits@forbidden-operations.html

  * igt@gem_userptr_blits@map-fixed-invalidate-busy:
    - shard-mtlp:         NOTRUN -> [SKIP][121] ([i915#3297]) +1 other test skip
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@gem_userptr_blits@map-fixed-invalidate-busy.html
    - shard-dg2-9:        NOTRUN -> [SKIP][122] ([i915#3297] / [i915#4880])
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gem_userptr_blits@map-fixed-invalidate-busy.html
    - shard-dg1:          NOTRUN -> [SKIP][123] ([i915#3297] / [i915#4880])
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@gem_userptr_blits@map-fixed-invalidate-busy.html

  * igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy:
    - shard-dg2:          NOTRUN -> [SKIP][124] ([i915#3297] / [i915#4880])
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-8/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html

  * igt@gem_userptr_blits@readonly-unsync:
    - shard-rkl:          NOTRUN -> [SKIP][125] ([i915#3297]) +1 other test skip
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@gem_userptr_blits@readonly-unsync.html

  * igt@gem_userptr_blits@relocations:
    - shard-rkl:          NOTRUN -> [SKIP][126] ([i915#3281] / [i915#3297])
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@gem_userptr_blits@relocations.html

  * igt@gem_userptr_blits@sd-probe:
    - shard-dg2:          NOTRUN -> [SKIP][127] ([i915#3297] / [i915#4958])
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@gem_userptr_blits@sd-probe.html

  * igt@gen9_exec_parse@bb-large:
    - shard-dg1:          NOTRUN -> [SKIP][128] ([i915#2527]) +2 other tests skip
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@gen9_exec_parse@bb-large.html
    - shard-glk10:        NOTRUN -> [FAIL][129] ([i915#14806])
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk10/igt@gen9_exec_parse@bb-large.html

  * igt@gen9_exec_parse@bb-oversize:
    - shard-dg2-9:        NOTRUN -> [SKIP][130] ([i915#2856]) +1 other test skip
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@gen9_exec_parse@bb-oversize.html

  * igt@gen9_exec_parse@bb-start-param:
    - shard-dg2:          NOTRUN -> [SKIP][131] ([i915#2856]) +4 other tests skip
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-8/igt@gen9_exec_parse@bb-start-param.html
    - shard-rkl:          NOTRUN -> [SKIP][132] ([i915#2527]) +3 other tests skip
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@gen9_exec_parse@bb-start-param.html

  * igt@gen9_exec_parse@cmd-crossing-page:
    - shard-tglu:         NOTRUN -> [SKIP][133] ([i915#2527] / [i915#2856]) +3 other tests skip
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-7/igt@gen9_exec_parse@cmd-crossing-page.html
    - shard-mtlp:         NOTRUN -> [SKIP][134] ([i915#2856]) +2 other tests skip
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@gen9_exec_parse@cmd-crossing-page.html

  * igt@gen9_exec_parse@secure-batches:
    - shard-rkl:          NOTRUN -> [SKIP][135] ([i915#14544] / [i915#2527])
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gen9_exec_parse@secure-batches.html

  * igt@i915_drm_fdinfo@all-busy-idle-check-all:
    - shard-dg2-9:        NOTRUN -> [SKIP][136] ([i915#14123])
   [136]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@i915_drm_fdinfo@all-busy-idle-check-all.html
    - shard-dg1:          NOTRUN -> [SKIP][137] ([i915#14123])
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@i915_drm_fdinfo@all-busy-idle-check-all.html
    - shard-mtlp:         NOTRUN -> [SKIP][138] ([i915#14123])
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-6/igt@i915_drm_fdinfo@all-busy-idle-check-all.html

  * igt@i915_drm_fdinfo@busy-hang@rcs0:
    - shard-dg2:          NOTRUN -> [SKIP][139] ([i915#14073]) +23 other tests skip
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@i915_drm_fdinfo@busy-hang@rcs0.html

  * igt@i915_drm_fdinfo@busy-idle-check-all@ccs0:
    - shard-dg2:          NOTRUN -> [SKIP][140] ([i915#11527]) +7 other tests skip
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@i915_drm_fdinfo@busy-idle-check-all@ccs0.html

  * igt@i915_drm_fdinfo@busy@bcs0:
    - shard-mtlp:         NOTRUN -> [SKIP][141] ([i915#14073]) +6 other tests skip
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@i915_drm_fdinfo@busy@bcs0.html

  * igt@i915_drm_fdinfo@busy@rcs0:
    - shard-dg1:          NOTRUN -> [SKIP][142] ([i915#14073]) +5 other tests skip
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@i915_drm_fdinfo@busy@rcs0.html

  * igt@i915_drm_fdinfo@virtual-busy-hang-all:
    - shard-dg2-9:        NOTRUN -> [SKIP][143] ([i915#14118])
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@i915_drm_fdinfo@virtual-busy-hang-all.html

  * igt@i915_drm_fdinfo@virtual-busy-idle:
    - shard-dg1:          NOTRUN -> [SKIP][144] ([i915#14118])
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-17/igt@i915_drm_fdinfo@virtual-busy-idle.html

  * igt@i915_module_load@load:
    - shard-glk:          ([PASS][145], [PASS][146], [PASS][147], [PASS][148], [PASS][149], [PASS][150], [PASS][151], [PASS][152], [PASS][153], [PASS][154], [PASS][155], [PASS][156], [PASS][157], [PASS][158], [PASS][159], [PASS][160]) -> ([PASS][161], [PASS][162], [PASS][163], [PASS][164], [PASS][165], [PASS][166], [PASS][167], [PASS][168], [DMESG-WARN][169], [PASS][170], [PASS][171], [PASS][172], [PASS][173], [PASS][174], [PASS][175], [PASS][176]) ([i915#14804])
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk1/igt@i915_module_load@load.html
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk1/igt@i915_module_load@load.html
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk1/igt@i915_module_load@load.html
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk5/igt@i915_module_load@load.html
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk5/igt@i915_module_load@load.html
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk6/igt@i915_module_load@load.html
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk6/igt@i915_module_load@load.html
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk6/igt@i915_module_load@load.html
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk6/igt@i915_module_load@load.html
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk8/igt@i915_module_load@load.html
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk8/igt@i915_module_load@load.html
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk8/igt@i915_module_load@load.html
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk9/igt@i915_module_load@load.html
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk9/igt@i915_module_load@load.html
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk9/igt@i915_module_load@load.html
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk9/igt@i915_module_load@load.html
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk9/igt@i915_module_load@load.html
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk8/igt@i915_module_load@load.html
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk1/igt@i915_module_load@load.html
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk5/igt@i915_module_load@load.html
   [165]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk1/igt@i915_module_load@load.html
   [166]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk6/igt@i915_module_load@load.html
   [167]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk6/igt@i915_module_load@load.html
   [168]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk5/igt@i915_module_load@load.html
   [169]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk8/igt@i915_module_load@load.html
   [170]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk5/igt@i915_module_load@load.html
   [171]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk6/igt@i915_module_load@load.html
   [172]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk8/igt@i915_module_load@load.html
   [173]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk5/igt@i915_module_load@load.html
   [174]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk9/igt@i915_module_load@load.html
   [175]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk1/igt@i915_module_load@load.html
   [176]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk9/igt@i915_module_load@load.html

  * igt@i915_module_load@resize-bar:
    - shard-dg2:          NOTRUN -> [DMESG-WARN][177] ([i915#14545])
   [177]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@i915_module_load@resize-bar.html

  * igt@i915_pm_freq_api@freq-basic-api:
    - shard-tglu:         NOTRUN -> [SKIP][178] ([i915#8399])
   [178]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-5/igt@i915_pm_freq_api@freq-basic-api.html
    - shard-rkl:          NOTRUN -> [SKIP][179] ([i915#8399])
   [179]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@i915_pm_freq_api@freq-basic-api.html

  * igt@i915_pm_freq_api@freq-suspend@gt0:
    - shard-dg2:          [PASS][180] -> [INCOMPLETE][181] ([i915#12455] / [i915#13820]) +1 other test incomplete
   [180]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-1/igt@i915_pm_freq_api@freq-suspend@gt0.html
   [181]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-1/igt@i915_pm_freq_api@freq-suspend@gt0.html

  * igt@i915_pm_rc6_residency@rc6-fence:
    - shard-tglu:         NOTRUN -> [WARN][182] ([i915#13790] / [i915#2681]) +1 other test warn
   [182]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-7/igt@i915_pm_rc6_residency@rc6-fence.html

  * igt@i915_pm_rps@min-max-config-loaded:
    - shard-dg1:          NOTRUN -> [SKIP][183] ([i915#11681] / [i915#6621])
   [183]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@i915_pm_rps@min-max-config-loaded.html
    - shard-mtlp:         NOTRUN -> [SKIP][184] ([i915#11681] / [i915#6621])
   [184]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@i915_pm_rps@min-max-config-loaded.html

  * igt@i915_pm_rps@thresholds-idle:
    - shard-dg2:          NOTRUN -> [SKIP][185] ([i915#11681])
   [185]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-11/igt@i915_pm_rps@thresholds-idle.html

  * igt@i915_pm_rps@waitboost:
    - shard-mtlp:         NOTRUN -> [FAIL][186] ([i915#8346])
   [186]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@i915_pm_rps@waitboost.html

  * igt@i915_selftest@live@workarounds:
    - shard-dg2:          NOTRUN -> [DMESG-FAIL][187] ([i915#12061]) +1 other test dmesg-fail
   [187]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@i915_selftest@live@workarounds.html

  * igt@i915_suspend@basic-s2idle-without-i915:
    - shard-rkl:          [PASS][188] -> [DMESG-WARN][189] ([i915#12917] / [i915#12964])
   [188]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@i915_suspend@basic-s2idle-without-i915.html
   [189]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@i915_suspend@basic-s2idle-without-i915.html

  * igt@i915_suspend@basic-s3-without-i915:
    - shard-tglu-1:       NOTRUN -> [INCOMPLETE][190] ([i915#4817] / [i915#7443])
   [190]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-1/igt@i915_suspend@basic-s3-without-i915.html
    - shard-mtlp:         NOTRUN -> [ABORT][191] ([i915#14804])
   [191]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-6/igt@i915_suspend@basic-s3-without-i915.html

  * igt@i915_suspend@fence-restore-tiled2untiled:
    - shard-glk:          NOTRUN -> [INCOMPLETE][192] ([i915#4817])
   [192]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk9/igt@i915_suspend@fence-restore-tiled2untiled.html

  * igt@i915_suspend@forcewake:
    - shard-glk10:        NOTRUN -> [INCOMPLETE][193] ([i915#4817])
   [193]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk10/igt@i915_suspend@forcewake.html

  * igt@i915_suspend@sysfs-reader:
    - shard-rkl:          [PASS][194] -> [INCOMPLETE][195] ([i915#4817])
   [194]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@i915_suspend@sysfs-reader.html
   [195]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@i915_suspend@sysfs-reader.html

  * igt@intel_hwmon@hwmon-write:
    - shard-tglu:         NOTRUN -> [SKIP][196] ([i915#7707])
   [196]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-9/igt@intel_hwmon@hwmon-write.html

  * igt@kms_addfb_basic@clobberred-modifier:
    - shard-dg2:          NOTRUN -> [SKIP][197] ([i915#4212]) +3 other tests skip
   [197]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_addfb_basic@clobberred-modifier.html

  * igt@kms_addfb_basic@tile-pitch-mismatch:
    - shard-dg1:          NOTRUN -> [SKIP][198] ([i915#4212]) +1 other test skip
   [198]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@kms_addfb_basic@tile-pitch-mismatch.html
    - shard-mtlp:         NOTRUN -> [SKIP][199] ([i915#4212]) +1 other test skip
   [199]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@kms_addfb_basic@tile-pitch-mismatch.html

  * igt@kms_async_flips@async-flip-suspend-resume:
    - shard-dg2:          [PASS][200] -> [ABORT][201] ([i915#8213]) +1 other test abort
   [200]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-11/igt@kms_async_flips@async-flip-suspend-resume.html
   [201]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-10/igt@kms_async_flips@async-flip-suspend-resume.html

  * igt@kms_async_flips@async-flip-suspend-resume@pipe-a-hdmi-a-2:
    - shard-glk:          NOTRUN -> [INCOMPLETE][202] ([i915#12761]) +1 other test incomplete
   [202]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk1/igt@kms_async_flips@async-flip-suspend-resume@pipe-a-hdmi-a-2.html

  * igt@kms_async_flips@invalid-async-flip-atomic:
    - shard-mtlp:         NOTRUN -> [SKIP][203] ([i915#12967])
   [203]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-8/igt@kms_async_flips@invalid-async-flip-atomic.html
    - shard-dg2:          NOTRUN -> [SKIP][204] ([i915#12967])
   [204]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_async_flips@invalid-async-flip-atomic.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels:
    - shard-tglu:         NOTRUN -> [SKIP][205] ([i915#1769] / [i915#3555])
   [205]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels.html

  * igt@kms_big_fb@4-tiled-32bpp-rotate-180:
    - shard-tglu-1:       NOTRUN -> [SKIP][206] ([i915#5286]) +1 other test skip
   [206]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-1/igt@kms_big_fb@4-tiled-32bpp-rotate-180.html

  * igt@kms_big_fb@4-tiled-8bpp-rotate-90:
    - shard-rkl:          NOTRUN -> [SKIP][207] ([i915#5286]) +4 other tests skip
   [207]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_big_fb@4-tiled-8bpp-rotate-90.html
    - shard-dg1:          NOTRUN -> [SKIP][208] ([i915#4538] / [i915#5286]) +4 other tests skip
   [208]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@kms_big_fb@4-tiled-8bpp-rotate-90.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
    - shard-tglu:         NOTRUN -> [SKIP][209] ([i915#5286]) +8 other tests skip
   [209]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html

  * igt@kms_big_fb@linear-16bpp-rotate-270:
    - shard-tglu:         NOTRUN -> [SKIP][210] +90 other tests skip
   [210]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@kms_big_fb@linear-16bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-64bpp-rotate-270:
    - shard-dg2-9:        NOTRUN -> [SKIP][211] +3 other tests skip
   [211]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_big_fb@x-tiled-64bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-32bpp-rotate-90:
    - shard-dg2-9:        NOTRUN -> [SKIP][212] ([i915#4538] / [i915#5190]) +4 other tests skip
   [212]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_big_fb@y-tiled-32bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-64bpp-rotate-270:
    - shard-rkl:          NOTRUN -> [SKIP][213] ([i915#3638]) +3 other tests skip
   [213]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_big_fb@y-tiled-64bpp-rotate-270.html
    - shard-dg1:          NOTRUN -> [SKIP][214] ([i915#3638]) +3 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@kms_big_fb@y-tiled-64bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
    - shard-mtlp:         NOTRUN -> [SKIP][215] +14 other tests skip
   [215]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/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-64bpp-rotate-180-hflip-async-flip:
    - shard-dg2:          NOTRUN -> [SKIP][216] ([i915#4538] / [i915#5190]) +12 other tests skip
   [216]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
    - shard-dg2:          NOTRUN -> [SKIP][217] ([i915#5190]) +2 other tests skip
   [217]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0:
    - shard-dg1:          NOTRUN -> [SKIP][218] ([i915#4538]) +5 other tests skip
   [218]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0.html

  * igt@kms_busy@extended-modeset-hang-newfb-with-reset:
    - shard-rkl:          [PASS][219] -> [SKIP][220] ([i915#14544]) +32 other tests skip
   [219]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_busy@extended-modeset-hang-newfb-with-reset.html
   [220]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_busy@extended-modeset-hang-newfb-with-reset.html

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][221] ([i915#6095]) +37 other tests skip
   [221]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-2.html

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-4:
    - shard-dg1:          NOTRUN -> [SKIP][222] ([i915#6095]) +134 other tests skip
   [222]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-18/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-4.html

  * igt@kms_ccs@bad-pixel-format-y-tiled-ccs@pipe-c-dp-3:
    - shard-dg2:          NOTRUN -> [SKIP][223] ([i915#10307] / [i915#6095]) +157 other tests skip
   [223]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-10/igt@kms_ccs@bad-pixel-format-y-tiled-ccs@pipe-c-dp-3.html

  * igt@kms_ccs@ccs-on-another-bo-4-tiled-mtl-rc-ccs@pipe-d-hdmi-a-1:
    - shard-dg2:          NOTRUN -> [SKIP][224] ([i915#10307] / [i915#10434] / [i915#6095]) +2 other tests skip
   [224]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_ccs@ccs-on-another-bo-4-tiled-mtl-rc-ccs@pipe-d-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-1:
    - shard-rkl:          NOTRUN -> [SKIP][225] ([i915#14098] / [i915#6095]) +36 other tests skip
   [225]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_ccs@crc-primary-rotation-180-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][226] ([i915#12313]) +1 other test skip
   [226]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs.html

  * igt@kms_ccs@crc-primary-rotation-180-y-tiled-ccs@pipe-b-hdmi-a-2:
    - shard-dg2-9:        NOTRUN -> [SKIP][227] ([i915#10307] / [i915#6095]) +39 other tests skip
   [227]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_ccs@crc-primary-rotation-180-y-tiled-ccs@pipe-b-hdmi-a-2.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs:
    - shard-rkl:          NOTRUN -> [SKIP][228] ([i915#12805])
   [228]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs.html
    - shard-dg1:          NOTRUN -> [SKIP][229] ([i915#12805])
   [229]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc@pipe-b-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][230] ([i915#6095]) +25 other tests skip
   [230]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc@pipe-b-hdmi-a-3.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs@pipe-a-hdmi-a-2:
    - shard-rkl:          [PASS][231] -> [INCOMPLETE][232] ([i915#12796]) +1 other test incomplete
   [231]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-3/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs@pipe-a-hdmi-a-2.html
   [232]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-3/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs@pipe-a-hdmi-a-2.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-1:
    - shard-tglu:         NOTRUN -> [SKIP][233] ([i915#6095]) +74 other tests skip
   [233]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-1.html

  * igt@kms_ccs@missing-ccs-buffer-yf-tiled-ccs@pipe-a-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][234] ([i915#6095]) +19 other tests skip
   [234]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@kms_ccs@missing-ccs-buffer-yf-tiled-ccs@pipe-a-edp-1.html

  * igt@kms_cdclk@mode-transition-all-outputs:
    - shard-dg1:          NOTRUN -> [SKIP][235] ([i915#3742])
   [235]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@kms_cdclk@mode-transition-all-outputs.html
    - shard-tglu:         NOTRUN -> [SKIP][236] ([i915#3742])
   [236]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-10/igt@kms_cdclk@mode-transition-all-outputs.html
    - shard-mtlp:         NOTRUN -> [SKIP][237] ([i915#13784])
   [237]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-3/igt@kms_cdclk@mode-transition-all-outputs.html
    - shard-dg2:          NOTRUN -> [SKIP][238] ([i915#13784])
   [238]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@kms_cdclk@mode-transition-all-outputs.html
    - shard-rkl:          NOTRUN -> [SKIP][239] ([i915#3742])
   [239]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_cdclk@mode-transition-all-outputs.html

  * igt@kms_cdclk@mode-transition@pipe-d-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][240] ([i915#13781]) +3 other tests skip
   [240]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_cdclk@mode-transition@pipe-d-hdmi-a-3.html

  * igt@kms_cdclk@plane-scaling@pipe-d-hdmi-a-1:
    - shard-dg2:          NOTRUN -> [SKIP][241] ([i915#13783]) +4 other tests skip
   [241]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_cdclk@plane-scaling@pipe-d-hdmi-a-1.html

  * igt@kms_chamelium_audio@dp-audio:
    - shard-tglu:         NOTRUN -> [SKIP][242] ([i915#11151] / [i915#7828]) +11 other tests skip
   [242]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-9/igt@kms_chamelium_audio@dp-audio.html

  * igt@kms_chamelium_edid@dp-mode-timings:
    - shard-mtlp:         NOTRUN -> [SKIP][243] ([i915#11151] / [i915#7828]) +5 other tests skip
   [243]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@kms_chamelium_edid@dp-mode-timings.html

  * igt@kms_chamelium_frames@hdmi-crc-fast:
    - shard-dg2-9:        NOTRUN -> [SKIP][244] ([i915#11151] / [i915#7828]) +1 other test skip
   [244]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_chamelium_frames@hdmi-crc-fast.html

  * igt@kms_chamelium_frames@hdmi-crc-multiple:
    - shard-dg2:          NOTRUN -> [SKIP][245] ([i915#11151] / [i915#7828]) +11 other tests skip
   [245]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-7/igt@kms_chamelium_frames@hdmi-crc-multiple.html

  * igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode:
    - shard-rkl:          NOTRUN -> [SKIP][246] ([i915#11151] / [i915#7828]) +5 other tests skip
   [246]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode.html
    - shard-dg1:          NOTRUN -> [SKIP][247] ([i915#11151] / [i915#7828]) +6 other tests skip
   [247]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode.html

  * igt@kms_color@ctm-0-75:
    - shard-rkl:          NOTRUN -> [SKIP][248] ([i915#12655] / [i915#14544])
   [248]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_color@ctm-0-75.html

  * igt@kms_color@ctm-signed:
    - shard-rkl:          [PASS][249] -> [SKIP][250] ([i915#12655] / [i915#14544])
   [249]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_color@ctm-signed.html
   [250]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_color@ctm-signed.html

  * igt@kms_colorop@plane-xr30-xr30-pq_eotf (NEW):
    - shard-rkl:          NOTRUN -> [SKIP][251] ([i915#14544]) +29 other tests skip
   [251]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_colorop@plane-xr30-xr30-pq_eotf.html

  * igt@kms_concurrent@multi-plane-atomic-lowres:
    - shard-rkl:          NOTRUN -> [ABORT][252] ([i915#14804]) +1 other test abort
   [252]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_concurrent@multi-plane-atomic-lowres.html
    - shard-snb:          [PASS][253] -> [ABORT][254] ([i915#14804]) +1 other test abort
   [253]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-snb5/igt@kms_concurrent@multi-plane-atomic-lowres.html
   [254]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-snb4/igt@kms_concurrent@multi-plane-atomic-lowres.html

  * igt@kms_content_protection@atomic-dpms:
    - shard-tglu:         NOTRUN -> [SKIP][255] ([i915#6944] / [i915#7116] / [i915#7118] / [i915#9424]) +1 other test skip
   [255]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-5/igt@kms_content_protection@atomic-dpms.html
    - shard-mtlp:         NOTRUN -> [SKIP][256] ([i915#6944] / [i915#9424])
   [256]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@kms_content_protection@atomic-dpms.html
    - shard-dg2:          NOTRUN -> [SKIP][257] ([i915#7118] / [i915#9424]) +1 other test skip
   [257]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-8/igt@kms_content_protection@atomic-dpms.html
    - shard-rkl:          NOTRUN -> [SKIP][258] ([i915#7118] / [i915#9424])
   [258]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_content_protection@atomic-dpms.html
    - shard-dg1:          NOTRUN -> [SKIP][259] ([i915#7116] / [i915#9424])
   [259]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-17/igt@kms_content_protection@atomic-dpms.html

  * igt@kms_content_protection@dp-mst-type-0:
    - shard-tglu:         NOTRUN -> [SKIP][260] ([i915#3116] / [i915#3299])
   [260]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@kms_content_protection@dp-mst-type-0.html

  * igt@kms_content_protection@lic-type-0@pipe-a-dp-3:
    - shard-dg2:          NOTRUN -> [FAIL][261] ([i915#7173])
   [261]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-10/igt@kms_content_protection@lic-type-0@pipe-a-dp-3.html

  * igt@kms_content_protection@mei-interface:
    - shard-dg2-9:        NOTRUN -> [SKIP][262] ([i915#9424])
   [262]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_content_protection@mei-interface.html

  * igt@kms_cursor_crc@cursor-onscreen-512x512:
    - shard-tglu:         NOTRUN -> [SKIP][263] ([i915#13049]) +2 other tests skip
   [263]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@kms_cursor_crc@cursor-onscreen-512x512.html

  * igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1:
    - shard-rkl:          NOTRUN -> [FAIL][264] ([i915#13566]) +4 other tests fail
   [264]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1.html

  * igt@kms_cursor_crc@cursor-random-256x85:
    - shard-rkl:          [PASS][265] -> [FAIL][266] ([i915#13566])
   [265]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_cursor_crc@cursor-random-256x85.html
   [266]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@kms_cursor_crc@cursor-random-256x85.html

  * igt@kms_cursor_crc@cursor-random-512x512:
    - shard-dg2:          NOTRUN -> [SKIP][267] ([i915#13049])
   [267]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_cursor_crc@cursor-random-512x512.html

  * igt@kms_cursor_crc@cursor-random-64x21:
    - shard-tglu:         NOTRUN -> [FAIL][268] ([i915#13566]) +1 other test fail
   [268]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-7/igt@kms_cursor_crc@cursor-random-64x21.html
    - shard-mtlp:         NOTRUN -> [SKIP][269] ([i915#8814])
   [269]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@kms_cursor_crc@cursor-random-64x21.html

  * igt@kms_cursor_crc@cursor-rapid-movement-max-size:
    - shard-dg2-9:        NOTRUN -> [SKIP][270] ([i915#3555]) +1 other test skip
   [270]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_cursor_crc@cursor-rapid-movement-max-size.html

  * igt@kms_cursor_crc@cursor-sliding-32x10:
    - shard-dg2:          NOTRUN -> [SKIP][271] ([i915#3555]) +8 other tests skip
   [271]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-5/igt@kms_cursor_crc@cursor-sliding-32x10.html
    - shard-rkl:          NOTRUN -> [SKIP][272] ([i915#3555]) +1 other test skip
   [272]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_cursor_crc@cursor-sliding-32x10.html

  * igt@kms_cursor_crc@cursor-sliding-512x170:
    - shard-dg2-9:        NOTRUN -> [SKIP][273] ([i915#13049])
   [273]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_cursor_crc@cursor-sliding-512x170.html

  * igt@kms_cursor_crc@cursor-sliding-64x21:
    - shard-rkl:          NOTRUN -> [DMESG-FAIL][274] ([i915#12964])
   [274]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_cursor_crc@cursor-sliding-64x21.html
    - shard-tglu:         [PASS][275] -> [FAIL][276] ([i915#13566]) +3 other tests fail
   [275]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-tglu-2/igt@kms_cursor_crc@cursor-sliding-64x21.html
   [276]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@kms_cursor_crc@cursor-sliding-64x21.html

  * igt@kms_cursor_crc@cursor-sliding-max-size:
    - shard-mtlp:         NOTRUN -> [SKIP][277] ([i915#3555] / [i915#8814]) +2 other tests skip
   [277]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-4/igt@kms_cursor_crc@cursor-sliding-max-size.html

  * igt@kms_cursor_edge_walk@256x256-right-edge@pipe-c-hdmi-a-2:
    - shard-glk:          NOTRUN -> [ABORT][278] ([i915#14804]) +4 other tests abort
   [278]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk8/igt@kms_cursor_edge_walk@256x256-right-edge@pipe-c-hdmi-a-2.html

  * igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy:
    - shard-rkl:          NOTRUN -> [SKIP][279] +10 other tests skip
   [279]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy.html

  * igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy:
    - shard-dg2:          NOTRUN -> [SKIP][280] ([i915#13046] / [i915#5354]) +2 other tests skip
   [280]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy.html

  * igt@kms_cursor_legacy@2x-long-nonblocking-modeset-vs-cursor-atomic:
    - shard-dg2-9:        NOTRUN -> [SKIP][281] ([i915#13046] / [i915#5354]) +2 other tests skip
   [281]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_cursor_legacy@2x-long-nonblocking-modeset-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
    - shard-mtlp:         NOTRUN -> [SKIP][282] ([i915#4213])
   [282]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
    - shard-dg2:          NOTRUN -> [SKIP][283] ([i915#4103] / [i915#4213]) +1 other test skip
   [283]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
    - shard-rkl:          NOTRUN -> [SKIP][284] ([i915#4103])
   [284]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
    - shard-dg1:          NOTRUN -> [SKIP][285] ([i915#4103] / [i915#4213])
   [285]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html

  * igt@kms_cursor_legacy@basic-flip-after-cursor-legacy:
    - shard-glk10:        NOTRUN -> [SKIP][286] ([i915#11190]) +1 other test skip
   [286]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk10/igt@kms_cursor_legacy@basic-flip-after-cursor-legacy.html

  * igt@kms_cursor_legacy@basic-flip-before-cursor-legacy:
    - shard-rkl:          [PASS][287] -> [SKIP][288] ([i915#11190] / [i915#14544])
   [287]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_cursor_legacy@basic-flip-before-cursor-legacy.html
   [288]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_cursor_legacy@basic-flip-before-cursor-legacy.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size:
    - shard-tglu-1:       NOTRUN -> [SKIP][289]
   [289]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-1/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
    - shard-tglu:         NOTRUN -> [SKIP][290] ([i915#4103]) +1 other test skip
   [290]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-9/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

  * igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
    - shard-dg2-9:        NOTRUN -> [SKIP][291] ([i915#9833])
   [291]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc:
    - shard-rkl:          NOTRUN -> [SKIP][292] ([i915#3555] / [i915#3804])
   [292]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
    - shard-dg1:          NOTRUN -> [SKIP][293] ([i915#3555]) +4 other tests skip
   [293]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
    - shard-tglu:         NOTRUN -> [SKIP][294] ([i915#1769] / [i915#3555] / [i915#3804])
   [294]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-1:
    - shard-tglu:         NOTRUN -> [SKIP][295] ([i915#3804])
   [295]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-1.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][296] ([i915#3804])
   [296]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-2.html

  * igt@kms_dp_link_training@non-uhbr-sst:
    - shard-dg2:          NOTRUN -> [SKIP][297] ([i915#13749])
   [297]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@kms_dp_link_training@non-uhbr-sst.html
    - shard-tglu:         NOTRUN -> [SKIP][298] ([i915#13749])
   [298]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-5/igt@kms_dp_link_training@non-uhbr-sst.html

  * igt@kms_dp_link_training@uhbr-sst:
    - shard-tglu:         NOTRUN -> [SKIP][299] ([i915#13748])
   [299]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@kms_dp_link_training@uhbr-sst.html

  * igt@kms_dsc@dsc-fractional-bpp:
    - shard-tglu:         NOTRUN -> [SKIP][300] ([i915#3840])
   [300]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-3/igt@kms_dsc@dsc-fractional-bpp.html

  * igt@kms_dsc@dsc-fractional-bpp-with-bpc:
    - shard-rkl:          NOTRUN -> [SKIP][301] ([i915#3840])
   [301]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html

  * igt@kms_dsc@dsc-with-bpc-formats:
    - shard-mtlp:         NOTRUN -> [SKIP][302] ([i915#3555] / [i915#3840])
   [302]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-6/igt@kms_dsc@dsc-with-bpc-formats.html
    - shard-dg1:          NOTRUN -> [SKIP][303] ([i915#3555] / [i915#3840])
   [303]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@kms_dsc@dsc-with-bpc-formats.html
    - shard-tglu:         NOTRUN -> [SKIP][304] ([i915#3555] / [i915#3840])
   [304]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-3/igt@kms_dsc@dsc-with-bpc-formats.html

  * igt@kms_dsc@dsc-with-output-formats:
    - shard-dg2-9:        NOTRUN -> [SKIP][305] ([i915#3555] / [i915#3840]) +1 other test skip
   [305]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_dsc@dsc-with-output-formats.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][306] ([i915#9878])
   [306]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk9/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_feature_discovery@display-3x:
    - shard-dg1:          NOTRUN -> [SKIP][307] ([i915#1839])
   [307]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-16/igt@kms_feature_discovery@display-3x.html

  * igt@kms_feature_discovery@display-4x:
    - shard-tglu:         NOTRUN -> [SKIP][308] ([i915#1839]) +1 other test skip
   [308]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-7/igt@kms_feature_discovery@display-4x.html

  * igt@kms_feature_discovery@dp-mst:
    - shard-rkl:          NOTRUN -> [SKIP][309] ([i915#9337])
   [309]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_feature_discovery@dp-mst.html
    - shard-dg1:          NOTRUN -> [SKIP][310] ([i915#9337])
   [310]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@kms_feature_discovery@dp-mst.html

  * igt@kms_feature_discovery@psr1:
    - shard-dg2:          NOTRUN -> [SKIP][311] ([i915#658]) +1 other test skip
   [311]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_feature_discovery@psr1.html

  * igt@kms_flip@2x-flip-vs-dpms:
    - shard-glk:          [PASS][312] -> [ABORT][313] ([i915#14804]) +3 other tests abort
   [312]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk1/igt@kms_flip@2x-flip-vs-dpms.html
   [313]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk1/igt@kms_flip@2x-flip-vs-dpms.html

  * igt@kms_flip@2x-flip-vs-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][314] ([i915#12745] / [i915#4839])
   [314]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk5/igt@kms_flip@2x-flip-vs-suspend.html

  * igt@kms_flip@2x-flip-vs-suspend-interruptible@ab-hdmi-a1-hdmi-a2:
    - shard-glk:          NOTRUN -> [INCOMPLETE][315] ([i915#4839]) +1 other test incomplete
   [315]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk6/igt@kms_flip@2x-flip-vs-suspend-interruptible@ab-hdmi-a1-hdmi-a2.html

  * igt@kms_flip@2x-modeset-vs-vblank-race:
    - shard-dg2-9:        NOTRUN -> [SKIP][316] ([i915#9934]) +2 other tests skip
   [316]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_flip@2x-modeset-vs-vblank-race.html

  * igt@kms_flip@2x-nonexisting-fb-interruptible:
    - shard-tglu:         NOTRUN -> [SKIP][317] ([i915#3637] / [i915#9934]) +10 other tests skip
   [317]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@kms_flip@2x-nonexisting-fb-interruptible.html

  * igt@kms_flip@2x-plain-flip-fb-recreate:
    - shard-mtlp:         NOTRUN -> [SKIP][318] ([i915#3637] / [i915#9934]) +5 other tests skip
   [318]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@kms_flip@2x-plain-flip-fb-recreate.html

  * igt@kms_flip@2x-plain-flip-fb-recreate-interruptible:
    - shard-dg1:          NOTRUN -> [SKIP][319] ([i915#9934]) +5 other tests skip
   [319]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-18/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html

  * igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset:
    - shard-dg2:          NOTRUN -> [SKIP][320] ([i915#9934]) +9 other tests skip
   [320]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-7/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html

  * igt@kms_flip@2x-wf_vblank-ts-check-interruptible:
    - shard-rkl:          NOTRUN -> [SKIP][321] ([i915#9934]) +6 other tests skip
   [321]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_flip@2x-wf_vblank-ts-check-interruptible.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank:
    - shard-rkl:          [PASS][322] -> [SKIP][323] ([i915#14544] / [i915#3637]) +5 other tests skip
   [322]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_flip@flip-vs-blocking-wf-vblank.html
   [323]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_flip@flip-vs-blocking-wf-vblank.html

  * igt@kms_flip@flip-vs-fences@a-hdmi-a1:
    - shard-rkl:          NOTRUN -> [DMESG-WARN][324] ([i915#12964]) +2 other tests dmesg-warn
   [324]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_flip@flip-vs-fences@a-hdmi-a1.html

  * igt@kms_flip@flip-vs-suspend-interruptible@c-hdmi-a4:
    - shard-dg1:          [PASS][325] -> [DMESG-WARN][326] ([i915#4423]) +5 other tests dmesg-warn
   [325]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-14/igt@kms_flip@flip-vs-suspend-interruptible@c-hdmi-a4.html
   [326]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-16/igt@kms_flip@flip-vs-suspend-interruptible@c-hdmi-a4.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
    - shard-rkl:          NOTRUN -> [SKIP][327] ([i915#2672] / [i915#3555]) +5 other tests skip
   [327]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode:
    - shard-rkl:          NOTRUN -> [SKIP][328] ([i915#2672]) +6 other tests skip
   [328]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html
    - shard-dg1:          NOTRUN -> [SKIP][329] ([i915#2587] / [i915#2672]) +5 other tests skip
   [329]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling:
    - shard-mtlp:         NOTRUN -> [SKIP][330] ([i915#2672] / [i915#3555] / [i915#8813]) +5 other tests skip
   [330]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-4/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling:
    - shard-dg2:          NOTRUN -> [SKIP][331] ([i915#2672] / [i915#3555]) +4 other tests skip
   [331]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling:
    - shard-dg2-9:        NOTRUN -> [SKIP][332] ([i915#2672] / [i915#3555])
   [332]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling@pipe-a-valid-mode:
    - shard-dg2-9:        NOTRUN -> [SKIP][333] ([i915#2672]) +1 other test skip
   [333]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling:
    - shard-dg2-9:        NOTRUN -> [SKIP][334] ([i915#2672] / [i915#3555] / [i915#5190])
   [334]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling:
    - shard-dg1:          NOTRUN -> [SKIP][335] ([i915#2587] / [i915#2672] / [i915#3555])
   [335]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling.html
    - shard-tglu:         NOTRUN -> [SKIP][336] ([i915#2587] / [i915#2672] / [i915#3555])
   [336]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-10/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode:
    - shard-dg2:          NOTRUN -> [SKIP][337] ([i915#2672]) +7 other tests skip
   [337]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling:
    - shard-tglu:         NOTRUN -> [SKIP][338] ([i915#2672] / [i915#3555]) +7 other tests skip
   [338]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling:
    - shard-mtlp:         NOTRUN -> [SKIP][339] ([i915#3555] / [i915#8813])
   [339]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-8/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][340] ([i915#8810] / [i915#8813])
   [340]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-8/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-upscaling@pipe-a-valid-mode:
    - shard-tglu:         NOTRUN -> [SKIP][341] ([i915#2587] / [i915#2672]) +8 other tests skip
   [341]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-9/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
    - shard-rkl:          NOTRUN -> [SKIP][342] ([i915#14544] / [i915#3555]) +2 other tests skip
   [342]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][343] ([i915#2672] / [i915#8813]) +5 other tests skip
   [343]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-upscaling:
    - shard-rkl:          [PASS][344] -> [SKIP][345] ([i915#14544] / [i915#3555]) +1 other test skip
   [344]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-upscaling.html
   [345]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling:
    - shard-dg1:          NOTRUN -> [SKIP][346] ([i915#2672] / [i915#3555]) +4 other tests skip
   [346]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-17/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling:
    - shard-dg2:          NOTRUN -> [SKIP][347] ([i915#2672] / [i915#3555] / [i915#5190]) +2 other tests skip
   [347]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-8/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-gtt:
    - shard-mtlp:         NOTRUN -> [SKIP][348] ([i915#8708]) +7 other tests skip
   [348]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-cpu:
    - shard-dg2:          NOTRUN -> [FAIL][349] ([i915#6880]) +1 other test fail
   [349]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-blt:
    - shard-mtlp:         NOTRUN -> [SKIP][350] ([i915#1825]) +20 other tests skip
   [350]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-pwrite:
    - shard-dg2:          NOTRUN -> [SKIP][351] ([i915#5354]) +39 other tests skip
   [351]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen:
    - shard-dg1:          NOTRUN -> [SKIP][352] +33 other tests skip
   [352]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-18/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbc-2p-rte:
    - shard-glk:          [PASS][353] -> [SKIP][354] +1 other test skip
   [353]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk9/igt@kms_frontbuffer_tracking@fbc-2p-rte.html
   [354]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk8/igt@kms_frontbuffer_tracking@fbc-2p-rte.html

  * igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-pwrite:
    - shard-rkl:          [PASS][355] -> [SKIP][356] ([i915#14544] / [i915#1849] / [i915#5354]) +3 other tests skip
   [355]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-pwrite.html
   [356]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbc-shrfb-scaledprimary:
    - shard-rkl:          [PASS][357] -> [DMESG-WARN][358] ([i915#12964]) +20 other tests dmesg-warn
   [357]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_frontbuffer_tracking@fbc-shrfb-scaledprimary.html
   [358]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_frontbuffer_tracking@fbc-shrfb-scaledprimary.html

  * igt@kms_frontbuffer_tracking@fbc-suspend:
    - shard-rkl:          [PASS][359] -> [INCOMPLETE][360] ([i915#10056])
   [359]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-3/igt@kms_frontbuffer_tracking@fbc-suspend.html
   [360]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_frontbuffer_tracking@fbc-suspend.html

  * igt@kms_frontbuffer_tracking@fbc-tiling-4:
    - shard-dg1:          NOTRUN -> [SKIP][361] ([i915#5439])
   [361]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_frontbuffer_tracking@fbc-tiling-4.html
    - shard-tglu:         NOTRUN -> [SKIP][362] ([i915#5439]) +1 other test skip
   [362]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@kms_frontbuffer_tracking@fbc-tiling-4.html

  * igt@kms_frontbuffer_tracking@fbc-tiling-y:
    - shard-dg2:          NOTRUN -> [SKIP][363] ([i915#10055])
   [363]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@kms_frontbuffer_tracking@fbc-tiling-y.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-wc:
    - shard-dg1:          NOTRUN -> [SKIP][364] ([i915#8708]) +15 other tests skip
   [364]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-mmap-cpu:
    - shard-dg2-9:        NOTRUN -> [SKIP][365] ([i915#3458]) +8 other tests skip
   [365]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-mmap-wc:
    - shard-snb:          NOTRUN -> [SKIP][366] +249 other tests skip
   [366]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-snb4/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-cpu:
    - shard-rkl:          NOTRUN -> [SKIP][367] ([i915#3023]) +13 other tests skip
   [367]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][368] ([i915#8708]) +26 other tests skip
   [368]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-gtt.html
    - shard-rkl:          NOTRUN -> [SKIP][369] ([i915#1825]) +30 other tests skip
   [369]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-dg2-9:        NOTRUN -> [SKIP][370] ([i915#8708]) +7 other tests skip
   [370]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-render:
    - shard-dg1:          NOTRUN -> [SKIP][371] ([i915#3458]) +14 other tests skip
   [371]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-suspend:
    - shard-dg2:          NOTRUN -> [SKIP][372] ([i915#10433] / [i915#3458])
   [372]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_frontbuffer_tracking@fbcpsr-suspend.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-move:
    - shard-dg2:          NOTRUN -> [SKIP][373] ([i915#3458]) +16 other tests skip
   [373]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-1/igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-move.html
    - shard-rkl:          NOTRUN -> [SKIP][374] ([i915#14544] / [i915#1849] / [i915#5354]) +15 other tests skip
   [374]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-move.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-blt:
    - shard-dg2-9:        NOTRUN -> [SKIP][375] ([i915#5354]) +13 other tests skip
   [375]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_hdr@invalid-hdr:
    - shard-rkl:          NOTRUN -> [SKIP][376] ([i915#3555] / [i915#8228])
   [376]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_hdr@invalid-hdr.html
    - shard-dg1:          NOTRUN -> [SKIP][377] ([i915#3555] / [i915#8228])
   [377]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-17/igt@kms_hdr@invalid-hdr.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-dg2:          NOTRUN -> [SKIP][378] ([i915#3555] / [i915#8228]) +2 other tests skip
   [378]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_hdr@invalid-metadata-sizes.html

  * igt@kms_hdr@static-toggle-suspend:
    - shard-tglu:         NOTRUN -> [SKIP][379] ([i915#3555] / [i915#8228]) +2 other tests skip
   [379]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-3/igt@kms_hdr@static-toggle-suspend.html

  * igt@kms_invalid_mode@bad-hsync-start:
    - shard-rkl:          [PASS][380] -> [SKIP][381] ([i915#14544] / [i915#3555] / [i915#8826]) +1 other test skip
   [380]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_invalid_mode@bad-hsync-start.html
   [381]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_invalid_mode@bad-hsync-start.html

  * igt@kms_invalid_mode@overflow-vrefresh:
    - shard-rkl:          NOTRUN -> [SKIP][382] ([i915#14544] / [i915#8826])
   [382]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_invalid_mode@overflow-vrefresh.html

  * igt@kms_joiner@basic-force-big-joiner:
    - shard-tglu:         NOTRUN -> [SKIP][383] ([i915#12388])
   [383]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-9/igt@kms_joiner@basic-force-big-joiner.html
    - shard-dg2:          NOTRUN -> [SKIP][384] ([i915#12388])
   [384]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_joiner@basic-force-big-joiner.html
    - shard-rkl:          NOTRUN -> [SKIP][385] ([i915#12388])
   [385]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_joiner@basic-force-big-joiner.html
    - shard-dg1:          NOTRUN -> [SKIP][386] ([i915#12388])
   [386]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_joiner@basic-force-big-joiner.html

  * igt@kms_joiner@invalid-modeset-force-ultra-joiner:
    - shard-tglu:         NOTRUN -> [SKIP][387] ([i915#12394])
   [387]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-3/igt@kms_joiner@invalid-modeset-force-ultra-joiner.html

  * igt@kms_joiner@invalid-modeset-ultra-joiner:
    - shard-tglu:         NOTRUN -> [SKIP][388] ([i915#12339])
   [388]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@kms_joiner@invalid-modeset-ultra-joiner.html
    - shard-mtlp:         NOTRUN -> [SKIP][389] ([i915#12339])
   [389]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-3/igt@kms_joiner@invalid-modeset-ultra-joiner.html
    - shard-dg2:          NOTRUN -> [SKIP][390] ([i915#12339])
   [390]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-11/igt@kms_joiner@invalid-modeset-ultra-joiner.html
    - shard-rkl:          NOTRUN -> [SKIP][391] ([i915#12339])
   [391]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_joiner@invalid-modeset-ultra-joiner.html
    - shard-dg1:          NOTRUN -> [SKIP][392] ([i915#12339])
   [392]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@kms_joiner@invalid-modeset-ultra-joiner.html

  * igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
    - shard-tglu:         NOTRUN -> [SKIP][393] ([i915#13522])
   [393]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html

  * igt@kms_panel_fitting@legacy:
    - shard-tglu:         NOTRUN -> [SKIP][394] ([i915#6301])
   [394]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-8/igt@kms_panel_fitting@legacy.html
    - shard-dg2:          NOTRUN -> [SKIP][395] ([i915#6301])
   [395]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_panel_fitting@legacy.html
    - shard-rkl:          NOTRUN -> [SKIP][396] ([i915#6301])
   [396]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_panel_fitting@legacy.html
    - shard-dg1:          NOTRUN -> [SKIP][397] ([i915#6301])
   [397]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@kms_panel_fitting@legacy.html

  * igt@kms_plane@pixel-format:
    - shard-rkl:          NOTRUN -> [SKIP][398] ([i915#14544] / [i915#8825])
   [398]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane@pixel-format.html

  * igt@kms_plane@planar-pixel-format-settings:
    - shard-rkl:          [PASS][399] -> [SKIP][400] ([i915#14544] / [i915#9581])
   [399]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_plane@planar-pixel-format-settings.html
   [400]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane@planar-pixel-format-settings.html

  * igt@kms_plane@plane-panning-bottom-right-suspend:
    - shard-snb:          [PASS][401] -> [ABORT][402] ([i915#12817]) +1 other test abort
   [401]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-snb5/igt@kms_plane@plane-panning-bottom-right-suspend.html
   [402]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-snb4/igt@kms_plane@plane-panning-bottom-right-suspend.html

  * igt@kms_plane_lowres@tiling-4:
    - shard-tglu:         NOTRUN -> [SKIP][403] ([i915#3555]) +7 other tests skip
   [403]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-3/igt@kms_plane_lowres@tiling-4.html

  * igt@kms_plane_lowres@tiling-yf:
    - shard-dg2-9:        NOTRUN -> [SKIP][404] ([i915#3555] / [i915#8821])
   [404]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_plane_lowres@tiling-yf.html

  * igt@kms_plane_multiple@2x-tiling-4:
    - shard-dg2:          NOTRUN -> [SKIP][405] ([i915#13958])
   [405]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@kms_plane_multiple@2x-tiling-4.html
    - shard-rkl:          NOTRUN -> [SKIP][406] ([i915#13958])
   [406]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_plane_multiple@2x-tiling-4.html
    - shard-dg1:          NOTRUN -> [SKIP][407] ([i915#13958])
   [407]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@kms_plane_multiple@2x-tiling-4.html
    - shard-tglu:         NOTRUN -> [SKIP][408] ([i915#13958])
   [408]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-10/igt@kms_plane_multiple@2x-tiling-4.html
    - shard-mtlp:         NOTRUN -> [SKIP][409] ([i915#13958])
   [409]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-3/igt@kms_plane_multiple@2x-tiling-4.html

  * igt@kms_plane_multiple@tiling-yf:
    - shard-rkl:          NOTRUN -> [SKIP][410] ([i915#14259])
   [410]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_plane_multiple@tiling-yf.html
    - shard-dg1:          NOTRUN -> [SKIP][411] ([i915#14259])
   [411]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@kms_plane_multiple@tiling-yf.html
    - shard-tglu:         NOTRUN -> [SKIP][412] ([i915#14259])
   [412]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@kms_plane_multiple@tiling-yf.html
    - shard-mtlp:         NOTRUN -> [SKIP][413] ([i915#14259])
   [413]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-3/igt@kms_plane_multiple@tiling-yf.html

  * igt@kms_plane_scaling@2x-scaler-multi-pipe:
    - shard-mtlp:         NOTRUN -> [SKIP][414] ([i915#9809]) +3 other tests skip
   [414]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-3/igt@kms_plane_scaling@2x-scaler-multi-pipe.html
    - shard-dg2:          NOTRUN -> [SKIP][415] ([i915#13046] / [i915#5354] / [i915#9423])
   [415]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-10/igt@kms_plane_scaling@2x-scaler-multi-pipe.html

  * igt@kms_plane_scaling@intel-max-src-size:
    - shard-dg2:          NOTRUN -> [SKIP][416] ([i915#6953] / [i915#9423])
   [416]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@kms_plane_scaling@intel-max-src-size.html

  * igt@kms_plane_scaling@invalid-parameters:
    - shard-rkl:          [PASS][417] -> [SKIP][418] ([i915#14544] / [i915#8152]) +1 other test skip
   [417]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_plane_scaling@invalid-parameters.html
   [418]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_scaling@invalid-parameters.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-a:
    - shard-rkl:          NOTRUN -> [SKIP][419] ([i915#12247]) +4 other tests skip
   [419]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-a.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-c:
    - shard-tglu:         NOTRUN -> [SKIP][420] ([i915#12247]) +8 other tests skip
   [420]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-9/igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-c.html

  * igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-b:
    - shard-dg1:          NOTRUN -> [SKIP][421] ([i915#12247]) +8 other tests skip
   [421]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-b.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-75:
    - shard-rkl:          [PASS][422] -> [SKIP][423] ([i915#12247] / [i915#14544] / [i915#3555] / [i915#6953] / [i915#8152])
   [422]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_plane_scaling@planes-downscale-factor-0-75.html
   [423]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_scaling@planes-downscale-factor-0-75.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25:
    - shard-rkl:          [PASS][424] -> [SKIP][425] ([i915#14544] / [i915#6953] / [i915#8152]) +1 other test skip
   [424]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25.html
   [425]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25@pipe-a:
    - shard-rkl:          [PASS][426] -> [SKIP][427] ([i915#12247] / [i915#14544]) +3 other tests skip
   [426]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25@pipe-a.html
   [427]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25@pipe-a.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-b:
    - shard-rkl:          [PASS][428] -> [SKIP][429] ([i915#12247] / [i915#14544] / [i915#8152]) +3 other tests skip
   [428]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-b.html
   [429]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-b.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5:
    - shard-mtlp:         NOTRUN -> [SKIP][430] ([i915#12247] / [i915#3555] / [i915#6953])
   [430]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-3/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5@pipe-a:
    - shard-mtlp:         NOTRUN -> [SKIP][431] ([i915#12247]) +8 other tests skip
   [431]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-3/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5@pipe-a.html

  * igt@kms_plane_scaling@planes-upscale-factor-0-25:
    - shard-rkl:          NOTRUN -> [SKIP][432] ([i915#14544] / [i915#3555] / [i915#6953] / [i915#8152])
   [432]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_scaling@planes-upscale-factor-0-25.html

  * igt@kms_plane_scaling@planes-upscale-factor-0-25@pipe-a:
    - shard-rkl:          NOTRUN -> [SKIP][433] ([i915#12247] / [i915#14544])
   [433]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_scaling@planes-upscale-factor-0-25@pipe-a.html

  * igt@kms_plane_scaling@planes-upscale-factor-0-25@pipe-b:
    - shard-rkl:          NOTRUN -> [SKIP][434] ([i915#12247] / [i915#14544] / [i915#8152])
   [434]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_scaling@planes-upscale-factor-0-25@pipe-b.html

  * igt@kms_pm_backlight@basic-brightness:
    - shard-rkl:          NOTRUN -> [SKIP][435] ([i915#5354])
   [435]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_pm_backlight@basic-brightness.html
    - shard-dg1:          NOTRUN -> [SKIP][436] ([i915#5354])
   [436]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-17/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_pm_backlight@fade:
    - shard-tglu:         NOTRUN -> [SKIP][437] ([i915#9812]) +1 other test skip
   [437]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-5/igt@kms_pm_backlight@fade.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-dg1:          NOTRUN -> [SKIP][438] ([i915#3361])
   [438]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_dc@dc6-psr:
    - shard-dg2:          NOTRUN -> [SKIP][439] ([i915#9685]) +2 other tests skip
   [439]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_pm_dc@dc6-psr.html

  * igt@kms_pm_rpm@cursor-dpms:
    - shard-rkl:          [PASS][440] -> [SKIP][441] ([i915#14544] / [i915#1849])
   [440]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-4/igt@kms_pm_rpm@cursor-dpms.html
   [441]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_pm_rpm@cursor-dpms.html

  * igt@kms_pm_rpm@dpms-lpsp:
    - shard-dg2-9:        NOTRUN -> [SKIP][442] ([i915#9519])
   [442]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_pm_rpm@dpms-lpsp.html

  * igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
    - shard-rkl:          [PASS][443] -> [SKIP][444] ([i915#9519])
   [443]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
   [444]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html

  * igt@kms_pm_rpm@modeset-lpsp-stress:
    - shard-dg2:          [PASS][445] -> [SKIP][446] ([i915#9519]) +1 other test skip
   [445]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-4/igt@kms_pm_rpm@modeset-lpsp-stress.html
   [446]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-6/igt@kms_pm_rpm@modeset-lpsp-stress.html
    - shard-rkl:          NOTRUN -> [SKIP][447] ([i915#9519])
   [447]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_pm_rpm@modeset-lpsp-stress.html
    - shard-dg1:          NOTRUN -> [SKIP][448] ([i915#9519])
   [448]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_pm_rpm@modeset-lpsp-stress.html

  * igt@kms_pm_rpm@system-suspend-modeset:
    - shard-glk:          NOTRUN -> [INCOMPLETE][449] ([i915#10553])
   [449]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk5/igt@kms_pm_rpm@system-suspend-modeset.html

  * igt@kms_prime@basic-crc-vgem:
    - shard-dg2:          NOTRUN -> [SKIP][450] ([i915#6524] / [i915#6805]) +1 other test skip
   [450]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@kms_prime@basic-crc-vgem.html

  * igt@kms_prime@basic-modeset-hybrid:
    - shard-dg1:          NOTRUN -> [SKIP][451] ([i915#6524]) +1 other test skip
   [451]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@kms_prime@basic-modeset-hybrid.html
    - shard-tglu:         NOTRUN -> [SKIP][452] ([i915#6524]) +1 other test skip
   [452]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@kms_prime@basic-modeset-hybrid.html
    - shard-mtlp:         NOTRUN -> [SKIP][453] ([i915#6524])
   [453]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@kms_prime@basic-modeset-hybrid.html

  * igt@kms_prime@d3hot:
    - shard-rkl:          NOTRUN -> [SKIP][454] ([i915#6524])
   [454]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_prime@d3hot.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf:
    - shard-mtlp:         NOTRUN -> [SKIP][455] ([i915#12316]) +5 other tests skip
   [455]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area:
    - shard-glk11:        NOTRUN -> [SKIP][456] ([i915#11520]) +4 other tests skip
   [456]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk11/igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf@pipe-a-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][457] ([i915#9808])
   [457]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-4/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf@pipe-a-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area:
    - shard-tglu:         NOTRUN -> [SKIP][458] ([i915#11520]) +11 other tests skip
   [458]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-2/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@pr-cursor-plane-move-continuous-exceed-fully-sf:
    - shard-rkl:          NOTRUN -> [SKIP][459] ([i915#11520]) +7 other tests skip
   [459]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-exceed-fully-sf.html
    - shard-snb:          NOTRUN -> [SKIP][460] ([i915#11520]) +4 other tests skip
   [460]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-snb4/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@pr-cursor-plane-move-continuous-exceed-sf:
    - shard-dg2-9:        NOTRUN -> [SKIP][461] ([i915#11520]) +1 other test skip
   [461]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area:
    - shard-glk10:        NOTRUN -> [SKIP][462] ([i915#11520]) +4 other tests skip
   [462]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk10/igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-sf:
    - shard-dg2:          NOTRUN -> [SKIP][463] ([i915#11520]) +13 other tests skip
   [463]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-11/igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-sf:
    - shard-dg1:          NOTRUN -> [SKIP][464] ([i915#11520]) +7 other tests skip
   [464]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@psr2-overlay-primary-update-sf-dmg-area:
    - shard-glk:          NOTRUN -> [SKIP][465] ([i915#11520]) +7 other tests skip
   [465]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk5/igt@kms_psr2_sf@psr2-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-dg1:          NOTRUN -> [SKIP][466] ([i915#9683]) +1 other test skip
   [466]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr2_su@page_flip-xrgb8888:
    - shard-mtlp:         NOTRUN -> [SKIP][467] ([i915#4348])
   [467]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-4/igt@kms_psr2_su@page_flip-xrgb8888.html
    - shard-dg2:          NOTRUN -> [SKIP][468] ([i915#9683]) +1 other test skip
   [468]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-1/igt@kms_psr2_su@page_flip-xrgb8888.html
    - shard-rkl:          NOTRUN -> [SKIP][469] ([i915#14544] / [i915#9683])
   [469]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_psr2_su@page_flip-xrgb8888.html
    - shard-tglu:         NOTRUN -> [SKIP][470] ([i915#9683])
   [470]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-9/igt@kms_psr2_su@page_flip-xrgb8888.html

  * igt@kms_psr@fbc-pr-primary-blt:
    - shard-mtlp:         NOTRUN -> [SKIP][471] ([i915#9688]) +14 other tests skip
   [471]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@kms_psr@fbc-pr-primary-blt.html

  * igt@kms_psr@fbc-pr-suspend:
    - shard-tglu-1:       NOTRUN -> [SKIP][472] ([i915#9732])
   [472]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-1/igt@kms_psr@fbc-pr-suspend.html

  * igt@kms_psr@fbc-psr-primary-mmap-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][473] ([i915#1072] / [i915#9732]) +21 other tests skip
   [473]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@kms_psr@fbc-psr-primary-mmap-gtt.html

  * igt@kms_psr@fbc-psr2-no-drrs:
    - shard-tglu:         NOTRUN -> [SKIP][474] ([i915#9732]) +25 other tests skip
   [474]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@kms_psr@fbc-psr2-no-drrs.html

  * igt@kms_psr@psr-sprite-plane-onoff:
    - shard-rkl:          NOTRUN -> [SKIP][475] ([i915#1072] / [i915#9732]) +10 other tests skip
   [475]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_psr@psr-sprite-plane-onoff.html

  * igt@kms_psr@psr2-cursor-blt:
    - shard-dg2-9:        NOTRUN -> [SKIP][476] ([i915#1072] / [i915#9732]) +9 other tests skip
   [476]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_psr@psr2-cursor-blt.html
    - shard-rkl:          NOTRUN -> [SKIP][477] ([i915#1072] / [i915#14544] / [i915#9732]) +5 other tests skip
   [477]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_psr@psr2-cursor-blt.html

  * igt@kms_psr@psr2-primary-mmap-cpu:
    - shard-dg1:          NOTRUN -> [SKIP][478] ([i915#1072] / [i915#9732]) +17 other tests skip
   [478]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@kms_psr@psr2-primary-mmap-cpu.html

  * igt@kms_psr@psr2-sprite-plane-onoff:
    - shard-glk:          NOTRUN -> [SKIP][479] +274 other tests skip
   [479]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk9/igt@kms_psr@psr2-sprite-plane-onoff.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-rkl:          NOTRUN -> [SKIP][480] ([i915#9685])
   [480]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
    - shard-dg1:          NOTRUN -> [SKIP][481] ([i915#9685])
   [481]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-tglu:         NOTRUN -> [SKIP][482] ([i915#9685]) +2 other tests skip
   [482]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-9/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-270:
    - shard-mtlp:         NOTRUN -> [SKIP][483] ([i915#12755])
   [483]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@kms_rotation_crc@primary-y-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
    - shard-tglu:         NOTRUN -> [SKIP][484] ([i915#5289])
   [484]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-3/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-dg2-9:        NOTRUN -> [SKIP][485] ([i915#12755] / [i915#5190])
   [485]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@sprite-rotation-270:
    - shard-dg2:          NOTRUN -> [SKIP][486] ([i915#12755])
   [486]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@kms_rotation_crc@sprite-rotation-270.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-dg2:          NOTRUN -> [SKIP][487] ([i915#8623])
   [487]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-11/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_vblank@ts-continuation-modeset:
    - shard-glk10:        NOTRUN -> [SKIP][488] +217 other tests skip
   [488]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk10/igt@kms_vblank@ts-continuation-modeset.html

  * igt@kms_vblank@ts-continuation-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][489] ([i915#12276]) +1 other test incomplete
   [489]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk8/igt@kms_vblank@ts-continuation-suspend.html

  * igt@kms_vrr@flip-basic-fastset:
    - shard-tglu:         NOTRUN -> [SKIP][490] ([i915#9906])
   [490]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@kms_vrr@flip-basic-fastset.html
    - shard-mtlp:         NOTRUN -> [SKIP][491] ([i915#8808] / [i915#9906])
   [491]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-5/igt@kms_vrr@flip-basic-fastset.html
    - shard-dg1:          NOTRUN -> [SKIP][492] ([i915#9906])
   [492]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_vrr@flip-basic-fastset.html

  * igt@kms_vrr@lobf:
    - shard-dg2:          NOTRUN -> [SKIP][493] ([i915#11920])
   [493]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-11/igt@kms_vrr@lobf.html
    - shard-tglu:         NOTRUN -> [SKIP][494] ([i915#11920])
   [494]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-4/igt@kms_vrr@lobf.html

  * igt@kms_vrr@max-min:
    - shard-rkl:          NOTRUN -> [SKIP][495] ([i915#9906])
   [495]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@kms_vrr@max-min.html

  * igt@kms_vrr@negative-basic:
    - shard-dg2:          [PASS][496] -> [SKIP][497] ([i915#3555] / [i915#9906])
   [496]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-11/igt@kms_vrr@negative-basic.html
   [497]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-7/igt@kms_vrr@negative-basic.html

  * igt@kms_vrr@seamless-rr-switch-vrr:
    - shard-dg2-9:        NOTRUN -> [SKIP][498] ([i915#9906])
   [498]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@kms_vrr@seamless-rr-switch-vrr.html

  * igt@kms_writeback@writeback-fb-id-xrgb2101010:
    - shard-rkl:          NOTRUN -> [SKIP][499] ([i915#2437] / [i915#9412]) +1 other test skip
   [499]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_writeback@writeback-fb-id-xrgb2101010.html
    - shard-dg1:          NOTRUN -> [SKIP][500] ([i915#2437] / [i915#9412]) +1 other test skip
   [500]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@kms_writeback@writeback-fb-id-xrgb2101010.html
    - shard-glk:          NOTRUN -> [SKIP][501] ([i915#2437])
   [501]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk6/igt@kms_writeback@writeback-fb-id-xrgb2101010.html

  * igt@perf@global-sseu-config:
    - shard-dg2:          NOTRUN -> [SKIP][502] ([i915#7387])
   [502]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-7/igt@perf@global-sseu-config.html

  * igt@perf@unprivileged-single-ctx-counters:
    - shard-dg1:          NOTRUN -> [SKIP][503] ([i915#2433])
   [503]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-17/igt@perf@unprivileged-single-ctx-counters.html

  * igt@perf_pmu@busy-double-start:
    - shard-mtlp:         NOTRUN -> [FAIL][504] ([i915#4349]) +2 other tests fail
   [504]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-6/igt@perf_pmu@busy-double-start.html

  * igt@perf_pmu@busy-double-start@vecs1:
    - shard-dg2:          NOTRUN -> [FAIL][505] ([i915#4349]) +4 other tests fail
   [505]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@perf_pmu@busy-double-start@vecs1.html

  * igt@perf_pmu@frequency@gt0:
    - shard-dg2:          NOTRUN -> [FAIL][506] ([i915#12549] / [i915#6806]) +1 other test fail
   [506]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@perf_pmu@frequency@gt0.html

  * igt@perf_pmu@interrupts:
    - shard-rkl:          NOTRUN -> [FAIL][507] ([i915#14415])
   [507]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@perf_pmu@interrupts.html

  * igt@perf_pmu@module-unload:
    - shard-glk11:        NOTRUN -> [FAIL][508] ([i915#14433])
   [508]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk11/igt@perf_pmu@module-unload.html

  * igt@perf_pmu@rc6@other-idle-gt0:
    - shard-dg2:          NOTRUN -> [SKIP][509] ([i915#8516])
   [509]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-5/igt@perf_pmu@rc6@other-idle-gt0.html

  * igt@prime_vgem@basic-fence-flip:
    - shard-dg1:          NOTRUN -> [SKIP][510] ([i915#3708]) +1 other test skip
   [510]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-17/igt@prime_vgem@basic-fence-flip.html

  * igt@prime_vgem@basic-fence-mmap:
    - shard-dg1:          NOTRUN -> [SKIP][511] ([i915#3708] / [i915#4077])
   [511]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@prime_vgem@basic-fence-mmap.html

  * igt@prime_vgem@basic-fence-read:
    - shard-dg2-9:        NOTRUN -> [SKIP][512] ([i915#3291] / [i915#3708])
   [512]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-9/igt@prime_vgem@basic-fence-read.html

  * igt@prime_vgem@coherency-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][513] ([i915#3708] / [i915#4077])
   [513]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@prime_vgem@coherency-gtt.html

  * igt@prime_vgem@fence-read-hang:
    - shard-mtlp:         NOTRUN -> [SKIP][514] ([i915#3708])
   [514]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-4/igt@prime_vgem@fence-read-hang.html
    - shard-dg2:          NOTRUN -> [SKIP][515] ([i915#3708])
   [515]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-8/igt@prime_vgem@fence-read-hang.html
    - shard-rkl:          NOTRUN -> [SKIP][516] ([i915#3708])
   [516]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@prime_vgem@fence-read-hang.html

  * igt@sriov_basic@bind-unbind-vf@vf-4:
    - shard-tglu:         NOTRUN -> [FAIL][517] ([i915#12910]) +18 other tests fail
   [517]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-6/igt@sriov_basic@bind-unbind-vf@vf-4.html

  * igt@sriov_basic@enable-vfs-bind-unbind-each:
    - shard-dg1:          NOTRUN -> [SKIP][518] ([i915#9917])
   [518]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-18/igt@sriov_basic@enable-vfs-bind-unbind-each.html
    - shard-dg2:          NOTRUN -> [SKIP][519] ([i915#9917])
   [519]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@sriov_basic@enable-vfs-bind-unbind-each.html
    - shard-rkl:          NOTRUN -> [SKIP][520] ([i915#9917])
   [520]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@sriov_basic@enable-vfs-bind-unbind-each.html

  * igt@sriov_basic@enable-vfs-bind-unbind-each@numvfs-4:
    - shard-mtlp:         NOTRUN -> [FAIL][521] ([i915#12910]) +8 other tests fail
   [521]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-6/igt@sriov_basic@enable-vfs-bind-unbind-each@numvfs-4.html

  * igt@tools_test@sysfs_l3_parity:
    - shard-dg2:          NOTRUN -> [SKIP][522] ([i915#4818])
   [522]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@tools_test@sysfs_l3_parity.html

  
#### Possible fixes ####

  * igt@gem_lmem_swapping@massive:
    - shard-dg1:          [ABORT][523] ([i915#14804]) -> [PASS][524] +1 other test pass
   [523]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-17/igt@gem_lmem_swapping@massive.html
   [524]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-15/igt@gem_lmem_swapping@massive.html

  * igt@gem_lmem_swapping@verify:
    - shard-dg2:          [ABORT][525] ([i915#14804]) -> [PASS][526] +1 other test pass
   [525]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-5/igt@gem_lmem_swapping@verify.html
   [526]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-1/igt@gem_lmem_swapping@verify.html

  * igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted:
    - shard-rkl:          [TIMEOUT][527] ([i915#12964]) -> [PASS][528] +1 other test pass
   [527]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted.html
   [528]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted.html

  * igt@gem_pxp@reject-modify-context-protection-off-2:
    - shard-rkl:          [TIMEOUT][529] ([i915#12917] / [i915#12964]) -> [PASS][530] +1 other test pass
   [529]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@gem_pxp@reject-modify-context-protection-off-2.html
   [530]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@gem_pxp@reject-modify-context-protection-off-2.html

  * igt@i915_pm_rc6_residency@rc6-accuracy:
    - shard-rkl:          [FAIL][531] ([i915#12942]) -> [PASS][532] +1 other test pass
   [531]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@i915_pm_rc6_residency@rc6-accuracy.html
   [532]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@i915_pm_rc6_residency@rc6-accuracy.html

  * igt@i915_selftest@live@workarounds:
    - shard-mtlp:         [DMESG-FAIL][533] ([i915#12061]) -> [PASS][534] +1 other test pass
   [533]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-mtlp-7/igt@i915_selftest@live@workarounds.html
   [534]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@i915_selftest@live@workarounds.html

  * igt@kms_async_flips@alternate-sync-async-flip:
    - shard-dg1:          [FAIL][535] ([i915#10991] / [i915#12518] / [i915#12766]) -> [PASS][536]
   [535]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-15/igt@kms_async_flips@alternate-sync-async-flip.html
   [536]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@kms_async_flips@alternate-sync-async-flip.html

  * igt@kms_async_flips@alternate-sync-async-flip-atomic:
    - shard-mtlp:         [FAIL][537] ([i915#10991] / [i915#13320]) -> [PASS][538]
   [537]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-mtlp-1/igt@kms_async_flips@alternate-sync-async-flip-atomic.html
   [538]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@kms_async_flips@alternate-sync-async-flip-atomic.html

  * igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-c-edp-1:
    - shard-mtlp:         [FAIL][539] ([i915#13320]) -> [PASS][540]
   [539]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-mtlp-1/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-c-edp-1.html
   [540]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-7/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-c-edp-1.html

  * igt@kms_async_flips@alternate-sync-async-flip@pipe-d-hdmi-a-4:
    - shard-dg1:          [FAIL][541] ([i915#10991]) -> [PASS][542]
   [541]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-15/igt@kms_async_flips@alternate-sync-async-flip@pipe-d-hdmi-a-4.html
   [542]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-19/igt@kms_async_flips@alternate-sync-async-flip@pipe-d-hdmi-a-4.html

  * igt@kms_color@ctm-red-to-blue:
    - shard-rkl:          [SKIP][543] ([i915#12655] / [i915#14544]) -> [PASS][544] +1 other test pass
   [543]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_color@ctm-red-to-blue.html
   [544]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_color@ctm-red-to-blue.html

  * igt@kms_concurrent@multi-plane-atomic-lowres@pipe-a-edp-1:
    - shard-mtlp:         [ABORT][545] ([i915#14804]) -> [PASS][546] +1 other test pass
   [545]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-mtlp-4/igt@kms_concurrent@multi-plane-atomic-lowres@pipe-a-edp-1.html
   [546]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-mtlp-1/igt@kms_concurrent@multi-plane-atomic-lowres@pipe-a-edp-1.html

  * igt@kms_cursor_crc@cursor-offscreen-256x85:
    - shard-rkl:          [SKIP][547] ([i915#14544]) -> [PASS][548] +30 other tests pass
   [547]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_cursor_crc@cursor-offscreen-256x85.html
   [548]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_cursor_crc@cursor-offscreen-256x85.html

  * igt@kms_cursor_crc@cursor-sliding-128x42:
    - shard-tglu:         [FAIL][549] ([i915#13566]) -> [PASS][550] +5 other tests pass
   [549]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-tglu-7/igt@kms_cursor_crc@cursor-sliding-128x42.html
   [550]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-tglu-3/igt@kms_cursor_crc@cursor-sliding-128x42.html

  * igt@kms_cursor_crc@cursor-suspend:
    - shard-rkl:          [INCOMPLETE][551] ([i915#12358] / [i915#14152]) -> [PASS][552]
   [551]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_cursor_crc@cursor-suspend.html
   [552]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_cursor_crc@cursor-suspend.html

  * igt@kms_cursor_crc@cursor-suspend@pipe-a-hdmi-a-1:
    - shard-rkl:          [INCOMPLETE][553] ([i915#14152]) -> [PASS][554]
   [553]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_cursor_crc@cursor-suspend@pipe-a-hdmi-a-1.html
   [554]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_cursor_crc@cursor-suspend@pipe-a-hdmi-a-1.html

  * igt@kms_cursor_legacy@basic-flip-after-cursor-varying-size:
    - shard-rkl:          [SKIP][555] ([i915#11190] / [i915#14544]) -> [PASS][556]
   [555]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_cursor_legacy@basic-flip-after-cursor-varying-size.html
   [556]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_cursor_legacy@basic-flip-after-cursor-varying-size.html

  * igt@kms_cursor_legacy@flip-vs-cursor-toggle:
    - shard-rkl:          [FAIL][557] ([i915#2346]) -> [PASS][558]
   [557]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-4/igt@kms_cursor_legacy@flip-vs-cursor-toggle.html
   [558]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_cursor_legacy@flip-vs-cursor-toggle.html

  * igt@kms_cursor_legacy@torture-move@pipe-a:
    - shard-glk:          [ABORT][559] ([i915#14804]) -> [PASS][560] +2 other tests pass
   [559]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk9/igt@kms_cursor_legacy@torture-move@pipe-a.html
   [560]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk1/igt@kms_cursor_legacy@torture-move@pipe-a.html

  * igt@kms_flip@2x-flip-vs-fences:
    - shard-glk:          [SKIP][561] -> [PASS][562] +3 other tests pass
   [561]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk8/igt@kms_flip@2x-flip-vs-fences.html
   [562]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk5/igt@kms_flip@2x-flip-vs-fences.html

  * igt@kms_flip@plain-flip-fb-recreate:
    - shard-rkl:          [SKIP][563] ([i915#14544] / [i915#3637]) -> [PASS][564] +6 other tests pass
   [563]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_flip@plain-flip-fb-recreate.html
   [564]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-3/igt@kms_flip@plain-flip-fb-recreate.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling:
    - shard-rkl:          [SKIP][565] ([i915#14544] / [i915#3555]) -> [PASS][566] +2 other tests pass
   [565]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling.html
   [566]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-blt:
    - shard-dg2:          [FAIL][567] ([i915#6880]) -> [PASS][568] +2 other tests pass
   [567]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-11/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-blt.html
   [568]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-7/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-blt:
    - shard-rkl:          [SKIP][569] ([i915#14544] / [i915#1849] / [i915#5354]) -> [PASS][570] +8 other tests pass
   [569]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-blt.html
   [570]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-blt.html

  * igt@kms_hdr@bpc-switch-dpms:
    - shard-dg2:          [SKIP][571] ([i915#3555] / [i915#8228]) -> [PASS][572]
   [571]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-7/igt@kms_hdr@bpc-switch-dpms.html
   [572]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-11/igt@kms_hdr@bpc-switch-dpms.html

  * igt@kms_invalid_mode@zero-clock:
    - shard-rkl:          [SKIP][573] ([i915#14544] / [i915#3555] / [i915#8826]) -> [PASS][574] +1 other test pass
   [573]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_invalid_mode@zero-clock.html
   [574]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_invalid_mode@zero-clock.html

  * igt@kms_plane@plane-panning-bottom-right:
    - shard-rkl:          [SKIP][575] ([i915#14544] / [i915#8825]) -> [PASS][576]
   [575]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_plane@plane-panning-bottom-right.html
   [576]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_plane@plane-panning-bottom-right.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-factor-0-25:
    - shard-rkl:          [SKIP][577] ([i915#14544] / [i915#6953] / [i915#8152]) -> [PASS][578]
   [577]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-factor-0-25.html
   [578]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-factor-0-25.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling@pipe-a:
    - shard-rkl:          [SKIP][579] ([i915#12247] / [i915#14544]) -> [PASS][580] +3 other tests pass
   [579]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling@pipe-a.html
   [580]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-3/igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling@pipe-a.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-75:
    - shard-rkl:          [SKIP][581] ([i915#14544] / [i915#3555] / [i915#6953] / [i915#8152]) -> [PASS][582]
   [581]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-75.html
   [582]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-75.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-75@pipe-b:
    - shard-rkl:          [SKIP][583] ([i915#12247] / [i915#14544] / [i915#8152]) -> [PASS][584] +5 other tests pass
   [583]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-75@pipe-b.html
   [584]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-75@pipe-b.html

  * igt@kms_pm_dc@dc5-dpms-negative:
    - shard-rkl:          [DMESG-WARN][585] ([i915#12964]) -> [PASS][586] +22 other tests pass
   [585]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_pm_dc@dc5-dpms-negative.html
   [586]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_pm_dc@dc5-dpms-negative.html

  * igt@kms_pm_rpm@i2c:
    - shard-dg2:          [FAIL][587] ([i915#8717]) -> [PASS][588]
   [587]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-2/igt@kms_pm_rpm@i2c.html
   [588]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-7/igt@kms_pm_rpm@i2c.html

  * igt@kms_pm_rpm@modeset-lpsp:
    - shard-dg2:          [SKIP][589] ([i915#9519]) -> [PASS][590] +3 other tests pass
   [589]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-7/igt@kms_pm_rpm@modeset-lpsp.html
   [590]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_pm_rpm@modeset-lpsp.html

  * igt@kms_pm_rpm@modeset-non-lpsp:
    - shard-rkl:          [SKIP][591] ([i915#9519]) -> [PASS][592]
   [591]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_pm_rpm@modeset-non-lpsp.html
   [592]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_pm_rpm@modeset-non-lpsp.html

  * igt@kms_properties@plane-properties-atomic:
    - shard-rkl:          [SKIP][593] ([i915#11521] / [i915#14544]) -> [PASS][594]
   [593]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_properties@plane-properties-atomic.html
   [594]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_properties@plane-properties-atomic.html

  * igt@kms_universal_plane@cursor-fb-leak:
    - shard-dg2:          [FAIL][595] ([i915#9196]) -> [PASS][596]
   [595]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-4/igt@kms_universal_plane@cursor-fb-leak.html
   [596]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-3/igt@kms_universal_plane@cursor-fb-leak.html

  * igt@kms_universal_plane@disable-primary-vs-flip:
    - shard-dg1:          [DMESG-WARN][597] ([i915#4423]) -> [PASS][598] +1 other test pass
   [597]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-12/igt@kms_universal_plane@disable-primary-vs-flip.html
   [598]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_universal_plane@disable-primary-vs-flip.html

  * igt@kms_vblank@query-forked-hang:
    - shard-rkl:          [DMESG-WARN][599] ([i915#12917] / [i915#12964]) -> [PASS][600]
   [599]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_vblank@query-forked-hang.html
   [600]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_vblank@query-forked-hang.html

  * igt@perf_pmu@rc6-suspend:
    - shard-rkl:          [INCOMPLETE][601] ([i915#13520]) -> [PASS][602]
   [601]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-4/igt@perf_pmu@rc6-suspend.html
   [602]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@perf_pmu@rc6-suspend.html

  * igt@prime_vgem@basic-fence-flip:
    - shard-rkl:          [SKIP][603] ([i915#14544] / [i915#3708]) -> [PASS][604]
   [603]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@prime_vgem@basic-fence-flip.html
   [604]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@prime_vgem@basic-fence-flip.html

  
#### Warnings ####

  * igt@device_reset@unbind-cold-reset-rebind:
    - shard-rkl:          [SKIP][605] ([i915#11078]) -> [SKIP][606] ([i915#11078] / [i915#14544])
   [605]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@device_reset@unbind-cold-reset-rebind.html
   [606]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@device_reset@unbind-cold-reset-rebind.html

  * igt@gem_bad_reloc@negative-reloc:
    - shard-rkl:          [SKIP][607] ([i915#3281]) -> [SKIP][608] ([i915#14544] / [i915#3281]) +3 other tests skip
   [607]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-3/igt@gem_bad_reloc@negative-reloc.html
   [608]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_bad_reloc@negative-reloc.html

  * igt@gem_basic@multigpu-create-close:
    - shard-rkl:          [SKIP][609] ([i915#7697]) -> [SKIP][610] ([i915#14544] / [i915#7697])
   [609]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@gem_basic@multigpu-create-close.html
   [610]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_basic@multigpu-create-close.html

  * igt@gem_ccs@block-multicopy-compressed:
    - shard-rkl:          [SKIP][611] ([i915#14544] / [i915#9323]) -> [SKIP][612] ([i915#9323])
   [611]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_ccs@block-multicopy-compressed.html
   [612]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@gem_ccs@block-multicopy-compressed.html

  * igt@gem_ctx_sseu@engines:
    - shard-rkl:          [SKIP][613] ([i915#14544] / [i915#280]) -> [SKIP][614] ([i915#280])
   [613]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_ctx_sseu@engines.html
   [614]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@gem_ctx_sseu@engines.html

  * igt@gem_ctx_sseu@mmap-args:
    - shard-rkl:          [SKIP][615] ([i915#280]) -> [SKIP][616] ([i915#14544] / [i915#280])
   [615]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@gem_ctx_sseu@mmap-args.html
   [616]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_ctx_sseu@mmap-args.html

  * igt@gem_eio@kms:
    - shard-rkl:          [SKIP][617] ([i915#14544]) -> [DMESG-WARN][618] ([i915#13363])
   [617]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_eio@kms.html
   [618]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@gem_eio@kms.html

  * igt@gem_exec_balancer@parallel-keep-submit-fence:
    - shard-rkl:          [SKIP][619] ([i915#14544] / [i915#4525]) -> [SKIP][620] ([i915#4525]) +1 other test skip
   [619]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_exec_balancer@parallel-keep-submit-fence.html
   [620]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@gem_exec_balancer@parallel-keep-submit-fence.html

  * igt@gem_exec_capture@capture-invisible:
    - shard-rkl:          [SKIP][621] ([i915#14544] / [i915#6334]) -> [SKIP][622] ([i915#6334]) +1 other test skip
   [621]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_exec_capture@capture-invisible.html
   [622]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@gem_exec_capture@capture-invisible.html

  * igt@gem_exec_reloc@basic-wc-read-noreloc:
    - shard-rkl:          [SKIP][623] ([i915#14544] / [i915#3281]) -> [SKIP][624] ([i915#3281]) +3 other tests skip
   [623]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_exec_reloc@basic-wc-read-noreloc.html
   [624]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@gem_exec_reloc@basic-wc-read-noreloc.html

  * igt@gem_lmem_swapping@heavy-verify-random:
    - shard-rkl:          [SKIP][625] ([i915#4613]) -> [SKIP][626] ([i915#14544] / [i915#4613]) +2 other tests skip
   [625]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@gem_lmem_swapping@heavy-verify-random.html
   [626]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_lmem_swapping@heavy-verify-random.html

  * igt@gem_lmem_swapping@massive:
    - shard-rkl:          [SKIP][627] ([i915#14544] / [i915#4613]) -> [SKIP][628] ([i915#4613]) +2 other tests skip
   [627]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_lmem_swapping@massive.html
   [628]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@gem_lmem_swapping@massive.html

  * igt@gem_partial_pwrite_pread@reads-uncached:
    - shard-rkl:          [SKIP][629] ([i915#14544] / [i915#3282]) -> [SKIP][630] ([i915#3282]) +7 other tests skip
   [629]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_partial_pwrite_pread@reads-uncached.html
   [630]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@gem_partial_pwrite_pread@reads-uncached.html

  * igt@gem_pwrite@basic-self:
    - shard-rkl:          [SKIP][631] ([i915#3282]) -> [SKIP][632] ([i915#14544] / [i915#3282]) +3 other tests skip
   [631]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@gem_pwrite@basic-self.html
   [632]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_pwrite@basic-self.html

  * igt@gem_userptr_blits@dmabuf-unsync:
    - shard-rkl:          [SKIP][633] ([i915#14544] / [i915#3297]) -> [SKIP][634] ([i915#3297]) +2 other tests skip
   [633]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gem_userptr_blits@dmabuf-unsync.html
   [634]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-3/igt@gem_userptr_blits@dmabuf-unsync.html

  * igt@gem_userptr_blits@unsync-unmap-cycles:
    - shard-rkl:          [SKIP][635] ([i915#3297]) -> [SKIP][636] ([i915#14544] / [i915#3297])
   [635]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@gem_userptr_blits@unsync-unmap-cycles.html
   [636]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gem_userptr_blits@unsync-unmap-cycles.html

  * igt@gen9_exec_parse@bb-oversize:
    - shard-rkl:          [SKIP][637] ([i915#2527]) -> [SKIP][638] ([i915#14544] / [i915#2527]) +2 other tests skip
   [637]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@gen9_exec_parse@bb-oversize.html
   [638]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@gen9_exec_parse@bb-oversize.html

  * igt@gen9_exec_parse@bb-start-far:
    - shard-rkl:          [SKIP][639] ([i915#14544] / [i915#2527]) -> [SKIP][640] ([i915#2527])
   [639]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@gen9_exec_parse@bb-start-far.html
   [640]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@gen9_exec_parse@bb-start-far.html

  * igt@i915_pm_freq_mult@media-freq@gt0:
    - shard-rkl:          [SKIP][641] ([i915#14544] / [i915#6590]) -> [SKIP][642] ([i915#6590]) +1 other test skip
   [641]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@i915_pm_freq_mult@media-freq@gt0.html
   [642]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@i915_pm_freq_mult@media-freq@gt0.html

  * igt@i915_power@sanity:
    - shard-rkl:          [SKIP][643] ([i915#14544] / [i915#7984]) -> [SKIP][644] ([i915#7984])
   [643]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@i915_power@sanity.html
   [644]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@i915_power@sanity.html

  * igt@i915_query@hwconfig_table:
    - shard-rkl:          [SKIP][645] ([i915#6245]) -> [SKIP][646] ([i915#14544] / [i915#6245])
   [645]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@i915_query@hwconfig_table.html
   [646]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@i915_query@hwconfig_table.html

  * igt@i915_query@test-query-geometry-subslices:
    - shard-rkl:          [SKIP][647] ([i915#5723]) -> [SKIP][648] ([i915#14544] / [i915#5723])
   [647]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-3/igt@i915_query@test-query-geometry-subslices.html
   [648]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@i915_query@test-query-geometry-subslices.html

  * igt@intel_hwmon@hwmon-read:
    - shard-rkl:          [SKIP][649] ([i915#7707]) -> [SKIP][650] ([i915#14544] / [i915#7707])
   [649]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@intel_hwmon@hwmon-read.html
   [650]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@intel_hwmon@hwmon-read.html

  * igt@kms_addfb_basic@invalid-smem-bo-on-discrete:
    - shard-rkl:          [SKIP][651] ([i915#12454] / [i915#12712] / [i915#14544]) -> [SKIP][652] ([i915#12454] / [i915#12712])
   [651]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_addfb_basic@invalid-smem-bo-on-discrete.html
   [652]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_addfb_basic@invalid-smem-bo-on-discrete.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip:
    - shard-rkl:          [SKIP][653] ([i915#5286]) -> [SKIP][654] ([i915#14544]) +3 other tests skip
   [653]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip.html
   [654]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0:
    - shard-rkl:          [SKIP][655] ([i915#14544]) -> [SKIP][656] ([i915#5286])
   [655]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0.html
   [656]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0.html

  * igt@kms_big_fb@linear-32bpp-rotate-90:
    - shard-rkl:          [SKIP][657] ([i915#3638]) -> [SKIP][658] ([i915#14544]) +2 other tests skip
   [657]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_big_fb@linear-32bpp-rotate-90.html
   [658]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_big_fb@linear-32bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-8bpp-rotate-270:
    - shard-rkl:          [SKIP][659] ([i915#14544]) -> [SKIP][660] ([i915#3638]) +1 other test skip
   [659]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_big_fb@x-tiled-8bpp-rotate-270.html
   [660]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_big_fb@x-tiled-8bpp-rotate-270.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2:
    - shard-rkl:          [SKIP][661] ([i915#6095]) -> [SKIP][662] ([i915#14098] / [i915#6095])
   [661]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2.html
   [662]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-3/igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs:
    - shard-rkl:          [SKIP][663] ([i915#14544]) -> [SKIP][664] ([i915#12313])
   [663]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs.html
   [664]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2:
    - shard-rkl:          [SKIP][665] ([i915#14098] / [i915#6095]) -> [SKIP][666] ([i915#6095]) +1 other test skip
   [665]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2.html
   [666]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2.html

  * igt@kms_ccs@missing-ccs-buffer-4-tiled-mtl-mc-ccs:
    - shard-rkl:          [SKIP][667] ([i915#14544]) -> [SKIP][668] ([i915#14098] / [i915#6095]) +9 other tests skip
   [667]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_ccs@missing-ccs-buffer-4-tiled-mtl-mc-ccs.html
   [668]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_ccs@missing-ccs-buffer-4-tiled-mtl-mc-ccs.html

  * igt@kms_ccs@missing-ccs-buffer-y-tiled-ccs:
    - shard-rkl:          [SKIP][669] ([i915#14098] / [i915#6095]) -> [SKIP][670] ([i915#14544]) +12 other tests skip
   [669]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-4/igt@kms_ccs@missing-ccs-buffer-y-tiled-ccs.html
   [670]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_ccs@missing-ccs-buffer-y-tiled-ccs.html

  * igt@kms_chamelium_edid@dp-edid-stress-resolution-4k:
    - shard-rkl:          [SKIP][671] ([i915#11151] / [i915#14544] / [i915#7828]) -> [SKIP][672] ([i915#11151] / [i915#7828]) +2 other tests skip
   [671]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_chamelium_edid@dp-edid-stress-resolution-4k.html
   [672]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_chamelium_edid@dp-edid-stress-resolution-4k.html

  * igt@kms_chamelium_hpd@dp-hpd:
    - shard-rkl:          [SKIP][673] ([i915#11151] / [i915#7828]) -> [SKIP][674] ([i915#11151] / [i915#14544] / [i915#7828]) +4 other tests skip
   [673]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_chamelium_hpd@dp-hpd.html
   [674]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_chamelium_hpd@dp-hpd.html

  * igt@kms_content_protection@atomic:
    - shard-rkl:          [SKIP][675] ([i915#7118] / [i915#9424]) -> [SKIP][676] ([i915#14544])
   [675]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_content_protection@atomic.html
   [676]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_content_protection@atomic.html

  * igt@kms_content_protection@lic-type-0:
    - shard-dg2:          [SKIP][677] ([i915#9424]) -> [FAIL][678] ([i915#7173])
   [677]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-8/igt@kms_content_protection@lic-type-0.html
   [678]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-10/igt@kms_content_protection@lic-type-0.html

  * igt@kms_content_protection@mei-interface:
    - shard-rkl:          [SKIP][679] ([i915#9424]) -> [SKIP][680] ([i915#14544])
   [679]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-3/igt@kms_content_protection@mei-interface.html
   [680]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_content_protection@mei-interface.html
    - shard-dg1:          [SKIP][681] ([i915#9433]) -> [SKIP][682] ([i915#9424])
   [681]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-13/igt@kms_content_protection@mei-interface.html
   [682]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-14/igt@kms_content_protection@mei-interface.html

  * igt@kms_content_protection@type1:
    - shard-dg2:          [SKIP][683] ([i915#7118] / [i915#7162] / [i915#9424]) -> [SKIP][684] ([i915#7118] / [i915#9424])
   [683]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-11/igt@kms_content_protection@type1.html
   [684]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-7/igt@kms_content_protection@type1.html

  * igt@kms_cursor_crc@cursor-onscreen-64x21:
    - shard-rkl:          [FAIL][685] ([i915#13566]) -> [SKIP][686] ([i915#14544])
   [685]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-3/igt@kms_cursor_crc@cursor-onscreen-64x21.html
   [686]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_cursor_crc@cursor-onscreen-64x21.html

  * igt@kms_cursor_crc@cursor-random-512x512:
    - shard-rkl:          [SKIP][687] ([i915#14544]) -> [SKIP][688] ([i915#13049])
   [687]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_cursor_crc@cursor-random-512x512.html
   [688]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_cursor_crc@cursor-random-512x512.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x32:
    - shard-rkl:          [SKIP][689] ([i915#14544]) -> [SKIP][690] ([i915#3555]) +2 other tests skip
   [689]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html
   [690]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size:
    - shard-dg1:          [SKIP][691] ([i915#4103] / [i915#4213]) -> [SKIP][692] ([i915#4103] / [i915#4213] / [i915#4423])
   [691]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-14/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size.html
   [692]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-13/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size.html

  * igt@kms_cursor_legacy@cursora-vs-flipa-atomic:
    - shard-rkl:          [SKIP][693] ([i915#14544]) -> [DMESG-WARN][694] ([i915#12964]) +1 other test dmesg-warn
   [693]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_cursor_legacy@cursora-vs-flipa-atomic.html
   [694]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_cursor_legacy@cursora-vs-flipa-atomic.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-toggle:
    - shard-rkl:          [SKIP][695] -> [SKIP][696] ([i915#14544]) +8 other tests skip
   [695]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html
   [696]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
    - shard-rkl:          [SKIP][697] ([i915#14544]) -> [SKIP][698] ([i915#4103])
   [697]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html
   [698]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

  * igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
    - shard-rkl:          [SKIP][699] ([i915#9723]) -> [SKIP][700] ([i915#14544])
   [699]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html
   [700]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html

  * igt@kms_dp_aux_dev:
    - shard-rkl:          [SKIP][701] ([i915#1257]) -> [SKIP][702] ([i915#1257] / [i915#14544])
   [701]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_dp_aux_dev.html
   [702]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_dp_aux_dev.html

  * igt@kms_dp_link_training@non-uhbr-sst:
    - shard-rkl:          [SKIP][703] ([i915#14544]) -> [SKIP][704] ([i915#13749]) +1 other test skip
   [703]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_dp_link_training@non-uhbr-sst.html
   [704]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_dp_link_training@non-uhbr-sst.html

  * igt@kms_dsc@dsc-with-output-formats:
    - shard-rkl:          [SKIP][705] ([i915#3555] / [i915#3840]) -> [SKIP][706] ([i915#14544])
   [705]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_dsc@dsc-with-output-formats.html
   [706]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_dsc@dsc-with-output-formats.html

  * igt@kms_feature_discovery@psr1:
    - shard-rkl:          [SKIP][707] ([i915#14544] / [i915#658]) -> [SKIP][708] ([i915#658])
   [707]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_feature_discovery@psr1.html
   [708]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_feature_discovery@psr1.html

  * igt@kms_feature_discovery@psr2:
    - shard-rkl:          [SKIP][709] ([i915#658]) -> [SKIP][710] ([i915#14544] / [i915#658])
   [709]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_feature_discovery@psr2.html
   [710]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_feature_discovery@psr2.html

  * igt@kms_flip@2x-flip-vs-fences-interruptible:
    - shard-rkl:          [SKIP][711] ([i915#14544] / [i915#9934]) -> [SKIP][712] ([i915#9934]) +3 other tests skip
   [711]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_flip@2x-flip-vs-fences-interruptible.html
   [712]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_flip@2x-flip-vs-fences-interruptible.html

  * igt@kms_flip@2x-flip-vs-suspend-interruptible:
    - shard-glk:          [SKIP][713] -> [INCOMPLETE][714] ([i915#12745] / [i915#4839])
   [713]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-glk8/igt@kms_flip@2x-flip-vs-suspend-interruptible.html
   [714]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-glk6/igt@kms_flip@2x-flip-vs-suspend-interruptible.html

  * igt@kms_flip@2x-modeset-vs-vblank-race:
    - shard-rkl:          [SKIP][715] ([i915#9934]) -> [SKIP][716] ([i915#14544] / [i915#9934]) +3 other tests skip
   [715]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_flip@2x-modeset-vs-vblank-race.html
   [716]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_flip@2x-modeset-vs-vblank-race.html

  * igt@kms_flip@flip-vs-panning-interruptible:
    - shard-rkl:          [DMESG-WARN][717] ([i915#12964]) -> [SKIP][718] ([i915#14544] / [i915#3637]) +1 other test skip
   [717]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-5/igt@kms_flip@flip-vs-panning-interruptible.html
   [718]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_flip@flip-vs-panning-interruptible.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling:
    - shard-rkl:          [SKIP][719] ([i915#2672] / [i915#3555]) -> [SKIP][720] ([i915#14544] / [i915#3555]) +1 other test skip
   [719]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-4/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling.html
   [720]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling:
    - shard-rkl:          [SKIP][721] ([i915#14544] / [i915#3555]) -> [SKIP][722] ([i915#2672] / [i915#3555])
   [721]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling.html
   [722]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt:
    - shard-rkl:          [SKIP][723] ([i915#1825]) -> [SKIP][724] ([i915#14544] / [i915#1849] / [i915#5354]) +26 other tests skip
   [723]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt.html
   [724]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-cpu:
    - shard-dg1:          [SKIP][725] ([i915#3458]) -> [SKIP][726] ([i915#3458] / [i915#4423])
   [725]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-18/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-cpu.html
   [726]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-16/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbcpsr-farfromfence-mmap-gtt:
    - shard-dg1:          [SKIP][727] ([i915#8708]) -> [SKIP][728] ([i915#4423] / [i915#8708])
   [727]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-13/igt@kms_frontbuffer_tracking@fbcpsr-farfromfence-mmap-gtt.html
   [728]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-18/igt@kms_frontbuffer_tracking@fbcpsr-farfromfence-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render:
    - shard-dg2:          [SKIP][729] ([i915#10433] / [i915#3458]) -> [SKIP][730] ([i915#3458]) +1 other test skip
   [729]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-4/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render.html
   [730]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-2/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-blt:
    - shard-dg2:          [SKIP][731] ([i915#3458]) -> [SKIP][732] ([i915#10433] / [i915#3458]) +2 other tests skip
   [731]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg2-6/igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-blt.html
   [732]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg2-4/igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render:
    - shard-rkl:          [SKIP][733] ([i915#14544] / [i915#1849] / [i915#5354]) -> [SKIP][734] ([i915#3023]) +9 other tests skip
   [733]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render.html
   [734]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt:
    - shard-rkl:          [SKIP][735] ([i915#14544] / [i915#1849] / [i915#5354]) -> [SKIP][736] ([i915#1825]) +22 other tests skip
   [735]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html
   [736]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-modesetfrombusy:
    - shard-rkl:          [SKIP][737] ([i915#3023]) -> [SKIP][738] ([i915#14544] / [i915#1849] / [i915#5354]) +9 other tests skip
   [737]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-modesetfrombusy.html
   [738]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_frontbuffer_tracking@psr-modesetfrombusy.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-rkl:          [SKIP][739] ([i915#14544]) -> [SKIP][740] ([i915#12713])
   [739]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_hdr@brightness-with-hdr.html
   [740]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-rkl:          [SKIP][741] ([i915#14544]) -> [SKIP][742] ([i915#3555] / [i915#8228]) +1 other test skip
   [741]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_hdr@invalid-metadata-sizes.html
   [742]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_hdr@invalid-metadata-sizes.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-rkl:          [SKIP][743] ([i915#13688]) -> [SKIP][744] ([i915#13688] / [i915#14544])
   [743]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_joiner@basic-max-non-joiner.html
   [744]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_joiner@basic-max-non-joiner.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-rkl:          [SKIP][745] ([i915#14544] / [i915#4070] / [i915#4816]) -> [SKIP][746] ([i915#4816])
   [745]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
   [746]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_plane_lowres@tiling-yf:
    - shard-rkl:          [SKIP][747] ([i915#3555]) -> [SKIP][748] ([i915#14544]) +1 other test skip
   [747]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_plane_lowres@tiling-yf.html
   [748]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_lowres@tiling-yf.html

  * igt@kms_plane_multiple@2x-tiling-x:
    - shard-rkl:          [SKIP][749] ([i915#14544]) -> [SKIP][750] ([i915#13958])
   [749]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_plane_multiple@2x-tiling-x.html
   [750]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_plane_multiple@2x-tiling-x.html

  * igt@kms_plane_multiple@tiling-4:
    - shard-rkl:          [SKIP][751] ([i915#14259]) -> [SKIP][752] ([i915#14544])
   [751]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-3/igt@kms_plane_multiple@tiling-4.html
   [752]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_plane_multiple@tiling-4.html

  * igt@kms_plane_scaling@intel-max-src-size:
    - shard-rkl:          [SKIP][753] ([i915#14544] / [i915#6953] / [i915#8152]) -> [SKIP][754] ([i915#6953])
   [753]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_plane_scaling@intel-max-src-size.html
   [754]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_plane_scaling@intel-max-src-size.html

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-rkl:          [SKIP][755] ([i915#14544] / [i915#5354]) -> [SKIP][756] ([i915#5354])
   [755]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_pm_backlight@fade-with-dpms.html
   [756]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-4/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_pm_dc@dc5-retention-flops:
    - shard-rkl:          [SKIP][757] ([i915#14544] / [i915#3828]) -> [SKIP][758] ([i915#3828])
   [757]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_pm_dc@dc5-retention-flops.html
   [758]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_pm_dc@dc5-retention-flops.html

  * igt@kms_pm_dc@dc6-psr:
    - shard-rkl:          [SKIP][759] ([i915#14544] / [i915#9685]) -> [SKIP][760] ([i915#9685]) +1 other test skip
   [759]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_pm_dc@dc6-psr.html
   [760]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_pm_dc@dc6-psr.html

  * igt@kms_pm_rpm@modeset-non-lpsp-stress:
    - shard-rkl:          [SKIP][761] ([i915#9519]) -> [SKIP][762] ([i915#14544] / [i915#9519]) +1 other test skip
   [761]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-7/igt@kms_pm_rpm@modeset-non-lpsp-stress.html
   [762]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_pm_rpm@modeset-non-lpsp-stress.html

  * igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area:
    - shard-rkl:          [SKIP][763] ([i915#11520] / [i915#14544]) -> [SKIP][764] ([i915#11520]) +7 other tests skip
   [763]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area.html
   [764]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-5/igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-primary-update-sf-dmg-area:
    - shard-rkl:          [SKIP][765] ([i915#11520]) -> [SKIP][766] ([i915#11520] / [i915#14544]) +6 other tests skip
   [765]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-3/igt@kms_psr2_sf@fbc-psr2-overlay-primary-update-sf-dmg-area.html
   [766]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_psr2_sf@fbc-psr2-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr@fbc-pr-no-drrs:
    - shard-rkl:          [SKIP][767] ([i915#1072] / [i915#9732]) -> [SKIP][768] ([i915#1072] / [i915#14544] / [i915#9732]) +10 other tests skip
   [767]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_psr@fbc-pr-no-drrs.html
   [768]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_psr@fbc-pr-no-drrs.html

  * igt@kms_psr@fbc-psr2-primary-render:
    - shard-dg1:          [SKIP][769] ([i915#1072] / [i915#9732]) -> [SKIP][770] ([i915#1072] / [i915#4423] / [i915#9732])
   [769]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-dg1-19/igt@kms_psr@fbc-psr2-primary-render.html
   [770]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-dg1-12/igt@kms_psr@fbc-psr2-primary-render.html

  * igt@kms_psr@psr2-suspend:
    - shard-rkl:          [SKIP][771] ([i915#1072] / [i915#14544] / [i915#9732]) -> [SKIP][772] ([i915#1072] / [i915#9732]) +11 other tests skip
   [771]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_psr@psr2-suspend.html
   [772]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@kms_psr@psr2-suspend.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-rkl:          [SKIP][773] ([i915#5289]) -> [SKIP][774] ([i915#14544])
   [773]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-4/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html
   [774]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-rkl:          [SKIP][775] ([i915#8623]) -> [SKIP][776] ([i915#14544])
   [775]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [776]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@kms_vblank@ts-continuation-dpms-rpm:
    - shard-rkl:          [SKIP][777] ([i915#14544]) -> [DMESG-WARN][778] ([i915#12917] / [i915#12964])
   [777]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@kms_vblank@ts-continuation-dpms-rpm.html
   [778]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-2/igt@kms_vblank@ts-continuation-dpms-rpm.html

  * igt@kms_vrr@seamless-rr-switch-vrr:
    - shard-rkl:          [SKIP][779] ([i915#9906]) -> [SKIP][780] ([i915#14544])
   [779]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@kms_vrr@seamless-rr-switch-vrr.html
   [780]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@kms_vrr@seamless-rr-switch-vrr.html

  * igt@perf@mi-rpc:
    - shard-rkl:          [SKIP][781] ([i915#2434]) -> [SKIP][782] ([i915#14544] / [i915#2434])
   [781]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-2/igt@perf@mi-rpc.html
   [782]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@perf@mi-rpc.html

  * igt@perf_pmu@event-wait:
    - shard-rkl:          [SKIP][783] ([i915#14544]) -> [SKIP][784] +13 other tests skip
   [783]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@perf_pmu@event-wait.html
   [784]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-7/igt@perf_pmu@event-wait.html

  * igt@prime_vgem@basic-fence-read:
    - shard-rkl:          [SKIP][785] ([i915#3291] / [i915#3708]) -> [SKIP][786] ([i915#14544] / [i915#3291] / [i915#3708])
   [785]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-4/igt@prime_vgem@basic-fence-read.html
   [786]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@prime_vgem@basic-fence-read.html

  * igt@prime_vgem@coherency-gtt:
    - shard-rkl:          [SKIP][787] ([i915#14544] / [i915#3708]) -> [SKIP][788] ([i915#3708])
   [787]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-6/igt@prime_vgem@coherency-gtt.html
   [788]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-8/igt@prime_vgem@coherency-gtt.html

  * igt@prime_vgem@fence-write-hang:
    - shard-rkl:          [SKIP][789] ([i915#3708]) -> [SKIP][790] ([i915#14544] / [i915#3708])
   [789]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17004/shard-rkl-8/igt@prime_vgem@fence-write-hang.html
   [790]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/shard-rkl-6/igt@prime_vgem@fence-write-hang.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [i915#10055]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10055
  [i915#10056]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10056
  [i915#10307]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10307
  [i915#10433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10433
  [i915#10434]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10434
  [i915#10553]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10553
  [i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
  [i915#1099]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1099
  [i915#10991]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10991
  [i915#11078]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11078
  [i915#11151]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11151
  [i915#11190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11190
  [i915#11441]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11441
  [i915#11520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11520
  [i915#11521]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11521
  [i915#11527]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11527
  [i915#11681]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11681
  [i915#11713]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11713
  [i915#11920]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11920
  [i915#11965]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11965
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#12247]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12247
  [i915#12276]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12276
  [i915#12313]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12313
  [i915#12316]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12316
  [i915#12339]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12339
  [i915#12353]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12353
  [i915#12358]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12358
  [i915#12388]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12388
  [i915#12394]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12394
  [i915#12454]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12454
  [i915#12455]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12455
  [i915#12518]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12518
  [i915#12549]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12549
  [i915#1257]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1257
  [i915#12655]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12655
  [i915#12712]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12712
  [i915#12713]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12713
  [i915#12745]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12745
  [i915#12755]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12755
  [i915#12761]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12761
  [i915#12766]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12766
  [i915#12796]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12796
  [i915#12805]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12805
  [i915#12817]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12817
  [i915#12910]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12910
  [i915#12917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12917
  [i915#12942]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12942
  [i915#12964]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12964
  [i915#12967]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12967
  [i915#13008]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13008
  [i915#13046]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13046
  [i915#13049]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13049
  [i915#13196]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13196
  [i915#13304]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13304
  [i915#13320]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13320
  [i915#13363]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13363
  [i915#13427]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13427
  [i915#13520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13520
  [i915#13522]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13522
  [i915#13566]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13566
  [i915#13688]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13688
  [i915#13748]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13748
  [i915#13749]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13749
  [i915#13781]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13781
  [i915#13783]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13783
  [i915#13784]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13784
  [i915#13790]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13790
  [i915#13820]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13820
  [i915#13958]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13958
  [i915#14073]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14073
  [i915#14098]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14098
  [i915#14118]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14118
  [i915#14123]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14123
  [i915#14152]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14152
  [i915#14259]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14259
  [i915#14415]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14415
  [i915#14433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14433
  [i915#14544]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14544
  [i915#14545]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14545
  [i915#14602]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14602
  [i915#14712]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14712
  [i915#14756]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14756
  [i915#14804]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14804
  [i915#14806]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14806
  [i915#1769]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1769
  [i915#1825]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1825
  [i915#1839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1839
  [i915#1849]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1849
  [i915#1850]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1850
  [i915#2346]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2346
  [i915#2433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2433
  [i915#2434]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2434
  [i915#2437]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2437
  [i915#2527]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2527
  [i915#2582]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2582
  [i915#2587]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2587
  [i915#2658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2658
  [i915#2672]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2672
  [i915#2681]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2681
  [i915#280]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/280
  [i915#2856]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2856
  [i915#3023]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3023
  [i915#3116]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3116
  [i915#3281]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3282
  [i915#3291]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3291
  [i915#3297]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3297
  [i915#3299]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3299
  [i915#3323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3323
  [i915#3361]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3361
  [i915#3458]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3458
  [i915#3539]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3539
  [i915#3555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3555
  [i915#3637]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3637
  [i915#3638]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3638
  [i915#3708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3708
  [i915#3742]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3742
  [i915#3804]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3804
  [i915#3828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3828
  [i915#3840]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3840
  [i915#4070]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4070
  [i915#4077]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4077
  [i915#4079]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4079
  [i915#4083]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4083
  [i915#4103]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4103
  [i915#4212]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4212
  [i915#4213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4213
  [i915#4270]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4270
  [i915#4348]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4348
  [i915#4349]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4349
  [i915#4423]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4423
  [i915#4525]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4525
  [i915#4537]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4537
  [i915#4538]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4538
  [i915#4613]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4613
  [i915#4771]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4771
  [i915#4812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4812
  [i915#4816]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4816
  [i915#4817]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4817
  [i915#4818]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4818
  [i915#4839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4839
  [i915#4852]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4852
  [i915#4860]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4860
  [i915#4880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4880
  [i915#4958]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4958
  [i915#5190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5190
  [i915#5286]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5286
  [i915#5289]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5289
  [i915#5354]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5354
  [i915#5439]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5439
  [i915#5723]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5723
  [i915#5784]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5784
  [i915#6095]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6095
  [i915#6245]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6245
  [i915#6301]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6301
  [i915#6334]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6334
  [i915#6335]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6335
  [i915#6524]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6524
  [i915#658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/658
  [i915#6590]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6590
  [i915#6621]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6621
  [i915#6805]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6805
  [i915#6806]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6806
  [i915#6880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6880
  [i915#6944]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6944
  [i915#6953]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6953
  [i915#7116]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7116
  [i915#7118]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7118
  [i915#7162]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7162
  [i915#7173]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7173
  [i915#7387]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7387
  [i915#7443]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7443
  [i915#7697]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7697
  [i915#7707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7707
  [i915#7828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7828
  [i915#7984]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7984
  [i915#8152]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8152
  [i915#8213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8213
  [i915#8228]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8228
  [i915#8289]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8289
  [i915#8346]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8346
  [i915#8399]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8399
  [i915#8411]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8411
  [i915#8428]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8428
  [i915#8516]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8516
  [i915#8555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8555
  [i915#8562]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8562
  [i915#8623]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8623
  [i915#8708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8708
  [i915#8717]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8717
  [i915#8808]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8808
  [i915#8810]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8810
  [i915#8813]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8813
  [i915#8814]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8814
  [i915#8821]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8821
  [i915#8825]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8825
  [i915#8826]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8826
  [i915#9196]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9196
  [i915#9323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9323
  [i915#9337]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9337
  [i915#9412]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9412
  [i915#9423]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9423
  [i915#9424]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9424
  [i915#9433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9433
  [i915#9519]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9519
  [i915#9581]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9581
  [i915#9683]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9683
  [i915#9685]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9685
  [i915#9688]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9688
  [i915#9723]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9723
  [i915#9732]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9732
  [i915#9808]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9808
  [i915#9809]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9809
  [i915#9812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9812
  [i915#9833]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9833
  [i915#9878]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9878
  [i915#9906]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9906
  [i915#9917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9917
  [i915#9934]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9934


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_8494 -> IGTPW_13586
  * Piglit: piglit_4509 -> None

  CI-20190529: 20190529
  CI_DRM_17004: 90b26f76462c96e29198988df41d6bd86d92c656 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_13586: 12c4cafd059541b6bd4dd2e4347bafda874323dd @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_8494: 8494
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_13586/index.html

[-- Attachment #2: Type: text/html, Size: 267719 bytes --]

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 27/30] tests/kms_colorop: Add a 3D LUT subtest
  2025-08-15  4:06 ` [PATCH V10 27/30] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
@ 2025-08-22 21:35   ` Aurabindo Pillai
  2025-08-26 16:39   ` Aurabindo Pillai
  1 sibling, 0 replies; 49+ messages in thread
From: Aurabindo Pillai @ 2025-08-22 21:35 UTC (permalink / raw)
  To: igt-dev



On 8/15/25 12:06 AM, Alex Hung wrote:
> This includes a subtests 3dlut_17_12_rgb.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> ---
>   include/drm-uapi/drm_mode.h |   18 +
>   lib/igt_color.c             |  186 ++
>   lib/igt_color.h             |   10 +
>   lib/igt_color_lut.h         | 4946 +++++++++++++++++++++++++++++++++++
>   lib/igt_kms.c               |    2 +
>   lib/igt_kms.h               |    2 +
>   tests/kms_colorop.c         |   35 +-
>   tests/kms_colorop.h         |   19 +
>   8 files changed, 5217 insertions(+), 1 deletion(-)
>   create mode 100644 lib/igt_color_lut.h
> 
> diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
> index fe3e98e20..009bb3e7f 100644
> --- a/include/drm-uapi/drm_mode.h
> +++ b/include/drm-uapi/drm_mode.h
> @@ -891,6 +891,24 @@ enum drm_colorop_type {
>   	DRM_COLOROP_1D_LUT,
>   	DRM_COLOROP_CTM_3X4,
>   	DRM_COLOROP_MULTIPLIER,
> +	DRM_COLOROP_3D_LUT,
> +};
> +
> +enum drm_colorop_interpolation_type {
> +	DRM_COLOROP_TETRAHEDRAL,
> +};
> +
> +/**
> + * enum drm_colorop_lut3d_interpolation_type - type of 3DLUT interpolation
> + *
> + */
> +enum drm_colorop_lut3d_interpolation_type {
> +	/**
> +	 * @DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL:
> +	 *
> +	 * Tetrahedral 3DLUT interpolation
> +	 */
> +	DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL,
>   };
>   
>   /**
> diff --git a/lib/igt_color.c b/lib/igt_color.c
> index aa65eac20..6a306bda2 100644
> --- a/lib/igt_color.c
> +++ b/lib/igt_color.c
> @@ -213,6 +213,184 @@ void igt_color_multiply_inv_125(igt_pixel_t *pixel)
>   	igt_color_multiply(pixel, 1 / 125.0f);
>   }
>   
> +static int
> +igt_get_lut3d_index_blue_fast(int r, int g, int b, long dim, int components)
> +{
> +	return components * (b + (int)dim * (g + (int)dim * r));
> +}
> +
> +/* algorithm from https://github.com/AcademySoftwareFoundation/OpenColorIO/blob/main/src/OpenColorIO/ops/lut3d/Lut3DOpCPU.cpp#L422 */
> +static void igt_color_3dlut_tetrahedral(igt_pixel_t *pixel, igt_3dlut_t *lut3d, long m_dim)
> +{
> +	int n000, n100, n010, n001, n110, n101, n011, n111;
> +	float m_step = (float) m_dim - 1.0f;
> +	const float dimMinusOne = (float) m_dim - 1.f;
> +	float *m_optLut = (float *) lut3d->lut;
> +	float idx[3];
> +	float out[3];
> +	int indexLow[3];
> +	int indexHigh[3];
> +	float fx, fy, fz;
> +
> +	idx[0] = pixel->b * m_step;
> +	idx[1] = pixel->g * m_step;
> +	idx[2] = pixel->r * m_step;
> +
> +	// NaNs become 0.
> +	idx[0] = clamp(idx[0], 0.f, dimMinusOne);
> +	idx[1] = clamp(idx[1], 0.f, dimMinusOne);
> +	idx[2] = clamp(idx[2], 0.f, dimMinusOne);
> +
> +	indexLow[0] = floor(idx[0]);
> +	indexLow[1] = floor(idx[1]);
> +	indexLow[2] = floor(idx[2]);
> +
> +	// When the idx is exactly equal to an index (e.g. 0,1,2...)
> +	// then the computation of highIdx is wrong. However,
> +	// the delta is then equal to zero (e.g. idx-lowIdx),
> +	// so the highIdx has no impact.
> +	indexHigh[0] = ceil(idx[0]);
> +	indexHigh[1] = ceil(idx[1]);
> +	indexHigh[2] = ceil(idx[2]);
> +
> +	fx = idx[0] - (float) indexLow[0];
> +	fy = idx[1] - (float) indexLow[1];
> +	fz = idx[2] - (float) indexLow[2];
> +
> +	// Compute index into LUT for surrounding corners
> +	n000 = igt_get_lut3d_index_blue_fast(indexLow[0], indexLow[1], indexLow[2], m_dim, 3);
> +	n100 = igt_get_lut3d_index_blue_fast(indexHigh[0], indexLow[1], indexLow[2], m_dim, 3);
> +	n010 = igt_get_lut3d_index_blue_fast(indexLow[0], indexHigh[1], indexLow[2], m_dim, 3);
> +	n001 = igt_get_lut3d_index_blue_fast(indexLow[0], indexLow[1], indexHigh[2], m_dim, 3);
> +	n110 = igt_get_lut3d_index_blue_fast(indexHigh[0], indexHigh[1], indexLow[2], m_dim, 3);
> +	n101 = igt_get_lut3d_index_blue_fast(indexHigh[0], indexLow[1], indexHigh[2], m_dim, 3);
> +	n011 = igt_get_lut3d_index_blue_fast(indexLow[0], indexHigh[1], indexHigh[2], m_dim, 3);
> +	n111 = igt_get_lut3d_index_blue_fast(indexHigh[0], indexHigh[1], indexHigh[2], m_dim, 3);
> +
> +	if (fx > fy) {
> +		if (fy > fz) {
> +			out[0] =
> +				(1 - fx)  * m_optLut[n000] +
> +				(fx - fy) * m_optLut[n100] +
> +				(fy - fz) * m_optLut[n110] +
> +				(fz)      * m_optLut[n111];
> +
> +			out[1] =
> +				(1 - fx)  * m_optLut[n000 + 1] +
> +				(fx - fy) * m_optLut[n100 + 1] +
> +				(fy - fz) * m_optLut[n110 + 1] +
> +				(fz)      * m_optLut[n111 + 1];
> +
> +			out[2] =
> +				(1 - fx)  * m_optLut[n000 + 2] +
> +				(fx - fy) * m_optLut[n100 + 2] +
> +				(fy - fz) * m_optLut[n110 + 2] +
> +				(fz)      * m_optLut[n111 + 2];
> +		} else if (fx > fz) {
> +			out[0] =
> +				(1 - fx)  * m_optLut[n000] +
> +				(fx - fz) * m_optLut[n100] +
> +				(fz - fy) * m_optLut[n101] +
> +				(fy)      * m_optLut[n111];
> +
> +			out[1] =
> +				(1 - fx)  * m_optLut[n000 + 1] +
> +				(fx - fz) * m_optLut[n100 + 1] +
> +				(fz - fy) * m_optLut[n101 + 1] +
> +				(fy)      * m_optLut[n111 + 1];
> +
> +			out[2] =
> +				(1 - fx)  * m_optLut[n000 + 2] +
> +				(fx - fz) * m_optLut[n100 + 2] +
> +				(fz - fy) * m_optLut[n101 + 2] +
> +				(fy)      * m_optLut[n111 + 2];
> +		} else {
> +			out[0] =
> +				(1 - fz)  * m_optLut[n000] +
> +				(fz - fx) * m_optLut[n001] +
> +				(fx - fy) * m_optLut[n101] +
> +				(fy)      * m_optLut[n111];
> +
> +			out[1] =
> +				(1 - fz)  * m_optLut[n000 + 1] +
> +				(fz - fx) * m_optLut[n001 + 1] +
> +				(fx - fy) * m_optLut[n101 + 1] +
> +				(fy)      * m_optLut[n111 + 1];
> +
> +			out[2] =
> +				(1 - fz)  * m_optLut[n000 + 2] +
> +				(fz - fx) * m_optLut[n001 + 2] +
> +				(fx - fy) * m_optLut[n101 + 2] +
> +				(fy)      * m_optLut[n111 + 2];
> +		}
> +	} else {
> +		if (fz > fy) {
> +			out[0] =
> +				(1 - fz)  * m_optLut[n000] +
> +				(fz - fy) * m_optLut[n001] +
> +				(fy - fx) * m_optLut[n011] +
> +				(fx)      * m_optLut[n111];
> +
> +			out[1] =
> +				(1 - fz)  * m_optLut[n000 + 1] +
> +				(fz - fy) * m_optLut[n001 + 1] +
> +				(fy - fx) * m_optLut[n011 + 1] +
> +				(fx)      * m_optLut[n111 + 1];
> +
> +			out[2] =
> +				(1 - fz)  * m_optLut[n000 + 2] +
> +				(fz - fy) * m_optLut[n001 + 2] +
> +				(fy - fx) * m_optLut[n011 + 2] +
> +				(fx)      * m_optLut[n111 + 2];
> +		} else if (fz > fx) {
> +			out[0] =
> +				(1 - fy)  * m_optLut[n000] +
> +				(fy - fz) * m_optLut[n010] +
> +				(fz - fx) * m_optLut[n011] +
> +				(fx)      * m_optLut[n111];
> +
> +			out[1] =
> +				(1 - fy)  * m_optLut[n000 + 1] +
> +				(fy - fz) * m_optLut[n010 + 1] +
> +				(fz - fx) * m_optLut[n011 + 1] +
> +				(fx)      * m_optLut[n111 + 1];
> +
> +			out[2] =
> +				(1 - fy)  * m_optLut[n000 + 2] +
> +				(fy - fz) * m_optLut[n010 + 2] +
> +				(fz - fx) * m_optLut[n011 + 2] +
> +				(fx)      * m_optLut[n111 + 2];
> +		} else {
> +			out[0] =
> +				(1 - fy)  * m_optLut[n000] +
> +				(fy - fx) * m_optLut[n010] +
> +				(fx - fz) * m_optLut[n110] +
> +				(fz)      * m_optLut[n111];
> +
> +			out[1] =
> +				(1 - fy)  * m_optLut[n000 + 1] +
> +				(fy - fx) * m_optLut[n010 + 1] +
> +				(fx - fz) * m_optLut[n110 + 1] +
> +				(fz)      * m_optLut[n111 + 1];
> +
> +			out[2] =
> +				(1 - fy)  * m_optLut[n000 + 2] +
> +				(fy - fx) * m_optLut[n010 + 2] +
> +				(fx - fz) * m_optLut[n110 + 2] +
> +				(fz)      * m_optLut[n111 + 2];
> +		}
> +	}
> +
> +	pixel->r = out[0];
> +	pixel->g = out[1];
> +	pixel->b = out[2];
> +}
> +
> +void igt_color_3dlut_17_12_rgb(igt_pixel_t *pixel)
> +{
> +	igt_color_3dlut_tetrahedral(pixel, &igt_3dlut_17_rgb, 17);
> +}
> +
>   static void
>   igt_color_fourcc_to_pixel(uint32_t raw_pixel, uint32_t drm_format, igt_pixel_t *pixel)
>   {
> @@ -446,3 +624,11 @@ void igt_colorop_set_custom_1dlut(igt_display_t *display,
>   {
>   	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, lut1d, lut_size);
>   }
> +
> +void igt_colorop_set_3dlut(igt_display_t *display,
> +			   igt_colorop_t *colorop,
> +			   const igt_3dlut_norm_t *lut3d,
> +			   const size_t lut_size)
> +{
> +	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, lut3d, lut_size);
> +}
> diff --git a/lib/igt_color.h b/lib/igt_color.h
> index 761dd2f95..0e1dc84e2 100644
> --- a/lib/igt_color.h
> +++ b/lib/igt_color.h
> @@ -16,6 +16,7 @@
>   
>   #include "igt_fb.h"
>   #include "igt_kms.h"
> +#include "igt_color_lut.h"
>   
>   #define MAX_COLOR_LUT_ENTRIES 4096
>   
> @@ -112,6 +113,12 @@ void igt_colorop_set_custom_1dlut(igt_display_t *display,
>   				  const igt_1dlut_t *lut1d,
>   				  const size_t lut_size);
>   
> +void igt_colorop_set_3dlut(igt_display_t *display,
> +			   igt_colorop_t *colorop,
> +			   const igt_3dlut_norm_t *lut3d,
> +			   const size_t lut_size);
> +
> +
>   /* transformations */
>   
>   void igt_color_srgb_inv_eotf(igt_pixel_t *pixel);
> @@ -136,4 +143,7 @@ void igt_color_ctm_3x4_bt709_enc(igt_pixel_t *pixel);
>   
>   void igt_color_multiply_125(igt_pixel_t *pixel);
>   void igt_color_multiply_inv_125(igt_pixel_t *pixel);
> +void igt_color_3dlut_17_12_rgb(igt_pixel_t *pixel);
> +void igt_color_3dlut_17_12_bgr(igt_pixel_t *pixel);
> +
>   #endif
> diff --git a/lib/igt_color_lut.h b/lib/igt_color_lut.h
> new file mode 100644
> index 000000000..b5c149c3d
> --- /dev/null
> +++ b/lib/igt_color_lut.h
> @@ -0,0 +1,4946 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright 2024 Advanced Micro Devices, Inc.
> + *
> + */
> +
> +#ifndef __IGT_COLOR_LUT_H__
> +#define __IGT_COLOR_LUT_H__
> +
> +#include "drm_mode.h"
> +
> +typedef struct igt_3dlut_norm {
> +	struct drm_color_lut32 lut[4913];
> +} igt_3dlut_norm_t;
> +
> +struct igt_color_lut_float {
> +	float red;
> +	float green;
> +	float blue;
> +};
> +
> +typedef struct igt_3dlut {
> +	struct igt_color_lut_float lut[4913];
> +} igt_3dlut_t;
> +
> +/*
> + * A 3D LUT table with 17x17x17 entries for Traversal order RGB.
> + * It can be generated by scripts/convert_3dlut.py
> + */
> +igt_3dlut_t igt_3dlut_17_rgb = { {

This is pretty big, and assuming this doesn't need to be changed, 
perhaps make it const so that it goes to .rodata

> +	{ .red = 0.000000, .green = 0.000000, .blue = 0.000000 },
> +	{ .red = 0.175580, .green = 0.003419, .blue = 0.006838 },
> +	{ .red = 0.338706, .green = 0.015140, .blue = 0.012454 },
> +	{ .red = 0.492552, .green = 0.015629, .blue = 0.012454 },
> +	{ .red = 0.641026, .green = 0.023687, .blue = 0.013187 },
> +	{ .red = 0.734310, .green = 0.049817, .blue = 0.013675 },
> +	{ .red = 0.809035, .green = 0.063736, .blue = 0.006105 },
> +	{ .red = 0.884982, .green = 0.063492, .blue = 0.019048 },
> +	{ .red = 0.963370, .green = 0.056899, .blue = 0.028571 },
> +	{ .red = 0.993407, .green = 0.080586, .blue = 0.044689 },
> +	{ .red = 0.999267, .green = 0.099145, .blue = 0.054457 },
> +	{ .red = 0.999267, .green = 0.110623, .blue = 0.060317 },
> +	{ .red = 0.999267, .green = 0.116972, .blue = 0.064225 },
> +	{ .red = 0.999267, .green = 0.121612, .blue = 0.066422 },

< snip >

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 23/30] lib/igt_color: Add 1D LUT color transformation support
  2025-08-15  4:06 ` [PATCH V10 23/30] lib/igt_color: Add 1D LUT color transformation support Alex Hung
@ 2025-08-22 21:43   ` Aurabindo Pillai
  0 siblings, 0 replies; 49+ messages in thread
From: Aurabindo Pillai @ 2025-08-22 21:43 UTC (permalink / raw)
  To: igt-dev



On 8/15/25 12:06 AM, Alex Hung wrote:
> Add definitions and functions for setting 1D LUT on a
> drm_colorop.
> 
> Add support for the SIZE prop of a colorop, as that's
> required for understanding the size of the LUT to
> construct.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Co-developed-by: Harry Wentland <harry.wentland@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   include/drm-uapi/drm_mode.h | 12 ++++++++++++
>   lib/igt_color.c             |  8 ++++++++
>   lib/igt_color.h             | 20 ++++++++++++++++++++
>   lib/igt_kms.c               |  1 +
>   lib/igt_kms.h               |  1 +
>   5 files changed, 42 insertions(+)
> 
> diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
> index fce45b5cf..106fbb889 100644
> --- a/include/drm-uapi/drm_mode.h
> +++ b/include/drm-uapi/drm_mode.h
> @@ -874,6 +874,18 @@ struct drm_color_lut {
>   	__u16 reserved;
>   };
>   
> +/*
> + * struct drm_color_lut32
> + *
> + * 32-bit per channel color LUT entry, similar to drm_color_lut.
> + */
> +struct drm_color_lut32 {
> +	__u32 red;
> +	__u32 green;
> +	__u32 blue;
> +	__u32 reserved;
> +};
> +
>   enum drm_colorop_type {
>   	DRM_COLOROP_1D_CURVE,
>   	DRM_COLOROP_1D_LUT,
> diff --git a/lib/igt_color.c b/lib/igt_color.c
> index 6a639813f..a58ba0e57 100644
> --- a/lib/igt_color.c
> +++ b/lib/igt_color.c
> @@ -428,3 +428,11 @@ void igt_colorop_set_ctm_3x4(igt_display_t *display,
>   	/* set blob property */
>   	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, &ctm, sizeof(ctm));
>   }
> +
> +void igt_colorop_set_custom_1dlut(igt_display_t *display,
> +				  igt_colorop_t *colorop,
> +				  const igt_1dlut_t *lut1d,
> +				  const size_t lut_size)
> +{
> +	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, lut1d, lut_size);
> +}
> diff --git a/lib/igt_color.h b/lib/igt_color.h
> index 9f56536a3..88de8166f 100644
> --- a/lib/igt_color.h
> +++ b/lib/igt_color.h
> @@ -17,6 +17,8 @@
>   #include "igt_fb.h"
>   #include "igt_kms.h"
>   
> +#define MAX_COLOR_LUT_ENTRIES 4096
> +
>   struct igt_color_tf {
>   	float g, a, b, c, d, e, f;
>   };
> @@ -37,6 +39,17 @@ typedef struct igt_pixel {
>   	float b;
>   } igt_pixel_t;
>   
> +typedef struct igt_1dlut {
> +	struct drm_color_lut32 lut[MAX_COLOR_LUT_ENTRIES];
> +} igt_1dlut_t;
> +
> +igt_1dlut_t igt_1dlut_srgb_inv_eotf = { {
> +} };
> +
> +
> +igt_1dlut_t igt_1dlut_srgb_eotf = { {
> +} };
> +
>   typedef struct igt_matrix_3x4 {
>   	/*
>   	 * out   matrix          in
> @@ -94,11 +107,18 @@ void igt_colorop_set_ctm_3x4(igt_display_t *display,
>   			     igt_colorop_t *colorop,
>   			     const igt_matrix_3x4_t *matrix);
>   
> +void igt_colorop_set_custom_1dlut(igt_display_t *display,
> +				  igt_colorop_t *colorop,
> +				  const igt_1dlut_t *lut1d,
> +				  const size_t lut_size);
> +
>   /* transformations */
>   
>   void igt_color_srgb_inv_eotf(igt_pixel_t *pixel);
>   void igt_color_srgb_eotf(igt_pixel_t *pixel);
>   
> +void igt_color_srgb_inv_eotf_custom_lut(igt_pixel_t *pixel);
> +

This is missing implementation. Maybe remove for now ?

>   void igt_color_pq_inv_eotf(igt_pixel_t *pixel);
>   void igt_color_pq_eotf(igt_pixel_t *pixel);
>   
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index d1c23b4a4..bdde2fc72 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -710,6 +710,7 @@ const char * const igt_colorop_prop_names[IGT_NUM_COLOROP_PROPS] = {
>   	[IGT_COLOROP_TYPE] = "TYPE",
>   	[IGT_COLOROP_BYPASS] = "BYPASS",
>   	[IGT_COLOROP_CURVE_1D_TYPE] = "CURVE_1D_TYPE",
> +	[IGT_COLOROP_SIZE] = "SIZE",
>   	[IGT_COLOROP_DATA] = "DATA",
>   	[IGT_COLOROP_NEXT] = "NEXT",
>   };
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 2a401cd3b..d0a7ed037 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -374,6 +374,7 @@ enum igt_atomic_colorop_properties {
>   	IGT_COLOROP_TYPE,
>   	IGT_COLOROP_BYPASS,
>   	IGT_COLOROP_CURVE_1D_TYPE,
> +	IGT_COLOROP_SIZE,
>   	IGT_COLOROP_DATA,
>   	IGT_COLOROP_NEXT,
>   	IGT_NUM_COLOROP_PROPS


^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 17/30] lib/igt_color: Support color transform for XRGB2101010
  2025-08-15  4:06 ` [PATCH V10 17/30] lib/igt_color: Support color transform for XRGB2101010 Alex Hung
@ 2025-08-26 16:28   ` Aurabindo Pillai
  0 siblings, 0 replies; 49+ messages in thread
From: Aurabindo Pillai @ 2025-08-26 16:28 UTC (permalink / raw)
  To: igt-dev



On 8/15/25 12:06 AM, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> Support color format XRGB2101010.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   lib/igt_color.c     | 113 +++++++++++++++++++++++++++-----------------
>   tests/kms_colorop.c |   3 ++
>   2 files changed, 73 insertions(+), 43 deletions(-)
> 
> diff --git a/lib/igt_color.c b/lib/igt_color.c
> index bc90fbdca..adf08fa2a 100644
> --- a/lib/igt_color.c
> +++ b/lib/igt_color.c
> @@ -132,6 +132,74 @@ void igt_color_ctm_3x4_bt709_dec(igt_pixel_t *pixel)
>   	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_bt709_dec);
>   }
>   
> +static void
> +igt_color_fourcc_to_pixel(uint32_t raw_pixel, uint32_t drm_format, igt_pixel_t *pixel)
> +{
> +	if (drm_format == DRM_FORMAT_XRGB8888) {
> +		raw_pixel &= 0x00ffffff;
> +
> +		pixel->r = (raw_pixel & 0x00ff0000) >> 16;
> +		pixel->g = (raw_pixel & 0x0000ff00) >> 8;
> +		pixel->b = (raw_pixel & 0x000000ff);
> +
> +		/* normalize for 8-bit */
> +		pixel->r /= (0xff);
> +		pixel->g /= (0xff);
> +		pixel->b /= (0xff);
> +	} else if (drm_format == DRM_FORMAT_XRGB2101010) {
> +		raw_pixel &= 0x3fffffff;
> +
> +		pixel->r = (raw_pixel & 0x3ff00000) >> 20;
> +		pixel->g = (raw_pixel & 0x000ffc00) >> 10;
> +		pixel->b = (raw_pixel & 0x000003ff);
> +
> +		/* normalize for 10-bit */
> +		pixel->r /= (0x3ff);
> +		pixel->g /= (0x3ff);
> +		pixel->b /= (0x3ff);
> +	} else {
> +		igt_skip("pixel format support not implemented");
> +	}
> +}
> +
> +static uint32_t
> +igt_color_pixel_to_fourc(uint32_t drm_format, igt_pixel_t *pixel)

Maybe rename this to fourcc?


^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 11/30] lib/igt_color: Add support for 3x4 matrices
  2025-08-15  4:06 ` [PATCH V10 11/30] lib/igt_color: Add support for 3x4 matrices Alex Hung
@ 2025-08-26 16:29   ` Aurabindo Pillai
  0 siblings, 0 replies; 49+ messages in thread
From: Aurabindo Pillai @ 2025-08-26 16:29 UTC (permalink / raw)
  To: igt-dev



On 8/15/25 12:06 AM, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> Support 3x4 matrices in color pipeline API.
> 
> Also add a few matrices for testing.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   lib/igt_color.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++
>   lib/igt_color.h | 54 +++++++++++++++++++++++++++++++
>   2 files changed, 140 insertions(+)
> 
> diff --git a/lib/igt_color.c b/lib/igt_color.c
> index 0e5f391db..bc90fbdca 100644
> --- a/lib/igt_color.c
> +++ b/lib/igt_color.c
> @@ -11,6 +11,7 @@
>   #include <errno.h>
>   #include <math.h>
>   
> +#include "drmtest.h"
>   #include "igt_color.h"
>   #include "igt_core.h"
>   #include "igt_x86.h"
> @@ -76,6 +77,62 @@ void igt_color_srgb_eotf(igt_pixel_t *pixel)
>   	pixel->b = igt_color_tf_eval(&srgb_eotf, pixel->b);
>   }
>   
> +static void igt_color_apply_3x4_ctm(igt_pixel_t *pixel, const igt_matrix_3x4_t *matrix)
> +{
> +	igt_pixel_t result;
> +
> +	memcpy(&result, pixel, sizeof(result));
> +
> +	result.r = matrix->m[0] * pixel->r +
> +		   matrix->m[1] * pixel->g +
> +		   matrix->m[2] * pixel->b +
> +		   matrix->m[3];
> +
> +	result.g = matrix->m[4] * pixel->r +
> +		   matrix->m[5] * pixel->g +
> +		   matrix->m[6] * pixel->b +
> +		   matrix->m[7];
> +
> +	result.b = matrix->m[8] * pixel->r +
> +		   matrix->m[9] * pixel->g +
> +		   matrix->m[10] * pixel->b +
> +		   matrix->m[11];
> +
> +	memcpy(pixel, &result, sizeof(result));
> +
> +}
> +
> +void igt_color_ctm_3x4_50_desat(igt_pixel_t *pixel)
> +{
> +	/* apply a 50% desat matrix */
> +	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_50_desat);
> +}
> +
> +void igt_color_ctm_3x4_overdrive(igt_pixel_t *pixel)
> +{
> +	/* apply a 50% desat matrix */
> +	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_overdrive);
> +}
> +
> +void igt_color_ctm_3x4_oversaturate(igt_pixel_t *pixel)
> +{
> +	/* apply a 50% desat matrix */
> +	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_oversaturate);
> +}
> +
> +void igt_color_ctm_3x4_bt709_enc(igt_pixel_t *pixel)
> +{
> +	/* apply a 50% desat matrix */
> +	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_bt709_enc);
> +}
> +
> +void igt_color_ctm_3x4_bt709_dec(igt_pixel_t *pixel)
> +{
> +	/* apply a 50% desat matrix */
> +	igt_color_apply_3x4_ctm(pixel, &igt_matrix_3x4_bt709_dec);
> +}
> +
> +
>   int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], int num_transforms)
>   {
>   	uint32_t *line = NULL;
> @@ -142,6 +199,11 @@ int igt_color_transform_pixels(igt_fb_t *fb, igt_pixel_transform transforms[], i
>   			for (i = 0; i < num_transforms; i++)
>   				transforms[i](&pixel);
>   
> +			/* clip */
> +			pixel.r = fmax(fmin(pixel.r, 1.0), 0.0);
> +			pixel.g = fmax(fmin(pixel.g, 1.0), 0.0);
> +			pixel.b = fmax(fmin(pixel.b, 1.0), 0.0);
> +
>   			/* de-normalize back to 8-bit */
>   			pixel.r *= (0xff);
>   			pixel.g *= (0xff);
> @@ -244,3 +306,27 @@ void igt_dump_fb(igt_display_t *display, igt_fb_t *fb,
>   	igt_assert_eq(status, CAIRO_STATUS_SUCCESS);
>   	cairo_surface_destroy(fb_surface_out);
>   }
> +
> +void igt_colorop_set_ctm_3x4(igt_display_t *display,
> +			     igt_colorop_t *colorop,
> +			     const igt_matrix_3x4_t *matrix)
> +{
> +	struct drm_color_ctm_3x4 ctm;
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(ctm.matrix); i++) {
> +		if (matrix->m[i] < 0) {
> +			ctm.matrix[i] =
> +				(int64_t) (-matrix->m[i] *
> +				((int64_t) 1L << 32));
> +			ctm.matrix[i] |= 1ULL << 63;
> +		} else {
> +			ctm.matrix[i] =
> +				(int64_t) (matrix->m[i] *
> +				((int64_t) 1L << 32));
> +		}
> +	}
> +
> +	/* set blob property */
> +	igt_colorop_replace_prop_blob(colorop, IGT_COLOROP_DATA, &ctm, sizeof(ctm));
> +}
> diff --git a/lib/igt_color.h b/lib/igt_color.h
> index 4f34a1b0d..fe0037ae5 100644
> --- a/lib/igt_color.h
> +++ b/lib/igt_color.h
> @@ -29,6 +29,47 @@ typedef struct igt_pixel {
>   	float b;
>   } igt_pixel_t;
>   
> +typedef struct igt_matrix_3x4 {
> +	/*
> +	 * out   matrix          in
> +	 * |R|   |0  1  2  3 |   | R |
> +	 * |G| = |4  5  6  7 | x | G |
> +	 * |B|   |8  9  10 12|   | B |

Typo here? 11 instead of 12 above



^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 03/30] drm-uapi: Add COLOROP object
  2025-08-15  4:06 ` [PATCH V10 03/30] drm-uapi: Add COLOROP object Alex Hung
@ 2025-08-26 16:37   ` Aurabindo Pillai
  0 siblings, 0 replies; 49+ messages in thread
From: Aurabindo Pillai @ 2025-08-26 16:37 UTC (permalink / raw)
  To: igt-dev



On 8/15/25 12:06 AM, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> DRM is introducing a new DRM core obejct, a drm_colorop. This
> object will represent one color operation in a color pipeline.
> 
> Introduce the object type in the drm-uapi, including the
> following types:
> - DRM_COLOROP_1D_CURVE,
> - DRM_COLOROP_1D_LUT,
> - DRM_COLOROP_CTM_3X4,
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   include/drm-uapi/amdgpu_drm.h |   9 --
>   include/drm-uapi/drm_mode.h   |  23 +++
>   lib/igt_kms.c                 | 272 +++++++++++++++++++++++++++++++++-
>   lib/igt_kms.h                 |  89 +++++++++++
>   tests/kms_properties.c        |   3 +
>   5 files changed, 381 insertions(+), 15 deletions(-)
> 
> diff --git a/include/drm-uapi/amdgpu_drm.h b/include/drm-uapi/amdgpu_drm.h
> index b38f27d69..ca24519c7 100644
> --- a/include/drm-uapi/amdgpu_drm.h
> +++ b/include/drm-uapi/amdgpu_drm.h
> @@ -1590,15 +1590,6 @@ struct drm_amdgpu_info_uq_metadata {
>   #define AMDGPU_FAMILY_GC_11_5_0			150 /* GC 11.5.0 */
>   #define AMDGPU_FAMILY_GC_12_0_0			152 /* GC 12.0.0 */
>   
> -/* FIXME wrong namespace! */
> -struct drm_color_ctm_3x4 {
> -	/*
> -	 * Conversion matrix with 3x4 dimensions in S31.32 sign-magnitude
> -	 * (not two's complement!) format.
> -	 */
> -	__u64 matrix[12];
> -};
> -
>   #if defined(__cplusplus)
>   }
>   #endif
> diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
> index c082810c0..fce45b5cf 100644
> --- a/include/drm-uapi/drm_mode.h
> +++ b/include/drm-uapi/drm_mode.h
> @@ -629,6 +629,7 @@ struct drm_mode_connector_set_property {
>   #define DRM_MODE_OBJECT_FB 0xfbfbfbfb
>   #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
>   #define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
> +#define DRM_MODE_OBJECT_COLOROP 0xfafafafa
>   #define DRM_MODE_OBJECT_ANY 0
>   
>   struct drm_mode_obj_get_properties {
> @@ -846,6 +847,22 @@ struct drm_color_ctm {
>   	__u64 matrix[9];
>   };
>   
> +struct drm_color_ctm_3x4 {
> +	/*
> +	 * Conversion matrix with 3x4 dimensions in S31.32 sign-magnitude
> +	 * (not two's complement!) format.
> +	 *
> +	 * TODO what's the format?

The format seems to be mentioned right above this line, so perhaps this 
is a stale TODO ?

> +	 *
> +	 * out   matrix          in
> +	 * |R|   |0  1  2  3 |   | R |
> +	 * |G| = |4  5  6  7 | x | G |
> +	 * |B|   |8  9  10 12|   | B |

Typo 11 instead of 12 ?



^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 27/30] tests/kms_colorop: Add a 3D LUT subtest
  2025-08-15  4:06 ` [PATCH V10 27/30] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
  2025-08-22 21:35   ` Aurabindo Pillai
@ 2025-08-26 16:39   ` Aurabindo Pillai
  1 sibling, 0 replies; 49+ messages in thread
From: Aurabindo Pillai @ 2025-08-26 16:39 UTC (permalink / raw)
  To: igt-dev



On 8/15/25 12:06 AM, Alex Hung wrote:
> This includes a subtests 3dlut_17_12_rgb.
> 
> Signed-off-by: Alex Hung<alex.hung@amd.com>
> ---
>   include/drm-uapi/drm_mode.h |   18 +
>   lib/igt_color.c             |  186 ++
>   lib/igt_color.h             |   10 +
>   lib/igt_color_lut.h         | 4946 +++++++++++++++++++++++++++++++++++
>   lib/igt_kms.c               |    2 +
>   lib/igt_kms.h               |    2 +
>   tests/kms_colorop.c         |   35 +-
>   tests/kms_colorop.h         |   19 +
>   8 files changed, 5217 insertions(+), 1 deletion(-)
>   create mode 100644 lib/igt_color_lut.h
> 
> diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
> index fe3e98e20..009bb3e7f 100644
> --- a/include/drm-uapi/drm_mode.h
> +++ b/include/drm-uapi/drm_mode.h
> @@ -891,6 +891,24 @@ enum drm_colorop_type {
>   	DRM_COLOROP_1D_LUT,
>   	DRM_COLOROP_CTM_3X4,
>   	DRM_COLOROP_MULTIPLIER,
> +	DRM_COLOROP_3D_LUT,
> +};
> +
> +enum drm_colorop_interpolation_type {
> +	DRM_COLOROP_TETRAHEDRAL,
> +};
> +

This doesnt seem to be used anywhere, so drop?


^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 09/30] tests/kms_colorop: Add kms_colorop tests
  2025-08-15  4:06 ` [PATCH V10 09/30] tests/kms_colorop: Add kms_colorop tests Alex Hung
@ 2025-08-26 20:39   ` Aurabindo Pillai
  2025-08-27 10:53   ` Kamil Konieczny
  1 sibling, 0 replies; 49+ messages in thread
From: Aurabindo Pillai @ 2025-08-26 20:39 UTC (permalink / raw)
  To: igt-dev



On 8/15/25 12:06 AM, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> This tests the color pipeline API, exposed via the
> COLOR PIPELINE plane property and drm_colorop objects.
> 
> We introduce tests for:
>   - sRGB EOTF
>   - sRGB Inverse EOTF
>   - sRGB EOTF + sRGB Inverse EOTF
> 
> The last one is the holy grail of LUT testing. It tests that
> after applying an EOTF, followed by its inverse EOTF we arrive
> back at the original value. We can use this to test for
> precision loss in the pipeline.
> 
> All tests are tested via writeback. All transforms are done in
> SW (in floating point) and at the end the SW transformed buffer
> is compared with the KMS writeback output buffer. The two should
> match within a bracket of acceptable deviations. Since these
> deviations might look different for different KMS drivers we'll
> do this check on a driver-specific basis.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   tests/kms_colorop.c | 508 ++++++++++++++++++++++++++++++++++++++++++++
>   tests/kms_colorop.h |  88 ++++++++
>   tests/meson.build   |   1 +
>   3 files changed, 597 insertions(+)
>   create mode 100644 tests/kms_colorop.c
>   create mode 100644 tests/kms_colorop.h
> 
> diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
> new file mode 100644
> index 000000000..e247477ec
> --- /dev/null
> +++ b/tests/kms_colorop.c
> @@ -0,0 +1,508 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright 2023 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "igt.h"
> +#include "igt_color.h"
> +#include "sw_sync.h"
> +#include "kms_colorop.h"
> +
> +/**
> + * TEST: kms colorop
> + * Category: Display
> + * Description: Test to validate the retrieving and setting of DRM colorops
> + *
> + * SUBTEST: plane-%s
> + * Description: Tests DRM colorop properties on a plane
> + * Driver requirement: amdgpu
> + * Functionality: kms_core
> + * Mega feature: General Display Features
> + * Test category: functionality test
> + *
> + * arg[1]:
> + *
> + * @srgb_eotf:                   sRGB EOTF
> + * @srgb_inv_eotf:               sRGB Inverse EOTF
> + * @srgb_eotf-srgb_inv_eotf:     sRGB EOTF -> sRGB Inverse EOTF
> + *
> + */
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
> +				    drmModeModeInfo override_mode)
> +{
> +	igt_fb_t input_fb, output_fb;
> +	igt_plane_t *plane;
> +	uint32_t writeback_format = DRM_FORMAT_XRGB8888;
> +	uint64_t modifier = DRM_FORMAT_MOD_LINEAR;
> +	int width, height, ret;
> +
> +	igt_output_override_mode(output, &override_mode);
> +
> +	width = override_mode.hdisplay;
> +	height = override_mode.vdisplay;
> +
> +	ret = igt_create_fb(display->drm_fd, width, height,
> +			    DRM_FORMAT_XRGB8888, modifier, &input_fb);
> +	igt_assert(ret >= 0);
> +
> +	ret = igt_create_fb(display->drm_fd, width, height,
> +			    writeback_format, modifier, &output_fb);
> +	igt_assert(ret >= 0);
> +
> +	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +	igt_plane_set_fb(plane, &input_fb);
> +	igt_output_set_writeback_fb(output, &output_fb);
> +
> +	ret = igt_display_try_commit_atomic(display, DRM_MODE_ATOMIC_TEST_ONLY |
> +					    DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +	igt_plane_set_fb(plane, NULL);
> +	igt_remove_fb(display->drm_fd, &input_fb);
> +	igt_remove_fb(display->drm_fd, &output_fb);
> +
> +	return !ret;
> +}
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +typedef struct {
> +	bool builtin_mode;
> +	bool custom_mode;
> +	bool list_modes;
> +	bool dump_check;
> +	int mode_index;
> +	drmModeModeInfo user_mode;
> +} data_t;
> +
> +static data_t data;
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +static igt_output_t *kms_writeback_get_output(igt_display_t *display)
> +{
> +	int i;
> +	enum pipe pipe;
> +
> +	drmModeModeInfo override_mode = {
> +		.clock = 25175,
> +		.hdisplay = 640,
> +		.hsync_start = 656,
> +		.hsync_end = 752,
> +		.htotal = 800,
> +		.hskew = 0,
> +		.vdisplay = 480,
> +		.vsync_start = 490,
> +		.vsync_end = 492,
> +		.vtotal = 525,
> +		.vscan = 0,
> +		.vrefresh = 60,
> +		.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
> +		.name = {"640x480-60"},
> +	};
> +
> +	for (i = 0; i < display->n_outputs; i++) {
> +		igt_output_t *output = &display->outputs[i];
> +
> +		if (output->config.connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
> +			continue;
> +
> +		for_each_pipe(display, pipe) {
> +			igt_output_set_pipe(output, pipe);
> +
> +			if (data.custom_mode)
> +				override_mode = data.user_mode;
> +			if (data.builtin_mode)
> +				override_mode = output->config.connector->modes[data.mode_index];
> +
> +			if (check_writeback_config(display, output, override_mode)) {
> +				igt_debug("Using connector %u:%s on pipe %d\n",
> +					  output->config.connector->connector_id,
> +					  output->name, pipe);
> +				return output;
> +			}
> +		}
> +
> +		igt_debug("We found %u:%s, but this test will not be able to use it.\n",
> +			  output->config.connector->connector_id, output->name);
> +
> +		/* Restore any connectors we don't use, so we don't trip on them later */
> +		kmstest_force_connector(display->drm_fd, output->config.connector, FORCE_CONNECTOR_UNSPECIFIED);
> +	}
> +
> +	return NULL;
> +}
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +static uint64_t get_writeback_fb_id(igt_output_t *output)
> +{
> +	return igt_output_get_prop(output, IGT_CONNECTOR_WRITEBACK_FB_ID);
> +}
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +static void detach_crtc(igt_display_t *display, igt_output_t *output)
> +{
> +	if (get_writeback_fb_id(output) == 0)
> +		return;
> +
> +	igt_output_set_pipe(output, PIPE_NONE);
> +	igt_display_commit2(display, COMMIT_ATOMIC);
> +}
> +
> +static void get_and_wait_out_fence(igt_output_t *output)
> +{
> +	int ret;
> +
> +	igt_assert(output->writeback_out_fence_fd >= 0);
> +
> +	ret = sync_fence_wait(output->writeback_out_fence_fd, 1000);
> +	igt_assert_f(ret == 0, "sync_fence_wait failed: %s\n", strerror(-ret));
> +	close(output->writeback_out_fence_fd);
> +	output->writeback_out_fence_fd = -1;
> +}
> +
> +static bool can_use_colorop(igt_display_t *display, igt_colorop_t *colorop, kms_colorop_t *desired)
> +{
> +	switch (desired->type) {
> +	case KMS_COLOROP_ENUMERATED_LUT1D:
> +		if (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_CURVE)
> +			return true;
> +	case KMS_COLOROP_CUSTOM_LUT1D:
> +	case KMS_COLOROP_CTM:
> +	case KMS_COLOROP_LUT3D:
> +	default:
> +		return false;
> +	}
> +}
> +
> +/**
> + * Iterate color pipeline that begins with colorop and try to map
> + * colorops[] to it.
> + */
> +static bool map_to_pipeline(igt_display_t *display,
> +			    igt_colorop_t *colorop,
> +			    kms_colorop_t *colorops[])
> +{
> +	igt_colorop_t *next = colorop;
> +	kms_colorop_t *current_op;
> +	int i = 0;
> +	int prop_val = 0;
> +
> +	current_op = colorops[i++];
> +	igt_require(current_op);
> +
> +	while (next) {
> +		if (can_use_colorop(display, next, current_op)) {
> +			current_op->colorop = next;
> +			current_op = colorops[i++];
> +			if (!current_op)
> +				break;
> +		}
> +		prop_val = igt_colorop_get_prop(display, next,
> +						IGT_COLOROP_NEXT);
> +		next = igt_find_colorop(display, prop_val);
> +	}
> +
> +	if (current_op) {
> +		/* we failed to map the pipeline */
> +
> +		/* clean up colorops[i].colorop mappings */
> +		for (i = 0, current_op = colorops[0]; current_op; current_op = colorops[i++])
> +			current_op->colorop = NULL;
> +
> +		return false;
> +	}
> +
> +	return true;
> +}
> +
> +static igt_colorop_t *get_color_pipeline(igt_display_t *display,
> +					 igt_plane_t *plane,
> +					 kms_colorop_t *colorops[])
> +{
> +	igt_colorop_t *colorop = NULL;
> +	int i;
> +
> +	/* go through all color pipelines */
> +	for (i = 0; i < plane->num_color_pipelines; ++i) {
> +		if (map_to_pipeline(display, plane->color_pipelines[i], colorops)) {
> +			colorop = plane->color_pipelines[i];
> +			break;
> +		}
> +	}
> +
> +	return colorop;
> +}
> +
> +static void set_colorop(igt_display_t *display,
> +			kms_colorop_t *colorop)
> +{
> +	igt_assert(colorop->colorop);
> +	igt_colorop_set_prop_value(colorop->colorop, IGT_COLOROP_BYPASS, 0);
> +
> +	/* Set to desired value from kms_colorop_t */
> +	switch (colorop->type) {
> +	case KMS_COLOROP_ENUMERATED_LUT1D:
> +		switch (colorop->enumerated_lut1d_info.tf) {
> +		case KMS_COLOROP_LUT1D_SRGB_EOTF:
> +			igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, "sRGB EOTF");
> +			break;
> +		case KMS_COLOROP_LUT1D_SRGB_INV_EOTF:
> +			igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, "sRGB Inverse EOTF");
> +			break;
> +		case KMS_COLOROP_LUT1D_PQ_EOTF:
> +		case KMS_COLOROP_LUT1D_PQ_INV_EOTF:
> +		default:
> +			igt_fail(IGT_EXIT_FAILURE);
> +		}
> +		break;
> +	case KMS_COLOROP_CUSTOM_LUT1D:
> +	case KMS_COLOROP_CTM:
> +	case KMS_COLOROP_LUT3D:
> +	default:
> +		igt_fail(IGT_EXIT_FAILURE);
> +	}
> +}
> +
> +static void set_color_pipeline(igt_display_t *display,
> +			       igt_plane_t *plane,
> +			       kms_colorop_t *colorops[],
> +			       igt_colorop_t *color_pipeline)
> +{
> +	igt_colorop_t *next;
> +	int prop_val = 0;
> +	int i;
> +
> +	igt_plane_set_color_pipeline(plane, color_pipeline);
> +
> +	for (i = 0; colorops[i]; i++)
> +		set_colorop(display, colorops[i]);
> +
> +	/* set unused ops in pipeline to bypass */
> +	next = color_pipeline;
> +	i = 0;
> +	while (next) {
> +		if (!colorops[i] || colorops[i]->colorop != next)
> +			igt_colorop_set_prop_value(next, IGT_COLOROP_BYPASS, 1);
> +		else
> +			i++;
> +
> +		prop_val = igt_colorop_get_prop(display, next,
> +						IGT_COLOROP_NEXT);
> +		next = igt_find_colorop(display, prop_val);
> +	}
> +}
> +
> +static void set_color_pipeline_bypass(igt_plane_t *plane)
> +{
> +	igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_PIPELINE, "Bypass");
> +}
> +
> +static bool compare_with_bracket(igt_fb_t *in, igt_fb_t *out)
> +{
> +	if (is_vkms_device(in->fd))
> +		return igt_cmp_fb_pixels(in, out, 1, 1);
> +
> +	/*
> +	 * By default we'll look for a [0, 0] bracket. We can then
> +	 * define it for each driver that implements support for this
> +	 * test. That way we can understand the precision of each
> +	 * driver better.
> +	 */
> +	return igt_cmp_fb_pixels(in, out, 0, 0);
> +}
> +
> +#define DUMP_FBS 1
> +
> +#define MAX_COLOROPS 3
> +#define NUM_COLOROP_TESTS 3
> +#define MAX_NAME_SIZE 256
> +
> +static void apply_transforms(kms_colorop_t *colorops[], igt_fb_t *sw_transform_fb)
> +{
> +	int i;
> +	igt_pixel_transform transforms[MAX_COLOROPS];
> +
> +	for (i = 0; colorops[i]; i++)
> +		transforms[i] = colorops[i]->transform;
> +
> +	igt_color_transform_pixels(sw_transform_fb, transforms, i);
> +}
> +
> +static void colorop_plane_test(igt_display_t *display,
> +			       kms_colorop_t *colorops[])
> +{
> +	igt_colorop_t *color_pipeline = NULL;
> +	igt_output_t *output;
> +	igt_plane_t *plane;
> +	igt_fb_t input_fb;
> +	igt_fb_t sw_transform_fb;
> +	igt_fb_t output_fb;
> +	drmModeModeInfo mode;
> +	unsigned int fb_id;
> +	igt_crc_t input_crc, output_crc;
> +
> +	output = kms_writeback_get_output(display);
> +	igt_require(output);
> +
> +	if (output->use_override_mode)
> +		memcpy(&mode, &output->override_mode, sizeof(mode));
> +	else
> +		memcpy(&mode, &output->config.default_mode, sizeof(mode));
> +
> +	/* create input fb */
> +	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +	igt_assert(plane);
> +
> +	fb_id = igt_create_color_pattern_fb(display->drm_fd,
> +					mode.hdisplay, mode.vdisplay,
> +					DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
> +					0.2, 0.2, 0.2, &input_fb);
> +	igt_assert(fb_id >= 0);
> +	igt_plane_set_fb(plane, &input_fb);
> +#if DUMP_FBS
> +	igt_dump_fb(display, &input_fb, ".", "input");
> +#endif

This is defined to 1 in this file. Leftover from a debug session?
  > +
> +	/* create output fb */
> +	fb_id = igt_create_fb(display->drm_fd, mode.hdisplay, mode.vdisplay,
> +				DRM_FORMAT_XRGB8888,
> +				igt_fb_mod_to_tiling(0),
> +				&output_fb);
> +	igt_require(fb_id > 0);
> +
> +	igt_fb_get_fnv1a_crc(&input_fb, &input_crc);
> +
> +	igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
> +
> +	/* reset color pipeline*/
> +
> +	set_color_pipeline_bypass(plane);
> +
> +	/* Commit */
> +	igt_plane_set_fb(plane, &input_fb);
> +	igt_output_set_writeback_fb(output, &output_fb);
> +
> +	igt_display_commit_atomic(output->display,
> +				DRM_MODE_ATOMIC_ALLOW_MODESET,
> +				NULL);
> +	get_and_wait_out_fence(output);
> +
> +	/* Compare input and output buffers. They should be equal here. */
> +	igt_fb_get_fnv1a_crc(&output_fb, &output_crc);
> +
> +	igt_assert_crc_equal(&input_crc, &output_crc);
> +
> +	/* create sw transformed buffer */
> +
> +	igt_copy_fb(display->drm_fd, &input_fb, &sw_transform_fb);
> +	igt_assert(igt_cmp_fb_pixels(&input_fb, &sw_transform_fb, 0, 0));
> +
> +	apply_transforms(colorops, &sw_transform_fb);
> +#if DUMP_FBS
> +	igt_dump_fb(display, &sw_transform_fb, ".", "sw_transform");
> +#endif
> +	/* discover and set COLOR PIPELINE */
> +
> +	/* get COLOR_PIPELINE enum */
> +	color_pipeline = get_color_pipeline(display, plane, colorops);
> +
> +	/* skip test if we can't find applicable pipeline */
> +	igt_skip_on(!color_pipeline);
> +
> +	set_color_pipeline(display, plane, colorops, color_pipeline);
> +
> +	igt_output_set_writeback_fb(output, &output_fb);
> +
> +	/* commit COLOR_PIPELINE */
> +	igt_display_commit_atomic(display,
> +				DRM_MODE_ATOMIC_ALLOW_MODESET,
> +				NULL);
> +	get_and_wait_out_fence(output);
> +#if DUMP_FBS
> +	igt_dump_fb(display, &output_fb, ".", "output");
> +#endif
> +
> +	/* compare sw transformed and KMS transformed FBs */
> +	igt_assert(compare_with_bracket(&sw_transform_fb, &output_fb));
> +
> +	/* reset color pipeline*/
> +	set_color_pipeline_bypass(plane);
> +
> +	/* Commit */
> +	igt_plane_set_fb(plane, &input_fb);
> +	igt_output_set_writeback_fb(output, &output_fb);
> +
> +	igt_display_commit_atomic(output->display,
> +				DRM_MODE_ATOMIC_ALLOW_MODESET,
> +				NULL);
> +	get_and_wait_out_fence(output);
> +
> +	/* cleanup */
> +	detach_crtc(display, output);
> +	igt_remove_fb(display->drm_fd, &input_fb);
> +	igt_remove_fb(display->drm_fd, &output_fb);
> +}
> +
> +igt_main
> +{
> +
> +	struct {
> +		kms_colorop_t *colorops[MAX_COLOROPS];
> +		const char *name;
> +	} tests[] = {
> +		{ { &kms_colorop_srgb_eotf, NULL }, "srgb_eotf" },
> +		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
> +		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" }
> +	};
> +
> +	igt_display_t display;
> +	int i, ret;
> +
> +	igt_fixture {
> +		display.drm_fd = drm_open_driver_master(DRIVER_ANY);
> +
> +		if (drmSetClientCap(display.drm_fd, DRM_CLIENT_CAP_ATOMIC, 1) == 0)
> +			display.is_atomic = 1;
> +
> +		ret = drmSetClientCap(display.drm_fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1);
> +
> +		igt_require_f(!ret, "error setting DRM_CLIENT_CAP_WRITEBACK_CONNECTORS\n");
> +
> +		igt_display_require(&display, display.drm_fd);
> +
> +		kmstest_set_vt_graphics_mode();
> +
> +		igt_display_require(&display, display.drm_fd);
> +
> +		igt_require(display.is_atomic);
> +
> +	}
> +
> +	for (i = 0; i < ARRAY_SIZE(tests); i++) {
> +		igt_describe("Check color ops on a plane");
> +		igt_subtest_f("plane-%s", tests[i].name)
> +			colorop_plane_test(&display, tests[i].colorops);
> +	}
> +
> +	igt_describe("Tests getting and setting COLOR_PIPELINE property on plane");
> +	igt_fixture {
> +		igt_display_fini(&display);
> +	}
> +}
> diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
> new file mode 100644
> index 000000000..f414895dd
> --- /dev/null
> +++ b/tests/kms_colorop.h
> @@ -0,0 +1,88 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright 2023 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#ifndef __KMS_COLOROP_H__
> +#define __KMS_COLOROP_H__
> +
> +#include "igt_color.h"
> +
> +typedef bool (*compare_fb_t)(igt_fb_t *in, igt_fb_t *out);
> +
> +typedef int (*transform_fb)(igt_fb_t *in);
> +
> +typedef int (*transform_pixel)(igt_pixel_t *pixel);
> +
> +/* Test version definitions */
> +typedef enum kms_colorop_type {
> +	KMS_COLOROP_ENUMERATED_LUT1D,
> +	KMS_COLOROP_CUSTOM_LUT1D,
> +	KMS_COLOROP_CTM,
> +	KMS_COLOROP_LUT3D
> +} kms_colorop_type_t;
> +
> +typedef enum kms_colorop_lut1d_tf {
> +	KMS_COLOROP_LUT1D_SRGB_EOTF,
> +	KMS_COLOROP_LUT1D_SRGB_INV_EOTF,
> +	KMS_COLOROP_LUT1D_PQ_EOTF,
> +	KMS_COLOROP_LUT1D_PQ_INV_EOTF,
> +} kms_colorop_lut1d_tf_t;
> +
> +typedef struct kms_colorop_enumerated_lut1d_info {
> +	kms_colorop_lut1d_tf_t tf;
> +} kms_colorop_enumerated_lut1d_info_t;
> +
> +typedef struct kms_colorop {
> +	kms_colorop_type_t type;
> +
> +	union {
> +		kms_colorop_enumerated_lut1d_info_t enumerated_lut1d_info;
> +	};
> +
> +	const char *name;
> +
> +	igt_pixel_transform transform;
> +
> +	/* Mapped colorop */
> +	igt_colorop_t *colorop;
> +
> +} kms_colorop_t;
> +
> +kms_colorop_t kms_colorop_srgb_eotf = {
> +	.type = KMS_COLOROP_ENUMERATED_LUT1D,
> +	.enumerated_lut1d_info = {
> +		.tf = KMS_COLOROP_LUT1D_SRGB_EOTF
> +	},
> +	.name = "srgb_eotf",
> +	.transform = &igt_color_srgb_eotf
> +};
> +
> +kms_colorop_t kms_colorop_srgb_inv_eotf = {
> +	.type = KMS_COLOROP_ENUMERATED_LUT1D,
> +	.enumerated_lut1d_info = {
> +		.tf = KMS_COLOROP_LUT1D_SRGB_INV_EOTF
> +	},
> +	.name = "srgb_inv_eotf",
> +	.transform = &igt_color_srgb_inv_eotf
> +};
> +
> +#endif /* __KMS_COLOROP_H__ */
> diff --git a/tests/meson.build b/tests/meson.build
> index 5c01c64e9..e612e1a05 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -26,6 +26,7 @@ test_progs = [
>   	'kms_bw',
>   	'kms_color',
>   	'kms_concurrent',
> +	'kms_colorop',
>   	'kms_content_protection',
>   	'kms_cursor_crc',
>   	'kms_cursor_edge_walk',


^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 09/30] tests/kms_colorop: Add kms_colorop tests
  2025-08-15  4:06 ` [PATCH V10 09/30] tests/kms_colorop: Add kms_colorop tests Alex Hung
  2025-08-26 20:39   ` Aurabindo Pillai
@ 2025-08-27 10:53   ` Kamil Konieczny
  1 sibling, 0 replies; 49+ messages in thread
From: Kamil Konieczny @ 2025-08-27 10:53 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev, harry.wentland, leo.liu

Hi Alex,
On 2025-08-14 at 22:06:38 -0600, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> This tests the color pipeline API, exposed via the
> COLOR PIPELINE plane property and drm_colorop objects.
> 
> We introduce tests for:
>  - sRGB EOTF
>  - sRGB Inverse EOTF
>  - sRGB EOTF + sRGB Inverse EOTF
> 
> The last one is the holy grail of LUT testing. It tests that
> after applying an EOTF, followed by its inverse EOTF we arrive
> back at the original value. We can use this to test for
> precision loss in the pipeline.
> 
> All tests are tested via writeback. All transforms are done in
> SW (in floating point) and at the end the SW transformed buffer
> is compared with the KMS writeback output buffer. The two should
> match within a bracket of acceptable deviations. Since these
> deviations might look different for different KMS drivers we'll
> do this check on a driver-specific basis.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>  tests/kms_colorop.c | 508 ++++++++++++++++++++++++++++++++++++++++++++
>  tests/kms_colorop.h |  88 ++++++++
>  tests/meson.build   |   1 +
>  3 files changed, 597 insertions(+)
>  create mode 100644 tests/kms_colorop.c
>  create mode 100644 tests/kms_colorop.h
> 
> diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
> new file mode 100644
> index 000000000..e247477ec
> --- /dev/null
> +++ b/tests/kms_colorop.c
> @@ -0,0 +1,508 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright 2023 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a

Please remove this text as it is replaced by SPDX above.

> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "igt.h"
> +#include "igt_color.h"
> +#include "sw_sync.h"
> +#include "kms_colorop.h"
> +
> +/**
> + * TEST: kms colorop
> + * Category: Display
> + * Description: Test to validate the retrieving and setting of DRM colorops
> + *
> + * SUBTEST: plane-%s
> + * Description: Tests DRM colorop properties on a plane
> + * Driver requirement: amdgpu
> + * Functionality: kms_core
> + * Mega feature: General Display Features
> + * Test category: functionality test
> + *
> + * arg[1]:
> + *
> + * @srgb_eotf:                   sRGB EOTF
> + * @srgb_inv_eotf:               sRGB Inverse EOTF
> + * @srgb_eotf-srgb_inv_eotf:     sRGB EOTF -> sRGB Inverse EOTF
> + *
> + */
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
> +				    drmModeModeInfo override_mode)
> +{
> +	igt_fb_t input_fb, output_fb;
> +	igt_plane_t *plane;
> +	uint32_t writeback_format = DRM_FORMAT_XRGB8888;
> +	uint64_t modifier = DRM_FORMAT_MOD_LINEAR;
> +	int width, height, ret;
> +
> +	igt_output_override_mode(output, &override_mode);
> +
> +	width = override_mode.hdisplay;
> +	height = override_mode.vdisplay;
> +
> +	ret = igt_create_fb(display->drm_fd, width, height,
> +			    DRM_FORMAT_XRGB8888, modifier, &input_fb);
> +	igt_assert(ret >= 0);
> +
> +	ret = igt_create_fb(display->drm_fd, width, height,
> +			    writeback_format, modifier, &output_fb);
> +	igt_assert(ret >= 0);
> +
> +	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +	igt_plane_set_fb(plane, &input_fb);
> +	igt_output_set_writeback_fb(output, &output_fb);
> +
> +	ret = igt_display_try_commit_atomic(display, DRM_MODE_ATOMIC_TEST_ONLY |
> +					    DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +	igt_plane_set_fb(plane, NULL);
> +	igt_remove_fb(display->drm_fd, &input_fb);
> +	igt_remove_fb(display->drm_fd, &output_fb);
> +
> +	return !ret;
> +}
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +typedef struct {
> +	bool builtin_mode;
> +	bool custom_mode;
> +	bool list_modes;
> +	bool dump_check;
> +	int mode_index;
> +	drmModeModeInfo user_mode;
> +} data_t;
> +
> +static data_t data;
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +static igt_output_t *kms_writeback_get_output(igt_display_t *display)
> +{
> +	int i;
> +	enum pipe pipe;
> +
> +	drmModeModeInfo override_mode = {
> +		.clock = 25175,
> +		.hdisplay = 640,
> +		.hsync_start = 656,
> +		.hsync_end = 752,
> +		.htotal = 800,
> +		.hskew = 0,
> +		.vdisplay = 480,
> +		.vsync_start = 490,
> +		.vsync_end = 492,
> +		.vtotal = 525,
> +		.vscan = 0,
> +		.vrefresh = 60,
> +		.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
> +		.name = {"640x480-60"},
> +	};
> +
> +	for (i = 0; i < display->n_outputs; i++) {
> +		igt_output_t *output = &display->outputs[i];
> +
> +		if (output->config.connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
> +			continue;
> +
> +		for_each_pipe(display, pipe) {
> +			igt_output_set_pipe(output, pipe);
> +
> +			if (data.custom_mode)
> +				override_mode = data.user_mode;
> +			if (data.builtin_mode)
> +				override_mode = output->config.connector->modes[data.mode_index];
> +
> +			if (check_writeback_config(display, output, override_mode)) {
> +				igt_debug("Using connector %u:%s on pipe %d\n",
> +					  output->config.connector->connector_id,
> +					  output->name, pipe);
> +				return output;
> +			}
> +		}
> +
> +		igt_debug("We found %u:%s, but this test will not be able to use it.\n",
> +			  output->config.connector->connector_id, output->name);
> +
> +		/* Restore any connectors we don't use, so we don't trip on them later */
> +		kmstest_force_connector(display->drm_fd, output->config.connector, FORCE_CONNECTOR_UNSPECIFIED);
> +	}
> +
> +	return NULL;
> +}
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +static uint64_t get_writeback_fb_id(igt_output_t *output)
> +{
> +	return igt_output_get_prop(output, IGT_CONNECTOR_WRITEBACK_FB_ID);
> +}
> +
> +/* TODO move to lib for kms_writeback and kms_colorop (and other future) use */
> +static void detach_crtc(igt_display_t *display, igt_output_t *output)
> +{
> +	if (get_writeback_fb_id(output) == 0)
> +		return;
> +
> +	igt_output_set_pipe(output, PIPE_NONE);
> +	igt_display_commit2(display, COMMIT_ATOMIC);
> +}
> +
> +static void get_and_wait_out_fence(igt_output_t *output)
> +{
> +	int ret;
> +
> +	igt_assert(output->writeback_out_fence_fd >= 0);
> +
> +	ret = sync_fence_wait(output->writeback_out_fence_fd, 1000);
> +	igt_assert_f(ret == 0, "sync_fence_wait failed: %s\n", strerror(-ret));
> +	close(output->writeback_out_fence_fd);
> +	output->writeback_out_fence_fd = -1;
> +}
> +
> +static bool can_use_colorop(igt_display_t *display, igt_colorop_t *colorop, kms_colorop_t *desired)
> +{
> +	switch (desired->type) {
> +	case KMS_COLOROP_ENUMERATED_LUT1D:
> +		if (igt_colorop_get_prop(display, colorop, IGT_COLOROP_TYPE) == DRM_COLOROP_1D_CURVE)
> +			return true;
> +	case KMS_COLOROP_CUSTOM_LUT1D:
> +	case KMS_COLOROP_CTM:
> +	case KMS_COLOROP_LUT3D:
> +	default:
> +		return false;
> +	}
> +}
> +
> +/**
> + * Iterate color pipeline that begins with colorop and try to map
> + * colorops[] to it.
> + */
> +static bool map_to_pipeline(igt_display_t *display,
> +			    igt_colorop_t *colorop,
> +			    kms_colorop_t *colorops[])
> +{
> +	igt_colorop_t *next = colorop;
> +	kms_colorop_t *current_op;
> +	int i = 0;
> +	int prop_val = 0;
> +
> +	current_op = colorops[i++];
> +	igt_require(current_op);
> +
> +	while (next) {
> +		if (can_use_colorop(display, next, current_op)) {
> +			current_op->colorop = next;
> +			current_op = colorops[i++];
> +			if (!current_op)
> +				break;
> +		}
> +		prop_val = igt_colorop_get_prop(display, next,
> +						IGT_COLOROP_NEXT);
> +		next = igt_find_colorop(display, prop_val);
> +	}
> +
> +	if (current_op) {
> +		/* we failed to map the pipeline */
> +
> +		/* clean up colorops[i].colorop mappings */
> +		for (i = 0, current_op = colorops[0]; current_op; current_op = colorops[i++])
> +			current_op->colorop = NULL;
> +
> +		return false;
> +	}
> +
> +	return true;
> +}
> +
> +static igt_colorop_t *get_color_pipeline(igt_display_t *display,
> +					 igt_plane_t *plane,
> +					 kms_colorop_t *colorops[])
> +{
> +	igt_colorop_t *colorop = NULL;
> +	int i;
> +
> +	/* go through all color pipelines */
> +	for (i = 0; i < plane->num_color_pipelines; ++i) {
> +		if (map_to_pipeline(display, plane->color_pipelines[i], colorops)) {
> +			colorop = plane->color_pipelines[i];
> +			break;
> +		}
> +	}
> +
> +	return colorop;
> +}
> +
> +static void set_colorop(igt_display_t *display,
> +			kms_colorop_t *colorop)
> +{
> +	igt_assert(colorop->colorop);
> +	igt_colorop_set_prop_value(colorop->colorop, IGT_COLOROP_BYPASS, 0);
> +
> +	/* Set to desired value from kms_colorop_t */
> +	switch (colorop->type) {
> +	case KMS_COLOROP_ENUMERATED_LUT1D:
> +		switch (colorop->enumerated_lut1d_info.tf) {
> +		case KMS_COLOROP_LUT1D_SRGB_EOTF:
> +			igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, "sRGB EOTF");
> +			break;
> +		case KMS_COLOROP_LUT1D_SRGB_INV_EOTF:
> +			igt_colorop_set_prop_enum(colorop->colorop, IGT_COLOROP_CURVE_1D_TYPE, "sRGB Inverse EOTF");
> +			break;
> +		case KMS_COLOROP_LUT1D_PQ_EOTF:
> +		case KMS_COLOROP_LUT1D_PQ_INV_EOTF:
> +		default:
> +			igt_fail(IGT_EXIT_FAILURE);
> +		}
> +		break;
> +	case KMS_COLOROP_CUSTOM_LUT1D:
> +	case KMS_COLOROP_CTM:
> +	case KMS_COLOROP_LUT3D:
> +	default:
> +		igt_fail(IGT_EXIT_FAILURE);
> +	}
> +}
> +
> +static void set_color_pipeline(igt_display_t *display,
> +			       igt_plane_t *plane,
> +			       kms_colorop_t *colorops[],
> +			       igt_colorop_t *color_pipeline)
> +{
> +	igt_colorop_t *next;
> +	int prop_val = 0;
> +	int i;
> +
> +	igt_plane_set_color_pipeline(plane, color_pipeline);
> +
> +	for (i = 0; colorops[i]; i++)
> +		set_colorop(display, colorops[i]);
> +
> +	/* set unused ops in pipeline to bypass */
> +	next = color_pipeline;
> +	i = 0;
> +	while (next) {
> +		if (!colorops[i] || colorops[i]->colorop != next)
> +			igt_colorop_set_prop_value(next, IGT_COLOROP_BYPASS, 1);
> +		else
> +			i++;
> +
> +		prop_val = igt_colorop_get_prop(display, next,
> +						IGT_COLOROP_NEXT);
> +		next = igt_find_colorop(display, prop_val);
> +	}
> +}
> +
> +static void set_color_pipeline_bypass(igt_plane_t *plane)
> +{
> +	igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_PIPELINE, "Bypass");
> +}
> +
> +static bool compare_with_bracket(igt_fb_t *in, igt_fb_t *out)
> +{
> +	if (is_vkms_device(in->fd))
> +		return igt_cmp_fb_pixels(in, out, 1, 1);
> +
> +	/*
> +	 * By default we'll look for a [0, 0] bracket. We can then
> +	 * define it for each driver that implements support for this
> +	 * test. That way we can understand the precision of each
> +	 * driver better.
> +	 */
> +	return igt_cmp_fb_pixels(in, out, 0, 0);
> +}
> +
> +#define DUMP_FBS 1
> +
> +#define MAX_COLOROPS 3
> +#define NUM_COLOROP_TESTS 3
> +#define MAX_NAME_SIZE 256
> +
> +static void apply_transforms(kms_colorop_t *colorops[], igt_fb_t *sw_transform_fb)
> +{
> +	int i;
> +	igt_pixel_transform transforms[MAX_COLOROPS];
> +
> +	for (i = 0; colorops[i]; i++)
> +		transforms[i] = colorops[i]->transform;
> +
> +	igt_color_transform_pixels(sw_transform_fb, transforms, i);
> +}
> +
> +static void colorop_plane_test(igt_display_t *display,
> +			       kms_colorop_t *colorops[])
> +{
> +	igt_colorop_t *color_pipeline = NULL;
> +	igt_output_t *output;
> +	igt_plane_t *plane;
> +	igt_fb_t input_fb;
> +	igt_fb_t sw_transform_fb;
> +	igt_fb_t output_fb;
> +	drmModeModeInfo mode;
> +	unsigned int fb_id;
> +	igt_crc_t input_crc, output_crc;
> +
> +	output = kms_writeback_get_output(display);
> +	igt_require(output);
> +
> +	if (output->use_override_mode)
> +		memcpy(&mode, &output->override_mode, sizeof(mode));
> +	else
> +		memcpy(&mode, &output->config.default_mode, sizeof(mode));
> +
> +	/* create input fb */
> +	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +	igt_assert(plane);
> +
> +	fb_id = igt_create_color_pattern_fb(display->drm_fd,
> +					mode.hdisplay, mode.vdisplay,
> +					DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
> +					0.2, 0.2, 0.2, &input_fb);
> +	igt_assert(fb_id >= 0);
> +	igt_plane_set_fb(plane, &input_fb);
> +#if DUMP_FBS
> +	igt_dump_fb(display, &input_fb, ".", "input");
> +#endif
> +
> +	/* create output fb */
> +	fb_id = igt_create_fb(display->drm_fd, mode.hdisplay, mode.vdisplay,
> +				DRM_FORMAT_XRGB8888,
> +				igt_fb_mod_to_tiling(0),
> +				&output_fb);
> +	igt_require(fb_id > 0);
> +
> +	igt_fb_get_fnv1a_crc(&input_fb, &input_crc);
> +
> +	igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
> +
> +	/* reset color pipeline*/
> +
> +	set_color_pipeline_bypass(plane);
> +
> +	/* Commit */
> +	igt_plane_set_fb(plane, &input_fb);
> +	igt_output_set_writeback_fb(output, &output_fb);
> +
> +	igt_display_commit_atomic(output->display,
> +				DRM_MODE_ATOMIC_ALLOW_MODESET,
> +				NULL);
> +	get_and_wait_out_fence(output);
> +
> +	/* Compare input and output buffers. They should be equal here. */
> +	igt_fb_get_fnv1a_crc(&output_fb, &output_crc);
> +
> +	igt_assert_crc_equal(&input_crc, &output_crc);
> +
> +	/* create sw transformed buffer */
> +
> +	igt_copy_fb(display->drm_fd, &input_fb, &sw_transform_fb);
> +	igt_assert(igt_cmp_fb_pixels(&input_fb, &sw_transform_fb, 0, 0));
> +
> +	apply_transforms(colorops, &sw_transform_fb);
> +#if DUMP_FBS
> +	igt_dump_fb(display, &sw_transform_fb, ".", "sw_transform");
> +#endif
> +	/* discover and set COLOR PIPELINE */
> +
> +	/* get COLOR_PIPELINE enum */
> +	color_pipeline = get_color_pipeline(display, plane, colorops);
> +
> +	/* skip test if we can't find applicable pipeline */
> +	igt_skip_on(!color_pipeline);
> +
> +	set_color_pipeline(display, plane, colorops, color_pipeline);
> +
> +	igt_output_set_writeback_fb(output, &output_fb);
> +
> +	/* commit COLOR_PIPELINE */
> +	igt_display_commit_atomic(display,
> +				DRM_MODE_ATOMIC_ALLOW_MODESET,
> +				NULL);
> +	get_and_wait_out_fence(output);
> +#if DUMP_FBS
> +	igt_dump_fb(display, &output_fb, ".", "output");
> +#endif
> +
> +	/* compare sw transformed and KMS transformed FBs */
> +	igt_assert(compare_with_bracket(&sw_transform_fb, &output_fb));
> +
> +	/* reset color pipeline*/
> +	set_color_pipeline_bypass(plane);
> +
> +	/* Commit */
> +	igt_plane_set_fb(plane, &input_fb);
> +	igt_output_set_writeback_fb(output, &output_fb);
> +
> +	igt_display_commit_atomic(output->display,
> +				DRM_MODE_ATOMIC_ALLOW_MODESET,
> +				NULL);
> +	get_and_wait_out_fence(output);
> +
> +	/* cleanup */
> +	detach_crtc(display, output);
> +	igt_remove_fb(display->drm_fd, &input_fb);
> +	igt_remove_fb(display->drm_fd, &output_fb);
> +}
> +
> +igt_main
> +{
> +
> +	struct {
> +		kms_colorop_t *colorops[MAX_COLOROPS];
> +		const char *name;
> +	} tests[] = {
> +		{ { &kms_colorop_srgb_eotf, NULL }, "srgb_eotf" },
> +		{ { &kms_colorop_srgb_inv_eotf, NULL }, "srgb_inv_eotf" },
> +		{ { &kms_colorop_srgb_eotf, &kms_colorop_srgb_inv_eotf, NULL }, "srgb_eotf-srgb_inv_eotf" }
> +	};
> +
> +	igt_display_t display;
> +	int i, ret;
> +
> +	igt_fixture {
> +		display.drm_fd = drm_open_driver_master(DRIVER_ANY);
> +
> +		if (drmSetClientCap(display.drm_fd, DRM_CLIENT_CAP_ATOMIC, 1) == 0)
> +			display.is_atomic = 1;
> +
> +		ret = drmSetClientCap(display.drm_fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1);
> +
> +		igt_require_f(!ret, "error setting DRM_CLIENT_CAP_WRITEBACK_CONNECTORS\n");
> +
> +		igt_display_require(&display, display.drm_fd);
> +
> +		kmstest_set_vt_graphics_mode();
> +
> +		igt_display_require(&display, display.drm_fd);
> +
> +		igt_require(display.is_atomic);
> +
> +	}
> +
> +	for (i = 0; i < ARRAY_SIZE(tests); i++) {
> +		igt_describe("Check color ops on a plane");
> +		igt_subtest_f("plane-%s", tests[i].name)
> +			colorop_plane_test(&display, tests[i].colorops);
> +	}
> +
> +	igt_describe("Tests getting and setting COLOR_PIPELINE property on plane");
> +	igt_fixture {
> +		igt_display_fini(&display);
> +	}
> +}
> diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
> new file mode 100644
> index 000000000..f414895dd
> --- /dev/null
> +++ b/tests/kms_colorop.h
> @@ -0,0 +1,88 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright 2023 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a

Same here, remove this text.

Regards,
Kamil

> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#ifndef __KMS_COLOROP_H__
> +#define __KMS_COLOROP_H__
> +
> +#include "igt_color.h"
> +
> +typedef bool (*compare_fb_t)(igt_fb_t *in, igt_fb_t *out);
> +
> +typedef int (*transform_fb)(igt_fb_t *in);
> +
> +typedef int (*transform_pixel)(igt_pixel_t *pixel);
> +
> +/* Test version definitions */
> +typedef enum kms_colorop_type {
> +	KMS_COLOROP_ENUMERATED_LUT1D,
> +	KMS_COLOROP_CUSTOM_LUT1D,
> +	KMS_COLOROP_CTM,
> +	KMS_COLOROP_LUT3D
> +} kms_colorop_type_t;
> +
> +typedef enum kms_colorop_lut1d_tf {
> +	KMS_COLOROP_LUT1D_SRGB_EOTF,
> +	KMS_COLOROP_LUT1D_SRGB_INV_EOTF,
> +	KMS_COLOROP_LUT1D_PQ_EOTF,
> +	KMS_COLOROP_LUT1D_PQ_INV_EOTF,
> +} kms_colorop_lut1d_tf_t;
> +
> +typedef struct kms_colorop_enumerated_lut1d_info {
> +	kms_colorop_lut1d_tf_t tf;
> +} kms_colorop_enumerated_lut1d_info_t;
> +
> +typedef struct kms_colorop {
> +	kms_colorop_type_t type;
> +
> +	union {
> +		kms_colorop_enumerated_lut1d_info_t enumerated_lut1d_info;
> +	};
> +
> +	const char *name;
> +
> +	igt_pixel_transform transform;
> +
> +	/* Mapped colorop */
> +	igt_colorop_t *colorop;
> +
> +} kms_colorop_t;
> +
> +kms_colorop_t kms_colorop_srgb_eotf = {
> +	.type = KMS_COLOROP_ENUMERATED_LUT1D,
> +	.enumerated_lut1d_info = {
> +		.tf = KMS_COLOROP_LUT1D_SRGB_EOTF
> +	},
> +	.name = "srgb_eotf",
> +	.transform = &igt_color_srgb_eotf
> +};
> +
> +kms_colorop_t kms_colorop_srgb_inv_eotf = {
> +	.type = KMS_COLOROP_ENUMERATED_LUT1D,
> +	.enumerated_lut1d_info = {
> +		.tf = KMS_COLOROP_LUT1D_SRGB_INV_EOTF
> +	},
> +	.name = "srgb_inv_eotf",
> +	.transform = &igt_color_srgb_inv_eotf
> +};
> +
> +#endif /* __KMS_COLOROP_H__ */
> diff --git a/tests/meson.build b/tests/meson.build
> index 5c01c64e9..e612e1a05 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -26,6 +26,7 @@ test_progs = [
>  	'kms_bw',
>  	'kms_color',
>  	'kms_concurrent',
> +	'kms_colorop',
>  	'kms_content_protection',
>  	'kms_cursor_crc',
>  	'kms_cursor_edge_walk',
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 02/30] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
  2025-08-15  4:06 ` [PATCH V10 02/30] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE Alex Hung
@ 2025-09-03 14:11   ` Borah, Chaitanya Kumar
  0 siblings, 0 replies; 49+ messages in thread
From: Borah, Chaitanya Kumar @ 2025-09-03 14:11 UTC (permalink / raw)
  To: Alex Hung, igt-dev; +Cc: harry.wentland, leo.liu



On 8/15/2025 9:36 AM, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> Setting the COLOR_PIPELINE plane prop is only allowed when the
> DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE is set.
> 
> Setting COLOR_RANGE and COLOR_ENCODING is only allowed when the
> DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE is NOT set.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   include/drm-uapi/drm.h | 15 ++++++++++
>   lib/igt_kms.c          | 63 ++++++++++++++++++++++++++++++++++--------
>   lib/igt_kms.h          |  1 +
>   tests/kms_properties.c | 20 ++++++++++----
>   4 files changed, 81 insertions(+), 18 deletions(-)
> 
> diff --git a/include/drm-uapi/drm.h b/include/drm-uapi/drm.h
> index 4e4f7c2c3..6b9af3348 100644
> --- a/include/drm-uapi/drm.h
> +++ b/include/drm-uapi/drm.h
> @@ -869,6 +869,21 @@ struct drm_get_cap {
>    */
>   #define DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT	6
>   
> +/**
> + * DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
> + *
> + * If set to 1, the DRM core will
> + * - expose plane COLOR_PIPELINE properties for pre-blending color management.
> + * - reject setting of these plane properties:
> + *   - COLOR_ENCODING
> + *   - COLOR_RANGE
> + *
> + * The client must enable &DRM_CLIENT_CAP_ATOMIC first.
> + *
> + * This capability is currently in development.

This line can go now.

> + */
> +#define DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE	7
> +
>   /* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
>   struct drm_set_client_cap {
>   	__u64 capability;
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 7191bf92e..a9641eba4 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -2545,6 +2545,8 @@ static int get_drm_plane_type(int drm_fd, uint32_t plane_id)
>   
>   static void igt_plane_reset(igt_plane_t *plane)
>   {
> +	igt_display_t *display = plane->pipe->display;
> +
>   	/* Reset src coordinates. */
>   	igt_plane_set_prop_value(plane, IGT_PLANE_SRC_X, 0);
>   	igt_plane_set_prop_value(plane, IGT_PLANE_SRC_Y, 0);
> @@ -2561,13 +2563,15 @@ static void igt_plane_reset(igt_plane_t *plane)
>   	igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, 0);
>   	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, 0);
>   
> -	if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
> -		igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_ENCODING,
> -			igt_color_encoding_to_str(IGT_COLOR_YCBCR_BT601));
> +	if (!display->has_plane_color_pipeline) {
> +		if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
> +			igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_ENCODING,
> +				igt_color_encoding_to_str(IGT_COLOR_YCBCR_BT601));
>   
> -	if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
> -		igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_RANGE,
> -			igt_color_range_to_str(IGT_COLOR_YCBCR_LIMITED_RANGE));
> +		if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
> +			igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_RANGE,
> +				igt_color_range_to_str(IGT_COLOR_YCBCR_LIMITED_RANGE));
> +	}
>   
>   	/* Use default rotation */
>   	if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> @@ -2982,6 +2986,9 @@ void igt_display_require(igt_display_t *display, int drm_fd)
>   	if (drmSetClientCap(drm_fd, LOCAL_DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, 1) == 0)
>   		display->has_virt_cursor_plane = 1;
>   
> +	if (drmSetClientCap(drm_fd, DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE, 1) == 0)
> +		display->has_plane_color_pipeline = 1;
> +

If we do this here, we will be taking out the legacy properties out of 
the equation for all IGTs (say kms_plane.c). So any place currently 
setting COLOR_ENCODING/COLOR_RANGE becomes dead code. Other than that 
probably harmless?

>   	plane_resources = drmModeGetPlaneResources(display->drm_fd);
>   	igt_assert(plane_resources);
>   
> @@ -3609,6 +3616,29 @@ static uint32_t igt_plane_get_fb_id(igt_plane_t *plane)
>   	igt_assert_eq(r, 0);	\
>   }
>   
> +static bool
> +igt_atomic_ignore_plane_prop(igt_pipe_t *pipe, uint32_t prop)
> +{
> +	igt_display_t *display = pipe->display;
> +
> +	if (display->has_plane_color_pipeline) {
> +		switch (prop) {
> +		case IGT_PLANE_COLOR_ENCODING:
> +		case IGT_PLANE_COLOR_RANGE:
> +			return true;
> +		default:
> +			return false;
> +		}
> +	} else {
> +		switch (prop) {
> +		default:
> +			return false;
> +		}
> +	}

The else block makes the last return statement unreachable. We can have 
something like

static bool igt_atomic_ignore_plane_prop(igt_pipe_t *pipe, uint32_t prop)
{
     igt_display_t *display = pipe->display;

     switch (prop) {
     case IGT_PLANE_COLOR_ENCODING:
     case IGT_PLANE_COLOR_RANGE:
         return display->has_plane_color_pipeline;
     default:
         return false;
     }
}

> +
> +	return false;
> +}
> +
>   /*
>    * Add position and fb changes of a plane to the atomic property set
>    */
> @@ -3628,6 +3658,12 @@ igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_pipe_t *pipe,
>   	    igt_plane_get_fb_id(plane));
>   
>   	for (i = 0; i < IGT_NUM_PLANE_PROPS; i++) {
> +		if (igt_atomic_ignore_plane_prop(pipe, i)) {
> +			igt_debug("plane %s.%d: Ignoring property \"%s\" to 0x%"PRIx64"/%"PRIi64"\n",
> +				kmstest_pipe_name(pipe->pipe), plane->index, igt_plane_prop_names[i],
> +			plane->values[i], plane->values[i]);			continue;

Could use a new line

==
Chaitanya

> +		}
> +
>   		if (!igt_plane_is_prop_changed(plane, i))
>   			continue;
>   
> @@ -5222,12 +5258,15 @@ void igt_plane_set_fb(igt_plane_t *plane, struct igt_fb *fb)
>   		igt_fb_set_position(fb, plane, 0, 0);
>   		igt_fb_set_size(fb, plane, fb->width, fb->height);
>   
> -		if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
> -			igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_ENCODING,
> -				igt_color_encoding_to_str(fb->color_encoding));
> -		if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
> -			igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_RANGE,
> -				igt_color_range_to_str(fb->color_range));
> +		if (!display->has_plane_color_pipeline) {
> +			if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_ENCODING))
> +				igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_ENCODING,
> +					igt_color_encoding_to_str(fb->color_encoding));
> +
> +			if (igt_plane_has_prop(plane, IGT_PLANE_COLOR_RANGE))
> +				igt_plane_set_prop_enum(plane, IGT_PLANE_COLOR_RANGE,
> +					igt_color_range_to_str(fb->color_range));
> +		}
>   
>   		/* Hack to prioritize the plane on the pipe that last set fb */
>   		igt_plane_set_pipe(plane, pipe);
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index f140ad91a..8ec39fa85 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -508,6 +508,7 @@ struct igt_display {
>   	bool has_cursor_plane;
>   	bool is_atomic;
>   	bool has_virt_cursor_plane;
> +	bool has_plane_color_pipeline;
>   	bool first_commit;
>   
>   	uint64_t *modifiers;
> diff --git a/tests/kms_properties.c b/tests/kms_properties.c
> index b30387888..e646b8184 100644
> --- a/tests/kms_properties.c
> +++ b/tests/kms_properties.c
> @@ -101,7 +101,7 @@ static void cleanup_pipe(igt_display_t *display, enum pipe pipe, igt_output_t *o
>   }
>   
>   static bool ignore_property(uint32_t obj_type, uint32_t prop_flags,
> -			    const char *name, bool atomic)
> +			    const char *name, bool atomic, bool has_color_pipeline)
>   {
>   	if (prop_flags & DRM_MODE_PROP_IMMUTABLE)
>   		return true;
> @@ -111,6 +111,14 @@ static bool ignore_property(uint32_t obj_type, uint32_t prop_flags,
>   		if (atomic && !strcmp(name, "DPMS"))
>   			return true;
>   		break;
> +	case DRM_MODE_OBJECT_PLANE:
> +		if (has_color_pipeline && !strcmp(name, "COLOR_RANGE"))
> +			return true;
> +
> +		if (has_color_pipeline && !strcmp(name, "COLOR_ENCODING"))
> +			return true;
> +
> +		break;
>   	default:
>   		break;
>   	}
> @@ -164,7 +172,7 @@ static bool has_additional_test_lookup(uint32_t obj_type, const char *name,
>   
>   	return false;
>   }
> -static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic)
> +static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic, bool has_color_pipeline)
>   {
>   	drmModeObjectPropertiesPtr props =
>   		drmModeObjectGetProperties(fd, id, type);
> @@ -183,7 +191,7 @@ static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic)
>   
>   		igt_assert(prop);
>   
> -		if (ignore_property(type, prop->flags, prop->name, atomic)) {
> +		if (ignore_property(type, prop->flags, prop->name, atomic, has_color_pipeline)) {
>   			igt_debug("Ignoring property \"%s\"\n", prop->name);
>   
>   			continue;
> @@ -230,7 +238,7 @@ static void run_plane_property_tests(igt_display_t *display, enum pipe pipe, igt
>   		igt_info("Testing plane properties on %s.#%d-%s (output: %s)\n",
>   			 kmstest_pipe_name(pipe), plane->index, kmstest_plane_type_name(plane->type), output->name);
>   
> -		test_properties(display->drm_fd, DRM_MODE_OBJECT_PLANE, plane->drm_plane->plane_id, atomic);
> +		test_properties(display->drm_fd, DRM_MODE_OBJECT_PLANE, plane->drm_plane->plane_id, atomic, display->has_plane_color_pipeline);
>   	}
>   
>   	cleanup_pipe(display, pipe, output, &fb);
> @@ -244,7 +252,7 @@ static void run_crtc_property_tests(igt_display_t *display, enum pipe pipe, igt_
>   
>   	igt_info("Testing crtc properties on %s (output: %s)\n", kmstest_pipe_name(pipe), output->name);
>   
> -	test_properties(display->drm_fd, DRM_MODE_OBJECT_CRTC, display->pipes[pipe].crtc_id, atomic);
> +	test_properties(display->drm_fd, DRM_MODE_OBJECT_CRTC, display->pipes[pipe].crtc_id, atomic, false);
>   
>   	cleanup_pipe(display, pipe, output, &fb);
>   }
> @@ -258,7 +266,7 @@ static void run_connector_property_tests(igt_display_t *display, enum pipe pipe,
>   
>   	igt_info("Testing connector properties on output %s (pipe: %s)\n", output->name, kmstest_pipe_name(pipe));
>   
> -	test_properties(display->drm_fd, DRM_MODE_OBJECT_CONNECTOR, output->id, atomic);
> +	test_properties(display->drm_fd, DRM_MODE_OBJECT_CONNECTOR, output->id, atomic, false);
>   
>   	if (pipe != PIPE_NONE)
>   		cleanup_pipe(display, pipe, output, &fb);


^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 28/30] drm-uapi: Update kernel doc for drm_colorop_type
  2025-08-15  4:06 ` [PATCH V10 28/30] drm-uapi: Update kernel doc for drm_colorop_type Alex Hung
@ 2025-09-03 16:41   ` Kamil Konieczny
  0 siblings, 0 replies; 49+ messages in thread
From: Kamil Konieczny @ 2025-09-03 16:41 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev, harry.wentland, leo.liu

Hi Alex,
On 2025-08-14 at 22:06:57 -0600, Alex Hung wrote:

please improve subject, imho add 'drm_mode' prefix:

[PATCH V10 28/30] drm-uapi/drm_mode: Update kernel doc for drm_colorop_type

> Sync up with kernel documents.

Provide kernel commit here, link to lore.kernel.org also
could be added.
Or look into history and do similar commit:
git log -- include/drm-uapi/drm_mode.h

Regards,
Kamil

> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> ---
>  include/drm-uapi/drm_mode.h | 44 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 44 insertions(+)
> 
> diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
> index 009bb3e7f..e00b21067 100644
> --- a/include/drm-uapi/drm_mode.h
> +++ b/include/drm-uapi/drm_mode.h
> @@ -886,11 +886,55 @@ struct drm_color_lut32 {
>  	__u32 reserved;
>  };
>  
> +/**
> + * enum drm_colorop_type - Type of color operation
> + *
> + *
> + * drm_colorops can be of many different types. Each type behaves differently
> + * and defines a different set of properties. This enum defines all types and
> + * gives a high-level description.
> + */
>  enum drm_colorop_type {
> +	/**
> +	 * @DRM_COLOROP_1D_CURVE:
> +	 *
> +	 * A 1D curve that is being applied to all color channels. The
> +	 * curve is specified via tha CURVE_1D_TYPE colorop property.
> +	 */
>  	DRM_COLOROP_1D_CURVE,
> +
> +	/**
> +	 * @DRM_COLOROP_1D_LUT:
> +	 *
> +	 * A simple 1D LUT of uniformly spaced &drm_color_lut32 entries,
> +	 * packed into a blob via the DATA property. The driver's expected
> +	 * LUT size is advertised via the SIZE property.
> +	 */
>  	DRM_COLOROP_1D_LUT,
> +
> +	/**
> +	 * @DRM_COLOROP_CTM_3X4:
> +	 *
> +	 * A 3x4 matrix. Its values are specified via the
> +	 * &drm_color_ctm_3x4 struct provided via the DATA property.
> +	 */
>  	DRM_COLOROP_CTM_3X4,
> +
> +	/**
> +	 * @DRM_COLOROP_MULTIPLIER:
> +	 *
> +	 * A simple multiplier, applied to all color values. The
> +	 * multiplier is specified as a S31.32 via the MULTIPLIER
> +	 * property.
> +	 */
>  	DRM_COLOROP_MULTIPLIER,
> +	/**
> +	 * @DRM_COLOROP_3D_LUT:
> +	 *
> +	 * A 3D LUT of &drm_color_lut entries,
> +	 * packed into a blob via the DATA property. The driver's expected
> +	 * LUT size is advertised via the SIZE property.
> +	 */
>  	DRM_COLOROP_3D_LUT,
>  };
>  
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 07/30] lib/igt_fb: Add igt_copy_fb function
  2025-08-15  4:06 ` [PATCH V10 07/30] lib/igt_fb: Add igt_copy_fb function Alex Hung
@ 2025-09-03 16:44   ` Kamil Konieczny
  0 siblings, 0 replies; 49+ messages in thread
From: Kamil Konieczny @ 2025-09-03 16:44 UTC (permalink / raw)
  To: Alex Hung
  Cc: igt-dev, harry.wentland, leo.liu, Karthik B S,
	Juha-Pekka Heikkila, Juha-Pekka Heikkila

Hi Alex,
On 2025-08-14 at 22:06:36 -0600, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> Add a function to copy fb of DRM_FORMAT_XRGB8888.
> 

+cc Karthik and Juha-Pekka
Cc: Karthik B S <karthik.b.s@intel.com>
Cc: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Cc: Juha-Pekka Heikkila <juha-pekka.heikkila@intel.com>

> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>  lib/igt_fb.c | 33 +++++++++++++++++++++++++++++++++
>  lib/igt_fb.h |  1 +
>  2 files changed, 34 insertions(+)
> 
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index 45692b170..8c8436e94 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -2170,6 +2170,39 @@ unsigned int igt_create_fb(int fd, int width, int height, uint32_t format,
>  					  fb, 0, 0);
>  }
>  
> +unsigned int igt_copy_fb(int fd, struct igt_fb *src, struct igt_fb *fb)
> +{
> +	char *in_ptr, *out_ptr;
> +	int cpp = igt_drm_format_to_bpp(src->drm_format) / 8;

Why setup it here?

> +	int fb_id = 0;
> +
> +	igt_assert(src);

cpp setup above whould trigger before this assert if src==NULL

> +
> +	/* TODO allow multiple planes */
> +	if (src->num_planes != 1)
> +		return -EINVAL;

return type is unsigned, maybe use bool instead?

> +
> +	/* TODO expand for other formats */
> +	if (src->drm_format != DRM_FORMAT_XRGB8888)
> +		return -EINVAL;

Same here.

Regards,
Kamil

> +
> +	fb_id = igt_create_fb(fd, src->width, src->height, src->drm_format,
> +			      src->modifier, fb);
> +
> +	/* copy buffer contents */
> +	in_ptr = igt_fb_map_buffer(fb->fd, src);
> +	igt_assert(in_ptr);
> +	out_ptr = igt_fb_map_buffer(fb->fd, fb);
> +	igt_assert(out_ptr);
> +
> +	igt_memcpy_from_wc(out_ptr, in_ptr, fb->width * fb->height * cpp);
> +
> +	igt_fb_unmap_buffer(fb, out_ptr);
> +	igt_fb_unmap_buffer(src, in_ptr);
> +
> +	return fb_id;
> +}
> +
>  /**
>   * igt_create_color_fb:
>   * @fd: open drm file descriptor
> diff --git a/lib/igt_fb.h b/lib/igt_fb.h
> index fe0bb580c..b2176558b 100644
> --- a/lib/igt_fb.h
> +++ b/lib/igt_fb.h
> @@ -141,6 +141,7 @@ struct intel_buf *igt_fb_create_intel_buf(int fd, struct buf_ops *bops,
>  					  const struct igt_fb *fb, const char *name);
>  unsigned int igt_create_fb(int fd, int width, int height, uint32_t format,
>  			   uint64_t modifier, struct igt_fb *fb);
> +unsigned int igt_copy_fb(int fd, struct igt_fb *src, struct igt_fb *fb);
>  unsigned int igt_create_color_fb(int fd, int width, int height,
>  				 uint32_t format, uint64_t modifier,
>  				 double r, double g, double b,
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 08/30] lib/drmtest: Add is_vkms_device()
  2025-08-15  4:06 ` [PATCH V10 08/30] lib/drmtest: Add is_vkms_device() Alex Hung
@ 2025-09-03 16:48   ` Kamil Konieczny
  0 siblings, 0 replies; 49+ messages in thread
From: Kamil Konieczny @ 2025-09-03 16:48 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev, harry.wentland, leo.liu, Karthik B S

Hi Alex,
On 2025-08-14 at 22:06:37 -0600, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> Add a function to check vkms device.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>  lib/drmtest.c | 5 +++++
>  lib/drmtest.h | 1 +
>  2 files changed, 6 insertions(+)
> 
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 436b6de78..a3904083f 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -118,6 +118,11 @@ static bool __is_device(int fd, const char *expect)
>  	return strcmp(expect, name) == 0;
>  }
>  
> +bool is_vkms_device(int fd)
> +{
> +	return __is_device(fd, "vkms");

Do you need this change in your series?
There is a separate VKMS series almost ready to merge,
so imho you could drop this patch.

See https://patchwork.freedesktop.org/series/145065/

+cc Karthik

Regards,
Kamil

> +}
> +
>  bool is_amdgpu_device(int fd)
>  {
>  	return __is_device(fd, "amdgpu");
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 27e5a18e2..b3d53f252 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -136,6 +136,7 @@ void igt_require_nouveau(int fd);
>  void igt_require_vc4(int fd);
>  void igt_require_xe(int fd);
>  
> +bool is_vkms_device(int fd);
>  bool is_amdgpu_device(int fd);
>  bool is_i915_device(int fd);
>  bool is_mtk_device(int fd);
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 16/30] lib/igt_fb: Allow any non-planar format for igt_copy_fb
  2025-08-15  4:06 ` [PATCH V10 16/30] lib/igt_fb: Allow any non-planar format for igt_copy_fb Alex Hung
@ 2025-09-03 16:51   ` Kamil Konieczny
  2025-09-04  7:55     ` Karthik B S
  0 siblings, 1 reply; 49+ messages in thread
From: Kamil Konieczny @ 2025-09-03 16:51 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev, harry.wentland, leo.liu, Karthik B S

Hi Alex,
On 2025-08-14 at 22:06:45 -0600, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
> 
> The function is able to handle any non-planar format. It's been
> tested for XRGB8888 and XRGB2101010 so far but should work
> for a wider range of formats.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>  lib/igt_fb.c        |   4 --

Please split this patch into lib change and test.
Also imho lib change could be squashed into first igt_copy_fb()

+cc Karthik

Regards,
Kamil

>  tests/kms_colorop.c | 138 +++++++++++++++++++++++++-------------------
>  2 files changed, 78 insertions(+), 64 deletions(-)
> 
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index 8c8436e94..b3474781d 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -2182,10 +2182,6 @@ unsigned int igt_copy_fb(int fd, struct igt_fb *src, struct igt_fb *fb)
>  	if (src->num_planes != 1)
>  		return -EINVAL;
>  
> -	/* TODO expand for other formats */
> -	if (src->drm_format != DRM_FORMAT_XRGB8888)
> -		return -EINVAL;
> -
>  	fb_id = igt_create_fb(fd, src->width, src->height, src->drm_format,
>  			      src->modifier, fb);
>  
> diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
> index 77d8c6bfa..7ac74c536 100644
> --- a/tests/kms_colorop.c
> +++ b/tests/kms_colorop.c
> @@ -380,60 +380,28 @@ static void apply_transforms(kms_colorop_t *colorops[], igt_fb_t *sw_transform_f
>  }
>  
>  static void colorop_plane_test(igt_display_t *display,
> +			       igt_output_t *output,
> +			       igt_plane_t *plane,
> +			       igt_fb_t *input_fb,
> +			       igt_fb_t *output_fb,
>  			       __u32 fourcc_in,
>  			       __u32 fourcc_out,
>  			       kms_colorop_t *colorops[])
>  {
>  	igt_colorop_t *color_pipeline = NULL;
> -	igt_output_t *output;
> -	igt_plane_t *plane;
> -	igt_fb_t input_fb;
>  	igt_fb_t sw_transform_fb;
> -	igt_fb_t output_fb;
> -	drmModeModeInfo mode;
> -	unsigned int fb_id;
>  	igt_crc_t input_crc, output_crc;
> +	int res;
>  
> -	output = kms_writeback_get_output(display, fourcc_in, fourcc_out);
> -	igt_require(output);
> -
> -	if (output->use_override_mode)
> -		memcpy(&mode, &output->override_mode, sizeof(mode));
> -	else
> -		memcpy(&mode, &output->config.default_mode, sizeof(mode));
> -
> -	/* create input fb */
> -	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> -	igt_assert(plane);
> -
> -	fb_id = igt_create_color_pattern_fb(display->drm_fd,
> -					mode.hdisplay, mode.vdisplay,
> -					fourcc_in, DRM_FORMAT_MOD_LINEAR,
> -					0.2, 0.2, 0.2, &input_fb);
> -	igt_assert(fb_id >= 0);
> -	igt_plane_set_fb(plane, &input_fb);
> -#if DUMP_FBS
> -	igt_dump_fb(display, &input_fb, ".", "input");
> -#endif
> -
> -	/* create output fb */
> -	fb_id = igt_create_fb(display->drm_fd, mode.hdisplay, mode.vdisplay,
> -				fourcc_in,
> -				igt_fb_mod_to_tiling(0),
> -				&output_fb);
> -	igt_require(fb_id > 0);
> -
> -	igt_fb_get_fnv1a_crc(&input_fb, &input_crc);
> -
> -	igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
> +	igt_fb_get_fnv1a_crc(input_fb, &input_crc);
>  
>  	/* reset color pipeline*/
>  
>  	set_color_pipeline_bypass(plane);
>  
>  	/* Commit */
> -	igt_plane_set_fb(plane, &input_fb);
> -	igt_output_set_writeback_fb(output, &output_fb);
> +	igt_plane_set_fb(plane, input_fb);
> +	igt_output_set_writeback_fb(output, output_fb);
>  
>  	igt_display_commit_atomic(output->display,
>  				DRM_MODE_ATOMIC_ALLOW_MODESET,
> @@ -441,14 +409,15 @@ static void colorop_plane_test(igt_display_t *display,
>  	get_and_wait_out_fence(output);
>  
>  	/* Compare input and output buffers. They should be equal here. */
> -	igt_fb_get_fnv1a_crc(&output_fb, &output_crc);
> +	igt_fb_get_fnv1a_crc(output_fb, &output_crc);
>  
>  	igt_assert_crc_equal(&input_crc, &output_crc);
>  
>  	/* create sw transformed buffer */
> +	res = igt_copy_fb(display->drm_fd, input_fb, &sw_transform_fb);
> +	igt_assert_lte(0, res);
>  
> -	igt_copy_fb(display->drm_fd, &input_fb, &sw_transform_fb);
> -	igt_assert(igt_cmp_fb_pixels(&input_fb, &sw_transform_fb, 0, 0));
> +	igt_assert(igt_cmp_fb_pixels(input_fb, &sw_transform_fb, 0, 0));
>  
>  	apply_transforms(colorops, &sw_transform_fb);
>  #if DUMP_FBS
> @@ -469,7 +438,7 @@ static void colorop_plane_test(igt_display_t *display,
>  		set_color_pipeline(display, plane, colorops, color_pipeline);
>  	}
>  
> -	igt_output_set_writeback_fb(output, &output_fb);
> +	igt_output_set_writeback_fb(output, output_fb);
>  
>  	/* commit COLOR_PIPELINE */
>  	igt_display_commit_atomic(display,
> @@ -477,28 +446,24 @@ static void colorop_plane_test(igt_display_t *display,
>  				NULL);
>  	get_and_wait_out_fence(output);
>  #if DUMP_FBS
> -	igt_dump_fb(display, &output_fb, ".", "output");
> +	igt_dump_fb(display, output_fb, ".", "output");
>  #endif
>  
>  	/* compare sw transformed and KMS transformed FBs */
> -	igt_assert(compare_with_bracket(&sw_transform_fb, &output_fb));
> +	igt_assert(compare_with_bracket(&sw_transform_fb, output_fb));
>  
>  	/* reset color pipeline*/
>  	set_color_pipeline_bypass(plane);
>  
>  	/* Commit */
> -	igt_plane_set_fb(plane, &input_fb);
> -	igt_output_set_writeback_fb(output, &output_fb);
> +	igt_plane_set_fb(plane, input_fb);
> +	igt_output_set_writeback_fb(output, output_fb);
>  
>  	igt_display_commit_atomic(output->display,
>  				DRM_MODE_ATOMIC_ALLOW_MODESET,
>  				NULL);
>  	get_and_wait_out_fence(output);
>  
> -	/* cleanup */
> -	detach_crtc(display, output);
> -	igt_remove_fb(display->drm_fd, &input_fb);
> -	igt_remove_fb(display->drm_fd, &output_fb);
>  }
>  
>  igt_main
> @@ -550,21 +515,74 @@ igt_main
>  		igt_display_require(&display, display.drm_fd);
>  
>  		igt_require(display.is_atomic);
> -
>  	}
>  
>  	for (j = 0; j < ARRAY_SIZE(formats); j++) {
> -		for (i = 0; i < ARRAY_SIZE(tests); i++) {
> -			igt_describe("Check color ops on a plane");
> -			igt_subtest_f("plane-%s-%s", formats[j].name, tests[i].name)
> -				colorop_plane_test(&display,
> -						   formats[j].fourcc_in,
> -						   formats[j].fourcc_out,
> -						   tests[i].colorops);
> +		igt_output_t *output;
> +		igt_plane_t *plane;
> +		igt_fb_t input_fb, output_fb;
> +		unsigned int fb_id;
> +		drmModeModeInfo mode;
> +
> +		igt_subtest_group {
> +			igt_fixture {
> +				output = kms_writeback_get_output(&display,
> +								  formats[j].fourcc_in,
> +								  formats[j].fourcc_out);
> +				igt_require(output);
> +
> +				if (output->use_override_mode)
> +					memcpy(&mode, &output->override_mode, sizeof(mode));
> +				else
> +					memcpy(&mode, &output->config.default_mode, sizeof(mode));
> +
> +				/* create input fb */
> +				plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +				igt_assert(plane);
> +				igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
> +
> +				fb_id = igt_create_color_pattern_fb(display.drm_fd,
> +								mode.hdisplay, mode.vdisplay,
> +								formats[j].fourcc_in, DRM_FORMAT_MOD_LINEAR,
> +								0.2, 0.2, 0.2, &input_fb);
> +				igt_assert(fb_id >= 0);
> +				igt_plane_set_fb(plane, &input_fb);
> +#if DUMP_FBS
> +				igt_dump_fb(&display, &input_fb, ".", "input");
> +#endif
> +
> +				/* create output fb */
> +				fb_id = igt_create_fb(display.drm_fd, mode.hdisplay, mode.vdisplay,
> +							formats[j].fourcc_in,
> +							igt_fb_mod_to_tiling(0),
> +							&output_fb);
> +				igt_require(fb_id > 0);
> +			}
> +
> +			for (i = 0; i < ARRAY_SIZE(tests); i++) {
> +				igt_describe("Check color ops on a plane");
> +				igt_subtest_f("plane-%s-%s", formats[j].name, tests[i].name)
> +					colorop_plane_test(&display,
> +							output,
> +							plane,
> +							&input_fb,
> +							&output_fb,
> +							formats[j].fourcc_in,
> +							formats[j].fourcc_out,
> +							tests[i].colorops);
> +			}
> +
> +			igt_fixture {
> +				detach_crtc(&display, output);
> +				igt_remove_fb(display.drm_fd, &input_fb);
> +				igt_remove_fb(display.drm_fd, &output_fb);
> +
> +			}
>  		}
>  	}
>  	igt_describe("Tests getting and setting COLOR_PIPELINE property on plane");
>  	igt_fixture {
>  		igt_display_fini(&display);
> +		drm_close_driver(display.drm_fd);
>  	}
>  }
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH V10 16/30] lib/igt_fb: Allow any non-planar format for igt_copy_fb
  2025-09-03 16:51   ` Kamil Konieczny
@ 2025-09-04  7:55     ` Karthik B S
  0 siblings, 0 replies; 49+ messages in thread
From: Karthik B S @ 2025-09-04  7:55 UTC (permalink / raw)
  To: Kamil Konieczny, Alex Hung, igt-dev, harry.wentland, leo.liu

Hi Alex,

On 9/3/2025 10:21 PM, Kamil Konieczny wrote:
> Hi Alex,
> On 2025-08-14 at 22:06:45 -0600, Alex Hung wrote:
>> From: Harry Wentland <harry.wentland@amd.com>
>>
>> The function is able to handle any non-planar format. It's been
>> tested for XRGB8888 and XRGB2101010 so far but should work
>> for a wider range of formats.
>>
>> Signed-off-by: Alex Hung <alex.hung@amd.com>
>> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
>> ---
>>   lib/igt_fb.c        |   4 --
> Please split this patch into lib change and test.
> Also imho lib change could be squashed into first igt_copy_fb()
>
> +cc Karthik

Yes I agree with both the changes suggested above.

Regards,
Karthik.B.S
>
> Regards,
> Kamil
>
>>   tests/kms_colorop.c | 138 +++++++++++++++++++++++++-------------------
>>   2 files changed, 78 insertions(+), 64 deletions(-)
>>
>> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
>> index 8c8436e94..b3474781d 100644
>> --- a/lib/igt_fb.c
>> +++ b/lib/igt_fb.c
>> @@ -2182,10 +2182,6 @@ unsigned int igt_copy_fb(int fd, struct igt_fb *src, struct igt_fb *fb)
>>   	if (src->num_planes != 1)
>>   		return -EINVAL;
>>   
>> -	/* TODO expand for other formats */
>> -	if (src->drm_format != DRM_FORMAT_XRGB8888)
>> -		return -EINVAL;
>> -
>>   	fb_id = igt_create_fb(fd, src->width, src->height, src->drm_format,
>>   			      src->modifier, fb);
>>   
>> diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
>> index 77d8c6bfa..7ac74c536 100644
>> --- a/tests/kms_colorop.c
>> +++ b/tests/kms_colorop.c
>> @@ -380,60 +380,28 @@ static void apply_transforms(kms_colorop_t *colorops[], igt_fb_t *sw_transform_f
>>   }
>>   
>>   static void colorop_plane_test(igt_display_t *display,
>> +			       igt_output_t *output,
>> +			       igt_plane_t *plane,
>> +			       igt_fb_t *input_fb,
>> +			       igt_fb_t *output_fb,
>>   			       __u32 fourcc_in,
>>   			       __u32 fourcc_out,
>>   			       kms_colorop_t *colorops[])
>>   {
>>   	igt_colorop_t *color_pipeline = NULL;
>> -	igt_output_t *output;
>> -	igt_plane_t *plane;
>> -	igt_fb_t input_fb;
>>   	igt_fb_t sw_transform_fb;
>> -	igt_fb_t output_fb;
>> -	drmModeModeInfo mode;
>> -	unsigned int fb_id;
>>   	igt_crc_t input_crc, output_crc;
>> +	int res;
>>   
>> -	output = kms_writeback_get_output(display, fourcc_in, fourcc_out);
>> -	igt_require(output);
>> -
>> -	if (output->use_override_mode)
>> -		memcpy(&mode, &output->override_mode, sizeof(mode));
>> -	else
>> -		memcpy(&mode, &output->config.default_mode, sizeof(mode));
>> -
>> -	/* create input fb */
>> -	plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
>> -	igt_assert(plane);
>> -
>> -	fb_id = igt_create_color_pattern_fb(display->drm_fd,
>> -					mode.hdisplay, mode.vdisplay,
>> -					fourcc_in, DRM_FORMAT_MOD_LINEAR,
>> -					0.2, 0.2, 0.2, &input_fb);
>> -	igt_assert(fb_id >= 0);
>> -	igt_plane_set_fb(plane, &input_fb);
>> -#if DUMP_FBS
>> -	igt_dump_fb(display, &input_fb, ".", "input");
>> -#endif
>> -
>> -	/* create output fb */
>> -	fb_id = igt_create_fb(display->drm_fd, mode.hdisplay, mode.vdisplay,
>> -				fourcc_in,
>> -				igt_fb_mod_to_tiling(0),
>> -				&output_fb);
>> -	igt_require(fb_id > 0);
>> -
>> -	igt_fb_get_fnv1a_crc(&input_fb, &input_crc);
>> -
>> -	igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
>> +	igt_fb_get_fnv1a_crc(input_fb, &input_crc);
>>   
>>   	/* reset color pipeline*/
>>   
>>   	set_color_pipeline_bypass(plane);
>>   
>>   	/* Commit */
>> -	igt_plane_set_fb(plane, &input_fb);
>> -	igt_output_set_writeback_fb(output, &output_fb);
>> +	igt_plane_set_fb(plane, input_fb);
>> +	igt_output_set_writeback_fb(output, output_fb);
>>   
>>   	igt_display_commit_atomic(output->display,
>>   				DRM_MODE_ATOMIC_ALLOW_MODESET,
>> @@ -441,14 +409,15 @@ static void colorop_plane_test(igt_display_t *display,
>>   	get_and_wait_out_fence(output);
>>   
>>   	/* Compare input and output buffers. They should be equal here. */
>> -	igt_fb_get_fnv1a_crc(&output_fb, &output_crc);
>> +	igt_fb_get_fnv1a_crc(output_fb, &output_crc);
>>   
>>   	igt_assert_crc_equal(&input_crc, &output_crc);
>>   
>>   	/* create sw transformed buffer */
>> +	res = igt_copy_fb(display->drm_fd, input_fb, &sw_transform_fb);
>> +	igt_assert_lte(0, res);
>>   
>> -	igt_copy_fb(display->drm_fd, &input_fb, &sw_transform_fb);
>> -	igt_assert(igt_cmp_fb_pixels(&input_fb, &sw_transform_fb, 0, 0));
>> +	igt_assert(igt_cmp_fb_pixels(input_fb, &sw_transform_fb, 0, 0));
>>   
>>   	apply_transforms(colorops, &sw_transform_fb);
>>   #if DUMP_FBS
>> @@ -469,7 +438,7 @@ static void colorop_plane_test(igt_display_t *display,
>>   		set_color_pipeline(display, plane, colorops, color_pipeline);
>>   	}
>>   
>> -	igt_output_set_writeback_fb(output, &output_fb);
>> +	igt_output_set_writeback_fb(output, output_fb);
>>   
>>   	/* commit COLOR_PIPELINE */
>>   	igt_display_commit_atomic(display,
>> @@ -477,28 +446,24 @@ static void colorop_plane_test(igt_display_t *display,
>>   				NULL);
>>   	get_and_wait_out_fence(output);
>>   #if DUMP_FBS
>> -	igt_dump_fb(display, &output_fb, ".", "output");
>> +	igt_dump_fb(display, output_fb, ".", "output");
>>   #endif
>>   
>>   	/* compare sw transformed and KMS transformed FBs */
>> -	igt_assert(compare_with_bracket(&sw_transform_fb, &output_fb));
>> +	igt_assert(compare_with_bracket(&sw_transform_fb, output_fb));
>>   
>>   	/* reset color pipeline*/
>>   	set_color_pipeline_bypass(plane);
>>   
>>   	/* Commit */
>> -	igt_plane_set_fb(plane, &input_fb);
>> -	igt_output_set_writeback_fb(output, &output_fb);
>> +	igt_plane_set_fb(plane, input_fb);
>> +	igt_output_set_writeback_fb(output, output_fb);
>>   
>>   	igt_display_commit_atomic(output->display,
>>   				DRM_MODE_ATOMIC_ALLOW_MODESET,
>>   				NULL);
>>   	get_and_wait_out_fence(output);
>>   
>> -	/* cleanup */
>> -	detach_crtc(display, output);
>> -	igt_remove_fb(display->drm_fd, &input_fb);
>> -	igt_remove_fb(display->drm_fd, &output_fb);
>>   }
>>   
>>   igt_main
>> @@ -550,21 +515,74 @@ igt_main
>>   		igt_display_require(&display, display.drm_fd);
>>   
>>   		igt_require(display.is_atomic);
>> -
>>   	}
>>   
>>   	for (j = 0; j < ARRAY_SIZE(formats); j++) {
>> -		for (i = 0; i < ARRAY_SIZE(tests); i++) {
>> -			igt_describe("Check color ops on a plane");
>> -			igt_subtest_f("plane-%s-%s", formats[j].name, tests[i].name)
>> -				colorop_plane_test(&display,
>> -						   formats[j].fourcc_in,
>> -						   formats[j].fourcc_out,
>> -						   tests[i].colorops);
>> +		igt_output_t *output;
>> +		igt_plane_t *plane;
>> +		igt_fb_t input_fb, output_fb;
>> +		unsigned int fb_id;
>> +		drmModeModeInfo mode;
>> +
>> +		igt_subtest_group {
>> +			igt_fixture {
>> +				output = kms_writeback_get_output(&display,
>> +								  formats[j].fourcc_in,
>> +								  formats[j].fourcc_out);
>> +				igt_require(output);
>> +
>> +				if (output->use_override_mode)
>> +					memcpy(&mode, &output->override_mode, sizeof(mode));
>> +				else
>> +					memcpy(&mode, &output->config.default_mode, sizeof(mode));
>> +
>> +				/* create input fb */
>> +				plane = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
>> +				igt_assert(plane);
>> +				igt_require(igt_plane_has_prop(plane, IGT_PLANE_COLOR_PIPELINE));
>> +
>> +				fb_id = igt_create_color_pattern_fb(display.drm_fd,
>> +								mode.hdisplay, mode.vdisplay,
>> +								formats[j].fourcc_in, DRM_FORMAT_MOD_LINEAR,
>> +								0.2, 0.2, 0.2, &input_fb);
>> +				igt_assert(fb_id >= 0);
>> +				igt_plane_set_fb(plane, &input_fb);
>> +#if DUMP_FBS
>> +				igt_dump_fb(&display, &input_fb, ".", "input");
>> +#endif
>> +
>> +				/* create output fb */
>> +				fb_id = igt_create_fb(display.drm_fd, mode.hdisplay, mode.vdisplay,
>> +							formats[j].fourcc_in,
>> +							igt_fb_mod_to_tiling(0),
>> +							&output_fb);
>> +				igt_require(fb_id > 0);
>> +			}
>> +
>> +			for (i = 0; i < ARRAY_SIZE(tests); i++) {
>> +				igt_describe("Check color ops on a plane");
>> +				igt_subtest_f("plane-%s-%s", formats[j].name, tests[i].name)
>> +					colorop_plane_test(&display,
>> +							output,
>> +							plane,
>> +							&input_fb,
>> +							&output_fb,
>> +							formats[j].fourcc_in,
>> +							formats[j].fourcc_out,
>> +							tests[i].colorops);
>> +			}
>> +
>> +			igt_fixture {
>> +				detach_crtc(&display, output);
>> +				igt_remove_fb(display.drm_fd, &input_fb);
>> +				igt_remove_fb(display.drm_fd, &output_fb);
>> +
>> +			}
>>   		}
>>   	}
>>   	igt_describe("Tests getting and setting COLOR_PIPELINE property on plane");
>>   	igt_fixture {
>>   		igt_display_fini(&display);
>> +		drm_close_driver(display.drm_fd);
>>   	}
>>   }
>> -- 
>> 2.43.0
>>

^ permalink raw reply	[flat|nested] 49+ messages in thread

end of thread, other threads:[~2025-09-04  7:55 UTC | newest]

Thread overview: 49+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-15  4:06 [PATCH V10 00/30] IGT tests for the KMS Color Pipeline API Alex Hung
2025-08-15  4:06 ` [PATCH V10 01/30] tests/kms_writeback: Fix kms_writeback for VKMS Alex Hung
2025-08-15  4:06 ` [PATCH V10 02/30] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE Alex Hung
2025-09-03 14:11   ` Borah, Chaitanya Kumar
2025-08-15  4:06 ` [PATCH V10 03/30] drm-uapi: Add COLOROP object Alex Hung
2025-08-26 16:37   ` Aurabindo Pillai
2025-08-15  4:06 ` [PATCH V10 04/30] lib/igt_kms: Destroy colorops on exit Alex Hung
2025-08-15  4:06 ` [PATCH V10 05/30] tests/kms_properties: Add colorop properties test Alex Hung
2025-08-15  4:06 ` [PATCH V10 06/30] igt/color: Add SW color transform functionality Alex Hung
2025-08-15  4:06 ` [PATCH V10 07/30] lib/igt_fb: Add igt_copy_fb function Alex Hung
2025-09-03 16:44   ` Kamil Konieczny
2025-08-15  4:06 ` [PATCH V10 08/30] lib/drmtest: Add is_vkms_device() Alex Hung
2025-09-03 16:48   ` Kamil Konieczny
2025-08-15  4:06 ` [PATCH V10 09/30] tests/kms_colorop: Add kms_colorop tests Alex Hung
2025-08-26 20:39   ` Aurabindo Pillai
2025-08-27 10:53   ` Kamil Konieczny
2025-08-15  4:06 ` [PATCH V10 10/30] lib/igt_kms: Add support for DATA colorop property Alex Hung
2025-08-15  4:06 ` [PATCH V10 11/30] lib/igt_color: Add support for 3x4 matrices Alex Hung
2025-08-26 16:29   ` Aurabindo Pillai
2025-08-15  4:06 ` [PATCH V10 12/30] tests/kms_colorop: Add 3x4 CTM tests Alex Hung
2025-08-15  4:06 ` [PATCH V10 13/30] tests/kms_colorop: Add bypass test Alex Hung
2025-08-15  4:06 ` [PATCH V10 14/30] tests/kms_colorop: Add 10bpc test Alex Hung
2025-08-15  4:06 ` [PATCH V10 15/30] tests/kms_colorop: Skip if writeback does not support fourcc Alex Hung
2025-08-15  4:06 ` [PATCH V10 16/30] lib/igt_fb: Allow any non-planar format for igt_copy_fb Alex Hung
2025-09-03 16:51   ` Kamil Konieczny
2025-09-04  7:55     ` Karthik B S
2025-08-15  4:06 ` [PATCH V10 17/30] lib/igt_color: Support color transform for XRGB2101010 Alex Hung
2025-08-26 16:28   ` Aurabindo Pillai
2025-08-15  4:06 ` [PATCH V10 18/30] lib/igt_color: Add PQ variants for 0-1 and 0-125 range Alex Hung
2025-08-15  4:06 ` [PATCH V10 19/30] tests/kms_colorop: Add tests for PQ variants Alex Hung
2025-08-15  4:06 ` [PATCH V10 20/30] tests/kms_colorop: Add a TF sRGB test Alex Hung
2025-08-15  4:06 ` [PATCH V10 21/30] lib/igt_color: add BT2020/BT709 transfer functions Alex Hung
2025-08-15  4:06 ` [PATCH V10 22/30] tests/kms_colorop: Add TF BT2020/BT709 tests Alex Hung
2025-08-15  4:06 ` [PATCH V10 23/30] lib/igt_color: Add 1D LUT color transformation support Alex Hung
2025-08-22 21:43   ` Aurabindo Pillai
2025-08-15  4:06 ` [PATCH V10 24/30] test/kms_colorop: Add tests that exercise the 1D LUT colorops Alex Hung
2025-08-15  4:06 ` [PATCH V10 25/30] tests/kms_colorop: Add multiplier tests Alex Hung
2025-08-15  4:06 ` [PATCH V10 26/30] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API Alex Hung
2025-08-15  4:06 ` [PATCH V10 27/30] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
2025-08-22 21:35   ` Aurabindo Pillai
2025-08-26 16:39   ` Aurabindo Pillai
2025-08-15  4:06 ` [PATCH V10 28/30] drm-uapi: Update kernel doc for drm_colorop_type Alex Hung
2025-09-03 16:41   ` Kamil Konieczny
2025-08-15  4:06 ` [PATCH V10 29/30] drm-uapi: Sync up definition with kernel colorop implementation Alex Hung
2025-08-15  4:06 ` [PATCH V10 30/30] tests/kms_colorop: Add a colorop uniqueness subtest Alex Hung
2025-08-15  5:24 ` ✓ i915.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev10) Patchwork
2025-08-15  5:33 ` ✓ Xe.CI.BAT: " Patchwork
2025-08-15  6:34 ` ✗ Xe.CI.Full: failure " Patchwork
2025-08-15 17:06 ` ✗ i915.CI.Full: " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).