[igt-dev] [PATCH i-g-t 4/4] tests/kms_flip_scaled_crc: Validate NN scaling filter
Swati Sharma
swati2.sharma at intel.com
Tue Jun 28 18:43:04 UTC 2022
SCALING_FILTER can be used either as plane scaler property
or CRTC scaler property.
The value of this property can be one of the following:
Default:
Driver's default scaling filter
Nearest Neighbor:
Nearest Neighbor scaling filter
If NN is used for scaling, sharpness is preserved
whereas if we use default scaling we can see blurriness
at edges.
v2: -no need to set pipe scaler filter property
v3: -addition of new lines to improve readability
-use of SPDX licence placeholder
-close(data.drm_fd)
v4: -instead of creating new i-g-t, tweaked kms_flip_scaled_crc
to validate both default and nn scaling filters
Cc: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
Cc: Petri Latvala <petri.latvala at intel.com>
Cc: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
Signed-off-by: Swati Sharma <swati2.sharma at intel.com>
---
lib/igt_kms.c | 16 +++++++++++
lib/igt_kms.h | 1 +
tests/i915/kms_flip_scaled_crc.c | 48 +++++++++++++++++++++++++++++---
3 files changed, 61 insertions(+), 4 deletions(-)
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 626a2567..fc3ad68b 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -912,6 +912,22 @@ const char *kmstest_connector_status_str(int status)
return find_type_name(connector_status_names, status);
}
+enum drm_scaling_filter {
+ DRM_SCALING_FILTER_DEFAULT,
+ DRM_SCALING_FILTER_NEAREST_NEIGHBOR,
+};
+
+static const struct type_name drm_scaling_filter[] = {
+ { DRM_SCALING_FILTER_DEFAULT, "Default" },
+ { DRM_SCALING_FILTER_NEAREST_NEIGHBOR, "Nearest Neighbor" },
+ {}
+};
+
+const char *kmstest_scaling_filter_str(int filter)
+{
+ return find_type_name(drm_scaling_filter, filter);
+}
+
static const struct type_name connector_type_names[] = {
{ DRM_MODE_CONNECTOR_Unknown, "Unknown" },
{ DRM_MODE_CONNECTOR_VGA, "VGA" },
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index bd05a13b..4b67708d 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -107,6 +107,7 @@ enum igt_custom_edid_type {
const char *kmstest_encoder_type_str(int type);
const char *kmstest_connector_status_str(int status);
const char *kmstest_connector_type_str(int type);
+const char *kmstest_scaling_filter_str(int filter);
void kmstest_dump_mode(drmModeModeInfo *mode);
#define MAX_HDISPLAY_PER_PIPE 5120
diff --git a/tests/i915/kms_flip_scaled_crc.c b/tests/i915/kms_flip_scaled_crc.c
index e291add4..91851e5e 100644
--- a/tests/i915/kms_flip_scaled_crc.c
+++ b/tests/i915/kms_flip_scaled_crc.c
@@ -26,6 +26,11 @@
IGT_TEST_DESCRIPTION("Test flipping between scaled/nonscaled framebuffers");
+enum {
+ DRM_SCALING_FILTER_DEFAULT,
+ DRM_SCALING_FILTER_NEAREST_NEIGHBOR,
+};
+
typedef struct {
int drm_fd;
igt_display_t display;
@@ -476,7 +481,7 @@ static void clear_lut(data_t *data, enum pipe pipe)
static void test_flip_to_scaled(data_t *data, uint32_t index,
enum pipe pipe, igt_output_t *output,
- drmModeModeInfoPtr modetoset)
+ drmModeModeInfoPtr modetoset, int flags)
{
igt_plane_t *primary;
igt_crc_t small_crc, big_crc;
@@ -513,6 +518,7 @@ static void test_flip_to_scaled(data_t *data, uint32_t index,
igt_output_set_pipe(output, pipe);
primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+ igt_skip_on_f (!igt_plane_has_prop(primary, IGT_PLANE_SCALING_FILTER), "Plane scaling filter prop not supported");
igt_skip_on_f (!igt_plane_has_format_mod(primary, data->small_fb.drm_format,
data->small_fb.modifier) ||
!igt_plane_has_format_mod(primary, data->big_fb.drm_format,
@@ -528,6 +534,8 @@ static void test_flip_to_scaled(data_t *data, uint32_t index,
data->pipe_crc = igt_pipe_crc_new(data->drm_fd, pipe,
INTEL_PIPE_CRC_SOURCE_AUTO);
+ igt_plane_set_prop_enum(primary, IGT_PLANE_SCALING_FILTER, kmstest_scaling_filter_str(flags));
+
igt_plane_set_position(primary, 0, 0);
igt_plane_set_fb(primary, &data->small_fb);
igt_plane_set_size(primary, data->attemptmodewidth,
@@ -613,9 +621,39 @@ igt_main
}
}
+ igt_describe("Tests with default plane scaling filter");
+ for (int index = 0; index < ARRAY_SIZE(flip_scenario_test); index++) {
+ igt_describe(flip_scenario_test[index].describe);
+ igt_subtest_with_dynamic_f("default-%s", flip_scenario_test[index].name) {
+ free_fbs(&data);
+ for_each_pipe(&data.display, pipe) {
+ bool found = false;
+ for_each_valid_output_on_pipe(&data.display, pipe, output) {
+ modetoset = find_mode(&data, output);
+ if (modetoset) {
+ found = true;
+ igt_dynamic_f("pipe-%s-valid-mode", kmstest_pipe_name(pipe))
+ test_flip_to_scaled(&data, index, pipe, output, modetoset,
+ DRM_SCALING_FILTER_DEFAULT);
+ break;
+ }
+ }
+ if (!found) {
+ for_each_valid_output_on_pipe(&data.display, pipe, output) {
+ igt_dynamic_f("pipe-%s-default-mode", kmstest_pipe_name(pipe))
+ test_flip_to_scaled(&data, index, pipe, output, NULL,
+ DRM_SCALING_FILTER_DEFAULT);
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ igt_describe("Tests with nearest neighbor plane scaling filter");
for (int index = 0; index < ARRAY_SIZE(flip_scenario_test); index++) {
igt_describe(flip_scenario_test[index].describe);
- igt_subtest_with_dynamic(flip_scenario_test[index].name) {
+ igt_subtest_with_dynamic_f("nn-%s", flip_scenario_test[index].name) {
free_fbs(&data);
for_each_pipe(&data.display, pipe) {
bool found = false;
@@ -624,14 +662,16 @@ igt_main
if (modetoset) {
found = true;
igt_dynamic_f("pipe-%s-valid-mode", kmstest_pipe_name(pipe))
- test_flip_to_scaled(&data, index, pipe, output, modetoset);
+ test_flip_to_scaled(&data, index, pipe, output, modetoset,
+ DRM_SCALING_FILTER_NEAREST_NEIGHBOR);
break;
}
}
if (!found) {
for_each_valid_output_on_pipe(&data.display, pipe, output) {
igt_dynamic_f("pipe-%s-default-mode", kmstest_pipe_name(pipe))
- test_flip_to_scaled(&data, index, pipe, output, NULL);
+ test_flip_to_scaled(&data, index, pipe, output, NULL,
+ DRM_SCALING_FILTER_NEAREST_NEIGHBOR);
}
}
break;
--
2.25.1
More information about the igt-dev
mailing list