[igt-dev] [PATCH 1/2] tests/amdgpu/amd_psr: add PSR-SU scaling test cases
David Zhang
dingchen.zhang at amd.com
Thu Apr 28 16:59:24 UTC 2022
[why]
We need a test cases to validate plane scaling scenario for PSR-SU
by visual confirm. From driver's perspective, any plane scaling
would result in that particular plane to be entirely marked as
dirty rectangle.
[how]
- create a test case to cover scenario of primary plane scaling,
start downscaling and then upscaling, validate the SU region
update by visual confirm.
- create a test case to cover scenario of primary plane scaling
plus the cursor movement. The cursor is always positioned at the
bottom-right corner of the primary plane along w/ the plane
scaling. validate the SU region update which is the combination
of dirty rectangles of primary plane scaling + cursor move.
Cc: Rodrigo Siqueira <rodrigo.siqueira at amd.com>
Cc: Harry Wentland <harry.wentland at amd.com>
Cc: Leo Li <sunpeng.li at amd.com>
Cc: Jay Pillai <aurabindo.pillai at amd.com>
Cc: Wayne Lin <wayne.lin at amd.com>
Signed-off-by: David Zhang <dingchen.zhang at amd.com>
---
tests/amdgpu/amd_psr.c | 116 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 116 insertions(+)
diff --git a/tests/amdgpu/amd_psr.c b/tests/amdgpu/amd_psr.c
index 56858f79..2ca41927 100644
--- a/tests/amdgpu/amd_psr.c
+++ b/tests/amdgpu/amd_psr.c
@@ -56,12 +56,15 @@ typedef struct data {
igt_pipe_crc_t *pipe_crc;
igt_fb_t ov_fb[2];
igt_fb_t pm_fb[2];
+ igt_fb_t cs_fb;
drmModeModeInfo *mode;
enum pipe pipe_id;
int fd;
int debugfs_fd;
int w;
int h;
+ int pb_w, pb_h;
+ int ob_w, ob_h;
} data_t;
enum cursor_move {
@@ -71,6 +74,11 @@ enum cursor_move {
INVALID
};
+typedef struct {
+ int x, y;
+ int w, h;
+} rect_t;
+
struct {
bool visual_confirm;
} opt = {
@@ -170,6 +178,10 @@ static void test_init(data_t *data)
data->w = data->mode->hdisplay;
data->h = data->mode->vdisplay;
+ data->pb_w = data->w / 2;
+ data->pb_h = data->h / 2;
+ data->ob_w = data->w;
+ data->ob_h = data->h;
}
/* Common test cleanup. */
static void test_fini(data_t *data)
@@ -609,6 +621,102 @@ static void run_check_psr_su_cursor(data_t *data, bool test_mpo)
test_fini(data);
}
+static void run_check_psr_su_scaling(data_t *data, bool test_cursor)
+{
+ int edp_idx = check_conn_type(data, DRM_MODE_CONNECTOR_eDP);
+ rect_t pb_upscale, pb_downscale, pb;
+ rect_t cs;
+ int ret;
+
+ igt_skip_on_f(edp_idx == -1, "no eDP connector found\n");
+
+ test_init(data);
+ igt_skip_on(!psr_su_supported(data));
+
+ /* size params for up/down scaling, scaling ratio = 1.5 / 0.5 respectively */
+ pb_upscale.x = pb_upscale.y = 0;
+ pb_upscale.w = data->pb_w * 3 / 2;
+ pb_upscale.h = data->pb_h * 3 / 2;
+ pb_downscale.x = pb_downscale.y = 0;
+ pb_downscale.w = data->pb_w / 2;
+ pb_downscale.h = data->pb_h / 2;
+
+ /*
+ * primary & overlay FBs creation
+ * - create primary FB of quarter screen size, i.e. width/height = 1/2 screen width/height
+ * - create overlay FB of screen size of white color (default alpha 1.0)
+ * - create cursor FB w/ a cursor pattern in magenta (if test_cursor flag set)
+ */
+ igt_create_color_fb(data->fd, data->pb_w, data->pb_h, DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
+ .0, .0, 1.0, &data->pm_fb[0]);
+ igt_create_color_fb(data->fd, data->ob_w, data->ob_h, DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_LINEAR,
+ 1.0, 1.0, 1.0, &data->ov_fb[0]);
+ if (test_cursor) {
+ cs.x = data->pb_w;
+ cs.y = data->pb_h;
+ cs.w = cs.h = 64;
+ igt_create_fb(data->fd, cs.w, cs.h, DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_LINEAR, &data->cs_fb);
+ draw_color_cursor(&data->cs_fb, cs.w, 1.0, .0, 1.0);
+ }
+
+ /* update alpha region within overlay plane for displaying upscaled primary plane */
+ draw_color_alpha(&data->ov_fb[0], pb_upscale.x, pb_upscale.y, pb_upscale.w, pb_upscale.h, 1.0, 1.0, 1.0, .0);
+
+ /* panning the primary plane at the top-left of screen */
+ igt_plane_set_fb(data->primary, &data->pm_fb[0]);
+ igt_plane_set_position(data->primary, 0, 0);
+ igt_plane_set_fb(data->overlay, &data->ov_fb[0]);
+ igt_plane_set_position(data->overlay, 0, 0);
+ if (test_cursor) {
+ igt_plane_set_fb(data->cursor, &data->cs_fb);
+ igt_plane_set_position(data->cursor, cs.x, cs.y);
+ }
+ igt_output_set_pipe(data->output, data->pipe_id);
+ igt_display_commit_atomic(&data->display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+
+ /*
+ * test by scaling the primary plane
+ * - downscaling
+ * - upscaling
+ */
+
+ /* downscaling */
+ igt_info(" downscaling primary plane from ratio 1.0 to 0.5 ...\n");
+ for (pb.w = data->pb_w, pb.h = data->pb_h, pb.x = pb.y = 0;
+ pb.w >= pb_downscale.w;
+ --pb.w, pb.h = pb.w * data->h / data->w, cs.x = pb.w, cs.y = pb.h) {
+ igt_plane_set_position(data->primary, pb.x, pb.y);
+ igt_plane_set_size(data->primary, pb.w, pb.h);
+ if (test_cursor)
+ igt_plane_set_position(data->cursor, cs.x, cs.y);
+
+ ret = igt_display_try_commit_atomic(&data->display, DRM_MODE_PAGE_FLIP_EVENT, NULL);
+ igt_require(ret == 0);
+ kmstest_wait_for_pageflip(data->fd);
+ }
+
+ /* upscaling */
+ igt_info(" upscaling primary plane from ratio 0.5 to 1.5 ...\n");
+ for (pb.w = pb_downscale.w, pb.h = pb_downscale.h, pb.x = pb.y = 0;
+ pb.w <= pb_upscale.w;
+ ++pb.w, pb.h = pb.w * data->h / data->w, cs.x = pb.w, cs.y = pb.h) {
+ igt_plane_set_position(data->primary, pb.x, pb.y);
+ igt_plane_set_size(data->primary, pb.w, pb.h);
+ if (test_cursor)
+ igt_plane_set_position(data->cursor, cs.x, cs.y);
+
+ ret = igt_display_try_commit_atomic(&data->display, DRM_MODE_PAGE_FLIP_EVENT, NULL);
+ igt_require(ret == 0);
+ kmstest_wait_for_pageflip(data->fd);
+ }
+
+ igt_remove_fb(data->fd, &data->pm_fb[0]);
+ igt_remove_fb(data->fd, &data->ov_fb[0]);
+ if (test_cursor)
+ igt_remove_fb(data->fd, &data->cs_fb);
+ test_fini(data);
+}
+
const char *help_str =
" --visual-confirm PSR visual confirm debug option enable\n";
@@ -680,6 +788,14 @@ igt_main_args("", long_options, help_str, opt_handler, NULL)
"and to validate cursor movement + MPO scenario");
igt_subtest("psr_su_cursor_mpo") run_check_psr_su_cursor(&data, true);
+ igt_describe("Test to validate PSR SU enablement with Visual Confirm "
+ "and to validate primary plane scaling scenario");
+ igt_subtest("psr_su_scaling") run_check_psr_su_scaling(&data, false);
+
+ igt_describe("Test to validate PSR SU enablement with Visual Confirm "
+ "and to validate primary plane scaling + cursor movement scenario");
+ igt_subtest("psr_su_scaling_cursor") run_check_psr_su_scaling(&data, true);
+
igt_fixture
{
if (opt.visual_confirm) {
--
2.25.1
More information about the igt-dev
mailing list