Skip to content
Snippets Groups Projects
Commit a7b11bab authored by Melissa Wen's avatar Melissa Wen
Browse files

tests/kms_color: add invalid and valid LUT 3D MODE tests

Validate if the driver accepts correct values of DRM CRTC LUT 3D MODE
property and also advertise supported modes as expected.

The valid tests was proposed by Alex Hung at:
https://patchwork.freedesktop.org/series/109402/



Co-developed-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarMelissa Wen <mwen@igalia.com>
parent f2159446
No related branches found
No related tags found
Loading
...@@ -883,6 +883,111 @@ run_deep_color_tests_for_pipe(data_t *data, enum pipe p) ...@@ -883,6 +883,111 @@ run_deep_color_tests_for_pipe(data_t *data, enum pipe p)
test_cleanup(data); test_cleanup(data);
} }
static void verify_3dlut_mode(data_t *data, uint64_t blob_id)
{
struct drm_mode_3dlut_mode *mode_3dlut = NULL;
drmModePropertyBlobPtr blob;
uint32_t i, j, count;
blob = drmModeGetPropertyBlob(data->drm_fd, blob_id);
igt_assert(blob);
igt_assert(blob->length);
mode_3dlut = (struct drm_mode_3dlut_mode *) blob->data;
count = blob->length / sizeof(mode_3dlut[0]);
igt_assert(count);
for (i = 0; i < count; i++) {
igt_assert(mode_3dlut[i].lut_size);
igt_assert(mode_3dlut[i].bit_depth);
for (j = 0; j < 3; j++) {
igt_assert(mode_3dlut[i].lut_stride[j]);
igt_assert_lte(mode_3dlut[i].lut_size,
mode_3dlut[i].lut_stride[j]);
}
/* check whether color formats are support */
if (mode_3dlut[i].color_format != DRM_FORMAT_XRGB16161616 &&
mode_3dlut[i].color_format != DRM_FORMAT_XBGR16161616)
igt_info("format 0x%X is not supported\n", mode_3dlut[i].color_format);
}
drmModeFreePropertyBlob(blob);
}
static void crtc_lut3d_modes_test(data_t *data, enum pipe p)
{
igt_display_t *display = &data->display;
igt_pipe_t *pipe = &display->pipes[p];
drmModePropertyPtr lut_3d_mode = NULL;
uint32_t i;
igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_LUT_3D_MODE));
igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_LUT_3D_MODE));
lut_3d_mode = get_pipe_lut_mode(pipe, IGT_CRTC_LUT_3D_MODE);
for (i = 0; i < lut_3d_mode->count_enums; i++) {
igt_info("Verifying 3D LUT mode: \'%s\'\n", lut_3d_mode->enums[i].name);
verify_3dlut_mode(data, lut_3d_mode->enums[i].value);
igt_pipe_obj_set_prop_enum(pipe,
IGT_CRTC_LUT_3D_MODE,
lut_3d_mode->enums[i].name);
igt_assert(igt_display_commit2(display, display->is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY) == 0);
}
drmModeFreeProperty(lut_3d_mode);
}
static void invalid_lut3d_modes(data_t *data, enum pipe p)
{
igt_display_t *display = &data->display;
igt_pipe_t *pipe = &display->pipes[p];
drmModePropertyPtr lut_3d_mode = NULL;
int count;
char str[20];
igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_LUT_3D_MODE));
igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_LUT_3D_MODE));
lut_3d_mode = get_pipe_lut_mode(pipe, IGT_CRTC_LUT_3D_MODE);
count = lut_3d_mode->count_enums;
igt_assert(count > 0);
igt_info("The last mode (\'%s\') is valid\n", lut_3d_mode->enums[count-1].name);
igt_assert(igt_pipe_obj_try_prop_enum(pipe,
IGT_CRTC_LUT_3D_MODE,
lut_3d_mode->enums[count-1].name));
igt_info("Empty mode (\'\') is not valid\n");
igt_fail_on(igt_pipe_obj_try_prop_enum(pipe,
IGT_CRTC_LUT_3D_MODE,
""));
sprintf(str, "%lld", lut_3d_mode->enums[0].value);
igt_info("The mode value (\'%s\') is not valid\n", str);
igt_fail_on(igt_pipe_obj_try_prop_enum(pipe,
IGT_CRTC_LUT_3D_MODE,
str));
/* we can't set a mode not listed */
igt_info("The mode (\'lut3d_9_100bit\') is not valid\n");
igt_fail_on(igt_pipe_obj_try_prop_enum(pipe,
IGT_CRTC_LUT_3D_MODE,
"lut3d_9_100bit"));
igt_info("The first mode (\'%s\') is valid\n", lut_3d_mode->enums[0].name);
igt_assert(igt_pipe_obj_try_prop_enum(pipe,
IGT_CRTC_LUT_3D_MODE,
lut_3d_mode->enums[0].name));
drmModeFreeProperty(lut_3d_mode);
}
static void static void
run_invalid_tests_for_pipe(data_t *data) run_invalid_tests_for_pipe(data_t *data)
{ {
...@@ -903,6 +1008,12 @@ run_invalid_tests_for_pipe(data_t *data) ...@@ -903,6 +1008,12 @@ run_invalid_tests_for_pipe(data_t *data)
{ "invalid-shaper-lut-sizes", invalid_shaper_lut_sizes, { "invalid-shaper-lut-sizes", invalid_shaper_lut_sizes,
"Negative check for invalid shaper LUT sizes" }, "Negative check for invalid shaper LUT sizes" },
{ "invalid-lut3d-modes", invalid_lut3d_modes,
"Negative check for invalid 3D LUT modes" },
{ "validate-lut3d-modes", crtc_lut3d_modes_test,
"Check if all lut3d modes are valid" },
}; };
int i; int i;
......
...@@ -257,6 +257,23 @@ void disable_prop(igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop) ...@@ -257,6 +257,23 @@ void disable_prop(igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop)
igt_pipe_obj_replace_prop_blob(pipe, prop, NULL, 0); igt_pipe_obj_replace_prop_blob(pipe, prop, NULL, 0);
} }
drmModePropertyPtr get_pipe_lut_mode(igt_pipe_t *pipe,
enum igt_atomic_crtc_properties prop)
{
igt_display_t *display = pipe->display;
uint32_t prop_id = pipe->props[prop];
drmModePropertyPtr drmProp;
igt_assert(prop_id);
drmProp = drmModeGetProperty(display->drm_fd, prop_id);
igt_assert(drmProp);
igt_assert(drmProp->count_enums);
return drmProp;
}
drmModePropertyBlobPtr drmModePropertyBlobPtr
get_blob(data_t *data, igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop) get_blob(data_t *data, igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop)
{ {
......
...@@ -102,6 +102,8 @@ void disable_prop(igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop); ...@@ -102,6 +102,8 @@ void disable_prop(igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop);
#define disable_gamma(pipe) disable_prop(pipe, IGT_CRTC_GAMMA_LUT) #define disable_gamma(pipe) disable_prop(pipe, IGT_CRTC_GAMMA_LUT)
#define disable_ctm(pipe) disable_prop(pipe, IGT_CRTC_CTM) #define disable_ctm(pipe) disable_prop(pipe, IGT_CRTC_CTM)
drmModePropertyPtr get_pipe_lut_mode(igt_pipe_t *pipe,
enum igt_atomic_crtc_properties prop);
drmModePropertyBlobPtr get_blob(data_t *data, igt_pipe_t *pipe, drmModePropertyBlobPtr get_blob(data_t *data, igt_pipe_t *pipe,
enum igt_atomic_crtc_properties prop); enum igt_atomic_crtc_properties prop);
bool crc_equal(igt_crc_t *a, igt_crc_t *b); bool crc_equal(igt_crc_t *a, igt_crc_t *b);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment