diff options
author | Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> | 2020-02-04 15:12:19 +0530 |
---|---|---|
committer | Arkadiusz Hiler <arkadiusz.hiler@intel.com> | 2020-02-07 10:36:35 +0200 |
commit | 092230f1a5297ca8b1fbff8da7f08bac7aa05df1 (patch) | |
tree | da237c0205bfd19800f7477b5461538e25f2b9b4 /tests/kms_hdr.c | |
parent | e4c9410b6be7f79f6cabe81d5c4c027afd91bcdd (diff) |
tests/kms_hdr: Add subtest to swap static HDR metadata
Add subtest to enable fast static metadata switches.
v2: Allow modeset for intel driver [Uma]
Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Diffstat (limited to 'tests/kms_hdr.c')
-rw-r--r-- | tests/kms_hdr.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/tests/kms_hdr.c b/tests/kms_hdr.c index 39d31cc2..677936c6 100644 --- a/tests/kms_hdr.c +++ b/tests/kms_hdr.c @@ -49,6 +49,7 @@ enum { TEST_NONE = 1 << 0, TEST_DPMS = 1 << 1, TEST_SUSPEND = 1 << 2, + TEST_SWAP = 1 << 3, }; /* BPC connector state. */ @@ -478,6 +479,120 @@ static void test_static_toggle(data_t *data, igt_output_t *output, } } +/* Fills some test values for HDR metadata targeting SDR. */ +static void fill_hdr_output_metadata_sdr(struct hdr_output_metadata *meta) +{ + memset(meta, 0, sizeof(*meta)); + + meta->metadata_type = HDMI_STATIC_METADATA_TYPE1; + meta->hdmi_metadata_type1.eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR; + + /* Rec. 709 */ + meta->hdmi_metadata_type1.display_primaries[0].x = + calc_hdr_float(0.640); /* Red */ + meta->hdmi_metadata_type1.display_primaries[0].y = + calc_hdr_float(0.330); + meta->hdmi_metadata_type1.display_primaries[1].x = + calc_hdr_float(0.300); /* Green */ + meta->hdmi_metadata_type1.display_primaries[1].y = + calc_hdr_float(0.600); + meta->hdmi_metadata_type1.display_primaries[2].x = + calc_hdr_float(0.150); /* Blue */ + meta->hdmi_metadata_type1.display_primaries[2].y = + calc_hdr_float(0.006); + meta->hdmi_metadata_type1.white_point.x = calc_hdr_float(0.3127); + meta->hdmi_metadata_type1.white_point.y = calc_hdr_float(0.3290); + + meta->hdmi_metadata_type1.max_display_mastering_luminance = 0; + meta->hdmi_metadata_type1.min_display_mastering_luminance = 0; + meta->hdmi_metadata_type1.max_fall = 0; + meta->hdmi_metadata_type1.max_cll = 0; +} + +static void test_static_swap(data_t *data, igt_output_t *output) +{ + igt_display_t *display = &data->display; + igt_crc_t ref_crc, new_crc; + enum pipe pipe; + igt_fb_t afb; + int afb_id; + struct hdr_output_metadata hdr; + + for_each_pipe(display, pipe) { + if (!igt_pipe_connector_valid(pipe, output)) + continue; + + if (!igt_pipe_is_free(display, pipe)) + continue; + + prepare_test(data, output, pipe); + + /* 10-bit formats are slow, so limit the size. */ + afb_id = igt_create_fb(data->fd, 512, 512, DRM_FORMAT_XRGB2101010, 0, &afb); + igt_assert(afb_id); + + draw_hdr_pattern(&afb); + + /* Start in SDR. */ + igt_plane_set_fb(data->primary, &afb); + igt_plane_set_size(data->primary, data->w, data->h); + igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8); + igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); + if (is_amdgpu_device(data->fd)) + assert_output_bpc(data, 8); + + /* Enter HDR, a modeset is allowed here. */ + fill_hdr_output_metadata_st2048(&hdr); + set_hdr_output_metadata(data, &hdr); + igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10); + igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); + if (is_amdgpu_device(data->fd)) + assert_output_bpc(data, 10); + + igt_pipe_crc_collect_crc(data->pipe_crc, &ref_crc); + + /* Change the mastering information, no modeset allowed + * for amd driver, whereas a modeset is required for i915 + * driver. */ + hdr.hdmi_metadata_type1.max_display_mastering_luminance = 200; + hdr.hdmi_metadata_type1.max_fall = 200; + hdr.hdmi_metadata_type1.max_cll = 100; + + set_hdr_output_metadata(data, &hdr); + if (is_amdgpu_device(data->fd)) + igt_display_commit_atomic(display, 0, NULL); + else + igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); + + /* Enter SDR via metadata, no modeset allowed for + * amd driver, whereas a modeset is required for + * i915 driver. */ + fill_hdr_output_metadata_sdr(&hdr); + set_hdr_output_metadata(data, &hdr); + if (is_amdgpu_device(data->fd)) + igt_display_commit_atomic(display, 0, NULL); + else + igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); + + igt_pipe_crc_collect_crc(data->pipe_crc, &new_crc); + + /* Exit SDR and enter 8bpc, cleanup. */ + set_hdr_output_metadata(data, NULL); + igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8); + igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); + if (is_amdgpu_device(data->fd)) + assert_output_bpc(data, 8); + + /* Verify that the CRC didn't change while cycling metadata. */ + igt_assert_crc_equal(&ref_crc, &new_crc); + + test_fini(data); + igt_remove_fb(data->fd, &afb); + + break; + } +} + /* Returns true if an output supports HDR metadata property. */ static bool has_hdr(igt_output_t *output) { @@ -506,6 +621,8 @@ static void test_hdr(data_t *data, const char *test_name, uint32_t flags) igt_info("HDR %s test execution on %s\n", test_name, output->name); if (flags & TEST_NONE || flags & TEST_DPMS || flags & TEST_SUSPEND) test_static_toggle(data, output, flags); + if (flags & TEST_SWAP) + test_static_swap(data, output); valid_tests++; } @@ -541,6 +658,9 @@ igt_main igt_describe("Tests static toggle with suspend"); igt_subtest("static-toggle-suspend") test_hdr(&data, "static-toggle-suspend", TEST_SUSPEND); + igt_describe("Tests swapping static HDR metadata"); + igt_subtest("static-swap") test_hdr(&data, "static-swap", TEST_SWAP); + igt_fixture { igt_display_fini(&data.display); } |