Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API
@ 2025-03-26 23:35 Alex Hung
  2025-03-26 23:35 ` [PATCH V7 01/37] lib/drmtest: Add is_vkms_device() Alex Hung
                   ` (43 more replies)
  0 siblings, 44 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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-v8

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):
  lib/igt_kms: increase MAX_NUM_COLOROPS to 128
  tests/kms_colorop: Add a sRGB test for EOTF -> Inverse EOTF -> EOTF
  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

Harry Wentland (28):
  lib/drmtest: Add is_vkms_device()
  tests/kms_writeback: Fix kms_writeback for VKMS
  lib/igt_kms: Move get_writeback_formats_blob to lib
  lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
  include/drm-uapi: Add COLOROP object
  drm-uapi: Add 3x4 CTM
  drm-uapi: Add 1D LUT drm_colorop_type
  lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE
  tests/kms_properties: Add colorop properties test
  igt/color: Add SW color transform functionality
  lib/igt_fb: Add copy_fb function
  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: Parametrize the buffer format
  tests/kms_colorop: Add 10bpc test and skip if format not supported
  tests/kms_colorop: Skip if writeback does not support fourcc
  lib/igt_fb: Allow any non-planar format for igt_copy_fb
  kms/colorop: Do proper setup and cleanup
  lib/igt_color: Support color transform for XRGB2101010
  tests/kms_colorop: Set wide [13, 13] bracket for comparison on amdgpu
  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 tests for BT2020/BT709 TFs
  lib/igt_color: Point license header at skia license

 include/drm-uapi/amdgpu_drm.h |    9 -
 include/drm-uapi/drm.h        |   15 +
 include/drm-uapi/drm_mode.h   |   99 +
 lib/drmtest.c                 |    5 +
 lib/drmtest.h                 |    1 +
 lib/igt_color.c               |  648 +++++
 lib/igt_color.h               |  162 ++
 lib/igt_color_lut.h           | 4946 +++++++++++++++++++++++++++++++++
 lib/igt_fb.c                  |   34 +-
 lib/igt_fb.h                  |    3 +
 lib/igt_kms.c                 |  359 ++-
 lib/igt_kms.h                 |  100 +
 lib/meson.build               |    1 +
 scripts/convert_3dlut.py      |   94 +
 tests/kms_colorop.c           |  702 +++++
 tests/kms_colorop.h           |  261 ++
 tests/kms_properties.c        |   94 +-
 tests/kms_writeback.c         |   38 +-
 tests/meson.build             |    1 +
 19 files changed, 7523 insertions(+), 49 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 V7 01/37] lib/drmtest: Add is_vkms_device()
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 02/37] tests/kms_writeback: Fix kms_writeback for VKMS Alex Hung
                   ` (42 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

From: Harry Wentland <harry.wentland@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 V7 02/37] tests/kms_writeback: Fix kms_writeback for VKMS
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
  2025-03-26 23:35 ` [PATCH V7 01/37] lib/drmtest: Add is_vkms_device() Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 03/37] lib/igt_kms: Move get_writeback_formats_blob to lib Alex Hung
                   ` (41 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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: 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 05680837e..e3671c59b 100644
--- a/tests/kms_writeback.c
+++ b/tests/kms_writeback.c
@@ -131,6 +131,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);
@@ -140,7 +144,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);
 
@@ -590,12 +593,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 (igt_plane_has_format_mod(plane, DRM_FORMAT_XRGB2101010, DRM_FORMAT_MOD_LINEAR)) {
+			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 V7 03/37] lib/igt_kms: Move get_writeback_formats_blob to lib
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
  2025-03-26 23:35 ` [PATCH V7 01/37] lib/drmtest: Add is_vkms_device() Alex Hung
  2025-03-26 23:35 ` [PATCH V7 02/37] tests/kms_writeback: Fix kms_writeback for VKMS Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-04-03  6:41   ` Sharma, Swati2
  2025-03-26 23:35 ` [PATCH V7 04/37] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE Alex Hung
                   ` (40 subsequent siblings)
  43 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

We'll need it in other tests

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_kms.c         | 19 +++++++++++++++++++
 lib/igt_kms.h         |  2 ++
 tests/kms_writeback.c | 19 -------------------
 3 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 99c8707c7..884d78749 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -7434,3 +7434,22 @@ int igt_backlight_write(int value, const char *fname, igt_backlight_context_t *c
 
 	return 0;
 }
+
+drmModePropertyBlobRes *get_writeback_formats_blob(igt_output_t *output)
+{
+	drmModePropertyBlobRes *blob = NULL;
+	uint64_t blob_id;
+	int ret;
+
+	ret = kmstest_get_property(output->display->drm_fd,
+				   output->config.connector->connector_id,
+				   DRM_MODE_OBJECT_CONNECTOR,
+				   igt_connector_prop_names[IGT_CONNECTOR_WRITEBACK_PIXEL_FORMATS],
+				   NULL, &blob_id, NULL);
+	if (ret)
+		blob = drmModeGetPropertyBlob(output->display->drm_fd, blob_id);
+
+	igt_assert(blob);
+
+	return blob;
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 0381c82ad..9b5a940f7 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1280,4 +1280,6 @@ void igt_set_link_params(int drm_fd, igt_output_t *output,
 int igt_backlight_read(int *result, const char *fname, igt_backlight_context_t *context);
 int igt_backlight_write(int value, const char *fname, igt_backlight_context_t *context);
 
+drmModePropertyBlobRes *get_writeback_formats_blob(igt_output_t *output);
+
 #endif /* __IGT_KMS_H__ */
diff --git a/tests/kms_writeback.c b/tests/kms_writeback.c
index e3671c59b..f733f3ce6 100644
--- a/tests/kms_writeback.c
+++ b/tests/kms_writeback.c
@@ -92,25 +92,6 @@ enum {
 	XRGB2101010 = 1 << 1,
 };
 
-static drmModePropertyBlobRes *get_writeback_formats_blob(igt_output_t *output)
-{
-	drmModePropertyBlobRes *blob = NULL;
-	uint64_t blob_id;
-	int ret;
-
-	ret = kmstest_get_property(output->display->drm_fd,
-				   output->config.connector->connector_id,
-				   DRM_MODE_OBJECT_CONNECTOR,
-				   igt_connector_prop_names[IGT_CONNECTOR_WRITEBACK_PIXEL_FORMATS],
-				   NULL, &blob_id, NULL);
-	if (ret)
-		blob = drmModeGetPropertyBlob(output->display->drm_fd, blob_id);
-
-	igt_assert(blob);
-
-	return blob;
-}
-
 static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
 				    drmModeModeInfo override_mode)
 {
-- 
2.43.0


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

* [PATCH V7 04/37] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (2 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 03/37] lib/igt_kms: Move get_writeback_formats_blob to lib Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 05/37] include/drm-uapi: Add COLOROP object Alex Hung
                   ` (39 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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.

v6:
 - Ignore COLOR_RANGE and COLOR_ENCODING plane properties
   when DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE is set

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 include/drm-uapi/drm.h | 15 +++++++++++++++
 lib/igt_kms.c          | 32 ++++++++++++++++++++++++++++++++
 lib/igt_kms.h          |  1 +
 tests/kms_properties.c | 22 ++++++++++++++++------
 4 files changed, 64 insertions(+), 6 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 884d78749..88ed35f07 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -2981,6 +2981,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);
 
@@ -3608,6 +3611,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
  */
@@ -3627,6 +3653,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;
 
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 9b5a940f7..7531ae53b 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -503,6 +503,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 408e23578..01ec3bedc 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,16 @@ 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")) {
+			printf("hwhw: ignoring COLOR_RANGE\n");
+			return true;
+		}
+		if (has_color_pipeline && !strcmp(name, "COLOR_ENCODING")) {
+			printf("hwhw: ignoring COLOR_ENCODING\n");
+			return true;
+		}
+		break;
 	default:
 		break;
 	}
@@ -164,7 +174,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 +193,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 +240,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 +254,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 +268,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 V7 05/37] include/drm-uapi: Add COLOROP object
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (3 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 04/37] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 06/37] drm-uapi: Add 3x4 CTM Alex Hung
                   ` (38 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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.

v3:
- move enum drm_colorop_type to drm_mode.h

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 include/drm-uapi/drm_mode.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index c082810c0..b31852a94 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 {
@@ -857,6 +858,10 @@ struct drm_color_lut {
 	__u16 reserved;
 };
 
+enum drm_colorop_type {
+	DRM_COLOROP_1D_CURVE
+};
+
 /**
  * struct drm_plane_size_hint - Plane size hints
  * @width: The width of the plane in pixel
-- 
2.43.0


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

* [PATCH V7 06/37] drm-uapi: Add 3x4 CTM
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (4 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 05/37] include/drm-uapi: Add COLOROP object Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 07/37] drm-uapi: Add 1D LUT drm_colorop_type Alex Hung
                   ` (37 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 include/drm-uapi/amdgpu_drm.h |  9 ---------
 include/drm-uapi/drm_mode.h   | 19 ++++++++++++++++++-
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/include/drm-uapi/amdgpu_drm.h b/include/drm-uapi/amdgpu_drm.h
index efe5de6ce..e44362e74 100644
--- a/include/drm-uapi/amdgpu_drm.h
+++ b/include/drm-uapi/amdgpu_drm.h
@@ -1283,15 +1283,6 @@ struct drm_amdgpu_info_gpuvm_fault {
 #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 b31852a94..c5debc1e2 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -847,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
@@ -859,7 +875,8 @@ struct drm_color_lut {
 };
 
 enum drm_colorop_type {
-	DRM_COLOROP_1D_CURVE
+	DRM_COLOROP_1D_CURVE,
+	DRM_COLOROP_CTM_3X4,
 };
 
 /**
-- 
2.43.0


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

* [PATCH V7 07/37] drm-uapi: Add 1D LUT drm_colorop_type
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (5 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 06/37] drm-uapi: Add 3x4 CTM Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 08/37] lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE Alex Hung
                   ` (36 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 include/drm-uapi/drm_mode.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index c5debc1e2..fce45b5cf 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -876,6 +876,7 @@ struct drm_color_lut {
 
 enum drm_colorop_type {
 	DRM_COLOROP_1D_CURVE,
+	DRM_COLOROP_1D_LUT,
 	DRM_COLOROP_CTM_3X4,
 };
 
-- 
2.43.0


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

* [PATCH V7 08/37] lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (6 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 07/37] drm-uapi: Add 1D LUT drm_colorop_type Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-04-03 10:04   ` Sharma, Swati2
  2025-03-26 23:35 ` [PATCH V7 09/37] tests/kms_properties: Add colorop properties test Alex Hung
                   ` (35 subsequent siblings)
  43 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

We've introduced a new drm_colorop object in DRM. These are
used to make up a color pipeline. Introduce the concept of
this new DRM core object to IGT, including:
 - discovery of drm_colorop objects during init
 - various helper functions for deaing with drm_colorops
 - handling drm_colorops in atomic commit

Along with this we're also introducing a new COLOR_PIPELINE
plane property to track and be able to retrieve the colorops.

v6:
 - Ignore COLOR_PIPELINE property if
   DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE not set

v5:
 - Fix warning

v3:
 - Add commit description (Kamil)
 - Add description for public functions (Kamil)
 - Squash with COLOR_PIPELINE patch
 - Remove need for IOCTLs
 - Change colorop discovery to work without IOCTLs
 - move enum drm_colorop_type to drm_mode.h
 - Drop display from colorop prop_enum functions

v2:
 - Iterate through all next drm_colorop objects

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_kms.c          | 271 ++++++++++++++++++++++++++++++++++++++++-
 lib/igt_kms.h          |  89 ++++++++++++++
 tests/kms_properties.c |   5 +-
 3 files changed, 358 insertions(+), 7 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 88ed35f07..3f0ad25ce 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 32
 
 typedef bool (*igt_connector_attr_set)(int dir, const char *attr, const char *value);
 
@@ -701,6 +702,14 @@ const char * const igt_plane_prop_names[IGT_NUM_PLANE_PROPS] = {
 	[IGT_PLANE_FB_DAMAGE_CLIPS] = "FB_DAMAGE_CLIPS",
 	[IGT_PLANE_SCALING_FILTER] = "SCALING_FILTER",
 	[IGT_PLANE_SIZE_HINTS] = "SIZE_HINTS",
+	[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] = {
@@ -768,6 +777,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.
@@ -799,6 +910,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);
 	}
 
@@ -2999,16 +3113,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;
@@ -3626,6 +3738,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;
 		}
@@ -3675,6 +3789,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.
@@ -4122,6 +4275,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);
@@ -4210,6 +4382,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.
@@ -4242,6 +4452,50 @@ 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.
@@ -4514,6 +4768,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 7531ae53b..04a96f47a 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -365,9 +365,18 @@ enum igt_atomic_plane_properties {
        IGT_PLANE_HOTSPOT_X,
        IGT_PLANE_HOTSPOT_Y,
        IGT_PLANE_SIZE_HINTS,
+       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
  *
@@ -376,10 +385,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,
@@ -405,6 +424,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;
@@ -438,6 +471,11 @@ typedef struct igt_plane {
 	uint64_t *modifiers;
 	uint32_t *formats;
 	int 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;
 
 /*
@@ -496,9 +534,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;
@@ -841,6 +881,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);
@@ -1283,4 +1370,6 @@ int igt_backlight_write(int value, const char *fname, igt_backlight_context_t *c
 
 drmModePropertyBlobRes *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 01ec3bedc..1f21fd851 100644
--- a/tests/kms_properties.c
+++ b/tests/kms_properties.c
@@ -112,7 +112,10 @@ 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_RANGE")) {
+		if (!has_color_pipeline && !strcmp(name, "COLOR_PIPELINE")) {
+			printf("hwhw: ignoring COLOR_PIPELINE\n");
+			return true;
+		}		if (has_color_pipeline && !strcmp(name, "COLOR_RANGE")) {
 			printf("hwhw: ignoring COLOR_RANGE\n");
 			return true;
 		}
-- 
2.43.0


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

* [PATCH V7 09/37] tests/kms_properties: Add colorop properties test
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (7 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 08/37] lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 10/37] igt/color: Add SW color transform functionality Alex Hung
                   ` (34 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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.

v3:
 - Update test to work without new libdrm definitions for
   colorop objects
 - Test colorop properties with both atomic and legacy
   code paths

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 1f21fd851..8562618bf 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]:
  *
@@ -232,6 +233,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;
@@ -277,6 +311,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;
@@ -854,6 +919,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 V7 10/37] igt/color: Add SW color transform functionality
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (8 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 09/37] tests/kms_properties: Add colorop properties test Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 11/37] lib/igt_fb: Add copy_fb function Alex Hung
                   ` (33 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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.

v4:
 - Rename srgb_tf to srgb_eotf

v3:
 - Use SPDX style license identifier (Kamil)
 - Replace large copy-paste of Skia license with copyright note
   in file header. Skia is BSD licensed, which is compatible with
   MIT.

v2:
 - Add inverse sRGB TF
 - Make TF functions available to tests
 - Modify tranform_pixels function to take multple transforms

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c | 258 ++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_color.h |  43 ++++++++
 lib/igt_fb.c    |   4 +-
 lib/igt_fb.h    |   2 +
 lib/meson.build |   1 +
 5 files changed, 306 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..6349f2b15
--- /dev/null
+++ b/lib/igt_color.c
@@ -0,0 +1,258 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * This file contains code adapted from Skia, which is
+ * Copyright (c) 2011 Google Inc. All rights reserved.
+ */
+
+#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;
+
+	/* for each pixel */
+
+	/* convert to float and create igt_pixel */
+
+	/* call transform */
+
+	/* convert back to fb format from igt_pixel */
+
+
+}
+
+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)) {
+		printf("comp1 %x comp2 %x diff %d down %d, up %d\n", comp1, comp2, diff, -down, 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)) {
+				/* TODO use proper log*/
+				printf("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);
+}
\ No newline at end of file
diff --git a/lib/igt_color.h b/lib/igt_color.h
new file mode 100644
index 000000000..fa9f6cf42
--- /dev/null
+++ b/lib/igt_color.h
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * This file contains code adapted from Skia, which is
+ * Copyright (c) 2011 Google Inc. All rights reserved.
+ */
+
+
+#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
\ No newline at end of file
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index d62a94e51..fa35a7793 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 d01c90df9..d515e0b92 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -108,6 +108,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 V7 11/37] lib/igt_fb: Add copy_fb function
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (9 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 10/37] igt/color: Add SW color transform functionality Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 12/37] tests/kms_colorop: Add kms_colorop tests Alex Hung
                   ` (32 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

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

diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index fa35a7793..17d3fa0a9 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -2170,6 +2170,40 @@ 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 */
+	/* TODO simplify :D */
+	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 V7 12/37] tests/kms_colorop: Add kms_colorop tests
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (10 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 11/37] lib/igt_fb: Add copy_fb function Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-04-03  9:57   ` Sharma, Swati2
  2025-03-26 23:35 ` [PATCH V7 13/37] lib/igt_kms: Add support for DATA colorop property Alex Hung
                   ` (31 subsequent siblings)
  43 siblings, 1 reply; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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.

v3:
 - skip tests if color pipeline not found
 - Rename colorop to color_pipeline in places where it refers
   to the entire pipeline (Sebastian)

v2:
 - Make tests dynamic, allowing definition of tests with an
   arbitrary number of transforms
 - Add test for sRGB Inverse EOTF
 - Add test for sRGB EOTF, followed by sRGB Inverse EOTF

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 530 ++++++++++++++++++++++++++++++++++++++++++++
 tests/kms_colorop.h |  87 ++++++++
 tests/meson.build   |   1 +
 3 files changed, 618 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..b9009a498
--- /dev/null
+++ b/tests/kms_colorop.c
@@ -0,0 +1,530 @@
+/*
+ * 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);
+
+	/* TODO 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);
+	else
+		/*
+		 * 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];
+
+	/*
+	 * TODO
+	 *
+	 * This is wrong and loses precision since it always goes back
+	 * to an 8-bpc framebuffer.
+	 *
+	 * Instead we need to stay as UNORM or float 16-bpc value throughout
+	 * all transforms.
+	 */
+
+	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*/
+
+	/* TODO do we need this? might be good sanity anyways */
+	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 < sizeof(tests) / sizeof (tests[0]); i++) {
+		igt_describe("Bla bla bla");
+		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");
+#if 0
+	igt_subtest("plane-srgb") {
+		colorop_plane_test(&display, colorops_srgb);
+	}
+	igt_subtest("plane-inv_srgb") {
+		colorop_plane_test(&display, colorops_srgb_inv);
+	}
+#endif
+	igt_fixture {
+
+		igt_display_fini(&display);
+	}
+}
+
diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
new file mode 100644
index 000000000..8102d25b1
--- /dev/null
+++ b/tests/kms_colorop.h
@@ -0,0 +1,87 @@
+/*
+ * 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 fda8584e9..dcdccef18 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -23,6 +23,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 V7 13/37] lib/igt_kms: Add support for DATA colorop property
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (11 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 12/37] tests/kms_colorop: Add kms_colorop tests Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 14/37] lib/igt_color: Add support for 3x4 matrices Alex Hung
                   ` (30 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

From: Harry Wentland <harry.wentland@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 3f0ad25ce..648f903c4 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -709,6 +709,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",
 };
 
@@ -4452,6 +4453,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 04a96f47a..580f21141 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -373,6 +373,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
 };
@@ -881,12 +882,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.
@@ -928,9 +932,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 V7 14/37] lib/igt_color: Add support for 3x4 matrices
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (12 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 13/37] lib/igt_kms: Add support for DATA colorop property Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 15/37] tests/kms_colorop: Add 3x4 CTM tests Alex Hung
                   ` (29 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

Also add a few matrices for testing.

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++-
 lib/igt_color.h | 71 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 158 insertions(+), 1 deletion(-)

diff --git a/lib/igt_color.c b/lib/igt_color.c
index 6349f2b15..5e1374e4b 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -9,6 +9,7 @@
 #include <errno.h>
 #include <math.h>
 
+#include "drmtest.h"
 #include "igt_color.h"
 #include "igt_core.h"
 #include "igt_x86.h"
@@ -70,6 +71,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;
@@ -136,6 +193,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);
@@ -255,4 +317,28 @@ void igt_dump_fb(igt_display_t *display, igt_fb_t *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);
-}
\ No newline at end of file
+}
+
+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 fa9f6cf42..d218550f6 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -27,6 +27,62 @@ 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
+} };
+
+#if 0
+const igt_matrix_3x4_t igt_matrix_3x4_bt709_enc = { {
+	 0.2126,   0.7152,  0.0722, 0.0,
+	-0.1146, -0.3854,  0.5,    0.0,
+	 0.5,     -0.4542, -0.0458, 0.0
+} };
+
+const igt_matrix_3x4_t igt_matrix_3x4_bt709_dec = { {
+	1.0,  0.0,     1.5748, 0.0,
+	1.0, -0.1873, -0.4681, 0.0,
+	1.0,  1.8556,  0.0,    0.0
+} };
+#else
+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
+} };
+#endif
+
+
 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);
 
@@ -37,7 +93,22 @@ 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
\ No newline at end of file
-- 
2.43.0


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

* [PATCH V7 15/37] tests/kms_colorop: Add 3x4 CTM tests
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (13 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 14/37] lib/igt_color: Add support for 3x4 matrices Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 16/37] tests/kms_colorop: Add bypass test Alex Hung
                   ` (28 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

v4:
 - Remove unused defines

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

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index b9009a498..e782f7598 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,11 +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;
@@ -205,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;
 		}
@@ -273,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);
@@ -331,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)
 {
@@ -481,7 +489,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 8102d25b1..30278ca4e 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -35,7 +35,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;
 
@@ -55,6 +55,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;
@@ -84,4 +85,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 V7 16/37] tests/kms_colorop: Add bypass test
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (14 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 15/37] tests/kms_colorop: Add 3x4 CTM tests Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 17/37] tests/kms_colorop: Parametrize the buffer format Alex Hung
                   ` (27 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index e782f7598..c65a3e73f 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -40,6 +40,7 @@
  *
  * arg[1]:
  *
+ * @bypass:			Bypass Color Pipeline
  * @srgb_eotf:                  sRGB EOTF
  * @srgb_inv_eotf:              sRGB Inverse EOTF
  * @srgb_eotf-srgb_inv_eotf:    sRGB EOTF -> sRGB Inverse EOTF
@@ -440,13 +441,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);
 
@@ -487,6 +493,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" },
-- 
2.43.0


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

* [PATCH V7 17/37] tests/kms_colorop: Parametrize the buffer format
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (15 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 16/37] tests/kms_colorop: Add bypass test Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 18/37] tests/kms_colorop: Add 10bpc test and skip if format not supported Alex Hung
                   ` (26 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

We'll eventually want to run this test for 10 bpc buffers,
or even other formats. Parametrize the buffer format for
both input and writeback buffers using fourcc.

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

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index c65a3e73f..3a12b84d2 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,10 @@
  *
  * 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
@@ -56,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;
 
@@ -70,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,
@@ -103,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;
@@ -139,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);
@@ -366,6 +371,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;
@@ -378,7 +385,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)
@@ -392,7 +399,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);
@@ -402,7 +409,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);
@@ -506,8 +513,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);
@@ -529,12 +544,16 @@ igt_main
 
 	}
 
-	for (i = 0; i < sizeof(tests) / sizeof (tests[0]); i++) {
-		igt_describe("Bla bla bla");
-		igt_subtest_f("plane-%s", tests[i].name)
-			colorop_plane_test(&display, tests[i].colorops);
+	for (j = 0; j < sizeof(formats) / sizeof (formats[0]); j++) {
+		for (i = 0; i < sizeof(tests) / sizeof (tests[0]); i++) {
+			igt_describe("Bla bla bla");
+			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");
 #if 0
 	igt_subtest("plane-srgb") {
-- 
2.43.0


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

* [PATCH V7 18/37] tests/kms_colorop: Add 10bpc test and skip if format not supported
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (16 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 17/37] tests/kms_colorop: Parametrize the buffer format Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 19/37] tests/kms_colorop: Skip if writeback does not support fourcc Alex Hung
                   ` (25 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

From: Harry Wentland <harry.wentland@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 3a12b84d2..56c232ef3 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:			XRGB8888 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);
 
@@ -519,6 +523,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 V7 19/37] tests/kms_colorop: Skip if writeback does not support fourcc
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (17 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 18/37] tests/kms_colorop: Add 10bpc test and skip if format not supported Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 20/37] lib/igt_fb: Allow any non-planar format for igt_copy_fb Alex Hung
                   ` (24 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

From: Harry Wentland <harry.wentland@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 56c232ef3..4c1751c3b 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 = 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 V7 20/37] lib/igt_fb: Allow any non-planar format for igt_copy_fb
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (18 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 19/37] tests/kms_colorop: Skip if writeback does not support fourcc Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 21/37] kms/colorop: Do proper setup and cleanup Alex Hung
                   ` (23 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_fb.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 17d3fa0a9..479086376 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);
 
-- 
2.43.0


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

* [PATCH V7 21/37] kms/colorop: Do proper setup and cleanup
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (19 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 20/37] lib/igt_fb: Allow any non-planar format for igt_copy_fb Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 22/37] lib/igt_color: Support color transform for XRGB2101010 Alex Hung
                   ` (22 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

We need to ensure framebuffers get removed and crcts detached
when tests fail, otherwise consecutive test runs might fail.

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 tests/kms_colorop.c | 139 +++++++++++++++++++++++++-------------------
 1 file changed, 78 insertions(+), 61 deletions(-)

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 4c1751c3b..3fa799e7c 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -390,52 +390,20 @@ 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*/
 
@@ -443,8 +411,8 @@ static void colorop_plane_test(igt_display_t *display,
 	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,
@@ -452,14 +420,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
@@ -480,7 +449,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,
@@ -488,28 +457,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
@@ -561,17 +526,69 @@ igt_main
 		igt_display_require(&display, display.drm_fd);
 
 		igt_require(display.is_atomic);
-
 	}
 
 	for (j = 0; j < sizeof(formats) / sizeof (formats[0]); j++) {
-		for (i = 0; i < sizeof(tests) / sizeof (tests[0]); i++) {
-			igt_describe("Bla bla bla");
-			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 < sizeof(tests) / sizeof (tests[0]); i++) {
+				igt_describe("Bla bla bla");
+				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");
@@ -584,8 +601,8 @@ igt_main
 	}
 #endif
 	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 V7 22/37] lib/igt_color: Support color transform for XRGB2101010
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (20 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 21/37] kms/colorop: Do proper setup and cleanup Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 23/37] tests/kms_colorop: Set wide [13, 13] bracket for comparison on amdgpu Alex Hung
                   ` (21 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c | 113 ++++++++++++++++++++++++++++++------------------
 1 file changed, 70 insertions(+), 43 deletions(-)

diff --git a/lib/igt_color.c b/lib/igt_color.c
index 5e1374e4b..43179a17e 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -126,6 +126,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)
 {
@@ -138,10 +206,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;
@@ -167,51 +231,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 */
-- 
2.43.0


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

* [PATCH V7 23/37] tests/kms_colorop: Set wide [13, 13] bracket for comparison on amdgpu
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (21 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 22/37] lib/igt_color: Support color transform for XRGB2101010 Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 24/37] lib/igt_color: Add PQ variants for 0-1 and 0-125 range Alex Hung
                   ` (20 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

Setting a fairly wide delta for now, to pass tests. Note that since
tests run with 10 bpc surfaces on amdgpu a wider bracket isn't
unreasonable. Still, this should be investigated to reduce the
delta.

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

diff --git a/tests/kms_colorop.c b/tests/kms_colorop.c
index 3fa799e7c..659fe63a5 100644
--- a/tests/kms_colorop.c
+++ b/tests/kms_colorop.c
@@ -354,6 +354,8 @@ 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);
 	else
 		/*
 		 * By default we'll look for a [0, 0] bracket. We can then
-- 
2.43.0


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

* [PATCH V7 24/37] lib/igt_color: Add PQ variants for 0-1 and 0-125 range
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (22 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 23/37] tests/kms_colorop: Set wide [13, 13] bracket for comparison on amdgpu Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 25/37] tests/kms_colorop: Add tests for PQ variants Alex Hung
                   ` (19 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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: 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 43179a17e..0926385f4 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -20,6 +20,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)
@@ -51,24 +58,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 d218550f6..a97383fab 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -19,8 +19,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;
@@ -104,6 +111,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 V7 25/37] tests/kms_colorop: Add tests for PQ variants
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (23 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 24/37] lib/igt_color: Add PQ variants for 0-1 and 0-125 range Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 26/37] lib/igt_kms: increase MAX_NUM_COLOROPS to 128 Alex Hung
                   ` (18 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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: 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 659fe63a5..538c527f6 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,
 	/* TODO 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);
@@ -490,6 +489,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 30278ca4e..3188e6db4 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -44,8 +44,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;
@@ -85,6 +97,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 V7 26/37] lib/igt_kms: increase MAX_NUM_COLOROPS to 128
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (24 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 25/37] tests/kms_colorop: Add tests for PQ variants Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:35 ` [PATCH V7 27/37] tests/kms_colorop: Add a sRGB test for EOTF -> Inverse EOTF -> EOTF Alex Hung
                   ` (17 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 lib/igt_kms.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 648f903c4..b20cb9cda 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -92,7 +92,7 @@
 #define MAX_CONNECTORS 32
 #define MAX_EDID 2
 #define DISPLAY_TILE_BLOCK 0x12
-#define MAX_NUM_COLOROPS 32
+#define MAX_NUM_COLOROPS 128
 
 typedef bool (*igt_connector_attr_set)(int dir, const char *attr, const char *value);
 
-- 
2.43.0


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

* [PATCH V7 27/37] tests/kms_colorop: Add a sRGB test for EOTF -> Inverse EOTF -> EOTF
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (25 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 26/37] lib/igt_kms: increase MAX_NUM_COLOROPS to 128 Alex Hung
@ 2025-03-26 23:35 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 28/37] lib/igt_color: add BT2020/BT709 transfer functions Alex Hung
                   ` (16 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:35 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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 538c527f6..e86115372 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:			XRGB8888 framebuffer and writeback buffer
+ * @XR24-XR24:				XRGB8888 framebuffer and writeback buffer
+ * @XR30-XR30:				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
- * @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
  *
  */
 
@@ -489,6 +490,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 3188e6db4..7d5cb4bd1 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -88,6 +88,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 V7 28/37] lib/igt_color: add BT2020/BT709 transfer functions
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (26 preceding siblings ...)
  2025-03-26 23:35 ` [PATCH V7 27/37] tests/kms_colorop: Add a sRGB test for EOTF -> Inverse EOTF -> EOTF Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 29/37] tests/kms_colorop: Add tests for BT2020/BT709 TFs Alex Hung
                   ` (15 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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: 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 0926385f4..ec8b27d1e 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -107,6 +107,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 a97383fab..813bd19ba 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -25,6 +25,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 };
 
@@ -117,6 +118,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 V7 29/37] tests/kms_colorop: Add tests for BT2020/BT709 TFs
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (27 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 28/37] lib/igt_color: add BT2020/BT709 transfer functions Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 30/37] lib/igt_color: Add 1D LUT color transformation support Alex Hung
                   ` (14 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

From: Harry Wentland <harry.wentland@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 e86115372..f6738cdcf 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
@@ -491,6 +494,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 7d5cb4bd1..7b98198f6 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -42,6 +42,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,
@@ -52,6 +54,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",
@@ -106,6 +110,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 V7 30/37] lib/igt_color: Add 1D LUT color transformation support
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (28 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 29/37] tests/kms_colorop: Add tests for BT2020/BT709 TFs Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 31/37] test/kms_colorop: Add tests that exercise the 1D LUT colorops Alex Hung
                   ` (13 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Co-developed-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c |  8 ++++++++
 lib/igt_color.h | 20 ++++++++++++++++++++
 lib/igt_kms.c   |  1 +
 lib/igt_kms.h   |  1 +
 4 files changed, 30 insertions(+)

diff --git a/lib/igt_color.c b/lib/igt_color.c
index ec8b27d1e..cc5ee3b0b 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -440,3 +440,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);
+}
\ No newline at end of file
diff --git a/lib/igt_color.h b/lib/igt_color.h
index 813bd19ba..4a9f9b7a3 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -15,6 +15,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;
 };
@@ -35,6 +37,17 @@ typedef struct igt_pixel {
 	float b;
 } igt_pixel_t;
 
+typedef struct igt_1dlut {
+	struct drm_color_lut 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
@@ -107,11 +120,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 b20cb9cda..5e0d710c7 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -709,6 +709,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 580f21141..33bc8854c 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -373,6 +373,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 V7 31/37] test/kms_colorop: Add tests that exercise the 1D LUT colorops
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (29 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 30/37] lib/igt_color: Add 1D LUT color transformation support Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 32/37] tests/kms_colorop: Add multiplier tests Alex Hung
                   ` (12 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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 f6738cdcf..436bd085f 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 * 0xffff;
+		colorop->lut1d->lut[i].green = pixel.g * 0xffff;
+		colorop->lut1d->lut[i].blue = pixel.b * 0xffff;
+	}
+}
+
 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_lut));
+		break;
 	case KMS_COLOROP_LUT3D:
 	default:
 		igt_fail(IGT_EXIT_FAILURE);
@@ -494,6 +527,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 7b98198f6..13d15ea66 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -71,6 +71,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;
 	};
 
@@ -110,6 +111,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 V7 32/37] tests/kms_colorop: Add multiplier tests
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (30 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 31/37] test/kms_colorop: Add tests that exercise the 1D LUT colorops Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 33/37] lib/igt_color: Point license header at skia license Alex Hung
                   ` (11 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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             |  2 ++
 lib/igt_kms.c               |  1 +
 lib/igt_kms.h               |  1 +
 tests/kms_colorop.c         | 11 +++++++++++
 tests/kms_colorop.h         | 15 +++++++++++++++
 7 files changed, 41 insertions(+)

diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index fce45b5cf..2cf3b4307 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -878,6 +878,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 cc5ee3b0b..e6f435bf4 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -197,6 +197,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 4a9f9b7a3..4cc34cab5 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -147,5 +147,7 @@ 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
\ No newline at end of file
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 5e0d710c7..e2349118a 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -711,6 +711,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 33bc8854c..0e8fd104b 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -375,6 +375,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 436bd085f..90348a345 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_lut));
 		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);
@@ -546,6 +555,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 13d15ea66..1def86bc3 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -36,6 +36,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;
 
@@ -73,6 +74,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;
@@ -223,5 +225,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 V7 33/37] lib/igt_color: Point license header at skia license
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (31 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 32/37] tests/kms_colorop: Add multiplier tests Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 34/37] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API Alex Hung
                   ` (10 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 lib/igt_color.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lib/igt_color.c b/lib/igt_color.c
index e6f435bf4..d3f2ccf00 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -3,7 +3,9 @@
  * Copyright 2023 Advanced Micro Devices, Inc.
  *
  * This file contains code adapted from Skia, which is
- * Copyright (c) 2011 Google Inc. All rights reserved.
+ * distributed under a BSD-style license which can be
+ * found at
+ * https://skia.googlesource.com/skia.git/+/refs/heads/main/LICENSE
  */
 
 #include <errno.h>
-- 
2.43.0


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

* [PATCH V7 34/37] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (32 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 33/37] lib/igt_color: Point license header at skia license Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 35/37] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
                   ` (9 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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 V7 35/37] tests/kms_colorop: Add a 3D LUT subtest
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (33 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 34/37] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 36/37] drm-uapi: Update kernel doc for drm_colorop_type Alex Hung
                   ` (8 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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             |    9 +
 lib/igt_color_lut.h         | 4946 +++++++++++++++++++++++++++++++++++
 lib/igt_kms.c               |    2 +
 lib/igt_kms.h               |    2 +
 tests/kms_colorop.c         |   34 +-
 tests/kms_colorop.h         |   19 +
 8 files changed, 5215 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 2cf3b4307..7206b213b 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -879,6 +879,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 d3f2ccf00..035d0b486 100644
--- a/lib/igt_color.c
+++ b/lib/igt_color.c
@@ -209,6 +209,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)
 {
@@ -459,4 +637,12 @@ void igt_colorop_set_custom_1dlut(igt_display_t *display,
 				  const size_t lut_size)
 {
 	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);
 }
\ No newline at end of file
diff --git a/lib/igt_color.h b/lib/igt_color.h
index 4cc34cab5..3f1bf5787 100644
--- a/lib/igt_color.h
+++ b/lib/igt_color.h
@@ -14,6 +14,7 @@
 
 #include "igt_fb.h"
 #include "igt_kms.h"
+#include "igt_color_lut.h"
 
 #define MAX_COLOR_LUT_ENTRIES 4096
 
@@ -125,6 +126,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);
@@ -149,5 +156,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
\ No newline at end of file
diff --git a/lib/igt_color_lut.h b/lib/igt_color_lut.h
new file mode 100644
index 000000000..ca35e3cc2
--- /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_lut 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
\ No newline at end of file
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index e2349118a..198bc2e46 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -712,6 +712,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 0e8fd104b..cb7a05182 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -376,6 +376,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 90348a345..b418b0a77 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,36 @@ 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_lut) * 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 (lut_f->red * 0xFFFF);
+		igt_3dlut->lut[i].green = round (lut_f->green * 0xFFFF);
+		igt_3dlut->lut[i].blue = round (lut_f->blue * 0xFFFF);
+	}
+
+	igt_colorop_set_3dlut(display, colorop->colorop, igt_3dlut, lut_size * sizeof(struct drm_color_lut));
+	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);
 
-	/* TODO 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 +378,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);
 	}
@@ -557,6 +588,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 1def86bc3..d9906353c 100644
--- a/tests/kms_colorop.h
+++ b/tests/kms_colorop.h
@@ -67,16 +67,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;
@@ -239,4 +247,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 V7 36/37] drm-uapi: Update kernel doc for drm_colorop_type
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (34 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 35/37] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-26 23:36 ` [PATCH V7 37/37] drm-uapi: Sync up definition with kernel colorop implementation Alex Hung
                   ` (7 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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 7206b213b..9e34d43db 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -874,11 +874,55 @@ struct drm_color_lut {
 	__u16 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_lut 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 V7 37/37] drm-uapi: Sync up definition with kernel colorop implementation
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (35 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 36/37] drm-uapi: Update kernel doc for drm_colorop_type Alex Hung
@ 2025-03-26 23:36 ` Alex Hung
  2025-03-27  0:48 ` ✓ Xe.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev7) Patchwork
                   ` (6 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-03-26 23:36 UTC (permalink / raw)
  To: igt-dev, alex.hung; +Cc: harry.wentland

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 9e34d43db..f749eebf8 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -956,6 +956,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

* ✓ Xe.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev7)
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (36 preceding siblings ...)
  2025-03-26 23:36 ` [PATCH V7 37/37] drm-uapi: Sync up definition with kernel colorop implementation Alex Hung
@ 2025-03-27  0:48 ` Patchwork
  2025-03-27  3:13 ` ✓ i915.CI.BAT: " Patchwork
                   ` (5 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-03-27  0:48 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

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

== Series Details ==

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

== Summary ==

CI Bug Log - changes from XEIGT_8288_BAT -> XEIGTPW_12848_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

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

  No changes in participating hosts

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

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

### IGT changes ###

#### Issues hit ####

  * igt@xe_intel_bb@intel-bb-blit-none:
    - bat-adlp-vf:        [PASS][1] -> [ABORT][2] ([Intel XE#3970])
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/bat-adlp-vf/igt@xe_intel_bb@intel-bb-blit-none.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/bat-adlp-vf/igt@xe_intel_bb@intel-bb-blit-none.html

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


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

  * IGT: IGT_8288 -> IGTPW_12848

  IGTPW_12848: 12848
  IGT_8288: 8288
  xe-2854-14c330bc015ded4a1f1dd1f5aeb8617077aaa7e8: 14c330bc015ded4a1f1dd1f5aeb8617077aaa7e8

== Logs ==

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

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

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

* ✓ i915.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev7)
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (37 preceding siblings ...)
  2025-03-27  0:48 ` ✓ Xe.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev7) Patchwork
@ 2025-03-27  3:13 ` Patchwork
  2025-03-27  5:26 ` ✗ i915.CI.Full: failure " Patchwork
                   ` (4 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-03-27  3:13 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

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

== Series Details ==

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

== Summary ==

CI Bug Log - changes from IGT_8288 -> IGTPW_12848
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

Participating hosts (42 -> 40)
------------------------------

  Missing    (2): bat-arlh-2 fi-snb-2520m 

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

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

### IGT changes ###

#### Issues hit ####

  * igt@dmabuf@all-tests:
    - bat-apl-1:          [PASS][1] -> [INCOMPLETE][2] ([i915#12904]) +1 other test incomplete
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/bat-apl-1/igt@dmabuf@all-tests.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/bat-apl-1/igt@dmabuf@all-tests.html

  * igt@i915_selftest@live:
    - bat-mtlp-8:         [PASS][3] -> [DMESG-FAIL][4] ([i915#12061]) +1 other test dmesg-fail
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/bat-mtlp-8/igt@i915_selftest@live.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/bat-mtlp-8/igt@i915_selftest@live.html

  * igt@i915_selftest@live@workarounds:
    - bat-arls-5:         [PASS][5] -> [DMESG-FAIL][6] ([i915#12061]) +1 other test dmesg-fail
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/bat-arls-5/igt@i915_selftest@live@workarounds.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/bat-arls-5/igt@i915_selftest@live@workarounds.html
    - bat-mtlp-9:         [PASS][7] -> [DMESG-FAIL][8] ([i915#12061]) +1 other test dmesg-fail
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/bat-mtlp-9/igt@i915_selftest@live@workarounds.html

  
#### Possible fixes ####

  * igt@dmabuf@all-tests@dma_fence_chain:
    - fi-bsw-n3050:       [INCOMPLETE][9] ([i915#12904]) -> [PASS][10] +1 other test pass
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/fi-bsw-n3050/igt@dmabuf@all-tests@dma_fence_chain.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/fi-bsw-n3050/igt@dmabuf@all-tests@dma_fence_chain.html

  * igt@i915_selftest@live@late_gt_pm:
    - fi-cfl-8109u:       [DMESG-WARN][11] ([i915#13735]) -> [PASS][12] +132 other tests pass
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/fi-cfl-8109u/igt@i915_selftest@live@late_gt_pm.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/fi-cfl-8109u/igt@i915_selftest@live@late_gt_pm.html

  
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#12904]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12904
  [i915#13735]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13735


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

  * CI: CI-20190529 -> None
  * IGT: IGT_8288 -> IGTPW_12848

  CI-20190529: 20190529
  CI_DRM_16321: 14c330bc015ded4a1f1dd1f5aeb8617077aaa7e8 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_12848: 12848
  IGT_8288: 8288

== Logs ==

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

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

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

* ✗ i915.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev7)
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (38 preceding siblings ...)
  2025-03-27  3:13 ` ✓ i915.CI.BAT: " Patchwork
@ 2025-03-27  5:26 ` Patchwork
  2025-03-27 13:49 ` ✗ Xe.CI.Full: " Patchwork
                   ` (3 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-03-27  5:26 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

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

== Series Details ==

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

== Summary ==

CI Bug Log - changes from IGT_8288_full -> IGTPW_12848_full
====================================================

Summary
-------

  **FAILURE**

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

Participating hosts (10 -> 11)
------------------------------

  Additional (1): shard-dg2-set2 

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@gem_exec_big@single:
    - shard-tglu:         NOTRUN -> [ABORT][1]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-7/igt@gem_exec_big@single.html

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

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

  * igt@kms_colorop@plane-xr24-xr24-pq_125_inv_eotf (NEW):
    - shard-dg2-9:        NOTRUN -> [SKIP][4] +5 other tests skip
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_colorop@plane-xr24-xr24-pq_125_inv_eotf.html

  * igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf (NEW):
    - shard-dg1:          NOTRUN -> [SKIP][5] +45 other tests skip
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-13/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][6] +44 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-2/igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_dec.html

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

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

  * igt@kms_fb_coherency@memset-crc:
    - shard-dg2:          [PASS][9] -> [CRASH][10] +1 other test crash
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-6/igt@kms_fb_coherency@memset-crc.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@kms_fb_coherency@memset-crc.html

  * igt@kms_fb_coherency@memset-crc@mmap-gtt:
    - shard-rkl:          [PASS][11] -> [CRASH][12] +1 other test crash
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-7/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
    - shard-snb:          [PASS][13] -> [CRASH][14] +1 other test crash
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-snb4/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-snb7/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
    - shard-tglu:         [PASS][15] -> [CRASH][16] +1 other test crash
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-tglu-7/igt@kms_fb_coherency@memset-crc@mmap-gtt.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-8/igt@kms_fb_coherency@memset-crc@mmap-gtt.html

  * igt@kms_fb_coherency@memset-crc@mmap-offset-fixed:
    - shard-dg1:          [PASS][17] -> [CRASH][18] +1 other test crash
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-12/igt@kms_fb_coherency@memset-crc@mmap-offset-fixed.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/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][19] -> [CRASH][20] +1 other test crash
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-mtlp-4/igt@kms_fb_coherency@memset-crc@mmap-offset-wc.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@kms_fb_coherency@memset-crc@mmap-offset-wc.html

  
New tests
---------

  New tests have been introduced between IGT_8288_full and IGTPW_12848_full:

### New IGT tests (103) ###

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

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

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

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

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

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

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

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

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

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

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

  * igt@kms_colorop@plane-xr24-xr24-ctm_3x4_oversaturate:
    - Statuses : 6 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 : 6 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_eotf:
    - Statuses : 7 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 : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-pq_125_inv_eotf:
    - Statuses : 6 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 : 6 skip(s)
    - Exec time: [0.0] s

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

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

  * igt@kms_colorop@plane-xr24-xr24-srgb_eotf-srgb_inv_eotf:
    - Statuses : 7 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 : 2 skip(s)
    - Exec time: [0.0] s

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

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

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

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

  * igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf-bt2020_oetf:
    - Statuses : 6 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 : 6 skip(s)
    - Exec time: [0.0] s

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

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_dec:
    - Statuses : 7 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 : 6 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 : 6 skip(s)
    - Exec time: [0.0] s

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

  * igt@kms_colorop@plane-xr30-xr30-multiply_inv_125:
    - Statuses : 7 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 : 6 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 : 4 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-pq_eotf:
    - Statuses : 6 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 : 5 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_eotf:
    - Statuses : 5 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 : 6 skip(s)
    - Exec time: [0.0] s

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

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

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

  * igt@kms_plane_multiple@2x-tiling-x@pipe-a-hdmi-a-1-pipe-b-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [1.00] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-a-hdmi-a-1-pipe-c-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [1.03] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-a-hdmi-a-2-pipe-b-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.22] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-a-hdmi-a-2-pipe-c-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.99] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-b-hdmi-a-1-pipe-a-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [1.23] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-b-hdmi-a-1-pipe-c-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [1.01] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-b-hdmi-a-2-pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.19] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-b-hdmi-a-2-pipe-c-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.99] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-c-hdmi-a-1-pipe-a-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.99] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-c-hdmi-a-1-pipe-b-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [1.01] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-c-hdmi-a-2-pipe-a-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.18] s

  * igt@kms_plane_multiple@2x-tiling-x@pipe-c-hdmi-a-2-pipe-b-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.98] s

  * igt@kms_properties@colorop-properties-atomic:
    - Statuses : 6 pass(s)
    - Exec time: [0.15, 3.49] s

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

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

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

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

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

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

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

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

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

  * igt@kms_properties@colorop-properties-atomic@pipe-c-hdmi-a-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.10] 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-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.11] s

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

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

  * igt@kms_properties@colorop-properties-atomic@pipe-d-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.11] 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 : 7 pass(s)
    - Exec time: [0.18, 3.46] s

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

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

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

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

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

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

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

  * igt@kms_properties@colorop-properties-legacy@pipe-b-hdmi-a-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.34] 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-b-hdmi-a-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.09] 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 : 2 pass(s)
    - Exec time: [0.10, 0.35] s

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

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

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

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

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

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

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

  

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

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

### IGT changes ###

#### Issues hit ####

  * igt@api_intel_bb@blit-reloc-keep-cache:
    - shard-dg2:          NOTRUN -> [SKIP][21] ([i915#8411])
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@api_intel_bb@blit-reloc-keep-cache.html

  * igt@api_intel_bb@crc32:
    - shard-rkl:          NOTRUN -> [SKIP][22] ([i915#6230])
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@api_intel_bb@crc32.html
    - shard-dg1:          NOTRUN -> [SKIP][23] ([i915#6230])
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@api_intel_bb@crc32.html
    - shard-tglu:         NOTRUN -> [SKIP][24] ([i915#6230])
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-6/igt@api_intel_bb@crc32.html

  * igt@api_intel_bb@object-reloc-keep-cache:
    - shard-rkl:          NOTRUN -> [SKIP][25] ([i915#8411])
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@api_intel_bb@object-reloc-keep-cache.html

  * igt@debugfs_test@basic-hwmon:
    - shard-rkl:          NOTRUN -> [SKIP][26] ([i915#9318])
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@debugfs_test@basic-hwmon.html

  * igt@drm_fdinfo@busy-idle@vcs1:
    - shard-dg1:          NOTRUN -> [SKIP][27] ([i915#8414]) +5 other tests skip
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-19/igt@drm_fdinfo@busy-idle@vcs1.html

  * igt@drm_fdinfo@most-busy-check-all@bcs0:
    - shard-dg2:          NOTRUN -> [SKIP][28] ([i915#8414]) +24 other tests skip
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@drm_fdinfo@most-busy-check-all@bcs0.html

  * igt@drm_fdinfo@most-busy-idle-check-all@ccs0:
    - shard-mtlp:         NOTRUN -> [SKIP][29] ([i915#8414]) +7 other tests skip
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-4/igt@drm_fdinfo@most-busy-idle-check-all@ccs0.html

  * igt@drm_fdinfo@most-busy-idle-check-all@vecs1:
    - shard-dg2-9:        NOTRUN -> [SKIP][30] ([i915#8414]) +7 other tests skip
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@drm_fdinfo@most-busy-idle-check-all@vecs1.html

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

  * igt@gem_caching@reads:
    - shard-mtlp:         NOTRUN -> [SKIP][32] ([i915#4873])
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-3/igt@gem_caching@reads.html

  * igt@gem_ccs@block-multicopy-compressed:
    - shard-rkl:          NOTRUN -> [SKIP][33] ([i915#9323]) +1 other test skip
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@gem_ccs@block-multicopy-compressed.html

  * igt@gem_ccs@block-multicopy-inplace:
    - shard-rkl:          NOTRUN -> [SKIP][34] ([i915#3555] / [i915#9323])
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@gem_ccs@block-multicopy-inplace.html

  * igt@gem_ccs@large-ctrl-surf-copy:
    - shard-rkl:          NOTRUN -> [SKIP][35] ([i915#13008])
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@gem_ccs@large-ctrl-surf-copy.html
    - shard-dg1:          NOTRUN -> [SKIP][36] ([i915#13008])
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-13/igt@gem_ccs@large-ctrl-surf-copy.html
    - shard-tglu:         NOTRUN -> [SKIP][37] ([i915#13008])
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-5/igt@gem_ccs@large-ctrl-surf-copy.html
    - shard-mtlp:         NOTRUN -> [SKIP][38] ([i915#13008])
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-8/igt@gem_ccs@large-ctrl-surf-copy.html

  * igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-smem-lmem0:
    - shard-dg2:          [PASS][39] -> [INCOMPLETE][40] ([i915#13356])
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-4/igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-smem-lmem0.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-smem-lmem0.html

  * igt@gem_close_race@multigpu-basic-process:
    - shard-rkl:          NOTRUN -> [SKIP][41] ([i915#7697])
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@gem_close_race@multigpu-basic-process.html

  * igt@gem_create@create-ext-cpu-access-big:
    - shard-dg2:          [PASS][42] -> [ABORT][43] ([i915#13427])
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-1/igt@gem_create@create-ext-cpu-access-big.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@gem_create@create-ext-cpu-access-big.html

  * igt@gem_create@create-ext-set-pat:
    - shard-rkl:          NOTRUN -> [SKIP][44] ([i915#8562])
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@gem_create@create-ext-set-pat.html

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

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

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

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

  * igt@gem_ctx_sseu@mmap-args:
    - shard-mtlp:         NOTRUN -> [SKIP][50] ([i915#280])
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-1/igt@gem_ctx_sseu@mmap-args.html

  * igt@gem_eio@hibernate:
    - shard-rkl:          NOTRUN -> [ABORT][51] ([i915#7975] / [i915#8213])
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-1/igt@gem_eio@hibernate.html

  * igt@gem_eio@kms:
    - shard-dg1:          [PASS][52] -> [FAIL][53] ([i915#5784])
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-18/igt@gem_eio@kms.html
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@gem_eio@kms.html

  * igt@gem_eio@unwedge-stress:
    - shard-mtlp:         [PASS][54] -> [ABORT][55] ([i915#13193]) +3 other tests abort
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-mtlp-6/igt@gem_eio@unwedge-stress.html
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-7/igt@gem_eio@unwedge-stress.html

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

  * igt@gem_exec_balancer@hog:
    - shard-mtlp:         NOTRUN -> [SKIP][57] ([i915#4812])
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-8/igt@gem_exec_balancer@hog.html

  * igt@gem_exec_balancer@invalid-bonds:
    - shard-dg2-9:        NOTRUN -> [SKIP][58] ([i915#4036])
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@gem_exec_balancer@invalid-bonds.html

  * igt@gem_exec_balancer@noheartbeat:
    - shard-dg2:          NOTRUN -> [SKIP][59] ([i915#8555]) +1 other test skip
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-3/igt@gem_exec_balancer@noheartbeat.html

  * igt@gem_exec_balancer@parallel-balancer:
    - shard-rkl:          NOTRUN -> [SKIP][60] ([i915#4525]) +3 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@gem_exec_balancer@parallel-balancer.html

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

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

  * igt@gem_exec_capture@capture-invisible:
    - shard-rkl:          NOTRUN -> [SKIP][63] ([i915#6334]) +1 other test skip
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@gem_exec_capture@capture-invisible.html
    - shard-tglu-1:       NOTRUN -> [SKIP][64] ([i915#6334]) +1 other test skip
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@gem_exec_capture@capture-invisible.html

  * igt@gem_exec_capture@capture-invisible@smem0:
    - shard-glk:          NOTRUN -> [SKIP][65] ([i915#6334]) +1 other test skip
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk1/igt@gem_exec_capture@capture-invisible@smem0.html

  * igt@gem_exec_capture@capture-recoverable:
    - shard-rkl:          NOTRUN -> [SKIP][66] ([i915#6344])
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@gem_exec_capture@capture-recoverable.html

  * igt@gem_exec_fence@submit3:
    - shard-dg2:          NOTRUN -> [SKIP][67] ([i915#4812]) +1 other test skip
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@gem_exec_fence@submit3.html

  * igt@gem_exec_flush@basic-wb-ro-before-default:
    - shard-dg2:          NOTRUN -> [SKIP][68] ([i915#3539] / [i915#4852])
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@gem_exec_flush@basic-wb-ro-before-default.html

  * igt@gem_exec_flush@basic-wb-set-default:
    - shard-dg2-9:        NOTRUN -> [SKIP][69] ([i915#3539] / [i915#4852])
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@gem_exec_flush@basic-wb-set-default.html

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

  * igt@gem_exec_reloc@basic-cpu-read-noreloc:
    - shard-mtlp:         NOTRUN -> [SKIP][71] ([i915#3281]) +3 other tests skip
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-8/igt@gem_exec_reloc@basic-cpu-read-noreloc.html

  * igt@gem_exec_reloc@basic-gtt-cpu-noreloc:
    - shard-dg1:          NOTRUN -> [SKIP][72] ([i915#3281]) +2 other tests skip
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@gem_exec_reloc@basic-gtt-cpu-noreloc.html

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

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

  * igt@gem_exec_schedule@preempt-queue-contexts-chain:
    - shard-dg2:          NOTRUN -> [SKIP][75] ([i915#4537] / [i915#4812]) +1 other test skip
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@gem_exec_schedule@preempt-queue-contexts-chain.html

  * igt@gem_exec_schedule@semaphore-power:
    - shard-rkl:          NOTRUN -> [SKIP][76] ([i915#7276])
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@gem_exec_schedule@semaphore-power.html

  * igt@gem_exec_suspend@basic-s4-devices:
    - shard-tglu:         NOTRUN -> [ABORT][77] ([i915#7975] / [i915#8213]) +1 other test abort
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-10/igt@gem_exec_suspend@basic-s4-devices.html

  * igt@gem_exec_suspend@basic-s4-devices@lmem0:
    - shard-dg1:          [PASS][78] -> [ABORT][79] ([i915#7975] / [i915#8213]) +1 other test abort
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-13/igt@gem_exec_suspend@basic-s4-devices@lmem0.html
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-14/igt@gem_exec_suspend@basic-s4-devices@lmem0.html

  * igt@gem_fenced_exec_thrash@2-spare-fences:
    - shard-mtlp:         NOTRUN -> [SKIP][80] ([i915#4860])
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-1/igt@gem_fenced_exec_thrash@2-spare-fences.html

  * igt@gem_fenced_exec_thrash@no-spare-fences-interruptible:
    - shard-dg2:          NOTRUN -> [SKIP][81] ([i915#4860])
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@gem_fenced_exec_thrash@no-spare-fences-interruptible.html

  * igt@gem_huc_copy@huc-copy:
    - shard-tglu-1:       NOTRUN -> [SKIP][82] ([i915#2190])
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@gem_huc_copy@huc-copy.html

  * igt@gem_lmem_evict@dontneed-evict-race:
    - shard-rkl:          NOTRUN -> [SKIP][83] ([i915#4613] / [i915#7582])
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@gem_lmem_evict@dontneed-evict-race.html

  * igt@gem_lmem_swapping@heavy-random:
    - shard-tglu-1:       NOTRUN -> [SKIP][84] ([i915#4613])
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@gem_lmem_swapping@heavy-random.html

  * igt@gem_lmem_swapping@heavy-verify-multi:
    - shard-mtlp:         NOTRUN -> [SKIP][85] ([i915#4613]) +1 other test skip
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-3/igt@gem_lmem_swapping@heavy-verify-multi.html

  * igt@gem_lmem_swapping@heavy-verify-random:
    - shard-rkl:          NOTRUN -> [SKIP][86] ([i915#4613]) +9 other tests skip
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-6/igt@gem_lmem_swapping@heavy-verify-random.html

  * igt@gem_lmem_swapping@parallel-random-verify-ccs:
    - shard-glk:          NOTRUN -> [SKIP][87] ([i915#4613]) +4 other tests skip
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk6/igt@gem_lmem_swapping@parallel-random-verify-ccs.html

  * igt@gem_lmem_swapping@smem-oom@lmem0:
    - shard-dg2:          [PASS][88] -> [TIMEOUT][89] ([i915#5493]) +1 other test timeout
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-1/igt@gem_lmem_swapping@smem-oom@lmem0.html
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@gem_lmem_swapping@smem-oom@lmem0.html

  * igt@gem_lmem_swapping@verify-random:
    - shard-tglu:         NOTRUN -> [SKIP][90] ([i915#4613]) +1 other test skip
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-10/igt@gem_lmem_swapping@verify-random.html

  * igt@gem_mmap@pf-nonblock:
    - shard-mtlp:         NOTRUN -> [SKIP][91] ([i915#4083])
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@gem_mmap@pf-nonblock.html

  * igt@gem_mmap_gtt@bad-object:
    - shard-dg1:          NOTRUN -> [SKIP][92] ([i915#4077]) +1 other test skip
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-16/igt@gem_mmap_gtt@bad-object.html

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

  * igt@gem_mmap_gtt@big-copy:
    - shard-dg2:          NOTRUN -> [SKIP][94] ([i915#4077]) +6 other tests skip
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@gem_mmap_gtt@big-copy.html

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

  * igt@gem_mmap_wc@write-read-distinct:
    - shard-dg1:          NOTRUN -> [SKIP][96] ([i915#4083]) +1 other test skip
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-13/igt@gem_mmap_wc@write-read-distinct.html

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

  * igt@gem_partial_pwrite_pread@write:
    - shard-dg2-9:        NOTRUN -> [SKIP][98] ([i915#3282]) +2 other tests skip
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@gem_partial_pwrite_pread@write.html
    - shard-dg1:          NOTRUN -> [SKIP][99] ([i915#3282]) +2 other tests skip
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@gem_partial_pwrite_pread@write.html

  * igt@gem_pread@bench:
    - shard-mtlp:         NOTRUN -> [SKIP][100] ([i915#3282]) +1 other test skip
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@gem_pread@bench.html

  * igt@gem_pwrite@basic-exhaustion:
    - shard-rkl:          NOTRUN -> [SKIP][101] ([i915#3282]) +13 other tests skip
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@gem_pwrite@basic-exhaustion.html
    - shard-glk:          NOTRUN -> [WARN][102] ([i915#2658])
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk4/igt@gem_pwrite@basic-exhaustion.html

  * igt@gem_pxp@create-regular-context-1:
    - shard-rkl:          [PASS][103] -> [TIMEOUT][104] ([i915#12917] / [i915#12964]) +2 other tests timeout
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-8/igt@gem_pxp@create-regular-context-1.html
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@gem_pxp@create-regular-context-1.html

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

  * igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted:
    - shard-dg2:          NOTRUN -> [SKIP][106] ([i915#4270]) +2 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted.html
    - shard-dg1:          NOTRUN -> [SKIP][107] ([i915#4270])
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-12/igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted.html

  * igt@gem_pxp@regular-baseline-src-copy-readible:
    - shard-rkl:          NOTRUN -> [TIMEOUT][108] ([i915#12964]) +2 other tests timeout
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@gem_pxp@regular-baseline-src-copy-readible.html

  * igt@gem_pxp@reject-modify-context-protection-on:
    - shard-dg2-9:        NOTRUN -> [SKIP][109] ([i915#4270]) +1 other test skip
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@gem_pxp@reject-modify-context-protection-on.html

  * igt@gem_readwrite@beyond-eob:
    - shard-dg2:          NOTRUN -> [SKIP][110] ([i915#3282]) +3 other tests skip
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@gem_readwrite@beyond-eob.html

  * igt@gem_render_copy@y-tiled-ccs-to-linear:
    - shard-dg2:          NOTRUN -> [SKIP][111] ([i915#5190] / [i915#8428]) +5 other tests skip
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@gem_render_copy@y-tiled-ccs-to-linear.html

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

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

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

  * igt@gem_set_tiling_vs_blt@tiled-to-tiled:
    - shard-dg2:          NOTRUN -> [SKIP][115] ([i915#4079]) +4 other tests skip
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@gem_set_tiling_vs_blt@tiled-to-tiled.html
    - shard-dg1:          NOTRUN -> [SKIP][116] ([i915#4079])
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@gem_set_tiling_vs_blt@tiled-to-tiled.html
    - shard-mtlp:         NOTRUN -> [SKIP][117] ([i915#4079]) +1 other test skip
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@gem_set_tiling_vs_blt@tiled-to-tiled.html

  * igt@gem_tiled_partial_pwrite_pread@writes-after-reads:
    - shard-mtlp:         NOTRUN -> [SKIP][118] ([i915#4077]) +2 other tests skip
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@gem_tiled_partial_pwrite_pread@writes-after-reads.html

  * igt@gem_userptr_blits@coherency-sync:
    - shard-tglu:         NOTRUN -> [SKIP][119] ([i915#3297]) +1 other test skip
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-9/igt@gem_userptr_blits@coherency-sync.html

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

  * igt@gem_userptr_blits@map-fixed-invalidate-overlap:
    - shard-dg1:          NOTRUN -> [SKIP][121] ([i915#3297] / [i915#4880])
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@gem_userptr_blits@map-fixed-invalidate-overlap.html
    - shard-dg2:          NOTRUN -> [SKIP][122] ([i915#3297] / [i915#4880])
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@gem_userptr_blits@map-fixed-invalidate-overlap.html

  * igt@gem_userptr_blits@readonly-pwrite-unsync:
    - shard-mtlp:         NOTRUN -> [SKIP][123] ([i915#3297]) +2 other tests skip
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-4/igt@gem_userptr_blits@readonly-pwrite-unsync.html

  * igt@gem_userptr_blits@relocations:
    - shard-mtlp:         NOTRUN -> [SKIP][124] ([i915#3281] / [i915#3297])
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-4/igt@gem_userptr_blits@relocations.html
    - shard-dg2-9:        NOTRUN -> [SKIP][125] ([i915#3281] / [i915#3297])
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@gem_userptr_blits@relocations.html
    - shard-rkl:          NOTRUN -> [SKIP][126] ([i915#3281] / [i915#3297])
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-6/igt@gem_userptr_blits@relocations.html
    - shard-dg1:          NOTRUN -> [SKIP][127] ([i915#3281] / [i915#3297])
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@gem_userptr_blits@relocations.html

  * igt@gem_userptr_blits@unsync-unmap-after-close:
    - shard-dg2-9:        NOTRUN -> [SKIP][128] ([i915#3297])
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@gem_userptr_blits@unsync-unmap-after-close.html

  * igt@gem_userptr_blits@unsync-unmap-cycles:
    - shard-rkl:          NOTRUN -> [SKIP][129] ([i915#3297]) +5 other tests skip
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-6/igt@gem_userptr_blits@unsync-unmap-cycles.html
    - shard-dg1:          NOTRUN -> [SKIP][130] ([i915#3297])
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-13/igt@gem_userptr_blits@unsync-unmap-cycles.html
    - shard-dg2:          NOTRUN -> [SKIP][131] ([i915#3297])
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-1/igt@gem_userptr_blits@unsync-unmap-cycles.html

  * igt@gen9_exec_parse@basic-rejected:
    - shard-dg2:          NOTRUN -> [SKIP][132] ([i915#2856]) +1 other test skip
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-3/igt@gen9_exec_parse@basic-rejected.html

  * igt@gen9_exec_parse@basic-rejected-ctx-param:
    - shard-tglu-1:       NOTRUN -> [SKIP][133] ([i915#2527] / [i915#2856])
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@gen9_exec_parse@basic-rejected-ctx-param.html

  * igt@gen9_exec_parse@batch-invalid-length:
    - shard-dg1:          NOTRUN -> [SKIP][134] ([i915#2527])
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@gen9_exec_parse@batch-invalid-length.html

  * igt@gen9_exec_parse@bb-oversize:
    - shard-rkl:          NOTRUN -> [SKIP][135] ([i915#2527]) +9 other tests skip
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@gen9_exec_parse@bb-oversize.html

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

  * igt@gen9_exec_parse@bb-start-out:
    - shard-tglu:         NOTRUN -> [SKIP][137] ([i915#2527] / [i915#2856]) +1 other test skip
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-2/igt@gen9_exec_parse@bb-start-out.html

  * igt@gen9_exec_parse@unaligned-jump:
    - shard-mtlp:         NOTRUN -> [SKIP][138] ([i915#2856])
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-7/igt@gen9_exec_parse@unaligned-jump.html

  * igt@i915_module_load@load:
    - shard-dg2:          ([PASS][139], [PASS][140], [PASS][141], [PASS][142], [PASS][143], [PASS][144], [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], [PASS][169], [DMESG-WARN][170], [PASS][171], [PASS][172], [PASS][173], [PASS][174], [PASS][175], [PASS][176], [PASS][177], [PASS][178], [PASS][179], [PASS][180], [PASS][181], [PASS][182]) ([i915#13368])
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-2/igt@i915_module_load@load.html
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-11/igt@i915_module_load@load.html
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-8/igt@i915_module_load@load.html
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-10/igt@i915_module_load@load.html
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-7/igt@i915_module_load@load.html
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-4/igt@i915_module_load@load.html
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-3/igt@i915_module_load@load.html
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-7/igt@i915_module_load@load.html
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-8/igt@i915_module_load@load.html
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-1/igt@i915_module_load@load.html
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-10/igt@i915_module_load@load.html
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-11/igt@i915_module_load@load.html
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-6/igt@i915_module_load@load.html
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-10/igt@i915_module_load@load.html
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-2/igt@i915_module_load@load.html
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-6/igt@i915_module_load@load.html
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-5/igt@i915_module_load@load.html
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-3/igt@i915_module_load@load.html
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-11/igt@i915_module_load@load.html
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-3/igt@i915_module_load@load.html
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-2/igt@i915_module_load@load.html
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-1/igt@i915_module_load@load.html
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@i915_module_load@load.html
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@i915_module_load@load.html
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@i915_module_load@load.html
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@i915_module_load@load.html
   [165]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@i915_module_load@load.html
   [166]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-1/igt@i915_module_load@load.html
   [167]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@i915_module_load@load.html
   [168]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@i915_module_load@load.html
   [169]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-3/igt@i915_module_load@load.html
   [170]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@i915_module_load@load.html
   [171]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@i915_module_load@load.html
   [172]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@i915_module_load@load.html
   [173]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@i915_module_load@load.html
   [174]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@i915_module_load@load.html
   [175]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@i915_module_load@load.html
   [176]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-3/igt@i915_module_load@load.html
   [177]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@i915_module_load@load.html
   [178]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@i915_module_load@load.html
   [179]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@i915_module_load@load.html
   [180]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@i915_module_load@load.html
   [181]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-6/igt@i915_module_load@load.html
   [182]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@i915_module_load@load.html

  * igt@i915_module_load@reload-no-display:
    - shard-tglu:         [PASS][183] -> [DMESG-WARN][184] ([i915#13029])
   [183]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-tglu-7/igt@i915_module_load@reload-no-display.html
   [184]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-3/igt@i915_module_load@reload-no-display.html

  * igt@i915_pm_freq_api@freq-reset:
    - shard-rkl:          NOTRUN -> [SKIP][185] ([i915#8399])
   [185]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@i915_pm_freq_api@freq-reset.html

  * igt@i915_pm_rps@min-max-config-idle:
    - shard-dg2:          NOTRUN -> [SKIP][186] ([i915#11681] / [i915#6621])
   [186]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@i915_pm_rps@min-max-config-idle.html

  * igt@i915_pm_rps@thresholds-idle-park:
    - shard-mtlp:         NOTRUN -> [SKIP][187] ([i915#11681])
   [187]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@i915_pm_rps@thresholds-idle-park.html

  * igt@i915_pm_rps@thresholds-park:
    - shard-dg2-9:        NOTRUN -> [SKIP][188] ([i915#11681])
   [188]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@i915_pm_rps@thresholds-park.html

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

  * igt@i915_power@sanity:
    - shard-mtlp:         [PASS][190] -> [SKIP][191] ([i915#7984])
   [190]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-mtlp-1/igt@i915_power@sanity.html
   [191]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-7/igt@i915_power@sanity.html

  * igt@i915_selftest@live:
    - shard-rkl:          [PASS][192] -> [DMESG-FAIL][193] ([i915#13550]) +1 other test dmesg-fail
   [192]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-5/igt@i915_selftest@live.html
   [193]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-1/igt@i915_selftest@live.html

  * igt@i915_selftest@mock:
    - shard-glk:          NOTRUN -> [DMESG-WARN][194] ([i915#9311]) +1 other test dmesg-warn
   [194]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk6/igt@i915_selftest@mock.html

  * igt@i915_suspend@basic-s3-without-i915:
    - shard-tglu-1:       NOTRUN -> [INCOMPLETE][195] ([i915#4817] / [i915#7443])
   [195]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@i915_suspend@basic-s3-without-i915.html

  * igt@i915_suspend@fence-restore-untiled:
    - shard-glk:          [PASS][196] -> [INCOMPLETE][197] ([i915#4817])
   [196]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-glk7/igt@i915_suspend@fence-restore-untiled.html
   [197]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk2/igt@i915_suspend@fence-restore-untiled.html

  * igt@i915_suspend@forcewake:
    - shard-glk:          NOTRUN -> [INCOMPLETE][198] ([i915#4817]) +1 other test incomplete
   [198]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk4/igt@i915_suspend@forcewake.html

  * igt@i915_suspend@sysfs-reader:
    - shard-snb:          [PASS][199] -> [INCOMPLETE][200] ([i915#4817])
   [199]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-snb4/igt@i915_suspend@sysfs-reader.html
   [200]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-snb6/igt@i915_suspend@sysfs-reader.html

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

  * igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy:
    - shard-dg2:          NOTRUN -> [SKIP][203] ([i915#4212])
   [203]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-6/igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy.html

  * igt@kms_addfb_basic@invalid-smem-bo-on-discrete:
    - shard-rkl:          NOTRUN -> [SKIP][204] ([i915#12454] / [i915#12712])
   [204]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-1/igt@kms_addfb_basic@invalid-smem-bo-on-discrete.html

  * igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-a-hdmi-a-3-y-rc-ccs-cc:
    - shard-dg1:          NOTRUN -> [SKIP][205] ([i915#8709]) +7 other tests skip
   [205]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-13/igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-a-hdmi-a-3-y-rc-ccs-cc.html

  * igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-c-hdmi-a-1-y-rc-ccs-cc:
    - shard-tglu:         NOTRUN -> [SKIP][206] ([i915#8709]) +3 other tests skip
   [206]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-4/igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-c-hdmi-a-1-y-rc-ccs-cc.html

  * igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-c-hdmi-a-2-4-mc-ccs:
    - shard-dg2-9:        NOTRUN -> [SKIP][207] ([i915#8709]) +7 other tests skip
   [207]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-c-hdmi-a-2-4-mc-ccs.html

  * igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-d-edp-1-4-mc-ccs:
    - shard-mtlp:         NOTRUN -> [SKIP][208] ([i915#8709]) +7 other tests skip
   [208]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-6/igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-d-edp-1-4-mc-ccs.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-2-y-rc-ccs-cc:
    - shard-rkl:          NOTRUN -> [SKIP][209] ([i915#8709]) +3 other tests skip
   [209]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-6/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-2-y-rc-ccs-cc.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-d-hdmi-a-3-4-mc-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][210] ([i915#8709]) +7 other tests skip
   [210]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-1/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-d-hdmi-a-3-4-mc-ccs.html

  * igt@kms_async_flips@invalid-async-flip-atomic:
    - shard-dg2:          NOTRUN -> [SKIP][211] ([i915#12967])
   [211]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@kms_async_flips@invalid-async-flip-atomic.html

  * igt@kms_atomic@plane-primary-overlay-mutable-zpos:
    - shard-tglu:         NOTRUN -> [SKIP][212] ([i915#9531])
   [212]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-10/igt@kms_atomic@plane-primary-overlay-mutable-zpos.html

  * igt@kms_atomic_transition@plane-all-modeset-transition:
    - shard-dg2-9:        NOTRUN -> [FAIL][213] ([i915#5956]) +1 other test fail
   [213]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_atomic_transition@plane-all-modeset-transition.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-fencing:
    - shard-dg1:          [PASS][214] -> [FAIL][215] ([i915#5956])
   [214]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-19/igt@kms_atomic_transition@plane-all-modeset-transition-fencing.html
   [215]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-12/igt@kms_atomic_transition@plane-all-modeset-transition-fencing.html

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

  * igt@kms_atomic_transition@plane-all-modeset-transition-fencing@pipe-a-hdmi-a-3:
    - shard-dg1:          NOTRUN -> [FAIL][217] ([i915#5956])
   [217]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-12/igt@kms_atomic_transition@plane-all-modeset-transition-fencing@pipe-a-hdmi-a-3.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels:
    - shard-rkl:          NOTRUN -> [SKIP][218] ([i915#1769] / [i915#3555]) +1 other test skip
   [218]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels.html

  * igt@kms_big_fb@4-tiled-64bpp-rotate-270:
    - shard-dg2:          NOTRUN -> [SKIP][219] +10 other tests skip
   [219]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_big_fb@4-tiled-64bpp-rotate-270.html

  * igt@kms_big_fb@4-tiled-8bpp-rotate-0:
    - shard-dg1:          NOTRUN -> [SKIP][220] ([i915#4538] / [i915#5286]) +3 other tests skip
   [220]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-12/igt@kms_big_fb@4-tiled-8bpp-rotate-0.html
    - shard-tglu:         NOTRUN -> [SKIP][221] ([i915#5286]) +2 other tests skip
   [221]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-10/igt@kms_big_fb@4-tiled-8bpp-rotate-0.html

  * igt@kms_big_fb@4-tiled-addfb:
    - shard-rkl:          NOTRUN -> [SKIP][222] ([i915#5286]) +13 other tests skip
   [222]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_big_fb@4-tiled-addfb.html

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

  * igt@kms_big_fb@linear-32bpp-rotate-90:
    - shard-rkl:          NOTRUN -> [SKIP][224] ([i915#3638]) +4 other tests skip
   [224]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_big_fb@linear-32bpp-rotate-90.html

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

  * igt@kms_big_fb@y-tiled-64bpp-rotate-270:
    - shard-dg1:          NOTRUN -> [SKIP][226] ([i915#3638])
   [226]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@kms_big_fb@y-tiled-64bpp-rotate-270.html

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

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

  * igt@kms_big_fb@y-tiled-addfb-size-overflow:
    - shard-mtlp:         NOTRUN -> [SKIP][229] ([i915#6187]) +1 other test skip
   [229]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-1/igt@kms_big_fb@y-tiled-addfb-size-overflow.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
    - shard-dg2:          NOTRUN -> [SKIP][230] ([i915#4538] / [i915#5190]) +6 other tests skip
   [230]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-64bpp-rotate-0:
    - shard-dg1:          NOTRUN -> [SKIP][231] ([i915#4538])
   [231]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@kms_big_fb@yf-tiled-64bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
    - shard-dg2-9:        NOTRUN -> [SKIP][232] ([i915#5190])
   [232]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-async-flip:
    - shard-mtlp:         NOTRUN -> [SKIP][233] +8 other tests skip
   [233]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-3/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-async-flip.html

  * igt@kms_ccs@bad-pixel-format-4-tiled-dg2-rc-ccs-cc@pipe-c-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][234] ([i915#6095]) +29 other tests skip
   [234]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-4/igt@kms_ccs@bad-pixel-format-4-tiled-dg2-rc-ccs-cc@pipe-c-edp-1.html

  * igt@kms_ccs@bad-pixel-format-y-tiled-gen12-mc-ccs@pipe-d-hdmi-a-1:
    - shard-dg2:          NOTRUN -> [SKIP][235] ([i915#10307] / [i915#10434] / [i915#6095]) +1 other test skip
   [235]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_ccs@bad-pixel-format-y-tiled-gen12-mc-ccs@pipe-d-hdmi-a-1.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][236] ([i915#12313])
   [236]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
    - shard-rkl:          NOTRUN -> [SKIP][237] ([i915#12313]) +3 other tests skip
   [237]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
    - shard-dg1:          NOTRUN -> [SKIP][238] ([i915#12313])
   [238]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
    - shard-tglu:         NOTRUN -> [SKIP][239] ([i915#12313])
   [239]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-6/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
    - shard-mtlp:         NOTRUN -> [SKIP][240] ([i915#12313]) +1 other test skip
   [240]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-1/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html

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

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][242] ([i915#6095]) +140 other tests skip
   [242]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-2.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-c-hdmi-a-1:
    - shard-tglu:         NOTRUN -> [SKIP][243] ([i915#6095]) +19 other tests skip
   [243]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-10/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-c-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-d-hdmi-a-2:
    - shard-dg2-9:        NOTRUN -> [SKIP][244] ([i915#6095]) +4 other tests skip
   [244]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-d-hdmi-a-2.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][245] ([i915#6095]) +21 other tests skip
   [245]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@kms_ccs@crc-primary-suspend-y-tiled-ccs.html

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

  * igt@kms_ccs@crc-sprite-planes-basic-yf-tiled-ccs@pipe-b-hdmi-a-2:
    - shard-dg2-9:        NOTRUN -> [SKIP][247] ([i915#10307] / [i915#6095]) +39 other tests skip
   [247]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_ccs@crc-sprite-planes-basic-yf-tiled-ccs@pipe-b-hdmi-a-2.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-hdmi-a-3:
    - shard-dg1:          NOTRUN -> [SKIP][248] ([i915#6095]) +143 other tests skip
   [248]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-12/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-hdmi-a-3.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
    - shard-dg2-9:        NOTRUN -> [SKIP][249] ([i915#12313])
   [249]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html

  * igt@kms_cdclk@mode-transition:
    - shard-rkl:          NOTRUN -> [SKIP][250] ([i915#3742])
   [250]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_cdclk@mode-transition.html
    - shard-dg1:          NOTRUN -> [SKIP][251] ([i915#3742])
   [251]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@kms_cdclk@mode-transition.html

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

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

  * igt@kms_chamelium_audio@dp-audio-edid:
    - shard-dg2:          NOTRUN -> [SKIP][254] ([i915#11151] / [i915#7828]) +5 other tests skip
   [254]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@kms_chamelium_audio@dp-audio-edid.html

  * igt@kms_chamelium_edid@hdmi-edid-change-during-suspend:
    - shard-rkl:          NOTRUN -> [SKIP][255] ([i915#11151] / [i915#7828]) +15 other tests skip
   [255]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-6/igt@kms_chamelium_edid@hdmi-edid-change-during-suspend.html

  * igt@kms_chamelium_frames@dp-crc-single:
    - shard-tglu-1:       NOTRUN -> [SKIP][256] ([i915#11151] / [i915#7828]) +3 other tests skip
   [256]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_chamelium_frames@dp-crc-single.html

  * igt@kms_chamelium_hpd@hdmi-hpd:
    - shard-dg2-9:        NOTRUN -> [SKIP][257] ([i915#11151] / [i915#7828]) +5 other tests skip
   [257]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_chamelium_hpd@hdmi-hpd.html

  * igt@kms_chamelium_hpd@hdmi-hpd-storm-disable:
    - shard-dg1:          NOTRUN -> [SKIP][258] ([i915#11151] / [i915#7828]) +1 other test skip
   [258]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@kms_chamelium_hpd@hdmi-hpd-storm-disable.html

  * igt@kms_chamelium_hpd@vga-hpd:
    - shard-mtlp:         NOTRUN -> [SKIP][259] ([i915#11151] / [i915#7828]) +4 other tests skip
   [259]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-4/igt@kms_chamelium_hpd@vga-hpd.html

  * igt@kms_chamelium_hpd@vga-hpd-with-enabled-mode:
    - shard-tglu:         NOTRUN -> [SKIP][260] ([i915#11151] / [i915#7828]) +7 other tests skip
   [260]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-2/igt@kms_chamelium_hpd@vga-hpd-with-enabled-mode.html

  * igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf (NEW):
    - shard-snb:          NOTRUN -> [SKIP][261] +108 other tests skip
   [261]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-snb2/igt@kms_colorop@plane-xr30-xr30-bt2020_inv_oetf.html

  * igt@kms_colorop@plane-xr30-xr30-pq_inv_eotf (NEW):
    - shard-dg1:          NOTRUN -> [SKIP][262] ([i915#4423])
   [262]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-12/igt@kms_colorop@plane-xr30-xr30-pq_inv_eotf.html

  * igt@kms_content_protection@atomic-dpms:
    - shard-dg2-9:        NOTRUN -> [SKIP][263] ([i915#7118] / [i915#9424])
   [263]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_content_protection@atomic-dpms.html

  * igt@kms_content_protection@content-type-change:
    - shard-dg2-9:        NOTRUN -> [SKIP][264] ([i915#9424])
   [264]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_content_protection@content-type-change.html

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

  * igt@kms_content_protection@dp-mst-type-1:
    - shard-rkl:          NOTRUN -> [SKIP][266] ([i915#3116])
   [266]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_content_protection@dp-mst-type-1.html

  * igt@kms_content_protection@lic-type-0:
    - shard-mtlp:         NOTRUN -> [SKIP][267] ([i915#6944] / [i915#9424])
   [267]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@kms_content_protection@lic-type-0.html

  * igt@kms_content_protection@lic-type-0@pipe-a-dp-4:
    - shard-dg2:          NOTRUN -> [FAIL][268] ([i915#7173]) +1 other test fail
   [268]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@kms_content_protection@lic-type-0@pipe-a-dp-4.html

  * igt@kms_content_protection@lic-type-1:
    - shard-rkl:          NOTRUN -> [SKIP][269] ([i915#9424]) +1 other test skip
   [269]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_content_protection@lic-type-1.html

  * igt@kms_content_protection@srm:
    - shard-rkl:          NOTRUN -> [SKIP][270] ([i915#7118])
   [270]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_content_protection@srm.html
    - shard-dg1:          NOTRUN -> [SKIP][271] ([i915#7116])
   [271]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-16/igt@kms_content_protection@srm.html

  * igt@kms_cursor_crc@cursor-offscreen-512x170:
    - shard-dg2-9:        NOTRUN -> [SKIP][272] ([i915#13049])
   [272]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_cursor_crc@cursor-offscreen-512x170.html
    - shard-rkl:          NOTRUN -> [SKIP][273] ([i915#13049]) +3 other tests skip
   [273]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-6/igt@kms_cursor_crc@cursor-offscreen-512x170.html

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

  * igt@kms_cursor_crc@cursor-onscreen-128x42:
    - shard-rkl:          [PASS][275] -> [FAIL][276] ([i915#13566]) +2 other tests fail
   [275]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-4/igt@kms_cursor_crc@cursor-onscreen-128x42.html
   [276]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_cursor_crc@cursor-onscreen-128x42.html

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

  * igt@kms_cursor_crc@cursor-onscreen-256x85:
    - shard-tglu-1:       NOTRUN -> [FAIL][278] ([i915#13566]) +1 other test fail
   [278]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_cursor_crc@cursor-onscreen-256x85.html

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

  * igt@kms_cursor_crc@cursor-rapid-movement-256x85:
    - shard-mtlp:         NOTRUN -> [SKIP][280] ([i915#8814])
   [280]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-4/igt@kms_cursor_crc@cursor-rapid-movement-256x85.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x10:
    - shard-rkl:          NOTRUN -> [SKIP][281] ([i915#3555]) +12 other tests skip
   [281]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_cursor_crc@cursor-rapid-movement-32x10.html

  * igt@kms_cursor_crc@cursor-rapid-movement-512x512:
    - shard-tglu-1:       NOTRUN -> [SKIP][282] ([i915#13049])
   [282]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_cursor_crc@cursor-rapid-movement-512x512.html

  * igt@kms_cursor_crc@cursor-sliding-128x42:
    - shard-tglu:         [PASS][283] -> [FAIL][284] ([i915#13566]) +5 other tests fail
   [283]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-tglu-6/igt@kms_cursor_crc@cursor-sliding-128x42.html
   [284]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-4/igt@kms_cursor_crc@cursor-sliding-128x42.html

  * igt@kms_cursor_crc@cursor-sliding-64x21:
    - shard-tglu:         NOTRUN -> [FAIL][285] ([i915#13566]) +3 other tests fail
   [285]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-9/igt@kms_cursor_crc@cursor-sliding-64x21.html

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

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
    - shard-rkl:          NOTRUN -> [SKIP][287] ([i915#4103]) +1 other test skip
   [287]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic:
    - shard-dg2:          NOTRUN -> [SKIP][288] ([i915#13046] / [i915#5354]) +4 other tests skip
   [288]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size:
    - shard-mtlp:         NOTRUN -> [SKIP][289] ([i915#9809])
   [289]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-6/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@flip-vs-cursor-legacy:
    - shard-rkl:          [PASS][290] -> [FAIL][291] ([i915#2346])
   [290]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-5/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
   [291]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-1/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html

  * igt@kms_cursor_legacy@flip-vs-cursor-toggle:
    - shard-rkl:          NOTRUN -> [FAIL][292] ([i915#2346])
   [292]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@kms_cursor_legacy@flip-vs-cursor-toggle.html

  * igt@kms_cursor_legacy@modeset-atomic-cursor-hotspot:
    - shard-mtlp:         NOTRUN -> [SKIP][293] ([i915#9067])
   [293]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-8/igt@kms_cursor_legacy@modeset-atomic-cursor-hotspot.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
    - shard-dg2:          NOTRUN -> [SKIP][294] ([i915#4103] / [i915#4213])
   [294]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-1/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html

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

  * igt@kms_display_modes@extended-mode-basic:
    - shard-dg2:          NOTRUN -> [SKIP][296] ([i915#13691])
   [296]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@kms_display_modes@extended-mode-basic.html
    - shard-rkl:          NOTRUN -> [SKIP][297] ([i915#13691])
   [297]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_display_modes@extended-mode-basic.html

  * igt@kms_dp_link_training@non-uhbr-sst:
    - shard-dg2:          [PASS][298] -> [SKIP][299] ([i915#13749])
   [298]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-10/igt@kms_dp_link_training@non-uhbr-sst.html
   [299]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_dp_link_training@non-uhbr-sst.html
    - shard-rkl:          NOTRUN -> [SKIP][300] ([i915#13749])
   [300]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_dp_link_training@non-uhbr-sst.html
    - shard-tglu-1:       NOTRUN -> [SKIP][301] ([i915#13749])
   [301]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_dp_link_training@non-uhbr-sst.html

  * igt@kms_dp_linktrain_fallback@dp-fallback:
    - shard-rkl:          NOTRUN -> [SKIP][302] ([i915#13707])
   [302]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_dp_linktrain_fallback@dp-fallback.html

  * igt@kms_dp_linktrain_fallback@dsc-fallback:
    - shard-dg2:          NOTRUN -> [SKIP][303] ([i915#13707])
   [303]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@kms_dp_linktrain_fallback@dsc-fallback.html

  * igt@kms_dsc@dsc-basic:
    - shard-rkl:          NOTRUN -> [SKIP][304] ([i915#3555] / [i915#3840]) +2 other tests skip
   [304]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_dsc@dsc-basic.html

  * igt@kms_dsc@dsc-fractional-bpp:
    - shard-mtlp:         NOTRUN -> [SKIP][305] ([i915#3840] / [i915#9688])
   [305]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-3/igt@kms_dsc@dsc-fractional-bpp.html

  * igt@kms_dsc@dsc-fractional-bpp-with-bpc:
    - shard-rkl:          NOTRUN -> [SKIP][306] ([i915#3840])
   [306]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html

  * igt@kms_dsc@dsc-with-bpc:
    - shard-tglu-1:       NOTRUN -> [SKIP][307] ([i915#3555] / [i915#3840])
   [307]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_dsc@dsc-with-bpc.html

  * igt@kms_dsc@dsc-with-output-formats-with-bpc:
    - shard-rkl:          NOTRUN -> [SKIP][308] ([i915#3840] / [i915#9053])
   [308]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@kms_dsc@dsc-with-output-formats-with-bpc.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats:
    - shard-dg2-9:        NOTRUN -> [SKIP][309] ([i915#13798])
   [309]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area:
    - shard-tglu-1:       NOTRUN -> [SKIP][310] ([i915#2575])
   [310]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area.html

  * igt@kms_fbcon_fbt@psr:
    - shard-rkl:          NOTRUN -> [SKIP][311] ([i915#3955])
   [311]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_fbcon_fbt@psr.html
    - shard-tglu:         NOTRUN -> [SKIP][312] ([i915#3469])
   [312]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-6/igt@kms_fbcon_fbt@psr.html

  * igt@kms_fbcon_fbt@psr-suspend:
    - shard-dg2-9:        NOTRUN -> [SKIP][313] ([i915#3469])
   [313]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_fbcon_fbt@psr-suspend.html

  * igt@kms_feature_discovery@chamelium:
    - shard-tglu:         NOTRUN -> [SKIP][314] ([i915#2065] / [i915#4854])
   [314]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-2/igt@kms_feature_discovery@chamelium.html

  * igt@kms_feature_discovery@display-3x:
    - shard-rkl:          NOTRUN -> [SKIP][315] ([i915#1839])
   [315]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_feature_discovery@display-3x.html

  * igt@kms_feature_discovery@display-4x:
    - shard-dg2:          NOTRUN -> [SKIP][316] ([i915#1839])
   [316]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@kms_feature_discovery@display-4x.html

  * igt@kms_feature_discovery@psr1:
    - shard-rkl:          NOTRUN -> [SKIP][317] ([i915#658])
   [317]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_feature_discovery@psr1.html

  * igt@kms_flip@2x-absolute-wf_vblank:
    - shard-dg2:          NOTRUN -> [SKIP][318] ([i915#9934]) +3 other tests skip
   [318]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@kms_flip@2x-absolute-wf_vblank.html

  * igt@kms_flip@2x-flip-vs-modeset:
    - shard-tglu:         NOTRUN -> [SKIP][319] ([i915#3637]) +3 other tests skip
   [319]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-9/igt@kms_flip@2x-flip-vs-modeset.html

  * igt@kms_flip@2x-flip-vs-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][320] ([i915#12745] / [i915#4839])
   [320]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk5/igt@kms_flip@2x-flip-vs-suspend.html

  * igt@kms_flip@2x-flip-vs-suspend@ab-hdmi-a1-hdmi-a2:
    - shard-glk:          NOTRUN -> [INCOMPLETE][321] ([i915#4839])
   [321]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk5/igt@kms_flip@2x-flip-vs-suspend@ab-hdmi-a1-hdmi-a2.html

  * igt@kms_flip@2x-modeset-vs-vblank-race:
    - shard-dg2-9:        NOTRUN -> [SKIP][322] ([i915#9934]) +5 other tests skip
   [322]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_flip@2x-modeset-vs-vblank-race.html

  * igt@kms_flip@2x-plain-flip:
    - shard-rkl:          NOTRUN -> [SKIP][323] ([i915#9934]) +13 other tests skip
   [323]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_flip@2x-plain-flip.html

  * igt@kms_flip@2x-plain-flip-ts-check-interruptible:
    - shard-tglu-1:       NOTRUN -> [SKIP][324] ([i915#3637]) +1 other test skip
   [324]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_flip@2x-plain-flip-ts-check-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@a-hdmi-a2:
    - shard-dg2-9:        NOTRUN -> [FAIL][325] ([i915#13027]) +1 other test fail
   [325]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_flip@flip-vs-expired-vblank-interruptible@a-hdmi-a2.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][326] ([i915#12314] / [i915#12745] / [i915#4839])
   [326]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk8/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-dg1:          [PASS][327] -> [DMESG-WARN][328] ([i915#4423]) +1 other test dmesg-warn
   [327]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-13/igt@kms_flip@flip-vs-suspend-interruptible.html
   [328]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-16/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible@d-hdmi-a4:
    - shard-dg1:          NOTRUN -> [DMESG-WARN][329] ([i915#4423])
   [329]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-16/igt@kms_flip@flip-vs-suspend-interruptible@d-hdmi-a4.html

  * igt@kms_flip@flip-vs-suspend@a-hdmi-a1:
    - shard-glk:          NOTRUN -> [INCOMPLETE][330] ([i915#12314] / [i915#12745])
   [330]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk8/igt@kms_flip@flip-vs-suspend@a-hdmi-a1.html

  * igt@kms_flip@wf_vblank-ts-check@a-edp1:
    - shard-mtlp:         [PASS][331] -> [FAIL][332] ([i915#13734]) +1 other test fail
   [331]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-mtlp-1/igt@kms_flip@wf_vblank-ts-check@a-edp1.html
   [332]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-7/igt@kms_flip@wf_vblank-ts-check@a-edp1.html

  * igt@kms_flip@wf_vblank-ts-check@c-hdmi-a1:
    - shard-tglu:         [PASS][333] -> [FAIL][334] ([i915#13734])
   [333]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-tglu-9/igt@kms_flip@wf_vblank-ts-check@c-hdmi-a1.html
   [334]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-8/igt@kms_flip@wf_vblank-ts-check@c-hdmi-a1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling@pipe-a-valid-mode:
    - shard-tglu:         NOTRUN -> [SKIP][335] ([i915#2587] / [i915#2672]) +1 other test skip
   [335]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-3/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling@pipe-a-valid-mode:
    - shard-dg1:          NOTRUN -> [SKIP][336] ([i915#2587] / [i915#2672]) +2 other tests skip
   [336]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-14/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling:
    - shard-dg2:          NOTRUN -> [SKIP][337] ([i915#2672] / [i915#3555]) +3 other tests skip
   [337]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-6/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling@pipe-a-valid-mode:
    - shard-rkl:          NOTRUN -> [SKIP][338] ([i915#2672]) +8 other tests skip
   [338]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling:
    - shard-tglu:         NOTRUN -> [SKIP][339] ([i915#2672] / [i915#3555]) +1 other test skip
   [339]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-8/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling.html
    - shard-mtlp:         NOTRUN -> [SKIP][340] ([i915#2672] / [i915#3555] / [i915#8813])
   [340]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/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-mtlp:         NOTRUN -> [SKIP][341] ([i915#2672] / [i915#8813])
   [341]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode:
    - shard-dg2-9:        NOTRUN -> [SKIP][342] ([i915#2672]) +2 other tests skip
   [342]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling:
    - shard-rkl:          NOTRUN -> [SKIP][343] ([i915#2672] / [i915#3555]) +8 other tests skip
   [343]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling:
    - shard-dg1:          NOTRUN -> [SKIP][344] ([i915#2672] / [i915#3555]) +2 other tests skip
   [344]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
    - shard-tglu-1:       NOTRUN -> [SKIP][345] ([i915#2672] / [i915#3555])
   [345]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/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-valid-mode:
    - shard-tglu-1:       NOTRUN -> [SKIP][346] ([i915#2587] / [i915#2672])
   [346]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling:
    - shard-mtlp:         NOTRUN -> [SKIP][347] ([i915#3555] / [i915#8810] / [i915#8813])
   [347]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][348] ([i915#3555] / [i915#8810])
   [348]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling:
    - shard-dg2:          NOTRUN -> [SKIP][349] ([i915#2672] / [i915#3555] / [i915#5190]) +4 other tests skip
   [349]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-upscaling:
    - shard-dg2-9:        NOTRUN -> [SKIP][350] ([i915#2672] / [i915#3555] / [i915#5190]) +2 other tests skip
   [350]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling@pipe-a-valid-mode:
    - shard-dg2:          NOTRUN -> [SKIP][351] ([i915#2672]) +8 other tests skip
   [351]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling@pipe-a-valid-mode.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-dg2-9:        NOTRUN -> [SKIP][352] ([i915#8708]) +13 other tests skip
   [352]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc.html
    - shard-dg1:          NOTRUN -> [SKIP][353] ([i915#8708]) +4 other tests skip
   [353]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-13/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt:
    - shard-rkl:          NOTRUN -> [DMESG-WARN][354] ([i915#12964]) +15 other tests dmesg-warn
   [354]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-onoff:
    - shard-dg2:          [PASS][355] -> [FAIL][356] ([i915#6880])
   [355]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-5/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-onoff.html
   [356]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-msflip-blt:
    - shard-tglu-1:       NOTRUN -> [SKIP][357] +35 other tests skip
   [357]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-cpu:
    - shard-dg1:          NOTRUN -> [SKIP][358] +14 other tests skip
   [358]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbc-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][359] ([i915#10056] / [i915#13353])
   [359]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk3/igt@kms_frontbuffer_tracking@fbc-suspend.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-pwrite:
    - shard-dg2:          NOTRUN -> [SKIP][360] ([i915#3458]) +14 other tests skip
   [360]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-pwrite.html
    - shard-dg1:          NOTRUN -> [SKIP][361] ([i915#3458]) +2 other tests skip
   [361]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-pwrite:
    - shard-dg2-9:        NOTRUN -> [SKIP][362] ([i915#3458]) +10 other tests skip
   [362]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-indfb-fliptrack-mmap-gtt:
    - shard-rkl:          NOTRUN -> [SKIP][363] +47 other tests skip
   [363]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_frontbuffer_tracking@fbcpsr-2p-indfb-fliptrack-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-shrfb-plflip-blt:
    - shard-dg2:          NOTRUN -> [SKIP][364] ([i915#5354]) +21 other tests skip
   [364]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][365] ([i915#8708]) +16 other tests skip
   [365]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-mmap-gtt:
    - shard-mtlp:         NOTRUN -> [SKIP][366] ([i915#8708]) +2 other tests skip
   [366]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-3/igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-pwrite:
    - shard-rkl:          NOTRUN -> [SKIP][367] ([i915#3023]) +55 other tests skip
   [367]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-blt:
    - shard-mtlp:         NOTRUN -> [SKIP][368] ([i915#1825]) +12 other tests skip
   [368]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-blt:
    - shard-dg2-9:        NOTRUN -> [SKIP][369] ([i915#5354]) +20 other tests skip
   [369]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt:
    - shard-rkl:          NOTRUN -> [SKIP][370] ([i915#1825]) +92 other tests skip
   [370]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html

  * igt@kms_hdr@bpc-switch-dpms:
    - shard-dg2-9:        NOTRUN -> [SKIP][371] ([i915#3555] / [i915#8228])
   [371]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_hdr@bpc-switch-dpms.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-dg2:          [PASS][372] -> [SKIP][373] ([i915#3555] / [i915#8228])
   [372]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-10/igt@kms_hdr@static-toggle-dpms.html
   [373]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_hdr@static-toggle-suspend:
    - shard-dg2:          NOTRUN -> [SKIP][374] ([i915#3555] / [i915#8228]) +1 other test skip
   [374]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@kms_hdr@static-toggle-suspend.html
    - shard-rkl:          NOTRUN -> [SKIP][375] ([i915#3555] / [i915#8228]) +2 other tests skip
   [375]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_hdr@static-toggle-suspend.html
    - shard-tglu-1:       NOTRUN -> [SKIP][376] ([i915#3555] / [i915#8228])
   [376]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_hdr@static-toggle-suspend.html
    - shard-dg1:          NOTRUN -> [SKIP][377] ([i915#3555] / [i915#8228])
   [377]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@kms_hdr@static-toggle-suspend.html

  * igt@kms_joiner@basic-big-joiner:
    - shard-rkl:          NOTRUN -> [SKIP][378] ([i915#10656]) +1 other test skip
   [378]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_joiner@basic-big-joiner.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-rkl:          NOTRUN -> [SKIP][379] ([i915#13688])
   [379]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_joiner@basic-max-non-joiner.html

  * igt@kms_joiner@invalid-modeset-big-joiner:
    - shard-tglu-1:       NOTRUN -> [SKIP][380] ([i915#10656])
   [380]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_joiner@invalid-modeset-big-joiner.html
    - shard-dg2:          NOTRUN -> [SKIP][381] ([i915#10656])
   [381]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_joiner@invalid-modeset-big-joiner.html

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-rkl:          NOTRUN -> [SKIP][382] ([i915#12388])
   [382]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_joiner@invalid-modeset-force-ultra-joiner:
    - shard-dg2-9:        NOTRUN -> [SKIP][383] ([i915#10656])
   [383]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_joiner@invalid-modeset-force-ultra-joiner.html

  * igt@kms_joiner@invalid-modeset-ultra-joiner:
    - shard-dg2:          NOTRUN -> [SKIP][384] ([i915#12339])
   [384]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-3/igt@kms_joiner@invalid-modeset-ultra-joiner.html
    - shard-rkl:          NOTRUN -> [SKIP][385] ([i915#12339])
   [385]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_joiner@invalid-modeset-ultra-joiner.html
    - shard-dg1:          NOTRUN -> [SKIP][386] ([i915#12339])
   [386]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@kms_joiner@invalid-modeset-ultra-joiner.html

  * igt@kms_panel_fitting@atomic-fastset:
    - shard-rkl:          NOTRUN -> [SKIP][387] ([i915#6301]) +1 other test skip
   [387]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_panel_fitting@atomic-fastset.html
    - shard-tglu-1:       NOTRUN -> [SKIP][388] ([i915#6301])
   [388]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_panel_fitting@atomic-fastset.html

  * igt@kms_plane_alpha_blend@alpha-basic:
    - shard-glk:          NOTRUN -> [FAIL][389] ([i915#12178])
   [389]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk3/igt@kms_plane_alpha_blend@alpha-basic.html

  * igt@kms_plane_alpha_blend@alpha-basic@pipe-c-hdmi-a-1:
    - shard-glk:          NOTRUN -> [FAIL][390] ([i915#7862]) +1 other test fail
   [390]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk3/igt@kms_plane_alpha_blend@alpha-basic@pipe-c-hdmi-a-1.html

  * igt@kms_plane_alpha_blend@alpha-opaque-fb:
    - shard-glk:          NOTRUN -> [FAIL][391] ([i915#10647] / [i915#12169])
   [391]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk6/igt@kms_plane_alpha_blend@alpha-opaque-fb.html

  * igt@kms_plane_alpha_blend@alpha-opaque-fb@pipe-a-hdmi-a-1:
    - shard-glk:          NOTRUN -> [FAIL][392] ([i915#10647]) +1 other test fail
   [392]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk6/igt@kms_plane_alpha_blend@alpha-opaque-fb@pipe-a-hdmi-a-1.html

  * igt@kms_plane_lowres@tiling-4:
    - shard-dg1:          NOTRUN -> [SKIP][393] ([i915#3555])
   [393]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-19/igt@kms_plane_lowres@tiling-4.html

  * igt@kms_plane_lowres@tiling-yf:
    - shard-dg2-9:        NOTRUN -> [SKIP][394] ([i915#3555] / [i915#8821])
   [394]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_plane_lowres@tiling-yf.html

  * igt@kms_plane_scaling@intel-max-src-size:
    - shard-dg2:          [PASS][395] -> [SKIP][396] ([i915#6953] / [i915#9423])
   [395]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-11/igt@kms_plane_scaling@intel-max-src-size.html
   [396]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-3/igt@kms_plane_scaling@intel-max-src-size.html
    - shard-rkl:          NOTRUN -> [SKIP][397] ([i915#6953])
   [397]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_plane_scaling@intel-max-src-size.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-a:
    - shard-rkl:          NOTRUN -> [SKIP][398] ([i915#12247]) +26 other tests skip
   [398]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-6/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-a.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-c:
    - shard-tglu:         NOTRUN -> [SKIP][399] ([i915#12247]) +13 other tests skip
   [399]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-5/igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-c.html

  * igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation:
    - shard-tglu-1:       NOTRUN -> [SKIP][400] ([i915#3555]) +2 other tests skip
   [400]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation.html

  * igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-b:
    - shard-tglu-1:       NOTRUN -> [SKIP][401] ([i915#12247]) +3 other tests skip
   [401]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-b.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling:
    - shard-dg2:          NOTRUN -> [SKIP][402] ([i915#12247] / [i915#9423])
   [402]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-d:
    - shard-dg2:          NOTRUN -> [SKIP][403] ([i915#12247]) +3 other tests skip
   [403]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-d.html
    - shard-dg1:          NOTRUN -> [SKIP][404] ([i915#12247]) +4 other tests skip
   [404]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-12/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-d.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-factor-0-25:
    - shard-tglu:         NOTRUN -> [SKIP][405] ([i915#12247] / [i915#6953])
   [405]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-3/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-factor-0-25.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-20x20@pipe-d:
    - shard-mtlp:         NOTRUN -> [SKIP][406] ([i915#12247]) +8 other tests skip
   [406]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-3/igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-20x20@pipe-d.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-75:
    - shard-mtlp:         NOTRUN -> [SKIP][407] ([i915#12247] / [i915#3555] / [i915#6953])
   [407]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-8/igt@kms_plane_scaling@planes-downscale-factor-0-75.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25:
    - shard-rkl:          NOTRUN -> [SKIP][408] ([i915#12247] / [i915#3555])
   [408]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25.html

  * igt@kms_pm_backlight@brightness-with-dpms:
    - shard-rkl:          NOTRUN -> [SKIP][409] ([i915#12343])
   [409]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_pm_backlight@brightness-with-dpms.html
    - shard-tglu-1:       NOTRUN -> [SKIP][410] ([i915#12343])
   [410]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_pm_backlight@brightness-with-dpms.html
    - shard-dg1:          NOTRUN -> [SKIP][411] ([i915#12343])
   [411]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@kms_pm_backlight@brightness-with-dpms.html

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-rkl:          NOTRUN -> [SKIP][412] ([i915#5354]) +1 other test skip
   [412]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-6/igt@kms_pm_backlight@fade-with-dpms.html
    - shard-tglu:         NOTRUN -> [SKIP][413] ([i915#9812])
   [413]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-8/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_pm_dc@dc5-dpms-negative:
    - shard-mtlp:         NOTRUN -> [SKIP][414] ([i915#13441])
   [414]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-3/igt@kms_pm_dc@dc5-dpms-negative.html

  * igt@kms_pm_dc@dc5-retention-flops:
    - shard-rkl:          NOTRUN -> [SKIP][415] ([i915#3828])
   [415]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_pm_dc@dc5-retention-flops.html
    - shard-tglu:         NOTRUN -> [SKIP][416] ([i915#3828])
   [416]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-9/igt@kms_pm_dc@dc5-retention-flops.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-dg2-9:        NOTRUN -> [SKIP][417] ([i915#5978])
   [417]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_pm_dc@dc6-dpms.html
    - shard-tglu:         [PASS][418] -> [FAIL][419] ([i915#9295])
   [418]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-tglu-10/igt@kms_pm_dc@dc6-dpms.html
   [419]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-4/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_lpsp@kms-lpsp:
    - shard-rkl:          NOTRUN -> [SKIP][420] ([i915#9340])
   [420]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_pm_lpsp@kms-lpsp.html
    - shard-tglu-1:       NOTRUN -> [SKIP][421] ([i915#3828])
   [421]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_pm_lpsp@kms-lpsp.html

  * igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
    - shard-rkl:          [PASS][422] -> [SKIP][423] ([i915#12916])
   [422]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-8/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
   [423]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html

  * igt@kms_pm_rpm@modeset-lpsp-stress:
    - shard-dg2:          [PASS][424] -> [SKIP][425] ([i915#9519])
   [424]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-8/igt@kms_pm_rpm@modeset-lpsp-stress.html
   [425]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@kms_pm_rpm@modeset-lpsp-stress.html

  * igt@kms_pm_rpm@modeset-non-lpsp-stress:
    - shard-rkl:          NOTRUN -> [SKIP][426] ([i915#9519]) +3 other tests skip
   [426]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@kms_pm_rpm@modeset-non-lpsp-stress.html

  * igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait:
    - shard-rkl:          [PASS][427] -> [SKIP][428] ([i915#9519])
   [427]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-5/igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait.html
   [428]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait.html

  * igt@kms_prime@basic-crc-vgem:
    - shard-dg2:          NOTRUN -> [SKIP][429] ([i915#6524] / [i915#6805]) +1 other test skip
   [429]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@kms_prime@basic-crc-vgem.html

  * igt@kms_prime@basic-modeset-hybrid:
    - shard-rkl:          NOTRUN -> [SKIP][430] ([i915#6524])
   [430]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_prime@basic-modeset-hybrid.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-update-sf:
    - shard-dg2:          NOTRUN -> [SKIP][431] ([i915#11520]) +7 other tests skip
   [431]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-6/igt@kms_psr2_sf@fbc-psr2-cursor-plane-update-sf.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-sf:
    - shard-snb:          NOTRUN -> [SKIP][432] ([i915#11520]) +1 other test skip
   [432]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-snb6/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-sf.html
    - shard-dg1:          NOTRUN -> [SKIP][433] ([i915#11520]) +4 other tests skip
   [433]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-19/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-sf@pipe-a-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][434] ([i915#9808])
   [434]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-2/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-sf@pipe-a-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-plane-update-sf-dmg-area:
    - shard-tglu-1:       NOTRUN -> [SKIP][435] ([i915#11520]) +2 other tests skip
   [435]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_psr2_sf@fbc-psr2-overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf:
    - shard-glk:          NOTRUN -> [SKIP][436] ([i915#11520]) +8 other tests skip
   [436]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk7/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf:
    - shard-rkl:          NOTRUN -> [SKIP][437] ([i915#11520]) +20 other tests skip
   [437]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf.html

  * igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area:
    - shard-tglu:         NOTRUN -> [SKIP][438] ([i915#11520]) +5 other tests skip
   [438]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-10/igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area.html
    - shard-mtlp:         NOTRUN -> [SKIP][439] ([i915#12316]) +3 other tests skip
   [439]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-4/igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-sf:
    - shard-dg2-9:        NOTRUN -> [SKIP][440] ([i915#11520]) +3 other tests skip
   [440]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-rkl:          NOTRUN -> [SKIP][441] ([i915#9683]) +2 other tests skip
   [441]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr@fbc-pr-no-drrs:
    - shard-dg1:          NOTRUN -> [SKIP][442] ([i915#1072] / [i915#9732]) +6 other tests skip
   [442]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-13/igt@kms_psr@fbc-pr-no-drrs.html

  * igt@kms_psr@fbc-psr-cursor-blt:
    - shard-dg2-9:        NOTRUN -> [SKIP][443] ([i915#1072] / [i915#9732]) +13 other tests skip
   [443]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_psr@fbc-psr-cursor-blt.html

  * igt@kms_psr@fbc-psr-no-drrs:
    - shard-tglu:         NOTRUN -> [SKIP][444] ([i915#9732]) +10 other tests skip
   [444]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-2/igt@kms_psr@fbc-psr-no-drrs.html

  * igt@kms_psr@fbc-psr-sprite-render:
    - shard-mtlp:         NOTRUN -> [SKIP][445] ([i915#9688]) +11 other tests skip
   [445]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@kms_psr@fbc-psr-sprite-render.html

  * igt@kms_psr@fbc-psr2-cursor-mmap-gtt:
    - shard-glk:          NOTRUN -> [SKIP][446] +339 other tests skip
   [446]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk6/igt@kms_psr@fbc-psr2-cursor-mmap-gtt.html

  * igt@kms_psr@psr-sprite-mmap-cpu:
    - shard-tglu-1:       NOTRUN -> [SKIP][447] ([i915#9732]) +7 other tests skip
   [447]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_psr@psr-sprite-mmap-cpu.html

  * igt@kms_psr@psr2-primary-mmap-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][448] ([i915#1072] / [i915#9732]) +15 other tests skip
   [448]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@kms_psr@psr2-primary-mmap-gtt.html

  * igt@kms_psr@psr2-suspend:
    - shard-rkl:          NOTRUN -> [SKIP][449] ([i915#1072] / [i915#9732]) +52 other tests skip
   [449]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_psr@psr2-suspend.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-rkl:          NOTRUN -> [SKIP][450] ([i915#9685]) +1 other test skip
   [450]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
    - shard-dg1:          NOTRUN -> [SKIP][451] ([i915#9685])
   [451]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
    - shard-dg2:          NOTRUN -> [SKIP][452] ([i915#9685])
   [452]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-dg2-9:        NOTRUN -> [SKIP][453] ([i915#9685])
   [453]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_rotation_crc@exhaust-fences:
    - shard-dg2:          NOTRUN -> [SKIP][454] ([i915#4235])
   [454]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@kms_rotation_crc@exhaust-fences.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
    - shard-rkl:          NOTRUN -> [SKIP][455] ([i915#5289])
   [455]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-1/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-mtlp:         NOTRUN -> [SKIP][456] ([i915#12755]) +1 other test skip
   [456]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-1/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90:
    - shard-dg2:          NOTRUN -> [SKIP][457] ([i915#12755] / [i915#5190]) +1 other test skip
   [457]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90.html
    - shard-dg1:          NOTRUN -> [SKIP][458] ([i915#5289])
   [458]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90.html

  * igt@kms_rotation_crc@sprite-rotation-90-pos-100-0:
    - shard-dg2:          NOTRUN -> [SKIP][459] ([i915#12755]) +1 other test skip
   [459]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@kms_rotation_crc@sprite-rotation-90-pos-100-0.html

  * igt@kms_scaling_modes@scaling-mode-center:
    - shard-tglu:         NOTRUN -> [SKIP][460] ([i915#3555]) +3 other tests skip
   [460]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-5/igt@kms_scaling_modes@scaling-mode-center.html

  * igt@kms_selftest@drm_format:
    - shard-rkl:          [PASS][461] -> [DMESG-WARN][462] ([i915#12964]) +30 other tests dmesg-warn
   [461]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-3/igt@kms_selftest@drm_format.html
   [462]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_selftest@drm_format.html

  * igt@kms_selftest@drm_framebuffer:
    - shard-mtlp:         NOTRUN -> [ABORT][463] ([i915#13179]) +1 other test abort
   [463]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-2/igt@kms_selftest@drm_framebuffer.html

  * igt@kms_setmode@basic:
    - shard-mtlp:         NOTRUN -> [FAIL][464] ([i915#5465]) +1 other test fail
   [464]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-3/igt@kms_setmode@basic.html

  * igt@kms_setmode@clone-exclusive-crtc:
    - shard-snb:          [PASS][465] -> [SKIP][466] +3 other tests skip
   [465]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-snb1/igt@kms_setmode@clone-exclusive-crtc.html
   [466]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-snb4/igt@kms_setmode@clone-exclusive-crtc.html

  * igt@kms_setmode@invalid-clone-exclusive-crtc:
    - shard-dg2:          NOTRUN -> [SKIP][467] ([i915#3555]) +2 other tests skip
   [467]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_setmode@invalid-clone-exclusive-crtc.html

  * igt@kms_setmode@invalid-clone-single-crtc:
    - shard-dg2-9:        NOTRUN -> [SKIP][468] ([i915#3555])
   [468]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_setmode@invalid-clone-single-crtc.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-dg2:          NOTRUN -> [SKIP][469] ([i915#8623])
   [469]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_vrr@lobf:
    - shard-dg2:          NOTRUN -> [SKIP][470] ([i915#11920])
   [470]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-3/igt@kms_vrr@lobf.html
    - shard-rkl:          NOTRUN -> [SKIP][471] ([i915#11920])
   [471]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@kms_vrr@lobf.html
    - shard-dg1:          NOTRUN -> [SKIP][472] ([i915#11920])
   [472]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@kms_vrr@lobf.html

  * igt@kms_vrr@negative-basic:
    - shard-dg2-9:        NOTRUN -> [SKIP][473] ([i915#3555] / [i915#9906])
   [473]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_vrr@negative-basic.html
    - shard-tglu:         NOTRUN -> [SKIP][474] ([i915#3555] / [i915#9906])
   [474]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-4/igt@kms_vrr@negative-basic.html

  * igt@kms_vrr@seamless-rr-switch-drrs:
    - shard-rkl:          NOTRUN -> [SKIP][475] ([i915#9906]) +1 other test skip
   [475]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-7/igt@kms_vrr@seamless-rr-switch-drrs.html
    - shard-dg2-9:        NOTRUN -> [SKIP][476] ([i915#9906])
   [476]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@kms_vrr@seamless-rr-switch-drrs.html

  * igt@kms_writeback@writeback-fb-id-xrgb2101010:
    - shard-tglu-1:       NOTRUN -> [SKIP][477] ([i915#2437] / [i915#9412])
   [477]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-1/igt@kms_writeback@writeback-fb-id-xrgb2101010.html

  * igt@kms_writeback@writeback-invalid-parameters:
    - shard-glk:          NOTRUN -> [SKIP][478] ([i915#2437]) +2 other tests skip
   [478]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk4/igt@kms_writeback@writeback-invalid-parameters.html
    - shard-rkl:          NOTRUN -> [SKIP][479] ([i915#2437])
   [479]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_writeback@writeback-invalid-parameters.html

  * igt@kms_writeback@writeback-pixel-formats:
    - shard-tglu:         NOTRUN -> [SKIP][480] ([i915#2437] / [i915#9412])
   [480]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-8/igt@kms_writeback@writeback-pixel-formats.html
    - shard-mtlp:         NOTRUN -> [SKIP][481] ([i915#2437] / [i915#9412]) +1 other test skip
   [481]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-5/igt@kms_writeback@writeback-pixel-formats.html
    - shard-dg2:          NOTRUN -> [SKIP][482] ([i915#2437] / [i915#9412])
   [482]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-2/igt@kms_writeback@writeback-pixel-formats.html
    - shard-rkl:          NOTRUN -> [SKIP][483] ([i915#2437] / [i915#9412])
   [483]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_writeback@writeback-pixel-formats.html
    - shard-dg1:          NOTRUN -> [SKIP][484] ([i915#2437] / [i915#9412])
   [484]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@kms_writeback@writeback-pixel-formats.html

  * igt@perf@global-sseu-config-invalid:
    - shard-dg2:          NOTRUN -> [SKIP][485] ([i915#7387])
   [485]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@perf@global-sseu-config-invalid.html

  * igt@perf@mi-rpc:
    - shard-rkl:          NOTRUN -> [SKIP][486] ([i915#2434])
   [486]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@perf@mi-rpc.html

  * igt@perf@non-zero-reason:
    - shard-dg2:          NOTRUN -> [FAIL][487] ([i915#9100]) +1 other test fail
   [487]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@perf@non-zero-reason.html

  * igt@perf_pmu@busy-double-start@vecs1:
    - shard-dg2-9:        NOTRUN -> [FAIL][488] ([i915#4349]) +4 other tests fail
   [488]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@perf_pmu@busy-double-start@vecs1.html

  * igt@perf_pmu@enable-race@bcs0:
    - shard-tglu:         [PASS][489] -> [INCOMPLETE][490] ([i915#13520]) +1 other test incomplete
   [489]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-tglu-4/igt@perf_pmu@enable-race@bcs0.html
   [490]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-8/igt@perf_pmu@enable-race@bcs0.html

  * igt@perf_pmu@frequency@gt0:
    - shard-dg2:          NOTRUN -> [FAIL][491] ([i915#12549] / [i915#6806]) +1 other test fail
   [491]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@perf_pmu@frequency@gt0.html
    - shard-dg1:          NOTRUN -> [FAIL][492] ([i915#12549] / [i915#6806]) +1 other test fail
   [492]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@perf_pmu@frequency@gt0.html

  * igt@perf_pmu@most-busy-check-all:
    - shard-rkl:          NOTRUN -> [FAIL][493] ([i915#4349]) +1 other test fail
   [493]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@perf_pmu@most-busy-check-all.html

  * igt@perf_pmu@rc6-all-gts:
    - shard-rkl:          NOTRUN -> [SKIP][494] ([i915#8516])
   [494]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@perf_pmu@rc6-all-gts.html

  * igt@prime_vgem@basic-fence-read:
    - shard-rkl:          NOTRUN -> [SKIP][495] ([i915#3291] / [i915#3708]) +1 other test skip
   [495]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-4/igt@prime_vgem@basic-fence-read.html
    - shard-dg1:          NOTRUN -> [SKIP][496] ([i915#3708]) +2 other tests skip
   [496]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@prime_vgem@basic-fence-read.html

  * igt@prime_vgem@basic-write:
    - shard-dg2:          NOTRUN -> [SKIP][497] ([i915#3291] / [i915#3708]) +2 other tests skip
   [497]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@prime_vgem@basic-write.html

  * igt@prime_vgem@coherency-gtt:
    - shard-rkl:          NOTRUN -> [SKIP][498] ([i915#3708]) +1 other test skip
   [498]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@prime_vgem@coherency-gtt.html

  * igt@prime_vgem@fence-write-hang:
    - shard-tglu:         NOTRUN -> [SKIP][499] +42 other tests skip
   [499]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-tglu-4/igt@prime_vgem@fence-write-hang.html
    - shard-mtlp:         NOTRUN -> [SKIP][500] ([i915#3708]) +1 other test skip
   [500]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-6/igt@prime_vgem@fence-write-hang.html
    - shard-dg2-9:        NOTRUN -> [SKIP][501] ([i915#3708])
   [501]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-9/igt@prime_vgem@fence-write-hang.html

  * igt@sriov_basic@bind-unbind-vf:
    - shard-rkl:          NOTRUN -> [SKIP][502] ([i915#9917]) +1 other test skip
   [502]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@sriov_basic@bind-unbind-vf.html

  * igt@sriov_basic@enable-vfs-autoprobe-off:
    - shard-dg2:          NOTRUN -> [SKIP][503] ([i915#9917])
   [503]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@sriov_basic@enable-vfs-autoprobe-off.html
    - shard-dg1:          NOTRUN -> [SKIP][504] ([i915#9917])
   [504]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-19/igt@sriov_basic@enable-vfs-autoprobe-off.html

  
#### Possible fixes ####

  * igt@gem_eio@hibernate:
    - shard-dg1:          [ABORT][505] ([i915#7975] / [i915#8213]) -> [PASS][506]
   [505]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-14/igt@gem_eio@hibernate.html
   [506]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-16/igt@gem_eio@hibernate.html

  * igt@gem_eio@in-flight-internal-10ms:
    - shard-mtlp:         [ABORT][507] ([i915#13193]) -> [PASS][508] +3 other tests pass
   [507]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-mtlp-7/igt@gem_eio@in-flight-internal-10ms.html
   [508]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-4/igt@gem_eio@in-flight-internal-10ms.html

  * igt@gem_lmem_swapping@smem-oom@lmem0:
    - shard-dg1:          [TIMEOUT][509] ([i915#5493]) -> [PASS][510] +1 other test pass
   [509]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-16/igt@gem_lmem_swapping@smem-oom@lmem0.html
   [510]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@gem_lmem_swapping@smem-oom@lmem0.html

  * igt@gem_pxp@protected-encrypted-src-copy-not-readible:
    - shard-rkl:          [TIMEOUT][511] ([i915#12917] / [i915#12964]) -> [PASS][512] +1 other test pass
   [511]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-5/igt@gem_pxp@protected-encrypted-src-copy-not-readible.html
   [512]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@gem_pxp@protected-encrypted-src-copy-not-readible.html

  * igt@i915_module_load@reload-with-fault-injection:
    - shard-dg2:          [DMESG-WARN][513] ([i915#10887] / [i915#13447]) -> [PASS][514]
   [513]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-10/igt@i915_module_load@reload-with-fault-injection.html
   [514]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-7/igt@i915_module_load@reload-with-fault-injection.html

  * igt@i915_pm_rpm@system-suspend:
    - shard-glk:          [INCOMPLETE][515] ([i915#12797]) -> [PASS][516]
   [515]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-glk5/igt@i915_pm_rpm@system-suspend.html
   [516]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk2/igt@i915_pm_rpm@system-suspend.html

  * igt@kms_ccs@crc-primary-rotation-180-y-tiled-gen12-rc-ccs@pipe-a-hdmi-a-2:
    - shard-rkl:          [DMESG-WARN][517] ([i915#12964]) -> [PASS][518] +26 other tests pass
   [517]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-3/igt@kms_ccs@crc-primary-rotation-180-y-tiled-gen12-rc-ccs@pipe-a-hdmi-a-2.html
   [518]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_ccs@crc-primary-rotation-180-y-tiled-gen12-rc-ccs@pipe-a-hdmi-a-2.html

  * igt@kms_color@deep-color:
    - shard-dg2:          [SKIP][519] ([i915#3555]) -> [PASS][520]
   [519]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-8/igt@kms_color@deep-color.html
   [520]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@kms_color@deep-color.html

  * igt@kms_flip@plain-flip-fb-recreate@a-edp1:
    - shard-mtlp:         [FAIL][521] ([i915#13734]) -> [PASS][522] +1 other test pass
   [521]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-mtlp-3/igt@kms_flip@plain-flip-fb-recreate@a-edp1.html
   [522]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-8/igt@kms_flip@plain-flip-fb-recreate@a-edp1.html

  * igt@kms_flip@wf_vblank-ts-check:
    - shard-dg2:          [FAIL][523] ([i915#13734]) -> [PASS][524] +2 other tests pass
   [523]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-3/igt@kms_flip@wf_vblank-ts-check.html
   [524]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-1/igt@kms_flip@wf_vblank-ts-check.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-mmap-cpu:
    - shard-dg2:          [FAIL][525] ([i915#6880]) -> [PASS][526] +1 other test pass
   [525]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-3/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-mmap-cpu.html
   [526]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-5/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc:
    - shard-snb:          [SKIP][527] -> [PASS][528] +1 other test pass
   [527]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-snb2/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html
   [528]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-snb1/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_pm_dc@dc9-dpms:
    - shard-rkl:          [SKIP][529] ([i915#3361]) -> [PASS][530]
   [529]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-8/igt@kms_pm_dc@dc9-dpms.html
   [530]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_pm_dc@dc9-dpms.html

  * igt@kms_pm_lpsp@kms-lpsp:
    - shard-dg2:          [SKIP][531] ([i915#9340]) -> [PASS][532]
   [531]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-2/igt@kms_pm_lpsp@kms-lpsp.html
   [532]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_pm_lpsp@kms-lpsp.html

  * igt@kms_pm_rpm@i2c:
    - shard-dg1:          [DMESG-WARN][533] ([i915#4423]) -> [PASS][534] +2 other tests pass
   [533]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-15/igt@kms_pm_rpm@i2c.html
   [534]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-19/igt@kms_pm_rpm@i2c.html
    - shard-glk:          [FAIL][535] ([i915#8717]) -> [PASS][536]
   [535]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-glk3/igt@kms_pm_rpm@i2c.html
   [536]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-glk3/igt@kms_pm_rpm@i2c.html

  * igt@kms_pm_rpm@modeset-lpsp:
    - shard-dg2:          [SKIP][537] ([i915#9519]) -> [PASS][538] +2 other tests pass
   [537]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-10/igt@kms_pm_rpm@modeset-lpsp.html
   [538]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-8/igt@kms_pm_rpm@modeset-lpsp.html

  * igt@kms_pm_rpm@system-suspend-modeset:
    - shard-rkl:          [INCOMPLETE][539] -> [PASS][540]
   [539]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-3/igt@kms_pm_rpm@system-suspend-modeset.html
   [540]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-8/igt@kms_pm_rpm@system-suspend-modeset.html

  * igt@kms_vrr@negative-basic:
    - shard-mtlp:         [FAIL][541] ([i915#10393]) -> [PASS][542] +1 other test pass
   [541]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-mtlp-8/igt@kms_vrr@negative-basic.html
   [542]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-6/igt@kms_vrr@negative-basic.html

  * igt@perf_pmu@most-busy-idle-check-all@rcs0:
    - shard-rkl:          [FAIL][543] ([i915#4349]) -> [PASS][544] +1 other test pass
   [543]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-4/igt@perf_pmu@most-busy-idle-check-all@rcs0.html
   [544]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@perf_pmu@most-busy-idle-check-all@rcs0.html

  
#### Warnings ####

  * igt@kms_big_fb@yf-tiled-16bpp-rotate-0:
    - shard-dg1:          [SKIP][545] ([i915#4423] / [i915#4538]) -> [SKIP][546] ([i915#4538])
   [545]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-15/igt@kms_big_fb@yf-tiled-16bpp-rotate-0.html
   [546]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-16/igt@kms_big_fb@yf-tiled-16bpp-rotate-0.html

  * igt@kms_chamelium_hpd@vga-hpd-fast:
    - shard-dg1:          [SKIP][547] ([i915#11151] / [i915#7828]) -> [SKIP][548] ([i915#11151] / [i915#4423] / [i915#7828])
   [547]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-13/igt@kms_chamelium_hpd@vga-hpd-fast.html
   [548]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@kms_chamelium_hpd@vga-hpd-fast.html

  * igt@kms_content_protection@lic-type-0:
    - shard-dg2:          [SKIP][549] ([i915#9424]) -> [FAIL][550] ([i915#7173])
   [549]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-3/igt@kms_content_protection@lic-type-0.html
   [550]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-10/igt@kms_content_protection@lic-type-0.html

  * igt@kms_content_protection@mei-interface:
    - shard-dg1:          [SKIP][551] ([i915#9433]) -> [SKIP][552] ([i915#9424])
   [551]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-12/igt@kms_content_protection@mei-interface.html
   [552]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@kms_content_protection@mei-interface.html

  * igt@kms_content_protection@srm:
    - shard-dg2:          [SKIP][553] ([i915#7118]) -> [FAIL][554] ([i915#7173])
   [553]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-8/igt@kms_content_protection@srm.html
   [554]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@kms_content_protection@srm.html

  * igt@kms_cursor_crc@cursor-sliding-256x85:
    - shard-rkl:          [FAIL][555] ([i915#13566]) -> [DMESG-FAIL][556] ([i915#12964])
   [555]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-8/igt@kms_cursor_crc@cursor-sliding-256x85.html
   [556]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_cursor_crc@cursor-sliding-256x85.html

  * igt@kms_flip@flip-vs-fences:
    - shard-dg1:          [SKIP][557] ([i915#8381]) -> [SKIP][558] ([i915#4423] / [i915#8381])
   [557]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-17/igt@kms_flip@flip-vs-fences.html
   [558]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@kms_flip@flip-vs-fences.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-plflip-blt:
    - shard-dg2:          [SKIP][559] ([i915#3458]) -> [SKIP][560] ([i915#10433] / [i915#3458]) +3 other tests skip
   [559]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-10/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-plflip-blt.html
   [560]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-4/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-suspend:
    - shard-dg1:          [SKIP][561] ([i915#3458]) -> [SKIP][562] ([i915#3458] / [i915#4423])
   [561]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-19/igt@kms_frontbuffer_tracking@fbcpsr-suspend.html
   [562]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@kms_frontbuffer_tracking@fbcpsr-suspend.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-4:
    - shard-dg2:          [SKIP][563] ([i915#10433] / [i915#3458]) -> [SKIP][564] ([i915#3458])
   [563]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-4/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html
   [564]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-3/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-mtlp:         [SKIP][565] ([i915#12713]) -> [SKIP][566] ([i915#1187] / [i915#12713])
   [565]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-mtlp-4/igt@kms_hdr@brightness-with-hdr.html
   [566]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-mtlp-1/igt@kms_hdr@brightness-with-hdr.html
    - shard-dg2:          [SKIP][567] ([i915#12713]) -> [SKIP][568] ([i915#13331])
   [567]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg2-6/igt@kms_hdr@brightness-with-hdr.html
   [568]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg2-11/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-rkl:          [SKIP][569] ([i915#4816]) -> [SKIP][570] ([i915#4070] / [i915#4816])
   [569]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-4/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
   [570]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-5/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_plane_multiple@2x-tiling-yf:
    - shard-dg1:          [SKIP][571] -> [SKIP][572] ([i915#4423])
   [571]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-13/igt@kms_plane_multiple@2x-tiling-yf.html
   [572]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-18/igt@kms_plane_multiple@2x-tiling-yf.html

  * igt@kms_pm_rpm@dpms-non-lpsp:
    - shard-rkl:          [SKIP][573] ([i915#9519]) -> [DMESG-WARN][574] ([i915#12964])
   [573]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-rkl-7/igt@kms_pm_rpm@dpms-non-lpsp.html
   [574]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-rkl-3/igt@kms_pm_rpm@dpms-non-lpsp.html

  * igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-exceed-fully-sf:
    - shard-dg1:          [SKIP][575] ([i915#11520] / [i915#4423]) -> [SKIP][576] ([i915#11520])
   [575]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-13/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-exceed-fully-sf.html
   [576]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-15/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_rotation_crc@primary-4-tiled-reflect-x-180:
    - shard-dg1:          [SKIP][577] ([i915#4423] / [i915#5289]) -> [SKIP][578] ([i915#5289])
   [577]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8288/shard-dg1-17/igt@kms_rotation_crc@primary-4-tiled-reflect-x-180.html
   [578]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12848/shard-dg1-17/igt@kms_rotation_crc@primary-4-tiled-reflect-x-180.html

  
  [i915#10056]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10056
  [i915#10307]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10307
  [i915#10393]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10393
  [i915#10433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10433
  [i915#10434]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10434
  [i915#10647]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10647
  [i915#10656]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10656
  [i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
  [i915#10887]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10887
  [i915#1099]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1099
  [i915#11151]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11151
  [i915#11520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11520
  [i915#11681]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11681
  [i915#1187]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1187
  [i915#11920]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11920
  [i915#11965]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11965
  [i915#12169]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12169
  [i915#12178]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12178
  [i915#12247]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12247
  [i915#12313]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12313
  [i915#12314]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12314
  [i915#12316]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12316
  [i915#12339]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12339
  [i915#12343]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12343
  [i915#12353]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12353
  [i915#12388]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12388
  [i915#12454]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12454
  [i915#12549]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12549
  [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#12797]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12797
  [i915#12916]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12916
  [i915#12917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12917
  [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#13027]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13027
  [i915#13029]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13029
  [i915#13046]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13046
  [i915#13049]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13049
  [i915#13179]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13179
  [i915#13193]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13193
  [i915#13331]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13331
  [i915#13353]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13353
  [i915#13356]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13356
  [i915#13368]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13368
  [i915#13427]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13427
  [i915#13441]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13441
  [i915#13447]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13447
  [i915#13520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13520
  [i915#13550]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13550
  [i915#13566]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13566
  [i915#13688]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13688
  [i915#13691]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13691
  [i915#13707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13707
  [i915#13734]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13734
  [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#13798]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13798
  [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#2065]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2065
  [i915#2190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2190
  [i915#2346]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2346
  [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#2575]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2575
  [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#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#3361]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3361
  [i915#3458]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3458
  [i915#3469]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3469
  [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#3828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3828
  [i915#3840]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3840
  [i915#3955]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3955
  [i915#4036]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4036
  [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#4235]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4235
  [i915#4270]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4270
  [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#4839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4839
  [i915#4852]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4852
  [i915#4854]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4854
  [i915#4860]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4860
  [i915#4873]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4873
  [i915#4880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4880
  [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#5465]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5465
  [i915#5493]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5493
  [i915#5784]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5784
  [i915#5956]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5956
  [i915#5978]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5978
  [i915#6095]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6095
  [i915#6187]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6187
  [i915#6230]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6230
  [i915#6301]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6301
  [i915#6334]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6334
  [i915#6344]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6344
  [i915#6524]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6524
  [i915#658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/658
  [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#7173]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7173
  [i915#7276]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7276
  [i915#7387]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7387
  [i915#7443]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7443
  [i915#7582]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7582
  [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#7862]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7862
  [i915#7975]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7975
  [i915#7984]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7984
  [i915#8213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8213
  [i915#8228]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8228
  [i915#8346]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8346
  [i915#8381]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8381
  [i915#8399]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8399
  [i915#8411]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8411
  [i915#8414]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8414
  [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#8709]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8709
  [i915#8717]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8717
  [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#9053]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9053
  [i915#9067]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9067
  [i915#9100]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9100
  [i915#9295]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9295
  [i915#9311]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9311
  [i915#9318]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9318
  [i915#9323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9323
  [i915#9340]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9340
  [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#9531]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9531
  [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#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#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_8288 -> IGTPW_12848

  CI-20190529: 20190529
  CI_DRM_16321: 14c330bc015ded4a1f1dd1f5aeb8617077aaa7e8 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_12848: 12848
  IGT_8288: 8288

== Logs ==

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

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

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

* ✗ Xe.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev7)
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (39 preceding siblings ...)
  2025-03-27  5:26 ` ✗ i915.CI.Full: failure " Patchwork
@ 2025-03-27 13:49 ` Patchwork
  2025-03-28 12:00 ` Patchwork
                   ` (2 subsequent siblings)
  43 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-03-27 13:49 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

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

== Series Details ==

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

== Summary ==

ERROR: The runconfig 'XEIGTPW_12848_FULL' does not exist in the database

== Logs ==

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

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

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

* ✗ Xe.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev7)
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (40 preceding siblings ...)
  2025-03-27 13:49 ` ✗ Xe.CI.Full: " Patchwork
@ 2025-03-28 12:00 ` Patchwork
  2025-04-03 10:12 ` [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Sharma, Swati2
  2025-04-06 16:26 ` ✗ Xe.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev7) Patchwork
  43 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-03-28 12:00 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

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

== Series Details ==

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

== Summary ==

ERROR: The runconfig 'XEIGT_8288_FULL' does not exist in the database

== Logs ==

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

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

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

* Re: [PATCH V7 03/37] lib/igt_kms: Move get_writeback_formats_blob to lib
  2025-03-26 23:35 ` [PATCH V7 03/37] lib/igt_kms: Move get_writeback_formats_blob to lib Alex Hung
@ 2025-04-03  6:41   ` Sharma, Swati2
  0 siblings, 0 replies; 49+ messages in thread
From: Sharma, Swati2 @ 2025-04-03  6:41 UTC (permalink / raw)
  To: Alex Hung, igt-dev; +Cc: harry.wentland

Hi Alex,

On 27-03-2025 05:05 am, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
>
> We'll need it in other tests
>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   lib/igt_kms.c         | 19 +++++++++++++++++++
>   lib/igt_kms.h         |  2 ++
>   tests/kms_writeback.c | 19 -------------------
>   3 files changed, 21 insertions(+), 19 deletions(-)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 99c8707c7..884d78749 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -7434,3 +7434,22 @@ int igt_backlight_write(int value, const char *fname, igt_backlight_context_t *c
>   
>   	return 0;
>   }
> +
> +drmModePropertyBlobRes *get_writeback_formats_blob(igt_output_t *output)
Please write function documentation comment.
> +{
> +	drmModePropertyBlobRes *blob = NULL;
> +	uint64_t blob_id;
> +	int ret;
> +
> +	ret = kmstest_get_property(output->display->drm_fd,
> +				   output->config.connector->connector_id,
> +				   DRM_MODE_OBJECT_CONNECTOR,
> +				   igt_connector_prop_names[IGT_CONNECTOR_WRITEBACK_PIXEL_FORMATS],
> +				   NULL, &blob_id, NULL);
> +	if (ret)
> +		blob = drmModeGetPropertyBlob(output->display->drm_fd, blob_id);
> +
> +	igt_assert(blob);
> +
> +	return blob;
> +}
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 0381c82ad..9b5a940f7 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -1280,4 +1280,6 @@ void igt_set_link_params(int drm_fd, igt_output_t *output,
>   int igt_backlight_read(int *result, const char *fname, igt_backlight_context_t *context);
>   int igt_backlight_write(int value, const char *fname, igt_backlight_context_t *context);
>   
> +drmModePropertyBlobRes *get_writeback_formats_blob(igt_output_t *output);
> +
>   #endif /* __IGT_KMS_H__ */
> diff --git a/tests/kms_writeback.c b/tests/kms_writeback.c
> index e3671c59b..f733f3ce6 100644
> --- a/tests/kms_writeback.c
> +++ b/tests/kms_writeback.c
> @@ -92,25 +92,6 @@ enum {
>   	XRGB2101010 = 1 << 1,
>   };
>   
> -static drmModePropertyBlobRes *get_writeback_formats_blob(igt_output_t *output)
> -{
> -	drmModePropertyBlobRes *blob = NULL;
> -	uint64_t blob_id;
> -	int ret;
> -
> -	ret = kmstest_get_property(output->display->drm_fd,
> -				   output->config.connector->connector_id,
> -				   DRM_MODE_OBJECT_CONNECTOR,
> -				   igt_connector_prop_names[IGT_CONNECTOR_WRITEBACK_PIXEL_FORMATS],
> -				   NULL, &blob_id, NULL);
> -	if (ret)
> -		blob = drmModeGetPropertyBlob(output->display->drm_fd, blob_id);
> -
> -	igt_assert(blob);
> -
> -	return blob;
> -}
> -
>   static bool check_writeback_config(igt_display_t *display, igt_output_t *output,
>   				    drmModeModeInfo override_mode)
>   {


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

* Re: [PATCH V7 12/37] tests/kms_colorop: Add kms_colorop tests
  2025-03-26 23:35 ` [PATCH V7 12/37] tests/kms_colorop: Add kms_colorop tests Alex Hung
@ 2025-04-03  9:57   ` Sharma, Swati2
  0 siblings, 0 replies; 49+ messages in thread
From: Sharma, Swati2 @ 2025-04-03  9:57 UTC (permalink / raw)
  To: Alex Hung, igt-dev; +Cc: harry.wentland

Hi Alex,

While applying this patch

Applying: tests/kms_colorop: Add kms_colorop tests
.git/rebase-apply/patch:544: new blank line at EOF.
+
warning: 1 line adds whitespace errors.

Please fix

On 27-03-2025 05:05 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.
>
> v3:
>   - skip tests if color pipeline not found
>   - Rename colorop to color_pipeline in places where it refers
>     to the entire pipeline (Sebastian)
>
> v2:
>   - Make tests dynamic, allowing definition of tests with an
>     arbitrary number of transforms
>   - Add test for sRGB Inverse EOTF
>   - Add test for sRGB EOTF, followed by sRGB Inverse EOTF
>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   tests/kms_colorop.c | 530 ++++++++++++++++++++++++++++++++++++++++++++
>   tests/kms_colorop.h |  87 ++++++++
>   tests/meson.build   |   1 +
>   3 files changed, 618 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..b9009a498
> --- /dev/null
> +++ b/tests/kms_colorop.c
> @@ -0,0 +1,530 @@
> +/*
> + * 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);
> +
> +	/* TODO 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);
> +	else
> +		/*
> +		 * 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];
> +
> +	/*
> +	 * TODO
> +	 *
> +	 * This is wrong and loses precision since it always goes back
> +	 * to an 8-bpc framebuffer.
> +	 *
> +	 * Instead we need to stay as UNORM or float 16-bpc value throughout
> +	 * all transforms.
> +	 */
> +
> +	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*/
> +
> +	/* TODO do we need this? might be good sanity anyways */
> +	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 < sizeof(tests) / sizeof (tests[0]); i++) {
> +		igt_describe("Bla bla bla");
> +		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");
> +#if 0
> +	igt_subtest("plane-srgb") {
> +		colorop_plane_test(&display, colorops_srgb);
> +	}
> +	igt_subtest("plane-inv_srgb") {
> +		colorop_plane_test(&display, colorops_srgb_inv);
> +	}
> +#endif
> +	igt_fixture {
> +
> +		igt_display_fini(&display);
> +	}
> +}
> +
> diff --git a/tests/kms_colorop.h b/tests/kms_colorop.h
> new file mode 100644
> index 000000000..8102d25b1
> --- /dev/null
> +++ b/tests/kms_colorop.h
> @@ -0,0 +1,87 @@
> +/*
> + * 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 fda8584e9..dcdccef18 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -23,6 +23,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 V7 08/37] lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE
  2025-03-26 23:35 ` [PATCH V7 08/37] lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE Alex Hung
@ 2025-04-03 10:04   ` Sharma, Swati2
  0 siblings, 0 replies; 49+ messages in thread
From: Sharma, Swati2 @ 2025-04-03 10:04 UTC (permalink / raw)
  To: Alex Hung, igt-dev; +Cc: harry.wentland

Hi Alex,

Destroy colorops on exit in this patch itself.
Something which Bhanu had added separate patch
https://patchwork.freedesktop.org/patch/591122/?series=132839&rev=1

On 27-03-2025 05:05 am, Alex Hung wrote:
> From: Harry Wentland <harry.wentland@amd.com>
>
> We've introduced a new drm_colorop object in DRM. These are
> used to make up a color pipeline. Introduce the concept of
> this new DRM core object to IGT, including:
>   - discovery of drm_colorop objects during init
>   - various helper functions for deaing with drm_colorops
>   - handling drm_colorops in atomic commit
>
> Along with this we're also introducing a new COLOR_PIPELINE
> plane property to track and be able to retrieve the colorops.
>
> v6:
>   - Ignore COLOR_PIPELINE property if
>     DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE not set
>
> v5:
>   - Fix warning
>
> v3:
>   - Add commit description (Kamil)
>   - Add description for public functions (Kamil)
>   - Squash with COLOR_PIPELINE patch
>   - Remove need for IOCTLs
>   - Change colorop discovery to work without IOCTLs
>   - move enum drm_colorop_type to drm_mode.h
>   - Drop display from colorop prop_enum functions
>
> v2:
>   - Iterate through all next drm_colorop objects
>
> Signed-off-by: Harry Wentland <harry.wentland@amd.com>
> ---
>   lib/igt_kms.c          | 271 ++++++++++++++++++++++++++++++++++++++++-
>   lib/igt_kms.h          |  89 ++++++++++++++
>   tests/kms_properties.c |   5 +-
>   3 files changed, 358 insertions(+), 7 deletions(-)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 88ed35f07..3f0ad25ce 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 32
>   
>   typedef bool (*igt_connector_attr_set)(int dir, const char *attr, const char *value);
>   
> @@ -701,6 +702,14 @@ const char * const igt_plane_prop_names[IGT_NUM_PLANE_PROPS] = {
>   	[IGT_PLANE_FB_DAMAGE_CLIPS] = "FB_DAMAGE_CLIPS",
>   	[IGT_PLANE_SCALING_FILTER] = "SCALING_FILTER",
>   	[IGT_PLANE_SIZE_HINTS] = "SIZE_HINTS",
> +	[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] = {
> @@ -768,6 +777,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.
> @@ -799,6 +910,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);
>   	}
>   
> @@ -2999,16 +3113,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;
> @@ -3626,6 +3738,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;
>   		}
> @@ -3675,6 +3789,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.
> @@ -4122,6 +4275,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);
> @@ -4210,6 +4382,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.
> @@ -4242,6 +4452,50 @@ 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.
> @@ -4514,6 +4768,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 7531ae53b..04a96f47a 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -365,9 +365,18 @@ enum igt_atomic_plane_properties {
>          IGT_PLANE_HOTSPOT_X,
>          IGT_PLANE_HOTSPOT_Y,
>          IGT_PLANE_SIZE_HINTS,
> +       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
>    *
> @@ -376,10 +385,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,
> @@ -405,6 +424,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;
> @@ -438,6 +471,11 @@ typedef struct igt_plane {
>   	uint64_t *modifiers;
>   	uint32_t *formats;
>   	int 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;
>   
>   /*
> @@ -496,9 +534,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;
> @@ -841,6 +881,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);
> @@ -1283,4 +1370,6 @@ int igt_backlight_write(int value, const char *fname, igt_backlight_context_t *c
>   
>   drmModePropertyBlobRes *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 01ec3bedc..1f21fd851 100644
> --- a/tests/kms_properties.c
> +++ b/tests/kms_properties.c
> @@ -112,7 +112,10 @@ 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_RANGE")) {
> +		if (!has_color_pipeline && !strcmp(name, "COLOR_PIPELINE")) {
> +			printf("hwhw: ignoring COLOR_PIPELINE\n");
> +			return true;
> +		}		if (has_color_pipeline && !strcmp(name, "COLOR_RANGE")) {
>   			printf("hwhw: ignoring COLOR_RANGE\n");
>   			return true;
>   		}


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

* Re: [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (41 preceding siblings ...)
  2025-03-28 12:00 ` Patchwork
@ 2025-04-03 10:12 ` Sharma, Swati2
  2025-04-07 23:26   ` Alex Hung
  2025-04-06 16:26 ` ✗ Xe.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev7) Patchwork
  43 siblings, 1 reply; 49+ messages in thread
From: Sharma, Swati2 @ 2025-04-03 10:12 UTC (permalink / raw)
  To: Alex Hung, igt-dev; +Cc: harry.wentland

Hi Alex,

I could see there were few patches from Bhanu in rev4
required to enable plane color pipeline on intel h/w.
https://patchwork.freedesktop.org/series/123448/#rev4

However, those seems missing on latest rev7.

On 27-03-2025 05:05 am, Alex Hung wrote:
> 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-v8
>
> 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):
>    lib/igt_kms: increase MAX_NUM_COLOROPS to 128
>    tests/kms_colorop: Add a sRGB test for EOTF -> Inverse EOTF -> EOTF
>    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
>
> Harry Wentland (28):
>    lib/drmtest: Add is_vkms_device()
>    tests/kms_writeback: Fix kms_writeback for VKMS
>    lib/igt_kms: Move get_writeback_formats_blob to lib
>    lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
>    include/drm-uapi: Add COLOROP object
>    drm-uapi: Add 3x4 CTM
>    drm-uapi: Add 1D LUT drm_colorop_type
>    lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE
>    tests/kms_properties: Add colorop properties test
>    igt/color: Add SW color transform functionality
>    lib/igt_fb: Add copy_fb function
>    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: Parametrize the buffer format
>    tests/kms_colorop: Add 10bpc test and skip if format not supported
>    tests/kms_colorop: Skip if writeback does not support fourcc
>    lib/igt_fb: Allow any non-planar format for igt_copy_fb
>    kms/colorop: Do proper setup and cleanup
>    lib/igt_color: Support color transform for XRGB2101010
>    tests/kms_colorop: Set wide [13, 13] bracket for comparison on amdgpu
>    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 tests for BT2020/BT709 TFs
>    lib/igt_color: Point license header at skia license
>
>   include/drm-uapi/amdgpu_drm.h |    9 -
>   include/drm-uapi/drm.h        |   15 +
>   include/drm-uapi/drm_mode.h   |   99 +
>   lib/drmtest.c                 |    5 +
>   lib/drmtest.h                 |    1 +
>   lib/igt_color.c               |  648 +++++
>   lib/igt_color.h               |  162 ++
>   lib/igt_color_lut.h           | 4946 +++++++++++++++++++++++++++++++++
>   lib/igt_fb.c                  |   34 +-
>   lib/igt_fb.h                  |    3 +
>   lib/igt_kms.c                 |  359 ++-
>   lib/igt_kms.h                 |  100 +
>   lib/meson.build               |    1 +
>   scripts/convert_3dlut.py      |   94 +
>   tests/kms_colorop.c           |  702 +++++
>   tests/kms_colorop.h           |  261 ++
>   tests/kms_properties.c        |   94 +-
>   tests/kms_writeback.c         |   38 +-
>   tests/meson.build             |    1 +
>   19 files changed, 7523 insertions(+), 49 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
>


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

* ✗ Xe.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev7)
  2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
                   ` (42 preceding siblings ...)
  2025-04-03 10:12 ` [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Sharma, Swati2
@ 2025-04-06 16:26 ` Patchwork
  43 siblings, 0 replies; 49+ messages in thread
From: Patchwork @ 2025-04-06 16:26 UTC (permalink / raw)
  To: Harry Wentland; +Cc: igt-dev

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

== Series Details ==

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

== Summary ==

CI Bug Log - changes from XEIGT_8288_FULL -> XEIGTPW_12848_FULL
====================================================

Summary
-------

  **FAILURE**

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

  No changes in participating hosts

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@kms_colorop@plane-xr24-xr24-bt2020_oetf (NEW):
    - shard-lnl:          NOTRUN -> [SKIP][1] +45 other tests skip
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/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] +31 other tests skip
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/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] +45 other tests skip
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_colorop@plane-xr30-xr30-pq_125_inv_eotf.html

  * igt@kms_fb_coherency@memset-crc:
    - shard-bmg:          [PASS][4] -> ([CRASH][5], [PASS][6]) +1 other test ( 1 crash, 1 pass )
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_fb_coherency@memset-crc.html
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_fb_coherency@memset-crc.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_fb_coherency@memset-crc.html
    - shard-dg2-set2:     [PASS][7] -> ([CRASH][8], [PASS][9]) +1 other test ( 1 crash, 1 pass )
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@kms_fb_coherency@memset-crc.html
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_fb_coherency@memset-crc.html
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_fb_coherency@memset-crc.html

  * igt@kms_fb_coherency@memset-crc@mmap-offset-wc:
    - shard-lnl:          [PASS][10] -> ([PASS][11], [CRASH][12]) +1 other test ( 1 crash, 1 pass )
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-1/igt@kms_fb_coherency@memset-crc@mmap-offset-wc.html
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@kms_fb_coherency@memset-crc@mmap-offset-wc.html
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_fb_coherency@memset-crc@mmap-offset-wc.html

  * igt@kms_plane_lowres@tiling-4:
    - shard-dg2-set2:     [PASS][13] -> ([INCOMPLETE][14], [PASS][15]) +1 other test ( 1 incomplete, 1 pass )
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-436/igt@kms_plane_lowres@tiling-4.html
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_plane_lowres@tiling-4.html
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_plane_lowres@tiling-4.html

  * igt@xe_fault_injection@vm-bind-fail-vm_bind_ioctl_ops_create:
    - shard-bmg:          [PASS][16] -> ([PASS][17], [ABORT][18])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@xe_fault_injection@vm-bind-fail-vm_bind_ioctl_ops_create.html
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_fault_injection@vm-bind-fail-vm_bind_ioctl_ops_create.html
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_fault_injection@vm-bind-fail-vm_bind_ioctl_ops_create.html

  
New tests
---------

  New tests have been introduced between XEIGT_8288_FULL and XEIGTPW_12848_FULL:

### New IGT tests (94) ###

  * igt@kms_colorop@plane-xr24-xr24-3dlut_17_12_rgb:
    - Statuses : 2 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 : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr24-xr24-bt2020_oetf:
    - Statuses : 2 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 : 2 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 : 3 skip(s)
    - Exec time: [0.0] s

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

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

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

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

  * igt@kms_colorop@plane-xr24-xr24-pq_125_eotf-pq_125_inv_eotf-pq_125_eotf:
    - Statuses : 2 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 : 1 skip(s)
    - Exec time: [0.0] 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 : 2 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 : 2 skip(s)
    - Exec time: [0.0] s

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

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

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

  * igt@kms_colorop@plane-xr24-xr24-srgb_inv_eotf_lut-srgb_eotf_lut:
    - Statuses : 2 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 : 1 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 : 2 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 : 3 skip(s)
    - Exec time: [0.0] s

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

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

  * igt@kms_colorop@plane-xr30-xr30-ctm_3x4_bt709_enc_dec:
    - Statuses : 2 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 : 3 skip(s)
    - Exec time: [0.0] s

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

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

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

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

  * igt@kms_colorop@plane-xr30-xr30-pq_125_inv_eotf:
    - Statuses : 2 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 : 3 skip(s)
    - Exec time: [0.0] 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 : 3 skip(s)
    - Exec time: [0.0] s

  * igt@kms_colorop@plane-xr30-xr30-srgb_eotf-srgb_inv_eotf:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] 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 : 2 skip(s)
    - Exec time: [0.0] s

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

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

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

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

  * igt@kms_properties@colorop-properties-atomic@pipe-a-dp-4:
    - Statuses : 1 pass(s)
    - Exec time: [0.20] 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.14] s

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

  * igt@kms_properties@colorop-properties-atomic@pipe-b-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.19] 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.16] 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.13] s

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

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

  * igt@kms_properties@colorop-properties-atomic@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.21] 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.13] s

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

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

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

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

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

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

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

  * igt@kms_properties@colorop-properties-legacy@pipe-a-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [0.39] 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.29] 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.19] s

  * igt@kms_properties@colorop-properties-legacy@pipe-b-hdmi-a-3:
    - Statuses : 1 pass(s)
    - Exec time: [0.15] 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.19] s

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

  * igt@kms_properties@colorop-properties-legacy@pipe-c-edp-1:
    - Statuses : 1 pass(s)
    - Exec time: [1.16] 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.13] s

  * igt@kms_properties@colorop-properties-legacy@pipe-d-dp-2:
    - Statuses : 1 pass(s)
    - Exec time: [0.19] 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.16] s

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

  

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

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

### IGT changes ###

#### Issues hit ####

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear:
    - shard-lnl:          [PASS][19] -> ([PASS][20], [FAIL][21]) ([Intel XE#911]) +3 other tests ( 1 fail, 1 pass )
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-8/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear.html
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear.html
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][22], [SKIP][23]) ([Intel XE#2550] / [Intel XE#3767]) +15 other tests ( 2 skip )
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs.html
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs.html

  * igt@kms_async_flips@invalid-async-flip:
    - shard-dg2-set2:     NOTRUN -> [SKIP][24] ([Intel XE#873])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_async_flips@invalid-async-flip.html

  * igt@kms_async_flips@test-cursor-atomic:
    - shard-lnl:          [PASS][25] -> ([PASS][26], [SKIP][27]) ([Intel XE#664])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-6/igt@kms_async_flips@test-cursor-atomic.html
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_async_flips@test-cursor-atomic.html
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@kms_async_flips@test-cursor-atomic.html

  * igt@kms_big_fb@4-tiled-64bpp-rotate-90:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][28], [SKIP][29]) ([Intel XE#316]) +1 other test ( 2 skip )
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_big_fb@4-tiled-64bpp-rotate-90.html
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_big_fb@4-tiled-64bpp-rotate-90.html

  * igt@kms_big_fb@linear-32bpp-rotate-270:
    - shard-bmg:          NOTRUN -> [SKIP][30] ([Intel XE#2327])
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_big_fb@linear-32bpp-rotate-270.html

  * igt@kms_big_fb@linear-32bpp-rotate-90:
    - shard-bmg:          NOTRUN -> ([SKIP][31], [SKIP][32]) ([Intel XE#2327]) +2 other tests ( 2 skip )
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_big_fb@linear-32bpp-rotate-90.html
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_big_fb@linear-32bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-16bpp-rotate-270:
    - shard-lnl:          NOTRUN -> [SKIP][33] ([Intel XE#1407])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_big_fb@x-tiled-16bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-64bpp-rotate-0:
    - shard-adlp:         NOTRUN -> [DMESG-FAIL][34] ([Intel XE#4543])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@kms_big_fb@x-tiled-64bpp-rotate-0.html

  * igt@kms_big_fb@x-tiled-8bpp-rotate-270:
    - shard-dg2-set2:     NOTRUN -> [SKIP][35] ([Intel XE#316]) +1 other test skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_big_fb@x-tiled-8bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-16bpp-rotate-0:
    - shard-dg2-set2:     NOTRUN -> [SKIP][36] ([Intel XE#1124]) +1 other test skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_big_fb@y-tiled-16bpp-rotate-0.html
    - shard-lnl:          NOTRUN -> ([SKIP][37], [SKIP][38]) ([Intel XE#1124]) +3 other tests ( 2 skip )
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@kms_big_fb@y-tiled-16bpp-rotate-0.html
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_big_fb@y-tiled-16bpp-rotate-0.html

  * igt@kms_big_fb@y-tiled-16bpp-rotate-180:
    - shard-bmg:          NOTRUN -> ([SKIP][39], [SKIP][40]) ([Intel XE#1124]) +5 other tests ( 2 skip )
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_big_fb@y-tiled-16bpp-rotate-180.html
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_big_fb@y-tiled-16bpp-rotate-180.html

  * igt@kms_big_fb@y-tiled-16bpp-rotate-270:
    - shard-adlp:         NOTRUN -> [SKIP][41] ([Intel XE#316])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@kms_big_fb@y-tiled-16bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-8bpp-rotate-270:
    - shard-lnl:          NOTRUN -> [SKIP][42] ([Intel XE#1124])
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_big_fb@y-tiled-8bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip:
    - shard-adlp:         [PASS][43] -> [DMESG-FAIL][44] ([Intel XE#4543]) +11 other tests dmesg-fail
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-2/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
    - shard-bmg:          NOTRUN -> [SKIP][45] ([Intel XE#1124]) +7 other tests skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-16bpp-rotate-0:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][46], [SKIP][47]) ([Intel XE#1124]) +6 other tests ( 2 skip )
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_big_fb@yf-tiled-16bpp-rotate-0.html
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_big_fb@yf-tiled-16bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
    - shard-adlp:         NOTRUN -> [SKIP][48] ([Intel XE#1124]) +2 other tests skip
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html

  * igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p:
    - shard-bmg:          [PASS][49] -> ([SKIP][50], [PASS][51]) ([Intel XE#2314] / [Intel XE#2894])
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-7/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html

  * igt@kms_bw@connected-linear-tiling-3-displays-2560x1440p:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#2314] / [Intel XE#2894])
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_bw@connected-linear-tiling-3-displays-2560x1440p.html
    - shard-dg2-set2:     NOTRUN -> ([SKIP][53], [SKIP][54]) ([Intel XE#2191])
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_bw@connected-linear-tiling-3-displays-2560x1440p.html
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_bw@connected-linear-tiling-3-displays-2560x1440p.html

  * igt@kms_bw@linear-tiling-2-displays-1920x1080p:
    - shard-bmg:          NOTRUN -> [SKIP][55] ([Intel XE#367])
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_bw@linear-tiling-2-displays-1920x1080p.html

  * igt@kms_bw@linear-tiling-2-displays-2160x1440p:
    - shard-lnl:          NOTRUN -> ([SKIP][56], [SKIP][57]) ([Intel XE#367])
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_bw@linear-tiling-2-displays-2160x1440p.html
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_bw@linear-tiling-2-displays-2160x1440p.html

  * igt@kms_bw@linear-tiling-3-displays-3840x2160p:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][58], [SKIP][59]) ([Intel XE#367]) +1 other test ( 2 skip )
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-4-displays-3840x2160p:
    - shard-bmg:          NOTRUN -> ([SKIP][60], [SKIP][61]) ([Intel XE#367])
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_bw@linear-tiling-4-displays-3840x2160p.html
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_bw@linear-tiling-4-displays-3840x2160p.html

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs@pipe-a-dp-2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][62] ([Intel XE#787]) +158 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/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][63] ([Intel XE#2652] / [Intel XE#787]) +7 other tests skip
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-d-hdmi-a-3:
    - shard-bmg:          NOTRUN -> ([SKIP][64], [SKIP][65]) ([Intel XE#2652] / [Intel XE#787]) +4 other tests ( 2 skip )
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-d-hdmi-a-3.html
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-d-hdmi-a-3.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-a-dp-4:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][66], [SKIP][67]) ([Intel XE#787]) +105 other tests ( 2 skip )
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-a-dp-4.html
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-a-dp-4.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc:
    - shard-lnl:          NOTRUN -> [SKIP][68] ([Intel XE#2887])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][69] ([Intel XE#2887]) +8 other tests skip
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_ccs@crc-primary-basic-y-tiled-ccs:
    - shard-bmg:          NOTRUN -> ([SKIP][70], [SKIP][71]) ([Intel XE#2887]) +5 other tests ( 2 skip )
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_ccs@crc-primary-basic-y-tiled-ccs.html
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_ccs@crc-primary-basic-y-tiled-ccs.html

  * igt@kms_ccs@crc-primary-basic-yf-tiled-ccs:
    - shard-adlp:         NOTRUN -> [SKIP][72] ([Intel XE#455] / [Intel XE#787]) +1 other test skip
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@kms_ccs@crc-primary-basic-yf-tiled-ccs.html

  * igt@kms_ccs@crc-primary-basic-yf-tiled-ccs@pipe-b-hdmi-a-1:
    - shard-adlp:         NOTRUN -> [SKIP][73] ([Intel XE#787]) +2 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@kms_ccs@crc-primary-basic-yf-tiled-ccs@pipe-b-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs:
    - shard-bmg:          NOTRUN -> ([SKIP][74], [SKIP][75]) ([Intel XE#3432]) +1 other test ( 2 skip )
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4:
    - shard-dg2-set2:     NOTRUN -> ([INCOMPLETE][76], [PASS][77]) ([Intel XE#3862]) +1 other test ( 1 incomplete, 1 pass )
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4.html
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs:
    - shard-lnl:          NOTRUN -> ([SKIP][78], [SKIP][79]) ([Intel XE#3432])
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs.html
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-d-dp-4:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][80], [SKIP][81]) ([Intel XE#455] / [Intel XE#787]) +30 other tests ( 2 skip )
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-d-dp-4.html
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-d-dp-4.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs:
    - shard-adlp:         NOTRUN -> [SKIP][82] ([Intel XE#2907])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> ([SKIP][83], [SKIP][84]) ([Intel XE#2669]) +3 other tests ( 2 skip )
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs@pipe-a-edp-1.html
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs@pipe-a-edp-1.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs@pipe-d-dp-2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][85] ([Intel XE#455] / [Intel XE#787]) +29 other tests skip
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs@pipe-d-dp-2.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs:
    - shard-dg2-set2:     [PASS][86] -> ([INCOMPLETE][87], [INCOMPLETE][88]) ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124] / [Intel XE#4345])
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
    - shard-lnl:          NOTRUN -> ([SKIP][89], [SKIP][90]) ([Intel XE#2887]) +2 other tests ( 2 skip )
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-dp-4:
    - shard-dg2-set2:     [PASS][91] -> [INCOMPLETE][92] ([Intel XE#2705] / [Intel XE#4212]) +1 other test incomplete
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-dp-4.html
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-c-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-dp-4:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][93] ([Intel XE#3124])
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-6:
    - shard-dg2-set2:     [PASS][94] -> ([INCOMPLETE][95], [DMESG-WARN][96]) ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124])
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-6.html
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-6.html
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][97], [SKIP][98]) ([Intel XE#2907]) +1 other test ( 2 skip )
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/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][99] ([Intel XE#4416]) +3 other tests skip
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_cdclk@plane-scaling@pipe-b-dp-4.html

  * igt@kms_chamelium_color@ctm-max:
    - shard-bmg:          NOTRUN -> ([SKIP][100], [SKIP][101]) ([Intel XE#2325]) +1 other test ( 2 skip )
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_chamelium_color@ctm-max.html
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_chamelium_color@ctm-max.html

  * igt@kms_chamelium_color@ctm-red-to-blue:
    - shard-bmg:          NOTRUN -> [SKIP][102] ([Intel XE#2325])
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_chamelium_color@ctm-red-to-blue.html

  * igt@kms_chamelium_color@degamma:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][103], [SKIP][104]) ([Intel XE#306]) +1 other test ( 2 skip )
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_chamelium_color@degamma.html
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_chamelium_color@degamma.html

  * igt@kms_chamelium_color@gamma:
    - shard-lnl:          NOTRUN -> ([SKIP][105], [SKIP][106]) ([Intel XE#306])
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_chamelium_color@gamma.html
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@kms_chamelium_color@gamma.html
    - shard-adlp:         NOTRUN -> [SKIP][107] ([Intel XE#306])
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-9/igt@kms_chamelium_color@gamma.html

  * igt@kms_chamelium_frames@hdmi-aspect-ratio:
    - shard-bmg:          NOTRUN -> [SKIP][108] ([Intel XE#2252]) +5 other tests skip
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_chamelium_frames@hdmi-aspect-ratio.html

  * igt@kms_chamelium_frames@hdmi-crc-fast:
    - shard-adlp:         NOTRUN -> [SKIP][109] ([Intel XE#373])
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_chamelium_frames@hdmi-crc-fast.html

  * igt@kms_chamelium_frames@vga-frame-dump:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][110], [SKIP][111]) ([Intel XE#373]) +1 other test ( 2 skip )
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_chamelium_frames@vga-frame-dump.html
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_chamelium_frames@vga-frame-dump.html

  * igt@kms_chamelium_hpd@common-hpd-after-suspend:
    - shard-bmg:          NOTRUN -> ([SKIP][112], [SKIP][113]) ([Intel XE#2252]) +4 other tests ( 2 skip )
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_chamelium_hpd@common-hpd-after-suspend.html
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_chamelium_hpd@common-hpd-after-suspend.html

  * igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode:
    - shard-lnl:          NOTRUN -> ([SKIP][114], [SKIP][115]) ([Intel XE#373]) +2 other tests ( 2 skip )
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode.html
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode.html

  * igt@kms_chamelium_hpd@vga-hpd-after-suspend:
    - shard-dg2-set2:     NOTRUN -> [SKIP][116] ([Intel XE#373])
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_chamelium_hpd@vga-hpd-after-suspend.html

  * igt@kms_content_protection@atomic-dpms@pipe-a-dp-2:
    - shard-dg2-set2:     NOTRUN -> [FAIL][117] ([Intel XE#1178]) +1 other test fail
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_content_protection@atomic-dpms@pipe-a-dp-2.html

  * igt@kms_content_protection@atomic@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][118] ([Intel XE#1178])
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_content_protection@atomic@pipe-a-dp-2.html

  * igt@kms_content_protection@dp-mst-lic-type-1:
    - shard-bmg:          NOTRUN -> [SKIP][119] ([Intel XE#2390])
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_content_protection@dp-mst-lic-type-1.html
    - shard-adlp:         NOTRUN -> [SKIP][120] ([Intel XE#307])
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_content_protection@dp-mst-lic-type-1.html
    - shard-lnl:          NOTRUN -> ([SKIP][121], [SKIP][122]) ([Intel XE#307])
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@kms_content_protection@dp-mst-lic-type-1.html
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_content_protection@dp-mst-lic-type-1.html

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

  * igt@kms_content_protection@mei-interface:
    - shard-bmg:          NOTRUN -> [SKIP][125] ([Intel XE#2341]) +1 other test skip
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_content_protection@mei-interface.html

  * igt@kms_content_protection@uevent@pipe-a-dp-4:
    - shard-dg2-set2:     NOTRUN -> [FAIL][126] ([Intel XE#1188])
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_content_protection@uevent@pipe-a-dp-4.html

  * igt@kms_cursor_crc@cursor-offscreen-128x42:
    - shard-adlp:         [PASS][127] -> [DMESG-WARN][128] ([Intel XE#4173]) +12 other tests dmesg-warn
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-9/igt@kms_cursor_crc@cursor-offscreen-128x42.html
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@kms_cursor_crc@cursor-offscreen-128x42.html

  * igt@kms_cursor_crc@cursor-offscreen-256x85:
    - shard-bmg:          NOTRUN -> [SKIP][129] ([Intel XE#2320]) +2 other tests skip
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_cursor_crc@cursor-offscreen-256x85.html
    - shard-lnl:          NOTRUN -> ([SKIP][130], [SKIP][131]) ([Intel XE#1424])
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_cursor_crc@cursor-offscreen-256x85.html
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_cursor_crc@cursor-offscreen-256x85.html

  * igt@kms_cursor_crc@cursor-onscreen-512x512:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][132], [SKIP][133]) ([Intel XE#308])
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_cursor_crc@cursor-onscreen-512x512.html
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_cursor_crc@cursor-onscreen-512x512.html

  * igt@kms_cursor_crc@cursor-random-32x32:
    - shard-bmg:          NOTRUN -> ([SKIP][134], [SKIP][135]) ([Intel XE#2320]) +1 other test ( 2 skip )
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_cursor_crc@cursor-random-32x32.html
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_cursor_crc@cursor-random-32x32.html

  * igt@kms_cursor_crc@cursor-random-max-size:
    - shard-lnl:          NOTRUN -> [SKIP][136] ([Intel XE#1424]) +1 other test skip
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_cursor_crc@cursor-random-max-size.html

  * igt@kms_cursor_crc@cursor-sliding-512x512:
    - shard-bmg:          NOTRUN -> [SKIP][137] ([Intel XE#2321])
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_cursor_crc@cursor-sliding-512x512.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
    - shard-bmg:          NOTRUN -> [SKIP][138] ([Intel XE#2286])
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][139], [SKIP][140]) ([Intel XE#323])
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size.html
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic:
    - shard-bmg:          [PASS][141] -> ([PASS][142], [SKIP][143]) ([Intel XE#2291]) +3 other tests ( 1 pass, 1 skip )
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
    - shard-dg2-set2:     [PASS][144] -> [SKIP][145] ([Intel XE#309]) +1 other test skip
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-466/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size:
    - shard-dg2-set2:     [PASS][146] -> ([PASS][147], [SKIP][148]) ([Intel XE#309]) +3 other tests ( 1 pass, 1 skip )
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html

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

  * igt@kms_cursor_legacy@cursorb-vs-flipb-toggle:
    - shard-dg2-set2:     [PASS][150] -> ([SKIP][151], [SKIP][152]) ([Intel XE#309])
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-435/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipb-toggle.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
    - shard-bmg:          NOTRUN -> ([SKIP][153], [SKIP][154]) ([Intel XE#2286])
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-3:
    - shard-bmg:          NOTRUN -> ([SKIP][155], [SKIP][156]) ([Intel XE#1340])
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-3.html
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-3.html

  * igt@kms_dp_linktrain_fallback@dp-fallback:
    - shard-dg2-set2:     NOTRUN -> ([PASS][157], [SKIP][158]) ([Intel XE#4331])
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_dp_linktrain_fallback@dp-fallback.html
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_dp_linktrain_fallback@dp-fallback.html

  * igt@kms_dsc@dsc-fractional-bpp-with-bpc:
    - shard-bmg:          NOTRUN -> ([SKIP][159], [SKIP][160]) ([Intel XE#2244])
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html

  * igt@kms_dsc@dsc-with-bpc-formats:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][161], [SKIP][162]) ([Intel XE#455]) +12 other tests ( 2 skip )
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_dsc@dsc-with-bpc-formats.html
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_dsc@dsc-with-bpc-formats.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][163], [SKIP][164]) ([Intel XE#4422])
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats.html
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats.html
    - shard-bmg:          NOTRUN -> ([SKIP][165], [SKIP][166]) ([Intel XE#4422])
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats.html
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-dirtyfb-tests:
    - shard-adlp:         NOTRUN -> [SKIP][167] ([Intel XE#4422])
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-dirtyfb-tests.html
    - shard-lnl:          NOTRUN -> ([SKIP][168], [SKIP][169]) ([Intel XE#4422])
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-dirtyfb-tests.html
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-dirtyfb-tests.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area:
    - shard-bmg:          NOTRUN -> [SKIP][170] ([Intel XE#4422])
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area.html

  * igt@kms_flip@2x-absolute-wf_vblank-interruptible:
    - shard-dg2-set2:     [PASS][171] -> ([SKIP][172], [PASS][173]) ([Intel XE#310]) +7 other tests ( 1 pass, 1 skip )
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-433/igt@kms_flip@2x-absolute-wf_vblank-interruptible.html
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@2x-absolute-wf_vblank-interruptible.html
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_flip@2x-absolute-wf_vblank-interruptible.html

  * igt@kms_flip@2x-blocking-wf_vblank:
    - shard-bmg:          [PASS][174] -> ([INCOMPLETE][175], [PASS][176]) ([Intel XE#2049]) +1 other test ( 1 incomplete, 1 pass )
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_flip@2x-blocking-wf_vblank.html
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_flip@2x-blocking-wf_vblank.html
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_flip@2x-blocking-wf_vblank.html

  * igt@kms_flip@2x-busy-flip:
    - shard-bmg:          NOTRUN -> ([PASS][177], [SKIP][178]) ([Intel XE#2316])
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_flip@2x-busy-flip.html
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_flip@2x-busy-flip.html

  * igt@kms_flip@2x-flip-vs-blocking-wf-vblank:
    - shard-bmg:          [PASS][179] -> [FAIL][180] ([Intel XE#2882]) +1 other test fail
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_flip@2x-flip-vs-blocking-wf-vblank.html
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_flip@2x-flip-vs-blocking-wf-vblank.html

  * igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible:
    - shard-bmg:          NOTRUN -> ([SKIP][181], [SKIP][182]) ([Intel XE#2316]) +1 other test ( 2 skip )
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-dp2-hdmi-a3:
    - shard-bmg:          [PASS][183] -> ([FAIL][184], [FAIL][185]) ([Intel XE#3321]) +1 other test ( 2 fail )
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-dp2-hdmi-a3.html
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-dp2-hdmi-a3.html
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-dp2-hdmi-a3.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][186] -> [FAIL][187] ([Intel XE#301] / [Intel XE#3321]) +1 other test fail
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4.html
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][188] -> [FAIL][189] ([Intel XE#301])
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a6-dp4.html
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3:
    - shard-bmg:          [PASS][190] -> ([FAIL][191], [PASS][192]) ([Intel XE#3321]) +1 other test ( 1 fail, 1 pass )
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-1/igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3.html
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3.html
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3.html

  * igt@kms_flip@2x-flip-vs-expired-vblank@bc-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][193] -> ([PASS][194], [FAIL][195]) ([Intel XE#301]) +1 other test ( 1 fail, 1 pass )
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank@bc-hdmi-a6-dp4.html
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank@bc-hdmi-a6-dp4.html
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank@bc-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-modeset-vs-hang:
    - shard-bmg:          [PASS][196] -> ([SKIP][197], [SKIP][198]) ([Intel XE#2316]) +1 other test ( 2 skip )
   [196]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_flip@2x-flip-vs-modeset-vs-hang.html
   [197]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_flip@2x-flip-vs-modeset-vs-hang.html
   [198]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_flip@2x-flip-vs-modeset-vs-hang.html

  * igt@kms_flip@2x-flip-vs-panning-vs-hang:
    - shard-dg2-set2:     [PASS][199] -> ([SKIP][200], [SKIP][201]) ([Intel XE#310])
   [199]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-433/igt@kms_flip@2x-flip-vs-panning-vs-hang.html
   [200]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@2x-flip-vs-panning-vs-hang.html
   [201]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@2x-flip-vs-panning-vs-hang.html

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

  * igt@kms_flip@2x-plain-flip-fb-recreate:
    - shard-dg2-set2:     [PASS][204] -> [SKIP][205] ([Intel XE#310]) +2 other tests skip
   [204]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-435/igt@kms_flip@2x-plain-flip-fb-recreate.html
   [205]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@2x-plain-flip-fb-recreate.html

  * igt@kms_flip@2x-plain-flip-fb-recreate-interruptible:
    - shard-bmg:          NOTRUN -> [FAIL][206] ([Intel XE#2882]) +1 other test fail
   [206]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html
    - shard-dg2-set2:     [PASS][207] -> ([SKIP][208], [FAIL][209]) ([Intel XE#2882] / [Intel XE#310])
   [207]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-433/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html
   [208]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html
   [209]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html

  * igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ac-hdmi-a6-dp4:
    - shard-dg2-set2:     [PASS][210] -> [FAIL][211] ([Intel XE#2882]) +2 other tests fail
   [210]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-433/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ac-hdmi-a6-dp4.html
   [211]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ac-hdmi-a6-dp4.html

  * igt@kms_flip@2x-plain-flip-interruptible:
    - shard-bmg:          [PASS][212] -> [SKIP][213] ([Intel XE#2316]) +2 other tests skip
   [212]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_flip@2x-plain-flip-interruptible.html
   [213]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_flip@2x-plain-flip-interruptible.html
    - shard-lnl:          NOTRUN -> [SKIP][214] ([Intel XE#1421])
   [214]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_flip@2x-plain-flip-interruptible.html

  * igt@kms_flip@2x-plain-flip-ts-check-interruptible:
    - shard-bmg:          [PASS][215] -> ([SKIP][216], [PASS][217]) ([Intel XE#2316]) +1 other test ( 1 pass, 1 skip )
   [215]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_flip@2x-plain-flip-ts-check-interruptible.html
   [216]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_flip@2x-plain-flip-ts-check-interruptible.html
   [217]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_flip@2x-plain-flip-ts-check-interruptible.html

  * igt@kms_flip@2x-wf_vblank-ts-check-interruptible:
    - shard-adlp:         NOTRUN -> [SKIP][218] ([Intel XE#310]) +4 other tests skip
   [218]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_flip@2x-wf_vblank-ts-check-interruptible.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank:
    - shard-dg2-set2:     [PASS][219] -> ([INCOMPLETE][220], [PASS][221]) ([Intel XE#2049])
   [219]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@kms_flip@flip-vs-blocking-wf-vblank.html
   [220]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_flip@flip-vs-blocking-wf-vblank.html
   [221]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_flip@flip-vs-blocking-wf-vblank.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank@a-dp4:
    - shard-dg2-set2:     NOTRUN -> ([INCOMPLETE][222], [PASS][223]) ([Intel XE#2049])
   [222]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_flip@flip-vs-blocking-wf-vblank@a-dp4.html
   [223]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_flip@flip-vs-blocking-wf-vblank@a-dp4.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-dp4:
    - shard-dg2-set2:     NOTRUN -> [FAIL][224] ([Intel XE#301])
   [224]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-dp4.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-hdmi-a6:
    - shard-dg2-set2:     NOTRUN -> ([FAIL][225], [PASS][226]) ([Intel XE#301]) +1 other test ( 1 fail, 1 pass )
   [225]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-hdmi-a6.html
   [226]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-hdmi-a6.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@d-hdmi-a6:
    - shard-dg2-set2:     NOTRUN -> ([FAIL][227], [FAIL][228]) ([Intel XE#301])
   [227]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@flip-vs-expired-vblank-interruptible@d-hdmi-a6.html
   [228]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_flip@flip-vs-expired-vblank-interruptible@d-hdmi-a6.html

  * igt@kms_flip@plain-flip-fb-recreate-interruptible@a-edp1:
    - shard-lnl:          [PASS][229] -> ([FAIL][230], [PASS][231]) ([Intel XE#886]) +9 other tests ( 1 fail, 1 pass )
   [229]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-8/igt@kms_flip@plain-flip-fb-recreate-interruptible@a-edp1.html
   [230]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@kms_flip@plain-flip-fb-recreate-interruptible@a-edp1.html
   [231]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_flip@plain-flip-fb-recreate-interruptible@a-edp1.html

  * igt@kms_flip@wf_vblank-ts-check:
    - shard-bmg:          [PASS][232] -> ([FAIL][233], [PASS][234]) ([Intel XE#2882])
   [232]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_flip@wf_vblank-ts-check.html
   [233]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_flip@wf_vblank-ts-check.html
   [234]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_flip@wf_vblank-ts-check.html

  * igt@kms_flip@wf_vblank-ts-check@a-dp2:
    - shard-bmg:          NOTRUN -> ([FAIL][235], [PASS][236]) ([Intel XE#2882])
   [235]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_flip@wf_vblank-ts-check@a-dp2.html
   [236]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_flip@wf_vblank-ts-check@a-dp2.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling:
    - shard-adlp:         NOTRUN -> [SKIP][237] ([Intel XE#455]) +3 other tests skip
   [237]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling.html
    - shard-bmg:          NOTRUN -> [SKIP][238] ([Intel XE#2293] / [Intel XE#2380]) +2 other tests skip
   [238]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling.html
    - shard-lnl:          NOTRUN -> ([SKIP][239], [SKIP][240]) ([Intel XE#1401] / [Intel XE#1745])
   [239]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling.html
   [240]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/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-default-mode:
    - shard-lnl:          NOTRUN -> ([SKIP][241], [SKIP][242]) ([Intel XE#1401])
   [241]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-default-mode.html
   [242]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode:
    - shard-bmg:          NOTRUN -> [SKIP][243] ([Intel XE#2293]) +2 other tests skip
   [243]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling:
    - shard-bmg:          NOTRUN -> ([SKIP][244], [SKIP][245]) ([Intel XE#2293] / [Intel XE#2380]) +3 other tests ( 2 skip )
   [244]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html
   [245]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling@pipe-a-valid-mode:
    - shard-adlp:         [PASS][246] -> [DMESG-FAIL][247] ([Intel XE#324] / [Intel XE#4543]) +3 other tests dmesg-fail
   [246]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-8/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling@pipe-a-valid-mode.html
   [247]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode:
    - shard-bmg:          NOTRUN -> ([SKIP][248], [SKIP][249]) ([Intel XE#2293]) +3 other tests ( 2 skip )
   [248]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode.html
   [249]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> ([SKIP][250], [SKIP][251]) ([Intel XE#2312]) +1 other test ( 2 skip )
   [250]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-blt.html
   [251]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-render:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][252], [SKIP][253]) ([Intel XE#651] / [Intel XE#656]) +3 other tests ( 2 skip )
   [252]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-render.html
   [253]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-render.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-render:
    - shard-bmg:          NOTRUN -> ([SKIP][254], [SKIP][255]) ([Intel XE#2311] / [Intel XE#2312]) +3 other tests ( 2 skip )
   [254]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-render.html
   [255]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-render.html
    - shard-lnl:          NOTRUN -> [SKIP][256] ([Intel XE#656]) +1 other test skip
   [256]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-move:
    - shard-adlp:         NOTRUN -> [SKIP][257] ([Intel XE#656]) +5 other tests skip
   [257]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-9/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-move.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-onoff:
    - shard-dg2-set2:     [PASS][258] -> ([PASS][259], [SKIP][260]) ([Intel XE#656]) +12 other tests ( 1 pass, 1 skip )
   [258]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-463/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-onoff.html
   [259]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-onoff.html
   [260]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-plflip-blt:
    - shard-dg2-set2:     [PASS][261] -> ([SKIP][262], [SKIP][263]) ([Intel XE#656]) +1 other test ( 2 skip )
   [261]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-436/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-plflip-blt.html
   [262]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-plflip-blt.html
   [263]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-pgflip-blt:
    - shard-bmg:          NOTRUN -> ([SKIP][264], [SKIP][265]) ([Intel XE#2312] / [Intel XE#4141]) +1 other test ( 2 skip )
   [264]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-pgflip-blt.html
   [265]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-rgb565-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][266] ([Intel XE#4141]) +6 other tests skip
   [266]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-tiling-linear:
    - shard-bmg:          NOTRUN -> ([SKIP][267], [SKIP][268]) ([Intel XE#4141]) +7 other tests ( 2 skip )
   [267]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-tiling-linear.html
   [268]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-tiling-linear.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-indfb-msflip-blt:
    - shard-lnl:          NOTRUN -> ([SKIP][269], [SKIP][270]) ([Intel XE#651]) +3 other tests ( 2 skip )
   [269]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-indfb-msflip-blt.html
   [270]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-render:
    - shard-adlp:         NOTRUN -> [SKIP][271] ([Intel XE#651]) +1 other test skip
   [271]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-fullscreen:
    - shard-bmg:          NOTRUN -> [SKIP][272] ([Intel XE#2311]) +12 other tests skip
   [272]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-onoff:
    - shard-bmg:          NOTRUN -> [SKIP][273] ([Intel XE#2312]) +1 other test skip
   [273]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-onoff.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][274] ([Intel XE#656])
   [274]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> ([SKIP][275], [SKIP][276]) ([Intel XE#2311]) +12 other tests ( 2 skip )
   [275]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html
   [276]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-dg2-set2:     NOTRUN -> [SKIP][277] ([Intel XE#651]) +3 other tests skip
   [277]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-mmap-wc:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][278], [SKIP][279]) ([Intel XE#651]) +8 other tests ( 2 skip )
   [278]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-mmap-wc.html
   [279]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-fullscreen:
    - shard-adlp:         NOTRUN -> [SKIP][280] ([Intel XE#653]) +1 other test skip
   [280]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-rte:
    - shard-bmg:          NOTRUN -> ([SKIP][281], [SKIP][282]) ([Intel XE#2313]) +12 other tests ( 2 skip )
   [281]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_frontbuffer_tracking@fbcpsr-1p-rte.html
   [282]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-1p-rte.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][283] ([Intel XE#2313]) +15 other tests skip
   [283]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> ([SKIP][284], [SKIP][285]) ([Intel XE#2312] / [Intel XE#2313]) +4 other tests ( 2 skip )
   [284]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html
   [285]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@plane-fbc-rte:
    - shard-adlp:         NOTRUN -> [SKIP][286] ([Intel XE#4439])
   [286]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@kms_frontbuffer_tracking@plane-fbc-rte.html
    - shard-bmg:          NOTRUN -> ([SKIP][287], [SKIP][288]) ([Intel XE#4439])
   [287]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_frontbuffer_tracking@plane-fbc-rte.html
   [288]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_frontbuffer_tracking@plane-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][289] ([Intel XE#653]) +5 other tests skip
   [289]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> ([SKIP][290], [SKIP][291]) ([Intel XE#656]) +8 other tests ( 2 skip )
   [290]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-blt.html
   [291]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-mmap-wc:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][292], [SKIP][293]) ([Intel XE#653] / [Intel XE#656]) +3 other tests ( 2 skip )
   [292]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-mmap-wc.html
   [293]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-rgb565-draw-blt:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][294], [SKIP][295]) ([Intel XE#653]) +8 other tests ( 2 skip )
   [294]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@psr-rgb565-draw-blt.html
   [295]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_frontbuffer_tracking@psr-rgb565-draw-blt.html

  * igt@kms_hdr@invalid-hdr:
    - shard-bmg:          [PASS][296] -> ([PASS][297], [SKIP][298]) ([Intel XE#1503])
   [296]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_hdr@invalid-hdr.html
   [297]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_hdr@invalid-hdr.html
   [298]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_hdr@invalid-hdr.html

  * igt@kms_pipe_stress@stress-xrgb8888-ytiled:
    - shard-bmg:          NOTRUN -> ([SKIP][299], [SKIP][300]) ([Intel XE#4329])
   [299]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_pipe_stress@stress-xrgb8888-ytiled.html
   [300]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_pipe_stress@stress-xrgb8888-ytiled.html

  * igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-1-size-64:
    - shard-adlp:         [PASS][301] -> [FAIL][302] ([Intel XE#1471]) +1 other test fail
   [301]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-2/igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-1-size-64.html
   [302]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-1-size-64.html

  * igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64:
    - shard-dg2-set2:     [PASS][303] -> ([FAIL][304], [PASS][305]) ([Intel XE#616]) +1 other test ( 1 fail, 1 pass )
   [303]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64.html
   [304]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64.html
   [305]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64.html

  * igt@kms_plane_multiple@2x-tiling-none:
    - shard-dg2-set2:     [PASS][306] -> [SKIP][307] ([Intel XE#4596])
   [306]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-435/igt@kms_plane_multiple@2x-tiling-none.html
   [307]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_plane_multiple@2x-tiling-none.html

  * igt@kms_plane_scaling@2x-scaler-multi-pipe:
    - shard-bmg:          [PASS][308] -> [SKIP][309] ([Intel XE#2571])
   [308]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_plane_scaling@2x-scaler-multi-pipe.html
   [309]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_plane_scaling@2x-scaler-multi-pipe.html

  * igt@kms_plane_scaling@intel-max-src-size@pipe-a-dp-4:
    - shard-dg2-set2:     NOTRUN -> [DMESG-WARN][310] ([Intel XE#4212])
   [310]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_plane_scaling@intel-max-src-size@pipe-a-dp-4.html

  * igt@kms_plane_scaling@intel-max-src-size@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [ABORT][311] ([Intel XE#4540]) +1 other test abort
   [311]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_plane_scaling@intel-max-src-size@pipe-a-hdmi-a-6.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-5@pipe-c:
    - shard-bmg:          NOTRUN -> ([SKIP][312], [SKIP][313]) ([Intel XE#2763]) +4 other tests ( 2 skip )
   [312]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_plane_scaling@planes-downscale-factor-0-5@pipe-c.html
   [313]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_plane_scaling@planes-downscale-factor-0-5@pipe-c.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-b:
    - shard-bmg:          NOTRUN -> [SKIP][314] ([Intel XE#2763]) +9 other tests skip
   [314]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-b.html

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-bmg:          NOTRUN -> ([SKIP][315], [SKIP][316]) ([Intel XE#870])
   [315]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_pm_backlight@fade-with-dpms.html
   [316]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_pm_backlight@fade-with-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][317] ([Intel XE#870])
   [317]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_pm_backlight@fade-with-suspend.html

  * igt@kms_pm_dc@dc3co-vpb-simulation:
    - shard-bmg:          NOTRUN -> [SKIP][318] ([Intel XE#2391])
   [318]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_pm_dc@dc3co-vpb-simulation.html

  * igt@kms_pm_dc@dc5-dpms:
    - shard-lnl:          [PASS][319] -> ([FAIL][320], [PASS][321]) ([Intel XE#718])
   [319]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-5/igt@kms_pm_dc@dc5-dpms.html
   [320]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_pm_dc@dc5-dpms.html
   [321]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_pm_dc@dc5-dpms.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-lnl:          [PASS][322] -> [FAIL][323] ([Intel XE#718])
   [322]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-3/igt@kms_pm_dc@dc5-psr.html
   [323]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_pm_dc@deep-pkgc:
    - shard-bmg:          NOTRUN -> ([SKIP][324], [SKIP][325]) ([Intel XE#2505])
   [324]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_pm_dc@deep-pkgc.html
   [325]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_pm_dc@deep-pkgc.html
    - shard-dg2-set2:     NOTRUN -> ([SKIP][326], [SKIP][327]) ([Intel XE#908])
   [326]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_pm_dc@deep-pkgc.html
   [327]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_pm_dc@deep-pkgc.html

  * igt@kms_pm_rpm@dpms-mode-unset-lpsp:
    - shard-bmg:          NOTRUN -> [SKIP][328] ([Intel XE#1439] / [Intel XE#836])
   [328]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_pm_rpm@dpms-mode-unset-lpsp.html

  * igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf:
    - shard-bmg:          NOTRUN -> ([SKIP][329], [SKIP][330]) ([Intel XE#1489]) +5 other tests ( 2 skip )
   [329]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf.html
   [330]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf:
    - shard-lnl:          NOTRUN -> ([SKIP][331], [SKIP][332]) ([Intel XE#2893]) +1 other test ( 2 skip )
   [331]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf.html
   [332]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [FAIL][333] ([Intel XE#4570]) +2 other tests fail
   [333]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-b-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area:
    - shard-dg2-set2:     NOTRUN -> [SKIP][334] ([Intel XE#1489]) +2 other tests skip
   [334]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@pr-overlay-plane-move-continuous-sf:
    - shard-bmg:          NOTRUN -> [SKIP][335] ([Intel XE#1489]) +1 other test skip
   [335]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_psr2_sf@pr-overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area:
    - shard-adlp:         NOTRUN -> [SKIP][336] ([Intel XE#1489]) +1 other test skip
   [336]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][337], [SKIP][338]) ([Intel XE#1489])
   [337]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area.html
   [338]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr@fbc-psr-primary-render:
    - shard-adlp:         NOTRUN -> [SKIP][339] ([Intel XE#2850] / [Intel XE#929]) +3 other tests skip
   [339]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_psr@fbc-psr-primary-render.html
    - shard-bmg:          NOTRUN -> ([SKIP][340], [SKIP][341]) ([Intel XE#2234] / [Intel XE#2850]) +8 other tests ( 2 skip )
   [340]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_psr@fbc-psr-primary-render.html
   [341]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_psr@fbc-psr-primary-render.html

  * igt@kms_psr@fbc-psr2-basic:
    - shard-dg2-set2:     NOTRUN -> [SKIP][342] ([Intel XE#2850] / [Intel XE#929]) +3 other tests skip
   [342]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_psr@fbc-psr2-basic.html

  * igt@kms_psr@fbc-psr2-basic@edp-1:
    - shard-lnl:          NOTRUN -> ([FAIL][343], [FAIL][344]) ([Intel XE#4568]) +1 other test ( 2 fail )
   [343]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_psr@fbc-psr2-basic@edp-1.html
   [344]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@kms_psr@fbc-psr2-basic@edp-1.html

  * igt@kms_psr@fbc-psr2-cursor-plane-move:
    - shard-bmg:          NOTRUN -> [SKIP][345] ([Intel XE#2234] / [Intel XE#2850]) +5 other tests skip
   [345]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_psr@fbc-psr2-cursor-plane-move.html

  * igt@kms_psr@fbc-psr2-dpms:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][346], [SKIP][347]) ([Intel XE#2850] / [Intel XE#929]) +7 other tests ( 2 skip )
   [346]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_psr@fbc-psr2-dpms.html
   [347]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_psr@fbc-psr2-dpms.html

  * igt@kms_psr@pr-primary-page-flip:
    - shard-lnl:          NOTRUN -> ([SKIP][348], [SKIP][349]) ([Intel XE#1406]) +1 other test ( 2 skip )
   [348]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@kms_psr@pr-primary-page-flip.html
   [349]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_psr@pr-primary-page-flip.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-bmg:          NOTRUN -> [SKIP][350] ([Intel XE#2414])
   [350]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][351] ([Intel XE#2939])
   [351]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@kms_rotation_crc@bad-pixel-format:
    - shard-bmg:          NOTRUN -> ([SKIP][352], [SKIP][353]) ([Intel XE#3414] / [Intel XE#3904])
   [352]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_rotation_crc@bad-pixel-format.html
   [353]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_rotation_crc@bad-pixel-format.html

  * igt@kms_setmode@basic-clone-single-crtc:
    - shard-bmg:          NOTRUN -> [SKIP][354] ([Intel XE#1435]) +2 other tests skip
   [354]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_setmode@basic-clone-single-crtc.html

  * igt@kms_setmode@invalid-clone-single-crtc-stealing:
    - shard-bmg:          [PASS][355] -> [SKIP][356] ([Intel XE#1435])
   [355]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
   [356]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
    - shard-dg2-set2:     [PASS][357] -> ([PASS][358], [SKIP][359]) ([Intel XE#455])
   [357]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
   [358]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
   [359]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_setmode@invalid-clone-single-crtc-stealing.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-bmg:          NOTRUN -> [SKIP][360] ([Intel XE#2426])
   [360]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-a-edp-1:
    - shard-lnl:          [PASS][361] -> [FAIL][362] ([Intel XE#899])
   [361]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-5/igt@kms_universal_plane@cursor-fb-leak@pipe-a-edp-1.html
   [362]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_universal_plane@cursor-fb-leak@pipe-a-edp-1.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-c-hdmi-a-1:
    - shard-adlp:         [PASS][363] -> [FAIL][364] ([Intel XE#899])
   [363]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@kms_universal_plane@cursor-fb-leak@pipe-c-hdmi-a-1.html
   [364]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_universal_plane@cursor-fb-leak@pipe-c-hdmi-a-1.html

  * igt@kms_vrr@cmrr@pipe-a-edp-1:
    - shard-lnl:          [PASS][365] -> ([FAIL][366], [PASS][367]) ([Intel XE#4459]) +1 other test ( 1 fail, 1 pass )
   [365]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-1/igt@kms_vrr@cmrr@pipe-a-edp-1.html
   [366]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@kms_vrr@cmrr@pipe-a-edp-1.html
   [367]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@kms_vrr@cmrr@pipe-a-edp-1.html

  * igt@kms_vrr@flip-basic-fastset:
    - shard-dg2-set2:     NOTRUN -> [SKIP][368] ([Intel XE#455]) +3 other tests skip
   [368]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_vrr@flip-basic-fastset.html

  * igt@kms_vrr@max-min:
    - shard-bmg:          NOTRUN -> ([SKIP][369], [SKIP][370]) ([Intel XE#1499])
   [369]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_vrr@max-min.html
   [370]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_vrr@max-min.html

  * igt@kms_vrr@seamless-rr-switch-vrr:
    - shard-lnl:          NOTRUN -> ([SKIP][371], [SKIP][372]) ([Intel XE#1499])
   [371]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@kms_vrr@seamless-rr-switch-vrr.html
   [372]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_vrr@seamless-rr-switch-vrr.html

  * igt@kms_writeback@writeback-check-output-xrgb2101010:
    - shard-bmg:          NOTRUN -> [SKIP][373] ([Intel XE#756]) +1 other test skip
   [373]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_writeback@writeback-check-output-xrgb2101010.html
    - shard-dg2-set2:     NOTRUN -> ([SKIP][374], [SKIP][375]) ([Intel XE#756])
   [374]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_writeback@writeback-check-output-xrgb2101010.html
   [375]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_writeback@writeback-check-output-xrgb2101010.html

  * igt@xe_ccs@block-copy-compressed-inc-dimension:
    - shard-adlp:         NOTRUN -> [SKIP][376] ([Intel XE#455] / [Intel XE#488])
   [376]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@xe_ccs@block-copy-compressed-inc-dimension.html

  * igt@xe_eudebug@basic-vm-access-parameters:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][377], [SKIP][378]) ([Intel XE#2905]) +5 other tests ( 2 skip )
   [377]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@xe_eudebug@basic-vm-access-parameters.html
   [378]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@xe_eudebug@basic-vm-access-parameters.html

  * igt@xe_eudebug@basic-vm-access-parameters-userptr:
    - shard-lnl:          NOTRUN -> ([SKIP][379], [SKIP][380]) ([Intel XE#2905] / [Intel XE#3889])
   [379]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_eudebug@basic-vm-access-parameters-userptr.html
   [380]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_eudebug@basic-vm-access-parameters-userptr.html

  * igt@xe_eudebug@basic-vm-access-userptr:
    - shard-dg2-set2:     NOTRUN -> [SKIP][381] ([Intel XE#2905])
   [381]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@xe_eudebug@basic-vm-access-userptr.html

  * igt@xe_eudebug@discovery-race-sigint:
    - shard-bmg:          NOTRUN -> ([SKIP][382], [SKIP][383]) ([Intel XE#2905] / [Intel XE#4259])
   [382]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@xe_eudebug@discovery-race-sigint.html
   [383]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_eudebug@discovery-race-sigint.html

  * igt@xe_eudebug@multigpu-basic-client-many:
    - shard-lnl:          NOTRUN -> ([SKIP][384], [SKIP][385]) ([Intel XE#2905])
   [384]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_eudebug@multigpu-basic-client-many.html
   [385]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@xe_eudebug@multigpu-basic-client-many.html
    - shard-adlp:         NOTRUN -> [SKIP][386] ([Intel XE#2905])
   [386]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@xe_eudebug@multigpu-basic-client-many.html

  * igt@xe_eudebug@read-metadata:
    - shard-bmg:          NOTRUN -> [SKIP][387] ([Intel XE#2905]) +4 other tests skip
   [387]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@xe_eudebug@read-metadata.html

  * igt@xe_eudebug_online@basic-breakpoint:
    - shard-bmg:          NOTRUN -> ([SKIP][388], [SKIP][389]) ([Intel XE#2905]) +3 other tests ( 2 skip )
   [388]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_eudebug_online@basic-breakpoint.html
   [389]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_eudebug_online@basic-breakpoint.html

  * igt@xe_eudebug_online@set-breakpoint-sigint-debugger:
    - shard-adlp:         NOTRUN -> [SKIP][390] ([Intel XE#4577])
   [390]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@xe_eudebug_online@set-breakpoint-sigint-debugger.html
    - shard-bmg:          NOTRUN -> ([SKIP][391], [SKIP][392]) ([Intel XE#4577])
   [391]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_eudebug_online@set-breakpoint-sigint-debugger.html
   [392]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_eudebug_online@set-breakpoint-sigint-debugger.html
    - shard-lnl:          NOTRUN -> ([SKIP][393], [SKIP][394]) ([Intel XE#4577])
   [393]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_eudebug_online@set-breakpoint-sigint-debugger.html
   [394]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_eudebug_online@set-breakpoint-sigint-debugger.html

  * igt@xe_eudebug_sriov@deny-eudebug:
    - shard-lnl:          NOTRUN -> ([SKIP][395], [SKIP][396]) ([Intel XE#4518])
   [395]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@xe_eudebug_sriov@deny-eudebug.html
   [396]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_eudebug_sriov@deny-eudebug.html
    - shard-adlp:         NOTRUN -> [SKIP][397] ([Intel XE#4519])
   [397]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@xe_eudebug_sriov@deny-eudebug.html
    - shard-bmg:          NOTRUN -> ([SKIP][398], [SKIP][399]) ([Intel XE#4518])
   [398]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_eudebug_sriov@deny-eudebug.html
   [399]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@xe_eudebug_sriov@deny-eudebug.html

  * igt@xe_eudebug_sriov@deny-sriov:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][400], [SKIP][401]) ([Intel XE#4518])
   [400]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@xe_eudebug_sriov@deny-sriov.html
   [401]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@xe_eudebug_sriov@deny-sriov.html

  * igt@xe_evict@evict-beng-large-external-cm:
    - shard-lnl:          NOTRUN -> ([SKIP][402], [SKIP][403]) ([Intel XE#688])
   [402]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_evict@evict-beng-large-external-cm.html
   [403]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@xe_evict@evict-beng-large-external-cm.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind:
    - shard-bmg:          NOTRUN -> [SKIP][404] ([Intel XE#2322]) +2 other tests skip
   [404]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind.html

  * igt@xe_exec_basic@multigpu-no-exec-basic-defer-bind:
    - shard-adlp:         NOTRUN -> [SKIP][405] ([Intel XE#1392])
   [405]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@xe_exec_basic@multigpu-no-exec-basic-defer-bind.html
    - shard-lnl:          NOTRUN -> ([SKIP][406], [SKIP][407]) ([Intel XE#1392]) +1 other test ( 2 skip )
   [406]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_exec_basic@multigpu-no-exec-basic-defer-bind.html
   [407]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_exec_basic@multigpu-no-exec-basic-defer-bind.html

  * igt@xe_exec_basic@multigpu-no-exec-bindexecqueue:
    - shard-dg2-set2:     [PASS][408] -> [SKIP][409] ([Intel XE#1392]) +2 other tests skip
   [408]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@xe_exec_basic@multigpu-no-exec-bindexecqueue.html
   [409]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@xe_exec_basic@multigpu-no-exec-bindexecqueue.html

  * igt@xe_exec_basic@multigpu-no-exec-bindexecqueue-userptr-rebind:
    - shard-dg2-set2:     [PASS][410] -> ([SKIP][411], [PASS][412]) ([Intel XE#1392]) +4 other tests ( 1 pass, 1 skip )
   [410]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-463/igt@xe_exec_basic@multigpu-no-exec-bindexecqueue-userptr-rebind.html
   [411]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@xe_exec_basic@multigpu-no-exec-bindexecqueue-userptr-rebind.html
   [412]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@xe_exec_basic@multigpu-no-exec-bindexecqueue-userptr-rebind.html

  * igt@xe_exec_basic@multigpu-once-null-rebind:
    - shard-bmg:          NOTRUN -> ([SKIP][413], [SKIP][414]) ([Intel XE#2322]) +4 other tests ( 2 skip )
   [413]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_exec_basic@multigpu-once-null-rebind.html
   [414]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_exec_basic@multigpu-once-null-rebind.html

  * igt@xe_exec_fault_mode@many-bindexecqueue-userptr-prefetch:
    - shard-adlp:         NOTRUN -> [SKIP][415] ([Intel XE#288]) +3 other tests skip
   [415]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@xe_exec_fault_mode@many-bindexecqueue-userptr-prefetch.html

  * igt@xe_exec_fault_mode@many-execqueues-userptr-invalidate-imm:
    - shard-dg2-set2:     NOTRUN -> [SKIP][416] ([Intel XE#288]) +3 other tests skip
   [416]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@xe_exec_fault_mode@many-execqueues-userptr-invalidate-imm.html

  * igt@xe_exec_fault_mode@many-userptr:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][417], [SKIP][418]) ([Intel XE#288]) +12 other tests ( 2 skip )
   [417]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@xe_exec_fault_mode@many-userptr.html
   [418]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@xe_exec_fault_mode@many-userptr.html

  * igt@xe_exec_mix_modes@exec-spinner-interrupted-lr:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][419], [SKIP][420]) ([Intel XE#2360])
   [419]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@xe_exec_mix_modes@exec-spinner-interrupted-lr.html
   [420]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@xe_exec_mix_modes@exec-spinner-interrupted-lr.html

  * igt@xe_huc_copy@huc_copy:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][421], [SKIP][422]) ([Intel XE#255])
   [421]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@xe_huc_copy@huc_copy.html
   [422]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@xe_huc_copy@huc_copy.html

  * igt@xe_live_ktest@xe_mocs@xe_live_mocs_kernel_kunit:
    - shard-dg2-set2:     [PASS][423] -> ([FAIL][424], [FAIL][425]) ([Intel XE#1999]) +2 other tests ( 2 fail )
   [423]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@xe_live_ktest@xe_mocs@xe_live_mocs_kernel_kunit.html
   [424]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@xe_live_ktest@xe_mocs@xe_live_mocs_kernel_kunit.html
   [425]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@xe_live_ktest@xe_mocs@xe_live_mocs_kernel_kunit.html

  * igt@xe_media_fill@media-fill:
    - shard-bmg:          NOTRUN -> ([SKIP][426], [SKIP][427]) ([Intel XE#2459] / [Intel XE#2596])
   [426]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_media_fill@media-fill.html
   [427]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_media_fill@media-fill.html

  * igt@xe_module_load@load:
    - shard-lnl:          ([PASS][428], [PASS][429], [PASS][430], [PASS][431], [PASS][432], [PASS][433], [PASS][434], [PASS][435], [PASS][436], [PASS][437], [PASS][438], [PASS][439], [PASS][440], [PASS][441], [PASS][442], [PASS][443], [PASS][444], [PASS][445], [PASS][446], [PASS][447], [PASS][448], [PASS][449], [PASS][450], [PASS][451], [PASS][452]) -> ([PASS][453], [PASS][454], [PASS][455], [PASS][456], [PASS][457], [PASS][458], [PASS][459], [PASS][460], [PASS][461], [PASS][462], [PASS][463], [PASS][464], [PASS][465], [PASS][466], [PASS][467], [PASS][468], [PASS][469], [PASS][470], [PASS][471], [PASS][472], [PASS][473], [PASS][474], [PASS][475], [PASS][476], [PASS][477], [PASS][478], [PASS][479], [PASS][480], [PASS][481], [PASS][482], [PASS][483], [PASS][484], [PASS][485], [PASS][486], [PASS][487], [PASS][488], [PASS][489], [SKIP][490], [PASS][491], [PASS][492], [PASS][493], [PASS][494], [PASS][495], [PASS][496], [PASS][497], [PASS][498], [PASS][499], [PASS][500], [PASS][501], [PASS][502], [PASS][503]) ([Intel XE#378])
   [428]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-5/igt@xe_module_load@load.html
   [429]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-7/igt@xe_module_load@load.html
   [430]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-6/igt@xe_module_load@load.html
   [431]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-4/igt@xe_module_load@load.html
   [432]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-4/igt@xe_module_load@load.html
   [433]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-1/igt@xe_module_load@load.html
   [434]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-5/igt@xe_module_load@load.html
   [435]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-3/igt@xe_module_load@load.html
   [436]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-8/igt@xe_module_load@load.html
   [437]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-3/igt@xe_module_load@load.html
   [438]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-1/igt@xe_module_load@load.html
   [439]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-3/igt@xe_module_load@load.html
   [440]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-6/igt@xe_module_load@load.html
   [441]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-8/igt@xe_module_load@load.html
   [442]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-2/igt@xe_module_load@load.html
   [443]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-8/igt@xe_module_load@load.html
   [444]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-7/igt@xe_module_load@load.html
   [445]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-2/igt@xe_module_load@load.html
   [446]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-4/igt@xe_module_load@load.html
   [447]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-7/igt@xe_module_load@load.html
   [448]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-3/igt@xe_module_load@load.html
   [449]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-5/igt@xe_module_load@load.html
   [450]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-6/igt@xe_module_load@load.html
   [451]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-2/igt@xe_module_load@load.html
   [452]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-1/igt@xe_module_load@load.html
   [453]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@xe_module_load@load.html
   [454]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@xe_module_load@load.html
   [455]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_module_load@load.html
   [456]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_module_load@load.html
   [457]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_module_load@load.html
   [458]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_module_load@load.html
   [459]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_module_load@load.html
   [460]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_module_load@load.html
   [461]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_module_load@load.html
   [462]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_module_load@load.html
   [463]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_module_load@load.html
   [464]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@xe_module_load@load.html
   [465]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@xe_module_load@load.html
   [466]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@xe_module_load@load.html
   [467]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@xe_module_load@load.html
   [468]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@xe_module_load@load.html
   [469]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@xe_module_load@load.html
   [470]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@xe_module_load@load.html
   [471]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@xe_module_load@load.html
   [472]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_module_load@load.html
   [473]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_module_load@load.html
   [474]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_module_load@load.html
   [475]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_module_load@load.html
   [476]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@xe_module_load@load.html
   [477]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@xe_module_load@load.html
   [478]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_module_load@load.html
   [479]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@xe_module_load@load.html
   [480]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@xe_module_load@load.html
   [481]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_module_load@load.html
   [482]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_module_load@load.html
   [483]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_module_load@load.html
   [484]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_module_load@load.html
   [485]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@xe_module_load@load.html
   [486]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_module_load@load.html
   [487]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_module_load@load.html
   [488]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_module_load@load.html
   [489]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_module_load@load.html
   [490]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_module_load@load.html
   [491]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_module_load@load.html
   [492]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@xe_module_load@load.html
   [493]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_module_load@load.html
   [494]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@xe_module_load@load.html
   [495]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@xe_module_load@load.html
   [496]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@xe_module_load@load.html
   [497]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_module_load@load.html
   [498]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@xe_module_load@load.html
   [499]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@xe_module_load@load.html
   [500]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-6/igt@xe_module_load@load.html
   [501]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-1/igt@xe_module_load@load.html
   [502]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@xe_module_load@load.html
   [503]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_module_load@load.html
    - shard-bmg:          ([PASS][504], [PASS][505], [PASS][506], [PASS][507], [PASS][508], [PASS][509], [PASS][510], [PASS][511], [PASS][512], [PASS][513], [PASS][514], [PASS][515], [PASS][516], [PASS][517], [PASS][518], [PASS][519], [PASS][520], [PASS][521], [PASS][522], [PASS][523]) -> ([PASS][524], [PASS][525], [PASS][526], [PASS][527], [PASS][528], [PASS][529], [PASS][530], [PASS][531], [PASS][532], [PASS][533], [PASS][534], [PASS][535], [PASS][536], [PASS][537], [PASS][538], [PASS][539], [SKIP][540], [PASS][541], [PASS][542], [PASS][543], [PASS][544], [PASS][545], [PASS][546], [PASS][547], [PASS][548], [PASS][549], [PASS][550], [PASS][551], [PASS][552], [PASS][553], [SKIP][554], [PASS][555], [PASS][556], [PASS][557], [PASS][558], [PASS][559], [PASS][560], [PASS][561], [PASS][562]) ([Intel XE#2457])
   [504]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@xe_module_load@load.html
   [505]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@xe_module_load@load.html
   [506]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@xe_module_load@load.html
   [507]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@xe_module_load@load.html
   [508]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@xe_module_load@load.html
   [509]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@xe_module_load@load.html
   [510]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@xe_module_load@load.html
   [511]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@xe_module_load@load.html
   [512]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@xe_module_load@load.html
   [513]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@xe_module_load@load.html
   [514]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@xe_module_load@load.html
   [515]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-7/igt@xe_module_load@load.html
   [516]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-7/igt@xe_module_load@load.html
   [517]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-8/igt@xe_module_load@load.html
   [518]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@xe_module_load@load.html
   [519]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-1/igt@xe_module_load@load.html
   [520]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-7/igt@xe_module_load@load.html
   [521]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-8/igt@xe_module_load@load.html
   [522]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@xe_module_load@load.html
   [523]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-8/igt@xe_module_load@load.html
   [524]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_module_load@load.html
   [525]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_module_load@load.html
   [526]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@xe_module_load@load.html
   [527]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_module_load@load.html
   [528]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_module_load@load.html
   [529]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_module_load@load.html
   [530]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@xe_module_load@load.html
   [531]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_module_load@load.html
   [532]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@xe_module_load@load.html
   [533]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@xe_module_load@load.html
   [534]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_module_load@load.html
   [535]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_module_load@load.html
   [536]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_module_load@load.html
   [537]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@xe_module_load@load.html
   [538]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_module_load@load.html
   [539]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_module_load@load.html
   [540]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@xe_module_load@load.html
   [541]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_module_load@load.html
   [542]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_module_load@load.html
   [543]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_module_load@load.html
   [544]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_module_load@load.html
   [545]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_module_load@load.html
   [546]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_module_load@load.html
   [547]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@xe_module_load@load.html
   [548]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@xe_module_load@load.html
   [549]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_module_load@load.html
   [550]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_module_load@load.html
   [551]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_module_load@load.html
   [552]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_module_load@load.html
   [553]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@xe_module_load@load.html
   [554]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@xe_module_load@load.html
   [555]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_module_load@load.html
   [556]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@xe_module_load@load.html
   [557]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@xe_module_load@load.html
   [558]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@xe_module_load@load.html
   [559]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@xe_module_load@load.html
   [560]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@xe_module_load@load.html
   [561]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@xe_module_load@load.html
   [562]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_module_load@load.html
    - shard-adlp:         ([PASS][563], [PASS][564], [PASS][565], [PASS][566], [PASS][567], [PASS][568], [PASS][569], [PASS][570], [PASS][571], [PASS][572], [PASS][573], [PASS][574], [PASS][575], [PASS][576], [PASS][577], [PASS][578], [PASS][579], [PASS][580], [PASS][581], [PASS][582], [PASS][583], [PASS][584], [PASS][585], [PASS][586], [PASS][587]) -> ([PASS][588], [PASS][589], [PASS][590], [PASS][591], [PASS][592], [PASS][593], [PASS][594], [PASS][595], [PASS][596], [PASS][597], [PASS][598], [PASS][599], [PASS][600], [PASS][601], [PASS][602], [PASS][603], [PASS][604], [PASS][605], [PASS][606], [SKIP][607], [PASS][608], [PASS][609], [PASS][610], [PASS][611], [PASS][612], [PASS][613]) ([Intel XE#378])
   [563]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-1/igt@xe_module_load@load.html
   [564]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-6/igt@xe_module_load@load.html
   [565]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-6/igt@xe_module_load@load.html
   [566]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-6/igt@xe_module_load@load.html
   [567]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-6/igt@xe_module_load@load.html
   [568]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-1/igt@xe_module_load@load.html
   [569]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-2/igt@xe_module_load@load.html
   [570]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-2/igt@xe_module_load@load.html
   [571]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-2/igt@xe_module_load@load.html
   [572]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-9/igt@xe_module_load@load.html
   [573]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-9/igt@xe_module_load@load.html
   [574]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-9/igt@xe_module_load@load.html
   [575]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-9/igt@xe_module_load@load.html
   [576]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-2/igt@xe_module_load@load.html
   [577]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-1/igt@xe_module_load@load.html
   [578]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-1/igt@xe_module_load@load.html
   [579]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@xe_module_load@load.html
   [580]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@xe_module_load@load.html
   [581]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@xe_module_load@load.html
   [582]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-8/igt@xe_module_load@load.html
   [583]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@xe_module_load@load.html
   [584]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-8/igt@xe_module_load@load.html
   [585]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@xe_module_load@load.html
   [586]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-8/igt@xe_module_load@load.html
   [587]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-8/igt@xe_module_load@load.html
   [588]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@xe_module_load@load.html
   [589]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@xe_module_load@load.html
   [590]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@xe_module_load@load.html
   [591]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@xe_module_load@load.html
   [592]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@xe_module_load@load.html
   [593]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@xe_module_load@load.html
   [594]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@xe_module_load@load.html
   [595]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-9/igt@xe_module_load@load.html
   [596]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@xe_module_load@load.html
   [597]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@xe_module_load@load.html
   [598]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@xe_module_load@load.html
   [599]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@xe_module_load@load.html
   [600]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-9/igt@xe_module_load@load.html
   [601]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@xe_module_load@load.html
   [602]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@xe_module_load@load.html
   [603]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@xe_module_load@load.html
   [604]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@xe_module_load@load.html
   [605]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@xe_module_load@load.html
   [606]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@xe_module_load@load.html
   [607]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@xe_module_load@load.html
   [608]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@xe_module_load@load.html
   [609]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@xe_module_load@load.html
   [610]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@xe_module_load@load.html
   [611]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@xe_module_load@load.html
   [612]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@xe_module_load@load.html
   [613]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@xe_module_load@load.html

  * igt@xe_module_load@many-reload:
    - shard-adlp:         [PASS][614] -> [DMESG-WARN][615] ([Intel XE#2953] / [Intel XE#4173])
   [614]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-9/igt@xe_module_load@many-reload.html
   [615]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@xe_module_load@many-reload.html

  * igt@xe_oa@buffer-size:
    - shard-lnl:          [PASS][616] -> ([PASS][617], [FAIL][618]) ([Intel XE#4541])
   [616]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-3/igt@xe_oa@buffer-size.html
   [617]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@xe_oa@buffer-size.html
   [618]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_oa@buffer-size.html

  * igt@xe_oa@buffer-size@rcs-0-128k:
    - shard-lnl:          NOTRUN -> [FAIL][619] ([Intel XE#4541])
   [619]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_oa@buffer-size@rcs-0-128k.html

  * igt@xe_oa@create-destroy-userspace-config:
    - shard-adlp:         NOTRUN -> [SKIP][620] ([Intel XE#2541] / [Intel XE#3573]) +1 other test skip
   [620]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@xe_oa@create-destroy-userspace-config.html

  * igt@xe_oa@invalid-remove-userspace-config:
    - shard-dg2-set2:     NOTRUN -> [SKIP][621] ([Intel XE#2541] / [Intel XE#3573]) +1 other test skip
   [621]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@xe_oa@invalid-remove-userspace-config.html

  * igt@xe_oa@privileged-forked-access-vaddr:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][622], [SKIP][623]) ([Intel XE#2541] / [Intel XE#3573]) +2 other tests ( 2 skip )
   [622]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@xe_oa@privileged-forked-access-vaddr.html
   [623]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@xe_oa@privileged-forked-access-vaddr.html

  * igt@xe_oa@syncs-syncobj-wait:
    - shard-dg2-set2:     NOTRUN -> [SKIP][624] ([Intel XE#2541] / [Intel XE#3573] / [Intel XE#4501])
   [624]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@xe_oa@syncs-syncobj-wait.html

  * igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p:
    - shard-dg2-set2:     NOTRUN -> [FAIL][625] ([Intel XE#1173])
   [625]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p.html

  * igt@xe_pm@d3cold-mocs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][626] ([Intel XE#2284])
   [626]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@xe_pm@d3cold-mocs.html

  * igt@xe_pm@s3-d3cold-basic-exec:
    - shard-bmg:          NOTRUN -> [SKIP][627] ([Intel XE#2284])
   [627]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@xe_pm@s3-d3cold-basic-exec.html
    - shard-dg2-set2:     NOTRUN -> ([SKIP][628], [SKIP][629]) ([Intel XE#2284] / [Intel XE#366])
   [628]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@xe_pm@s3-d3cold-basic-exec.html
   [629]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@xe_pm@s3-d3cold-basic-exec.html

  * igt@xe_pm@s3-d3hot-basic-exec:
    - shard-lnl:          NOTRUN -> [SKIP][630] ([Intel XE#584])
   [630]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_pm@s3-d3hot-basic-exec.html

  * igt@xe_pm@s4-d3hot-basic-exec:
    - shard-lnl:          [PASS][631] -> ([ABORT][632], [PASS][633]) ([Intel XE#1794]) +1 other test ( 1 abort, 1 pass )
   [631]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-8/igt@xe_pm@s4-d3hot-basic-exec.html
   [632]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@xe_pm@s4-d3hot-basic-exec.html
   [633]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_pm@s4-d3hot-basic-exec.html

  * igt@xe_pm@s4-multiple-execs:
    - shard-adlp:         [PASS][634] -> [ABORT][635] ([Intel XE#1794]) +1 other test abort
   [634]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-8/igt@xe_pm@s4-multiple-execs.html
   [635]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-9/igt@xe_pm@s4-multiple-execs.html

  * igt@xe_query@multigpu-query-cs-cycles:
    - shard-lnl:          NOTRUN -> [SKIP][636] ([Intel XE#944])
   [636]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-5/igt@xe_query@multigpu-query-cs-cycles.html

  * igt@xe_query@multigpu-query-invalid-extension:
    - shard-bmg:          NOTRUN -> ([SKIP][637], [SKIP][638]) ([Intel XE#944]) +1 other test ( 2 skip )
   [637]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_query@multigpu-query-invalid-extension.html
   [638]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@xe_query@multigpu-query-invalid-extension.html
    - shard-adlp:         NOTRUN -> [SKIP][639] ([Intel XE#944])
   [639]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-1/igt@xe_query@multigpu-query-invalid-extension.html
    - shard-lnl:          NOTRUN -> ([SKIP][640], [SKIP][641]) ([Intel XE#944])
   [640]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_query@multigpu-query-invalid-extension.html
   [641]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_query@multigpu-query-invalid-extension.html

  * igt@xe_query@multigpu-query-topology-l3-bank-mask:
    - shard-bmg:          NOTRUN -> [SKIP][642] ([Intel XE#944])
   [642]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@xe_query@multigpu-query-topology-l3-bank-mask.html

  * igt@xe_query@multigpu-query-uc-fw-version-guc:
    - shard-dg2-set2:     NOTRUN -> ([SKIP][643], [SKIP][644]) ([Intel XE#944]) +1 other test ( 2 skip )
   [643]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@xe_query@multigpu-query-uc-fw-version-guc.html
   [644]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@xe_query@multigpu-query-uc-fw-version-guc.html

  * igt@xe_sriov_auto_provisioning@fair-allocation:
    - shard-lnl:          NOTRUN -> ([SKIP][645], [SKIP][646]) ([Intel XE#4130])
   [645]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-2/igt@xe_sriov_auto_provisioning@fair-allocation.html
   [646]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@xe_sriov_auto_provisioning@fair-allocation.html

  * igt@xe_sriov_flr@flr-vf1-clear:
    - shard-bmg:          NOTRUN -> ([SKIP][647], [SKIP][648]) ([Intel XE#3342])
   [647]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@xe_sriov_flr@flr-vf1-clear.html
   [648]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@xe_sriov_flr@flr-vf1-clear.html

  * igt@xe_sriov_scheduling@equal-throughput:
    - shard-bmg:          NOTRUN -> [SKIP][649] ([Intel XE#4351])
   [649]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@xe_sriov_scheduling@equal-throughput.html

  
#### Possible fixes ####

  * igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p:
    - shard-bmg:          [SKIP][650] ([Intel XE#2314] / [Intel XE#2894]) -> ([PASS][651], [PASS][652])
   [650]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html
   [651]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html
   [652]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs:
    - shard-dg2-set2:     [INCOMPLETE][653] ([Intel XE#2705] / [Intel XE#4212] / [Intel XE#4345]) -> [PASS][654]
   [653]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
   [654]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html

  * igt@kms_cursor_legacy@2x-cursor-vs-flip-legacy:
    - shard-dg2-set2:     [SKIP][655] ([Intel XE#309]) -> [PASS][656]
   [655]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_cursor_legacy@2x-cursor-vs-flip-legacy.html
   [656]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_cursor_legacy@2x-cursor-vs-flip-legacy.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
    - shard-bmg:          [SKIP][657] ([Intel XE#2291]) -> ([PASS][658], [PASS][659]) +2 other tests ( 2 pass )
   [657]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html
   [658]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html
   [659]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic:
    - shard-bmg:          [SKIP][660] ([Intel XE#2291]) -> [PASS][661]
   [660]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic.html
   [661]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions:
    - shard-dg2-set2:     [SKIP][662] ([Intel XE#309]) -> ([PASS][663], [PASS][664]) +2 other tests ( 2 pass )
   [662]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions.html
   [663]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions.html
   [664]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc:
    - shard-dg2-set2:     [SKIP][665] ([Intel XE#455]) -> ([PASS][666], [PASS][667])
   [665]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
   [666]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
   [667]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html

  * igt@kms_dp_aux_dev:
    - shard-dg2-set2:     [SKIP][668] ([Intel XE#3009]) -> ([PASS][669], [PASS][670])
   [668]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_dp_aux_dev.html
   [669]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_dp_aux_dev.html
   [670]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_dp_aux_dev.html

  * igt@kms_feature_discovery@display-2x:
    - shard-bmg:          [SKIP][671] ([Intel XE#2373]) -> ([PASS][672], [PASS][673])
   [671]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_feature_discovery@display-2x.html
   [672]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_feature_discovery@display-2x.html
   [673]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_feature_discovery@display-2x.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4:
    - shard-dg2-set2:     [FAIL][674] ([Intel XE#301]) -> [PASS][675] +4 other tests pass
   [674]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4.html
   [675]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4.html

  * igt@kms_flip@2x-flip-vs-expired-vblank@ad-hdmi-a6-dp4:
    - shard-dg2-set2:     [FAIL][676] ([Intel XE#301]) -> ([PASS][677], [PASS][678]) +1 other test ( 2 pass )
   [676]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank@ad-hdmi-a6-dp4.html
   [677]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank@ad-hdmi-a6-dp4.html
   [678]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank@ad-hdmi-a6-dp4.html

  * igt@kms_flip@2x-plain-flip-ts-check:
    - shard-dg2-set2:     [SKIP][679] ([Intel XE#310]) -> [PASS][680]
   [679]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_flip@2x-plain-flip-ts-check.html
   [680]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_flip@2x-plain-flip-ts-check.html

  * igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset:
    - shard-bmg:          [SKIP][681] ([Intel XE#2316]) -> ([PASS][682], [PASS][683]) +1 other test ( 2 pass )
   [681]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html
   [682]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html
   [683]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html

  * igt@kms_flip@flip-vs-expired-vblank@a-dp4:
    - shard-dg2-set2:     [FAIL][684] ([Intel XE#301] / [Intel XE#3321]) -> [PASS][685] +1 other test pass
   [684]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-436/igt@kms_flip@flip-vs-expired-vblank@a-dp4.html
   [685]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_flip@flip-vs-expired-vblank@a-dp4.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-dg2-set2:     [INCOMPLETE][686] ([Intel XE#2049] / [Intel XE#2597]) -> ([PASS][687], [PASS][688]) +2 other tests ( 2 pass )
   [686]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-436/igt@kms_flip@flip-vs-suspend-interruptible.html
   [687]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@flip-vs-suspend-interruptible.html
   [688]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible@c-dp4:
    - shard-dg2-set2:     [INCOMPLETE][689] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][690]
   [689]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-436/igt@kms_flip@flip-vs-suspend-interruptible@c-dp4.html
   [690]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_flip@flip-vs-suspend-interruptible@c-dp4.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-render:
    - shard-adlp:         [DMESG-FAIL][691] ([Intel XE#4543]) -> [PASS][692] +7 other tests pass
   [691]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-render.html
   [692]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-1p-rte:
    - shard-adlp:         [DMESG-WARN][693] ([Intel XE#4173]) -> [PASS][694] +2 other tests pass
   [693]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-2/igt@kms_frontbuffer_tracking@fbc-1p-rte.html
   [694]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_frontbuffer_tracking@fbc-1p-rte.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-render:
    - shard-dg2-set2:     [SKIP][695] ([Intel XE#656]) -> ([PASS][696], [PASS][697]) +3 other tests ( 2 pass )
   [695]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-render.html
   [696]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-render.html
   [697]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-onoff:
    - shard-dg2-set2:     [SKIP][698] ([Intel XE#656]) -> [PASS][699] +2 other tests pass
   [698]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-onoff.html
   [699]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-onoff.html

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-dg2-set2:     [SKIP][700] ([Intel XE#4328]) -> ([PASS][701], [PASS][702])
   [700]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_joiner@invalid-modeset-force-big-joiner.html
   [701]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_joiner@invalid-modeset-force-big-joiner.html
   [702]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_plane_cursor@viewport:
    - shard-adlp:         [FAIL][703] ([Intel XE#1471]) -> [PASS][704] +1 other test pass
   [703]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-1/igt@kms_plane_cursor@viewport.html
   [704]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-6/igt@kms_plane_cursor@viewport.html
    - shard-dg2-set2:     [FAIL][705] ([Intel XE#616]) -> [PASS][706] +1 other test pass
   [705]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_plane_cursor@viewport.html
   [706]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_plane_cursor@viewport.html

  * igt@kms_plane_multiple@2x-tiling-none:
    - shard-bmg:          [SKIP][707] ([Intel XE#4596]) -> [PASS][708]
   [707]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_plane_multiple@2x-tiling-none.html
   [708]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_plane_multiple@2x-tiling-none.html

  * igt@kms_plane_multiple@2x-tiling-x:
    - shard-dg2-set2:     [SKIP][709] ([Intel XE#4596]) -> [PASS][710]
   [709]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_plane_multiple@2x-tiling-x.html
   [710]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_plane_multiple@2x-tiling-x.html

  * igt@kms_pm_rpm@modeset-non-lpsp:
    - shard-dg2-set2:     [SKIP][711] ([Intel XE#836]) -> ([PASS][712], [PASS][713]) +1 other test ( 2 pass )
   [711]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_pm_rpm@modeset-non-lpsp.html
   [712]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_pm_rpm@modeset-non-lpsp.html
   [713]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_pm_rpm@modeset-non-lpsp.html

  * igt@kms_setmode@basic@pipe-b-edp-1:
    - shard-lnl:          [FAIL][714] ([Intel XE#2883]) -> ([PASS][715], [PASS][716]) +2 other tests ( 2 pass )
   [714]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-3/igt@kms_setmode@basic@pipe-b-edp-1.html
   [715]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_setmode@basic@pipe-b-edp-1.html
   [716]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_setmode@basic@pipe-b-edp-1.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-1:
    - shard-adlp:         [FAIL][717] ([Intel XE#771]) -> [PASS][718]
   [717]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-1.html
   [718]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_universal_plane@cursor-fb-leak@pipe-d-hdmi-a-1.html

  * igt@kms_vblank@ts-continuation-suspend:
    - shard-adlp:         [DMESG-WARN][719] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][720] +1 other test pass
   [719]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-6/igt@kms_vblank@ts-continuation-suspend.html
   [720]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-8/igt@kms_vblank@ts-continuation-suspend.html

  * igt@xe_compute_preempt@compute-preempt-many@engine-drm_xe_engine_class_compute:
    - shard-lnl:          [FAIL][721] ([Intel XE#4278]) -> [PASS][722] +1 other test pass
   [721]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-5/igt@xe_compute_preempt@compute-preempt-many@engine-drm_xe_engine_class_compute.html
   [722]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_compute_preempt@compute-preempt-many@engine-drm_xe_engine_class_compute.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-bind:
    - shard-dg2-set2:     [SKIP][723] ([Intel XE#1392]) -> ([PASS][724], [PASS][725]) +2 other tests ( 2 pass )
   [723]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-bind.html
   [724]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-bind.html
   [725]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-bind.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr:
    - shard-dg2-set2:     [SKIP][726] ([Intel XE#1392]) -> [PASS][727]
   [726]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr.html
   [727]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr.html

  * igt@xe_pm@s4-vm-bind-unbind-all:
    - shard-lnl:          [ABORT][728] ([Intel XE#1794]) -> ([PASS][729], [PASS][730])
   [728]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-2/igt@xe_pm@s4-vm-bind-unbind-all.html
   [729]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@xe_pm@s4-vm-bind-unbind-all.html
   [730]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-4/igt@xe_pm@s4-vm-bind-unbind-all.html

  
#### Warnings ####

  * igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p:
    - shard-dg2-set2:     [SKIP][731] ([Intel XE#2191]) -> ([PASS][732], [SKIP][733]) ([Intel XE#2191])
   [731]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html
   [732]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html
   [733]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][734] ([Intel XE#787]) -> ([SKIP][735], [SKIP][736]) ([Intel XE#455] / [Intel XE#787]) +8 other tests ( 2 skip )
   [734]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-6.html
   [735]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-6.html
   [736]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-6.html

  * igt@kms_ccs@bad-rotation-90-y-tiled-gen12-mc-ccs@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][737] ([Intel XE#787]) -> [SKIP][738] ([Intel XE#455] / [Intel XE#787]) +4 other tests skip
   [737]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-436/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-mc-ccs@pipe-d-hdmi-a-6.html
   [738]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-mc-ccs@pipe-d-hdmi-a-6.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-ccs@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][739] ([Intel XE#455] / [Intel XE#787]) -> ([SKIP][740], [SKIP][741]) ([Intel XE#787]) +5 other tests ( 2 skip )
   [739]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_ccs@ccs-on-another-bo-y-tiled-ccs@pipe-d-hdmi-a-6.html
   [740]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_ccs@ccs-on-another-bo-y-tiled-ccs@pipe-d-hdmi-a-6.html
   [741]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_ccs@ccs-on-another-bo-y-tiled-ccs@pipe-d-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][742] ([Intel XE#455] / [Intel XE#787]) -> [SKIP][743] ([Intel XE#787]) +1 other test skip
   [742]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-6.html
   [743]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs-cc@pipe-d-hdmi-a-6.html

  * igt@kms_cdclk@mode-transition-all-outputs:
    - shard-dg2-set2:     [SKIP][744] ([Intel XE#4440]) -> ([SKIP][745], [SKIP][746]) ([Intel XE#4418] / [Intel XE#4440])
   [744]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_cdclk@mode-transition-all-outputs.html
   [745]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_cdclk@mode-transition-all-outputs.html
   [746]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_cdclk@mode-transition-all-outputs.html

  * igt@kms_content_protection@atomic:
    - shard-bmg:          [SKIP][747] ([Intel XE#2341]) -> ([FAIL][748], [SKIP][749]) ([Intel XE#1178] / [Intel XE#2341])
   [747]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_content_protection@atomic.html
   [748]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_content_protection@atomic.html
   [749]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_content_protection@atomic.html

  * igt@kms_content_protection@atomic-dpms:
    - shard-bmg:          [FAIL][750] ([Intel XE#1178]) -> ([SKIP][751], [FAIL][752]) ([Intel XE#1178] / [Intel XE#2341])
   [750]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_content_protection@atomic-dpms.html
   [751]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_content_protection@atomic-dpms.html
   [752]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_content_protection@atomic-dpms.html

  * igt@kms_content_protection@lic-type-0:
    - shard-dg2-set2:     [SKIP][753] ([Intel XE#455]) -> ([FAIL][754], [FAIL][755]) ([Intel XE#1178])
   [753]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_content_protection@lic-type-0.html
   [754]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_content_protection@lic-type-0.html
   [755]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_content_protection@lic-type-0.html

  * igt@kms_content_protection@uevent:
    - shard-dg2-set2:     [SKIP][756] ([Intel XE#455]) -> ([SKIP][757], [FAIL][758]) ([Intel XE#1188] / [Intel XE#455])
   [756]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_content_protection@uevent.html
   [757]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_content_protection@uevent.html
   [758]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_content_protection@uevent.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy:
    - shard-bmg:          [SKIP][759] ([Intel XE#2291]) -> ([SKIP][760], [PASS][761]) ([Intel XE#2291])
   [759]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html
   [760]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html
   [761]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-legacy:
    - shard-dg2-set2:     [SKIP][762] ([Intel XE#309]) -> ([SKIP][763], [PASS][764]) ([Intel XE#309])
   [762]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html
   [763]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html
   [764]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html

  * igt@kms_display_modes@extended-mode-basic:
    - shard-bmg:          [SKIP][765] ([Intel XE#4302]) -> ([SKIP][766], [PASS][767]) ([Intel XE#4302])
   [765]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_display_modes@extended-mode-basic.html
   [766]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_display_modes@extended-mode-basic.html
   [767]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_display_modes@extended-mode-basic.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][768] ([Intel XE#455] / [i915#3804]) -> ([SKIP][769], [SKIP][770]) ([i915#3804])
   [768]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-6.html
   [769]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-6.html
   [770]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-6.html

  * igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible:
    - shard-dg2-set2:     [SKIP][771] ([Intel XE#310]) -> ([SKIP][772], [PASS][773]) ([Intel XE#310])
   [771]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html
   [772]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html
   [773]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible:
    - shard-dg2-set2:     [FAIL][774] ([Intel XE#301]) -> ([FAIL][775], [PASS][776]) ([Intel XE#301]) +1 other test ( 1 fail, 1 pass )
   [774]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html
   [775]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html
   [776]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-dp2-hdmi-a3:
    - shard-bmg:          [FAIL][777] ([Intel XE#3321]) -> ([PASS][778], [FAIL][779]) ([Intel XE#3321]) +3 other tests ( 1 fail, 1 pass )
   [777]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-dp2-hdmi-a3.html
   [778]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-dp2-hdmi-a3.html
   [779]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bd-dp2-hdmi-a3.html

  * igt@kms_flip@2x-modeset-vs-vblank-race-interruptible:
    - shard-bmg:          [SKIP][780] ([Intel XE#2316]) -> ([PASS][781], [SKIP][782]) ([Intel XE#2316])
   [780]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_flip@2x-modeset-vs-vblank-race-interruptible.html
   [781]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_flip@2x-modeset-vs-vblank-race-interruptible.html
   [782]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_flip@2x-modeset-vs-vblank-race-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank@a-edp1:
    - shard-lnl:          [FAIL][783] ([Intel XE#301]) -> ([PASS][784], [FAIL][785]) ([Intel XE#301]) +2 other tests ( 1 fail, 1 pass )
   [783]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html
   [784]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html
   [785]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-lnl:          [FAIL][786] ([Intel XE#301] / [Intel XE#3149]) -> ([PASS][787], [FAIL][788]) ([Intel XE#301] / [Intel XE#3149]) +1 other test ( 1 fail, 1 pass )
   [786]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [787]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [788]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling:
    - shard-adlp:         [DMESG-FAIL][789] ([Intel XE#4543]) -> [DMESG-FAIL][790] ([Intel XE#324] / [Intel XE#4543]) +1 other test dmesg-fail
   [789]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-6/igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling.html
   [790]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-4/igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][791] ([Intel XE#2311]) -> [SKIP][792] ([Intel XE#2312]) +5 other tests skip
   [791]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc.html
   [792]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff:
    - shard-dg2-set2:     [SKIP][793] ([Intel XE#656]) -> ([SKIP][794], [SKIP][795]) ([Intel XE#651]) +7 other tests ( 2 skip )
   [793]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff.html
   [794]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff.html
   [795]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-435/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-move:
    - shard-bmg:          [SKIP][796] ([Intel XE#2311]) -> ([SKIP][797], [SKIP][798]) ([Intel XE#2312])
   [796]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-move.html
   [797]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-move.html
   [798]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-move.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff:
    - shard-dg2-set2:     [SKIP][799] ([Intel XE#651]) -> [SKIP][800] ([Intel XE#656]) +2 other tests skip
   [799]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-435/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff.html
   [800]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff.html
    - shard-bmg:          [SKIP][801] ([Intel XE#2312]) -> ([SKIP][802], [SKIP][803]) ([Intel XE#2311] / [Intel XE#2312]) +2 other tests ( 2 skip )
   [801]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff.html
   [802]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff.html
   [803]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][804] ([Intel XE#2312]) -> [SKIP][805] ([Intel XE#2311]) +6 other tests skip
   [804]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt.html
   [805]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen:
    - shard-dg2-set2:     [SKIP][806] ([Intel XE#651]) -> ([SKIP][807], [SKIP][808]) ([Intel XE#651] / [Intel XE#656]) +11 other tests ( 2 skip )
   [806]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-436/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen.html
   [807]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen.html
   [808]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-433/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][809] ([Intel XE#2312]) -> ([SKIP][810], [SKIP][811]) ([Intel XE#2312] / [Intel XE#4141]) +1 other test ( 2 skip )
   [809]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-wc.html
   [810]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-wc.html
   [811]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt:
    - shard-dg2-set2:     [SKIP][812] ([Intel XE#656]) -> ([SKIP][813], [PASS][814]) ([Intel XE#656])
   [812]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt.html
   [813]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt.html
   [814]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][815] ([Intel XE#4141]) -> ([SKIP][816], [SKIP][817]) ([Intel XE#2312] / [Intel XE#4141]) +6 other tests ( 2 skip )
   [815]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-2/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html
   [816]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html
   [817]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-render:
    - shard-bmg:          [SKIP][818] ([Intel XE#2312]) -> [SKIP][819] ([Intel XE#4141]) +4 other tests skip
   [818]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-render.html
   [819]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt:
    - shard-bmg:          [SKIP][820] ([Intel XE#4141]) -> [SKIP][821] ([Intel XE#2312]) +4 other tests skip
   [820]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt.html
   [821]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt:
    - shard-bmg:          [SKIP][822] ([Intel XE#2312]) -> ([SKIP][823], [SKIP][824]) ([Intel XE#4141]) +1 other test ( 2 skip )
   [822]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html
   [823]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html
   [824]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-blt:
    - shard-bmg:          [SKIP][825] ([Intel XE#2312]) -> ([SKIP][826], [SKIP][827]) ([Intel XE#2311]) +7 other tests ( 2 skip )
   [825]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-blt.html
   [826]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-blt.html
   [827]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-pgflip-blt:
    - shard-dg2-set2:     [SKIP][828] ([Intel XE#656]) -> [SKIP][829] ([Intel XE#651]) +1 other test skip
   [828]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-pgflip-blt.html
   [829]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-plflip-blt:
    - shard-dg2-set2:     [SKIP][830] ([Intel XE#656]) -> ([SKIP][831], [SKIP][832]) ([Intel XE#651] / [Intel XE#656]) +2 other tests ( 2 skip )
   [830]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-plflip-blt.html
   [831]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-plflip-blt.html
   [832]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-blt:
    - shard-bmg:          [SKIP][833] ([Intel XE#2311]) -> ([SKIP][834], [SKIP][835]) ([Intel XE#2311] / [Intel XE#2312]) +9 other tests ( 2 skip )
   [833]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-blt.html
   [834]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-blt.html
   [835]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-onoff:
    - shard-dg2-set2:     [SKIP][836] ([Intel XE#651]) -> ([SKIP][837], [SKIP][838]) ([Intel XE#656]) +1 other test ( 2 skip )
   [836]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-466/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-onoff.html
   [837]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-onoff.html
   [838]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-wc:
    - shard-dg2-set2:     [SKIP][839] ([Intel XE#656]) -> ([SKIP][840], [SKIP][841]) ([Intel XE#653]) +3 other tests ( 2 skip )
   [839]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-wc.html
   [840]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-wc.html
   [841]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-onoff:
    - shard-bmg:          [SKIP][842] ([Intel XE#2312]) -> ([SKIP][843], [SKIP][844]) ([Intel XE#2313]) +5 other tests ( 2 skip )
   [842]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-onoff.html
   [843]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-onoff.html
   [844]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-7/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt:
    - shard-dg2-set2:     [SKIP][845] ([Intel XE#656]) -> ([SKIP][846], [SKIP][847]) ([Intel XE#653] / [Intel XE#656])
   [845]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html
   [846]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html
   [847]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt:
    - shard-bmg:          [SKIP][848] ([Intel XE#2313]) -> ([SKIP][849], [SKIP][850]) ([Intel XE#2312] / [Intel XE#2313]) +10 other tests ( 2 skip )
   [848]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-7/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html
   [849]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html
   [850]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt:
    - shard-bmg:          [SKIP][851] ([Intel XE#2312]) -> [SKIP][852] ([Intel XE#2313]) +8 other tests skip
   [851]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt.html
   [852]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt:
    - shard-dg2-set2:     [SKIP][853] ([Intel XE#653]) -> ([SKIP][854], [SKIP][855]) ([Intel XE#653] / [Intel XE#656]) +16 other tests ( 2 skip )
   [853]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-436/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt.html
   [854]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt.html
   [855]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-plflip-blt:
    - shard-bmg:          [SKIP][856] ([Intel XE#2313]) -> ([SKIP][857], [SKIP][858]) ([Intel XE#2312])
   [856]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-3/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-plflip-blt.html
   [857]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-plflip-blt.html
   [858]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-render:
    - shard-dg2-set2:     [SKIP][859] ([Intel XE#656]) -> [SKIP][860] ([Intel XE#653]) +5 other tests skip
   [859]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-render.html
   [860]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-pgflip-blt:
    - shard-dg2-set2:     [SKIP][861] ([Intel XE#653]) -> [SKIP][862] ([Intel XE#656])
   [861]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-pgflip-blt.html
   [862]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][863] ([Intel XE#2312]) -> ([SKIP][864], [SKIP][865]) ([Intel XE#2312] / [Intel XE#2313]) +6 other tests ( 2 skip )
   [863]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [864]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-3/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [865]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-shrfb-plflip-blt:
    - shard-bmg:          [SKIP][866] ([Intel XE#2313]) -> [SKIP][867] ([Intel XE#2312]) +4 other tests skip
   [866]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-1/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-shrfb-plflip-blt.html
   [867]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-4/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-shrfb-plflip-blt.html

  * igt@kms_hdr@invalid-hdr:
    - shard-dg2-set2:     [SKIP][868] ([Intel XE#455]) -> ([PASS][869], [SKIP][870]) ([Intel XE#455]) +1 other test ( 1 pass, 1 skip )
   [868]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-433/igt@kms_hdr@invalid-hdr.html
   [869]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-463/igt@kms_hdr@invalid-hdr.html
   [870]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@kms_hdr@invalid-hdr.html

  * igt@kms_plane_multiple@2x-tiling-y:
    - shard-bmg:          [SKIP][871] ([Intel XE#4596]) -> [SKIP][872] ([Intel XE#2493])
   [871]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-bmg-4/igt@kms_plane_multiple@2x-tiling-y.html
   [872]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-bmg-8/igt@kms_plane_multiple@2x-tiling-y.html
    - shard-dg2-set2:     [SKIP][873] ([Intel XE#4596]) -> [SKIP][874] ([Intel XE#455])
   [873]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-464/igt@kms_plane_multiple@2x-tiling-y.html
   [874]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-466/igt@kms_plane_multiple@2x-tiling-y.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-dg2-set2:     [SKIP][875] ([Intel XE#362]) -> ([FAIL][876], [FAIL][877]) ([Intel XE#1729])
   [875]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-463/igt@kms_tiled_display@basic-test-pattern.html
   [876]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-436/igt@kms_tiled_display@basic-test-pattern.html
   [877]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-dg2-set2:     [SKIP][878] ([Intel XE#1500]) -> ([SKIP][879], [SKIP][880]) ([Intel XE#362])
   [878]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-434/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [879]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [880]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@kms_universal_plane@cursor-fb-leak:
    - shard-adlp:         [FAIL][881] ([Intel XE#771]) -> [FAIL][882] ([Intel XE#771] / [Intel XE#899])
   [881]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-adlp-4/igt@kms_universal_plane@cursor-fb-leak.html
   [882]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-adlp-2/igt@kms_universal_plane@cursor-fb-leak.html
    - shard-lnl:          [FAIL][883] ([Intel XE#771]) -> [FAIL][884] ([Intel XE#899]) +2 other tests fail
   [883]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-lnl-5/igt@kms_universal_plane@cursor-fb-leak.html
   [884]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-lnl-3/igt@kms_universal_plane@cursor-fb-leak.html

  * igt@kms_writeback@writeback-fb-id:
    - shard-dg2-set2:     [SKIP][885] ([Intel XE#756]) -> ([SKIP][886], [SKIP][887]) ([Intel XE#326] / [Intel XE#756]) +3 other tests ( 2 skip )
   [885]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-435/igt@kms_writeback@writeback-fb-id.html
   [886]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_writeback@writeback-fb-id.html
   [887]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@kms_writeback@writeback-fb-id.html

  * igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-rebind:
    - shard-dg2-set2:     [SKIP][888] ([Intel XE#1392]) -> ([SKIP][889], [PASS][890]) ([Intel XE#1392]) +2 other tests ( 1 pass, 1 skip )
   [888]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-rebind.html
   [889]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-rebind.html
   [890]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-434/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-rebind.html

  * igt@xe_peer2peer@read:
    - shard-dg2-set2:     [SKIP][891] ([Intel XE#1061]) -> ([SKIP][892], [FAIL][893]) ([Intel XE#1061] / [Intel XE#1173])
   [891]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8288/shard-dg2-432/igt@xe_peer2peer@read.html
   [892]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-432/igt@xe_peer2peer@read.html
   [893]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12848/shard-dg2-464/igt@xe_peer2peer@read.html

  
  [Intel XE#1061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1061
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1173
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1188]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1188
  [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#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#1471]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1471
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
  [Intel XE#1500]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1500
  [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#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
  [Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#1794]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1794
  [Intel XE#1999]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1999
  [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#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [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#2286]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2286
  [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#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2360
  [Intel XE#2373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2373
  [Intel XE#2380]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2380
  [Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
  [Intel XE#2391]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2391
  [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#2457]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2457
  [Intel XE#2459]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2459
  [Intel XE#2493]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2493
  [Intel XE#2505]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2505
  [Intel XE#2541]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2541
  [Intel XE#255]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/255
  [Intel XE#2550]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2550
  [Intel XE#2571]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2571
  [Intel XE#2596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2596
  [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#2669]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2669
  [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#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2882]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2882
  [Intel XE#2883]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2883
  [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#2905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2905
  [Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
  [Intel XE#2939]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2939
  [Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
  [Intel XE#3009]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3009
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [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#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#310]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/310
  [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#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
  [Intel XE#324]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/324
  [Intel XE#326]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/326
  [Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
  [Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
  [Intel XE#3342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3342
  [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#362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/362
  [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#3767]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3767
  [Intel XE#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
  [Intel XE#3862]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3862
  [Intel XE#3889]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3889
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
  [Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
  [Intel XE#4259]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4259
  [Intel XE#4278]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4278
  [Intel XE#4302]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4302
  [Intel XE#4328]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4328
  [Intel XE#4329]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4329
  [Intel XE#4331]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4331
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4351
  [Intel XE#4416]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4416
  [Intel XE#4418]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4418
  [Intel XE#4422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4422
  [Intel XE#4439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4439
  [Intel XE#4440]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4440
  [Intel XE#4459]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4459
  [Intel XE#4501]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4501
  [Intel XE#4518]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4518
  [Intel XE#4519]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4519
  [Intel XE#4540]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4540
  [Intel XE#4541]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4541
  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4568]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4568
  [Intel XE#4570]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4570
  [Intel XE#4577]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4577
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#488]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/488
  [Intel XE#584]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/584
  [Intel XE#616]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/616
  [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#756]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/756
  [Intel XE#771]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/771
  [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#873]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/873
  [Intel XE#886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/886
  [Intel XE#899]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/899
  [Intel XE#908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/908
  [Intel XE#911]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/911
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
  [i915#3804]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3804


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

  * IGT: IGT_8288 -> IGTPW_12848

  IGTPW_12848: 12848
  IGT_8288: 8288
  xe-2854-14c330bc015ded4a1f1dd1f5aeb8617077aaa7e8: 14c330bc015ded4a1f1dd1f5aeb8617077aaa7e8

== Logs ==

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

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

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

* Re: [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API
  2025-04-03 10:12 ` [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Sharma, Swati2
@ 2025-04-07 23:26   ` Alex Hung
  0 siblings, 0 replies; 49+ messages in thread
From: Alex Hung @ 2025-04-07 23:26 UTC (permalink / raw)
  To: Sharma, Swati2, igt-dev; +Cc: harry.wentland

On 4/3/25 04:12, Sharma, Swati2 wrote:
> Hi Alex,
> 
> I could see there were few patches from Bhanu in rev4
> required to enable plane color pipeline on intel h/w.
> https://patchwork.freedesktop.org/series/123448/#rev4
> 
> However, those seems missing on latest rev7.

Hi Swati,

Thanks for reviews.

Regarding to Intel's IGT series:

Both kernel (V8) and IGT (V7) series for color pipeline have changed 
significantly. Not only I am not able to apply all patches cleanly but 
also applying them breaks the color pipeline APIs.

For example, DRM_COLOROP_CTM_3X3 and DRM_COLOROP_1D_LUT_MULTSEG were 
inserted existing enum drm_colorop_type. IGT kms_colorop tests fails 
without inserting them in kernel patchset.

We do not have Intel hardware and knowledge of Intel hardware to rebase 
Intel's kernel and IGT patchsets to the latest changes.

A summary of Bhanu's patchset as below:

- No longer needed:
   tests/kms_properties: Fix compilation errors

- Still applicable (I will include it in V8)
   lib/igt_kms: Destroy colorops on exit

- Need to be rebased by Intel
   lib/colorops: Move few helpers to common place to reuse
   drm-uapi: Add 3x3 CTM
   drm-uapi: Add multi segmented 1D LUT
   lib/igt_color: Add support for 3x3 matrices
   lib/colorops: Add support for Custom 1D LUT
   tests/kms_color_helper: Add helpers to clear colorops data
   tests/kms_color: Add plane color pipeline tests for Intel hardware


> 
> On 27-03-2025 05:05 am, Alex Hung wrote:
>> 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-v8
>>
>> 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):
>>    lib/igt_kms: increase MAX_NUM_COLOROPS to 128
>>    tests/kms_colorop: Add a sRGB test for EOTF -> Inverse EOTF -> EOTF
>>    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
>>
>> Harry Wentland (28):
>>    lib/drmtest: Add is_vkms_device()
>>    tests/kms_writeback: Fix kms_writeback for VKMS
>>    lib/igt_kms: Move get_writeback_formats_blob to lib
>>    lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
>>    include/drm-uapi: Add COLOROP object
>>    drm-uapi: Add 3x4 CTM
>>    drm-uapi: Add 1D LUT drm_colorop_type
>>    lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE
>>    tests/kms_properties: Add colorop properties test
>>    igt/color: Add SW color transform functionality
>>    lib/igt_fb: Add copy_fb function
>>    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: Parametrize the buffer format
>>    tests/kms_colorop: Add 10bpc test and skip if format not supported
>>    tests/kms_colorop: Skip if writeback does not support fourcc
>>    lib/igt_fb: Allow any non-planar format for igt_copy_fb
>>    kms/colorop: Do proper setup and cleanup
>>    lib/igt_color: Support color transform for XRGB2101010
>>    tests/kms_colorop: Set wide [13, 13] bracket for comparison on amdgpu
>>    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 tests for BT2020/BT709 TFs
>>    lib/igt_color: Point license header at skia license
>>
>>   include/drm-uapi/amdgpu_drm.h |    9 -
>>   include/drm-uapi/drm.h        |   15 +
>>   include/drm-uapi/drm_mode.h   |   99 +
>>   lib/drmtest.c                 |    5 +
>>   lib/drmtest.h                 |    1 +
>>   lib/igt_color.c               |  648 +++++
>>   lib/igt_color.h               |  162 ++
>>   lib/igt_color_lut.h           | 4946 +++++++++++++++++++++++++++++++++
>>   lib/igt_fb.c                  |   34 +-
>>   lib/igt_fb.h                  |    3 +
>>   lib/igt_kms.c                 |  359 ++-
>>   lib/igt_kms.h                 |  100 +
>>   lib/meson.build               |    1 +
>>   scripts/convert_3dlut.py      |   94 +
>>   tests/kms_colorop.c           |  702 +++++
>>   tests/kms_colorop.h           |  261 ++
>>   tests/kms_properties.c        |   94 +-
>>   tests/kms_writeback.c         |   38 +-
>>   tests/meson.build             |    1 +
>>   19 files changed, 7523 insertions(+), 49 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
>>
> 


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

end of thread, other threads:[~2025-04-07 23:26 UTC | newest]

Thread overview: 49+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
2025-03-26 23:35 ` [PATCH V7 01/37] lib/drmtest: Add is_vkms_device() Alex Hung
2025-03-26 23:35 ` [PATCH V7 02/37] tests/kms_writeback: Fix kms_writeback for VKMS Alex Hung
2025-03-26 23:35 ` [PATCH V7 03/37] lib/igt_kms: Move get_writeback_formats_blob to lib Alex Hung
2025-04-03  6:41   ` Sharma, Swati2
2025-03-26 23:35 ` [PATCH V7 04/37] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE Alex Hung
2025-03-26 23:35 ` [PATCH V7 05/37] include/drm-uapi: Add COLOROP object Alex Hung
2025-03-26 23:35 ` [PATCH V7 06/37] drm-uapi: Add 3x4 CTM Alex Hung
2025-03-26 23:35 ` [PATCH V7 07/37] drm-uapi: Add 1D LUT drm_colorop_type Alex Hung
2025-03-26 23:35 ` [PATCH V7 08/37] lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE Alex Hung
2025-04-03 10:04   ` Sharma, Swati2
2025-03-26 23:35 ` [PATCH V7 09/37] tests/kms_properties: Add colorop properties test Alex Hung
2025-03-26 23:35 ` [PATCH V7 10/37] igt/color: Add SW color transform functionality Alex Hung
2025-03-26 23:35 ` [PATCH V7 11/37] lib/igt_fb: Add copy_fb function Alex Hung
2025-03-26 23:35 ` [PATCH V7 12/37] tests/kms_colorop: Add kms_colorop tests Alex Hung
2025-04-03  9:57   ` Sharma, Swati2
2025-03-26 23:35 ` [PATCH V7 13/37] lib/igt_kms: Add support for DATA colorop property Alex Hung
2025-03-26 23:35 ` [PATCH V7 14/37] lib/igt_color: Add support for 3x4 matrices Alex Hung
2025-03-26 23:35 ` [PATCH V7 15/37] tests/kms_colorop: Add 3x4 CTM tests Alex Hung
2025-03-26 23:35 ` [PATCH V7 16/37] tests/kms_colorop: Add bypass test Alex Hung
2025-03-26 23:35 ` [PATCH V7 17/37] tests/kms_colorop: Parametrize the buffer format Alex Hung
2025-03-26 23:35 ` [PATCH V7 18/37] tests/kms_colorop: Add 10bpc test and skip if format not supported Alex Hung
2025-03-26 23:35 ` [PATCH V7 19/37] tests/kms_colorop: Skip if writeback does not support fourcc Alex Hung
2025-03-26 23:35 ` [PATCH V7 20/37] lib/igt_fb: Allow any non-planar format for igt_copy_fb Alex Hung
2025-03-26 23:35 ` [PATCH V7 21/37] kms/colorop: Do proper setup and cleanup Alex Hung
2025-03-26 23:35 ` [PATCH V7 22/37] lib/igt_color: Support color transform for XRGB2101010 Alex Hung
2025-03-26 23:35 ` [PATCH V7 23/37] tests/kms_colorop: Set wide [13, 13] bracket for comparison on amdgpu Alex Hung
2025-03-26 23:35 ` [PATCH V7 24/37] lib/igt_color: Add PQ variants for 0-1 and 0-125 range Alex Hung
2025-03-26 23:35 ` [PATCH V7 25/37] tests/kms_colorop: Add tests for PQ variants Alex Hung
2025-03-26 23:35 ` [PATCH V7 26/37] lib/igt_kms: increase MAX_NUM_COLOROPS to 128 Alex Hung
2025-03-26 23:35 ` [PATCH V7 27/37] tests/kms_colorop: Add a sRGB test for EOTF -> Inverse EOTF -> EOTF Alex Hung
2025-03-26 23:36 ` [PATCH V7 28/37] lib/igt_color: add BT2020/BT709 transfer functions Alex Hung
2025-03-26 23:36 ` [PATCH V7 29/37] tests/kms_colorop: Add tests for BT2020/BT709 TFs Alex Hung
2025-03-26 23:36 ` [PATCH V7 30/37] lib/igt_color: Add 1D LUT color transformation support Alex Hung
2025-03-26 23:36 ` [PATCH V7 31/37] test/kms_colorop: Add tests that exercise the 1D LUT colorops Alex Hung
2025-03-26 23:36 ` [PATCH V7 32/37] tests/kms_colorop: Add multiplier tests Alex Hung
2025-03-26 23:36 ` [PATCH V7 33/37] lib/igt_color: Point license header at skia license Alex Hung
2025-03-26 23:36 ` [PATCH V7 34/37] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API Alex Hung
2025-03-26 23:36 ` [PATCH V7 35/37] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
2025-03-26 23:36 ` [PATCH V7 36/37] drm-uapi: Update kernel doc for drm_colorop_type Alex Hung
2025-03-26 23:36 ` [PATCH V7 37/37] drm-uapi: Sync up definition with kernel colorop implementation Alex Hung
2025-03-27  0:48 ` ✓ Xe.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev7) Patchwork
2025-03-27  3:13 ` ✓ i915.CI.BAT: " Patchwork
2025-03-27  5:26 ` ✗ i915.CI.Full: failure " Patchwork
2025-03-27 13:49 ` ✗ Xe.CI.Full: " Patchwork
2025-03-28 12:00 ` Patchwork
2025-04-03 10:12 ` [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Sharma, Swati2
2025-04-07 23:26   ` Alex Hung
2025-04-06 16:26 ` ✗ Xe.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev7) Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox