[PATCH i-g-t] tests/kms_color: Enable ctm-limited-range subtest
Sharma, Swati2
swati2.sharma at intel.com
Fri Feb 14 18:26:27 UTC 2025
Hi Ville,
On 14-02-2025 11:00 pm, Ville Syrjälä wrote:
> On Fri, Feb 14, 2025 at 09:40:11PM +0530, Swati Sharma wrote:
>> This tests is currently disabled since CRC computed on Intel
>> hardware seems to include data on the lower bits, this is
>> preventing us to CRC checks.
>>
>> Let's try to enable it back and check behavior on newer Intel
>> platforms.
>>
>> Signed-off-by: Swati Sharma <swati2.sharma at intel.com>
>> ---
>> tests/kms_color.c | 166 ++++++++++++++++++++++++++--------------------
>> 1 file changed, 93 insertions(+), 73 deletions(-)
>>
>> diff --git a/tests/kms_color.c b/tests/kms_color.c
>> index 4b71d3dd3..c3b285b4e 100644
>> --- a/tests/kms_color.c
>> +++ b/tests/kms_color.c
>> @@ -58,6 +58,7 @@
>> * @0-75: for 0.75 transparency
>> * @blue-to-red: from blue to red
>> * @green-to-red: from green to red
>> + * @limited-range: with identity matrix
>> * @max: for maximum transparency
>> * @negative: for negative transparency
>> * @red-to-blue: from red to blue
>> @@ -623,107 +624,97 @@ static bool test_pipe_ctm(data_t *data,
>> * This test is currently disabled as the CRC computed on Intel hardware seems
>> * to include data on the lower bits, this is preventing us to CRC checks.
>> */
>> -#if 0
>> -static void test_pipe_limited_range_ctm(data_t *data,
>> +static bool test_pipe_limited_range_ctm(data_t *data,
>> igt_plane_t *primary)
>> {
>> double limited_result = 235.0 / 255.0;
>> - static const color_t red_green_blue_limited[] = {
>> + color_t red_green_blue_limited[] = {
>> { limited_result, 0.0, 0.0 },
>> { 0.0, limited_result, 0.0 },
>> - { 0.0, 0.0, limited_result },
>> + { 0.0, 0.0, limited_result }
>> };
> This whole thing is fundementally broken. We can't generate
> limited range output without using the CSC post offsets,
> which are not exposed via the current CTM uapi.
We do have its equivalent test in kms_color_chamelium
and it seems its passing
https://gfx-ci.igk.intel.com/cibuglog-ng/results/all?query_key=af49bc8e4e7d1c69ce04f9a1196c167456e8344a
Is it wrong?
>
>> - static const color_t red_green_blue_full[] = {
>> + color_t red_green_blue_full[] = {
>> { 0.5, 0.0, 0.0 },
>> { 0.0, 0.5, 0.0 },
>> - { 0.0, 0.0, 0.5 },
>> - };
>> - static const double ctm[] = {
>> - 1.0, 0.0, 0.0,
>> - 0.0, 1.0, 0.0,
>> - 0.0, 0.0, 1.0,
>> + { 0.0, 0.0, 0.5 }
>> };
>> + double ctm[] = { 1.0, 0.0, 0.0,
>> + 0.0, 1.0, 0.0,
>> + 0.0, 0.0, 1.0 };
>> gamma_lut_t *degamma_linear, *gamma_linear;
>> - igt_output_t *output;
>> - bool has_broadcast_rgb_output = false;
>> + igt_output_t *output = data->output;
>> + drmModeModeInfo *mode = data->mode;
>> + struct igt_fb fb_modeset, fb;
>> + int fb_id, fb_modeset_id;
>> + igt_crc_t crc_full, crc_limited;
>> igt_display_t *display = &data->display;
>> + bool ret = false;
>> +
>> + igt_require(igt_pipe_obj_has_prop(primary->pipe, IGT_CRTC_CTM));
>>
>> degamma_linear = generate_table(data->degamma_lut_size, 1.0);
>> gamma_linear = generate_table(data->gamma_lut_size, 1.0);
>>
>> - for_each_valid_output_on_pipe(&data->display, primary->pipe->pipe, output) {
>> - drmModeModeInfo *mode;
>> - struct igt_fb fb_modeset, fb;
>> - igt_crc_t crc_full, crc_limited;
>> - int fb_id, fb_modeset_id;
>> -
>> - if (!igt_output_has_prop(output, IGT_CONNECTOR_BROADCAST_RGB))
>> - continue;
>> -
>> - has_broadcast_rgb_output = true;
>> + igt_output_set_pipe(output, primary->pipe->pipe);
>>
>> - igt_output_set_pipe(output, primary->pipe->pipe);
>> - mode = igt_output_get_mode(output);
>> + /* Create a framebuffer at the size of the output. */
>> + fb_id = igt_create_fb(data->drm_fd,
>> + mode->hdisplay,
>> + mode->vdisplay,
>> + DRM_FORMAT_XRGB8888,
>> + DRM_FORMAT_MOD_LINEAR,
>> + &fb);
>> + igt_assert(fb_id);
>>
>> - /* Create a framebuffer at the size of the output. */
>> - fb_id = igt_create_fb(data->drm_fd,
>> + fb_modeset_id = igt_create_fb(data->drm_fd,
>> mode->hdisplay,
>> mode->vdisplay,
>> DRM_FORMAT_XRGB8888,
>> DRM_FORMAT_MOD_LINEAR,
>> - &fb);
>> - igt_assert(fb_id);
>> -
>> - fb_modeset_id = igt_create_fb(data->drm_fd,
>> - mode->hdisplay,
>> - mode->vdisplay,
>> - DRM_FORMAT_XRGB8888,
>> - DRM_FORMAT_MOD_LINEAR,
>> - &fb_modeset);
>> - igt_assert(fb_modeset_id);
>> - igt_plane_set_fb(primary, &fb_modeset);
>> + &fb_modeset);
>> + igt_assert(fb_modeset_id);
>> + igt_plane_set_fb(primary, &fb_modeset);
>>
>> - set_degamma(data, primary->pipe, degamma_linear);
>> - set_gamma(data, primary->pipe, gamma_linear);
>> - set_ctm(primary->pipe, ctm);
>> -
>> - igt_output_set_prop_value(output, IGT_CONNECTOR_BROADCAST_RGB, BROADCAST_RGB_FULL);
>> - paint_rectangles(data, mode, red_green_blue_limited, &fb);
>> - igt_plane_set_fb(primary, &fb);
>> - igt_display_commit(&data->display);
>> - igt_wait_for_vblank(data->drm_fd,
>> - display->pipes[primary->pipe->pipe].crtc_offset);
>> - igt_pipe_crc_collect_crc(data->pipe_crc, &crc_full);
>> -
>> - /* Set the output into limited range. */
>> - igt_output_set_prop_value(output, IGT_CONNECTOR_BROADCAST_RGB, BROADCAST_RGB_16_235);
>> - paint_rectangles(data, mode, red_green_blue_full, &fb);
>> - igt_plane_set_fb(primary, &fb);
>> - igt_display_commit(&data->display);
>> - igt_wait_for_vblank(data->drm_fd,
>> - display->pipes[primary->pipe->pipe].crtc_offset);
>> - igt_pipe_crc_collect_crc(data->pipe_crc, &crc_limited);
>> -
>> - /* And reset.. */
>> - igt_output_set_prop_value(output, IGT_CONNECTOR_BROADCAST_RGB, BROADCAST_RGB_FULL);
>> - igt_plane_set_fb(primary, NULL);
>> - igt_output_set_pipe(output, PIPE_NONE);
>> -
>> - /* Verify that the CRC of the software computed output is
>> - * equal to the CRC of the CTM matrix transformation output.
>> - */
>> - igt_assert_crc_equal(&crc_full, &crc_limited);
>> + set_degamma(data, primary->pipe, degamma_linear);
>> + set_gamma(data, primary->pipe, gamma_linear);
>> + set_ctm(primary->pipe, ctm);
>>
>> - igt_remove_fb(data->drm_fd, &fb);
>> - igt_remove_fb(data->drm_fd, &fb_modeset);
>> - }
>> + igt_output_set_prop_value(output,
>> + IGT_CONNECTOR_BROADCAST_RGB,
>> + BROADCAST_RGB_FULL);
>> + paint_rectangles(data, mode, red_green_blue_limited, &fb);
>> + igt_plane_set_fb(primary, &fb);
>> + igt_display_commit(&data->display);
>> + igt_wait_for_vblank(data->drm_fd,
>> + display->pipes[primary->pipe->pipe].crtc_offset);
>> + igt_pipe_crc_collect_crc(data->pipe_crc, &crc_full);
>> +
>> + /* Set the output into limited range. */
>> + igt_output_set_prop_value(output,
>> + IGT_CONNECTOR_BROADCAST_RGB,
>> + BROADCAST_RGB_16_235);
>> + paint_rectangles(data, mode, red_green_blue_full, &fb);
>> + igt_plane_set_fb(primary, &fb);
>> + igt_display_commit(&data->display);
>> + igt_wait_for_vblank(data->drm_fd,
>> + display->pipes[primary->pipe->pipe].crtc_offset);
>> + igt_pipe_crc_collect_crc(data->pipe_crc, &crc_limited);
>> +
>> + /* And reset.. */
>> + igt_output_set_prop_value(output,
>> + IGT_CONNECTOR_BROADCAST_RGB,
>> + BROADCAST_RGB_FULL);
>> + igt_plane_set_fb(primary, NULL);
>> + igt_output_set_pipe(output, PIPE_NONE);
>> + igt_display_commit(&data->display);
>> +
>> + ret = igt_skip_crc_compare || igt_check_crc_equal(&crc_full, &crc_limited);
>>
>> free_lut(gamma_linear);
>> free_lut(degamma_linear);
>>
>> - igt_require(has_broadcast_rgb_output);
>> + return ret;
>> }
>> -#endif
>>
>> static void
>> prep_pipe(data_t *data, enum pipe p)
>> @@ -1000,6 +991,25 @@ run_invalid_tests_for_pipe(data_t *data)
>> }
>> }
>>
>> +static void
>> +run_limited_range_ctm_test_for_pipe(data_t *data, enum pipe p,
>> + bool (*test_t)(data_t*, igt_plane_t*))
>> +{
>> + test_setup(data, p);
>> +
>> + igt_require(igt_output_has_prop(data->output, IGT_CONNECTOR_BROADCAST_RGB));
>> +
>> + data->color_depth = 8;
>> + data->drm_format = DRM_FORMAT_XRGB8888;
>> + data->mode = igt_output_get_mode(data->output);
>> +
>> + igt_require(pipe_output_combo_valid(data, p));
>> +
>> + igt_assert(test_t(data, data->primary));
>> +
>> + test_cleanup(data);
>> +}
>> +
>> static void
>> run_tests_for_pipe(data_t *data)
>> {
>> @@ -1156,6 +1166,16 @@ run_tests_for_pipe(data_t *data)
>> }
>> }
>>
>> + igt_describe("Compare after applying ctm matrix & identity matrix");
>> + igt_subtest_with_dynamic("ctm-limited-range") {
>> + for_each_pipe_with_valid_output(&data->display, pipe, data->output) {
>> + igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe),
>> + igt_output_name(data->output))
>> + run_limited_range_ctm_test_for_pipe(data, pipe,
>> + test_pipe_limited_range_ctm);
>> + }
>> + }
>> +
>> igt_fixture
>> igt_require(data->display.is_atomic);
>>
>> --
>> 2.25.1
More information about the igt-dev
mailing list