* [PATCH v3 0/2] tests/kms_async_flips: Create subtest for overlay planes
@ 2025-03-20 14:00 André Almeida
2025-03-20 14:00 ` [PATCH v3 1/2] kms_async_flips: Refactor data options André Almeida
2025-03-20 14:00 ` [PATCH v3 2/2] tests/kms_async_flips: Create subtest for overlay planes André Almeida
0 siblings, 2 replies; 5+ messages in thread
From: André Almeida @ 2025-03-20 14:00 UTC (permalink / raw)
To: igt-dev, Jeevan B, Kamil Konieczny
Cc: kernel-dev, Vitaly Prosyak, Alex Hung, Melissa Wen,
Rodrigo Siqueira, André Almeida
This patchset creates a subtest for overlay planes. This is supported by amdgpu
and is merged in the kernel:
https://lore.kernel.org/lkml/173948734065.719858.7405160715916126757.b4-ty@linaro.org/
v3:
- Fixed a bug that was mixing `alternate_sync_async = true` with the overlay path
- Refactored how the test parameters are being set/unset (patch 1/2)
- Fixed a bug where a primary buffer was being used with an overlay plane
v2: Add test description for GitLab compilation
André Almeida (2):
kms_async_flips: Refactor data options
tests/kms_async_flips: Create subtest for overlay planes
tests/kms_async_flips.c | 72 ++++++++++++++++++++++++++++++++++-------
1 file changed, 60 insertions(+), 12 deletions(-)
--
2.49.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/2] kms_async_flips: Refactor data options
2025-03-20 14:00 [PATCH v3 0/2] tests/kms_async_flips: Create subtest for overlay planes André Almeida
@ 2025-03-20 14:00 ` André Almeida
2025-03-24 21:22 ` Melissa Wen
2025-03-20 14:00 ` [PATCH v3 2/2] tests/kms_async_flips: Create subtest for overlay planes André Almeida
1 sibling, 1 reply; 5+ messages in thread
From: André Almeida @ 2025-03-20 14:00 UTC (permalink / raw)
To: igt-dev, Jeevan B, Kamil Konieczny
Cc: kernel-dev, Vitaly Prosyak, Alex Hung, Melissa Wen,
Rodrigo Siqueira, André Almeida
Setting the test data options as true and false for every test is error
prone. Instead, reset all the data to false at the end of a test and
just set the needed options to true before running a test.
Signed-off-by: André Almeida <andrealmeid@igalia.com>
---
tests/kms_async_flips.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c
index da426f753..d4af9b383 100644
--- a/tests/kms_async_flips.c
+++ b/tests/kms_async_flips.c
@@ -708,6 +708,9 @@ static void run_test(data_t *data, void (*test)(data_t *))
test(data);
}
}
+
+ data->alternate_sync_async = false;
+ data->atomic_path = false;
}
static void run_test_with_modifiers(data_t *data, void (*test)(data_t *))
@@ -738,6 +741,9 @@ static void run_test_with_modifiers(data_t *data, void (*test)(data_t *))
}
}
}
+
+ data->alternate_sync_async = false;
+ data->atomic_path = false;
}
static data_t data;
@@ -757,6 +763,9 @@ igt_main
if (is_intel_device(data.drm_fd))
data.bops = buf_ops_create(data.drm_fd);
+
+ data.alternate_sync_async = false;
+ data.atomic_path = false;
}
igt_describe("Verify the async flip functionality and the fps during async flips");
@@ -766,8 +775,6 @@ igt_main
igt_describe("Wait for page flip events in between successive asynchronous flips");
igt_subtest_with_dynamic("async-flip-with-page-flip-events") {
- data.alternate_sync_async = false;
- data.atomic_path = false;
if (is_intel_device(data.drm_fd))
run_test_with_modifiers(&data, test_async_flip);
else
@@ -777,7 +784,6 @@ igt_main
igt_describe("Wait for page flip events in between successive "
"asynchronous flips using atomic path");
igt_subtest_with_dynamic("async-flip-with-page-flip-events-atomic") {
- data.alternate_sync_async = false;
data.atomic_path = true;
if (is_intel_device(data.drm_fd))
run_test_with_modifiers(&data, test_async_flip);
@@ -788,7 +794,6 @@ igt_main
igt_describe("Alternate between sync and async flips");
igt_subtest_with_dynamic("alternate-sync-async-flip") {
data.alternate_sync_async = true;
- data.atomic_path = false;
run_test(&data, test_async_flip);
}
@@ -802,7 +807,6 @@ igt_main
igt_describe("Verify that the async flip timestamp does not "
"coincide with either previous or next vblank");
igt_subtest_with_dynamic("test-time-stamp") {
- data.atomic_path = false;
run_test(&data, test_timestamp);
}
@@ -825,7 +829,6 @@ igt_main
"PSR2 sel fetch causes cursor to be added to primary plane "
"pages flips and async flip is not supported in cursor\n");
- data.atomic_path = false;
run_test(&data, test_cursor);
}
@@ -853,7 +856,6 @@ igt_main
igt_require(igt_display_has_format_mod(&data.display, DRM_FORMAT_XRGB8888,
I915_FORMAT_MOD_Y_TILED));
- data.atomic_path = false;
run_test(&data, test_invalid);
}
@@ -876,7 +878,6 @@ igt_main
/* Devices without CRC can't run this test */
igt_require_pipe_crc(data.drm_fd);
- data.atomic_path = false;
run_test(&data, test_crc);
}
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/2] tests/kms_async_flips: Create subtest for overlay planes
2025-03-20 14:00 [PATCH v3 0/2] tests/kms_async_flips: Create subtest for overlay planes André Almeida
2025-03-20 14:00 ` [PATCH v3 1/2] kms_async_flips: Refactor data options André Almeida
@ 2025-03-20 14:00 ` André Almeida
2025-03-24 21:32 ` Melissa Wen
1 sibling, 1 reply; 5+ messages in thread
From: André Almeida @ 2025-03-20 14:00 UTC (permalink / raw)
To: igt-dev, Jeevan B, Kamil Konieczny
Cc: kernel-dev, Vitaly Prosyak, Alex Hung, Melissa Wen,
Rodrigo Siqueira, André Almeida
amdgpu can perform async flips in overlay planes as well, so create a
test for that.
Signed-off-by: André Almeida <andrealmeid@igalia.com>
---
tests/kms_async_flips.c | 55 ++++++++++++++++++++++++++++++++++++++---
1 file changed, 51 insertions(+), 4 deletions(-)
diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c
index d4af9b383..bca646664 100644
--- a/tests/kms_async_flips.c
+++ b/tests/kms_async_flips.c
@@ -105,12 +105,14 @@ typedef struct {
uint32_t crtc_id;
uint32_t refresh_rate;
struct igt_fb bufs[NUM_FBS];
+ struct igt_fb bufs_overlay[NUM_FBS];
igt_display_t display;
igt_output_t *output;
unsigned long flip_timestamp_us;
double flip_interval;
uint64_t modifier;
igt_plane_t *plane;
+ igt_plane_t *plane_overlay;
igt_pipe_crc_t *pipe_crc;
igt_crc_t ref_crc;
int flip_count;
@@ -122,6 +124,7 @@ typedef struct {
bool allow_fail;
struct buf_ops *bops;
bool atomic_path;
+ bool overlay_path;
} data_t;
static void flip_handler(int fd_, unsigned int sequence, unsigned int tv_sec,
@@ -207,6 +210,18 @@ static void require_monotonic_timestamp(int fd)
"Monotonic timestamps not supported\n");
}
+static void require_overlay_flip_support(data_t *data)
+{
+ struct igt_fb *bufs = data->bufs_overlay;
+ igt_plane_t *plane = data->plane_overlay;
+ int flags = DRM_MODE_PAGE_FLIP_ASYNC | DRM_MODE_PAGE_FLIP_EVENT;
+
+ igt_plane_set_fb(plane, &bufs[0]);
+
+ igt_require_f(!igt_display_try_commit_atomic(&data->display, flags, data),
+ "Async flip for overlay planes not supported\n");
+}
+
static void test_init(data_t *data)
{
drmModeModeInfo *mode;
@@ -222,6 +237,8 @@ static void test_init(data_t *data)
igt_output_set_pipe(data->output, data->pipe);
data->plane = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
+ if (data->overlay_path)
+ data->plane_overlay = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_OVERLAY);
}
static void test_init_fbs(data_t *data)
@@ -242,16 +259,27 @@ static void test_init_fbs(data_t *data)
prev_modifier = data->modifier;
if (data->bufs[0].fb_id) {
- for (i = 0; i < NUM_FBS; i++)
+ for (i = 0; i < NUM_FBS; i++) {
igt_remove_fb(data->drm_fd, &data->bufs[i]);
+ if (data->overlay_path)
+ igt_remove_fb(data->drm_fd, &data->bufs_overlay[i]);
+ }
}
- for (i = 0; i < NUM_FBS; i++)
+ for (i = 0; i < NUM_FBS; i++) {
make_fb(data, &data->bufs[i], width, height, i);
+ if (data->overlay_path)
+ make_fb(data, &data->bufs_overlay[i], width, height, i);
+ }
}
igt_plane_set_fb(data->plane, &data->bufs[0]);
igt_plane_set_size(data->plane, width, height);
+
+ if (data->overlay_path) {
+ igt_plane_set_fb(data->plane_overlay, &data->bufs[0]);
+ igt_plane_set_size(data->plane_overlay, width, height);
+ }
}
static bool async_flip_needs_extra_frame(data_t *data)
@@ -279,12 +307,17 @@ static bool async_flip_needs_extra_frame(data_t *data)
static int perform_flip(data_t *data, int frame, int flags)
{
int ret;
+ igt_plane_t *plane;
+ struct igt_fb *bufs;
+
+ plane = data->overlay_path ? data->plane_overlay : data->plane;
+ bufs = data->overlay_path ? data->bufs_overlay : data->bufs;
if (!data->atomic_path) {
ret = drmModePageFlip(data->drm_fd, data->crtc_id,
- data->bufs[frame % NUM_FBS].fb_id, flags, data);
+ bufs[frame % NUM_FBS].fb_id, flags, data);
} else {
- igt_plane_set_fb(data->plane, &data->bufs[frame % NUM_FBS]);
+ igt_plane_set_fb(plane, &bufs[frame % NUM_FBS]);
ret = igt_display_try_commit_atomic(&data->display, flags, data);
}
@@ -300,6 +333,9 @@ static void test_async_flip(data_t *data)
igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
+ if (data->overlay_path)
+ require_overlay_flip_support(data);
+
gettimeofday(&start, NULL);
frame = 1;
do {
@@ -711,6 +747,7 @@ static void run_test(data_t *data, void (*test)(data_t *))
data->alternate_sync_async = false;
data->atomic_path = false;
+ data->overlay_path = false;
}
static void run_test_with_modifiers(data_t *data, void (*test)(data_t *))
@@ -744,6 +781,7 @@ static void run_test_with_modifiers(data_t *data, void (*test)(data_t *))
data->alternate_sync_async = false;
data->atomic_path = false;
+ data->overlay_path = false;
}
static data_t data;
@@ -766,6 +804,7 @@ igt_main
data.alternate_sync_async = false;
data.atomic_path = false;
+ data.overlay_path = false;
}
igt_describe("Verify the async flip functionality and the fps during async flips");
@@ -804,6 +843,14 @@ igt_main
run_test(&data, test_async_flip);
}
+ igt_describe("Verify overlay planes with async flips in atomic API");
+ igt_subtest_with_dynamic("overlay-atomic") {
+ igt_require(is_amdgpu_device(data.drm_fd));
+ data.atomic_path = true;
+ data.overlay_path = true;
+ run_test(&data, test_async_flip);
+ }
+
igt_describe("Verify that the async flip timestamp does not "
"coincide with either previous or next vblank");
igt_subtest_with_dynamic("test-time-stamp") {
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/2] kms_async_flips: Refactor data options
2025-03-20 14:00 ` [PATCH v3 1/2] kms_async_flips: Refactor data options André Almeida
@ 2025-03-24 21:22 ` Melissa Wen
0 siblings, 0 replies; 5+ messages in thread
From: Melissa Wen @ 2025-03-24 21:22 UTC (permalink / raw)
To: André Almeida
Cc: igt-dev, Jeevan B, Kamil Konieczny, kernel-dev, Vitaly Prosyak,
Alex Hung, Rodrigo Siqueira
On 03/20, André Almeida wrote:
> Setting the test data options as true and false for every test is error
> prone. Instead, reset all the data to false at the end of a test and
> just set the needed options to true before running a test.
>
> Signed-off-by: André Almeida <andrealmeid@igalia.com>
Hey, thanks for addressing this issue.
Besides that missing cleanup steps, I detected other issues on the atomic async flip subtests introduce by:
296891df ("tests/kms_async_flips: subtests to validate async flips on atomic path")
when running in a kernel without atomic async flip support.
1 - those subtests don't check the `DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP` cap
before perform atomic async flip tests and, therefore, they fail instead
of skips.
2 - the test sequence is not easy to follow and somewhat error prone
since it mixes legacy and atomic paths all the time. I think it should
be better if we keep atomic tests separated from the legacy path, i.e.
in a different igt_subtest_group.
As you are already fixing this mess, how about solve these other
problems too? :) It can also make the whole async flip test more
stable.
One more comment below
> ---
> tests/kms_async_flips.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c
> index da426f753..d4af9b383 100644
> --- a/tests/kms_async_flips.c
> +++ b/tests/kms_async_flips.c
> @@ -708,6 +708,9 @@ static void run_test(data_t *data, void (*test)(data_t *))
> test(data);
> }
> }
> +
> + data->alternate_sync_async = false;
> + data->atomic_path = false;
> }
>
> static void run_test_with_modifiers(data_t *data, void (*test)(data_t *))
> @@ -738,6 +741,9 @@ static void run_test_with_modifiers(data_t *data, void (*test)(data_t *))
> }
> }
> }
> +
> + data->alternate_sync_async = false;
> + data->atomic_path = false;
> }
>
> static data_t data;
> @@ -757,6 +763,9 @@ igt_main
>
> if (is_intel_device(data.drm_fd))
> data.bops = buf_ops_create(data.drm_fd);
> +
> + data.alternate_sync_async = false;
> + data.atomic_path = false;
It would be easier to maintain if we modularize cleanup steps in a
single function, such as, `test_data_cleanup`. WDYT?
BR,
Melissa
> }
>
> igt_describe("Verify the async flip functionality and the fps during async flips");
> @@ -766,8 +775,6 @@ igt_main
>
> igt_describe("Wait for page flip events in between successive asynchronous flips");
> igt_subtest_with_dynamic("async-flip-with-page-flip-events") {
> - data.alternate_sync_async = false;
> - data.atomic_path = false;
> if (is_intel_device(data.drm_fd))
> run_test_with_modifiers(&data, test_async_flip);
> else
> @@ -777,7 +784,6 @@ igt_main
> igt_describe("Wait for page flip events in between successive "
> "asynchronous flips using atomic path");
> igt_subtest_with_dynamic("async-flip-with-page-flip-events-atomic") {
> - data.alternate_sync_async = false;
> data.atomic_path = true;
> if (is_intel_device(data.drm_fd))
> run_test_with_modifiers(&data, test_async_flip);
> @@ -788,7 +794,6 @@ igt_main
> igt_describe("Alternate between sync and async flips");
> igt_subtest_with_dynamic("alternate-sync-async-flip") {
> data.alternate_sync_async = true;
> - data.atomic_path = false;
> run_test(&data, test_async_flip);
> }
>
> @@ -802,7 +807,6 @@ igt_main
> igt_describe("Verify that the async flip timestamp does not "
> "coincide with either previous or next vblank");
> igt_subtest_with_dynamic("test-time-stamp") {
> - data.atomic_path = false;
> run_test(&data, test_timestamp);
> }
>
> @@ -825,7 +829,6 @@ igt_main
> "PSR2 sel fetch causes cursor to be added to primary plane "
> "pages flips and async flip is not supported in cursor\n");
>
> - data.atomic_path = false;
> run_test(&data, test_cursor);
> }
>
> @@ -853,7 +856,6 @@ igt_main
> igt_require(igt_display_has_format_mod(&data.display, DRM_FORMAT_XRGB8888,
> I915_FORMAT_MOD_Y_TILED));
>
> - data.atomic_path = false;
> run_test(&data, test_invalid);
> }
>
> @@ -876,7 +878,6 @@ igt_main
> /* Devices without CRC can't run this test */
> igt_require_pipe_crc(data.drm_fd);
>
> - data.atomic_path = false;
> run_test(&data, test_crc);
> }
>
> --
> 2.49.0
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 2/2] tests/kms_async_flips: Create subtest for overlay planes
2025-03-20 14:00 ` [PATCH v3 2/2] tests/kms_async_flips: Create subtest for overlay planes André Almeida
@ 2025-03-24 21:32 ` Melissa Wen
0 siblings, 0 replies; 5+ messages in thread
From: Melissa Wen @ 2025-03-24 21:32 UTC (permalink / raw)
To: André Almeida
Cc: igt-dev, Jeevan B, Kamil Konieczny, kernel-dev, Vitaly Prosyak,
Alex Hung, Rodrigo Siqueira
On 03/20, André Almeida wrote:
> amdgpu can perform async flips in overlay planes as well, so create a
> test for that.
>
> Signed-off-by: André Almeida <andrealmeid@igalia.com>
> ---
> tests/kms_async_flips.c | 55 ++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 51 insertions(+), 4 deletions(-)
>
> diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c
> index d4af9b383..bca646664 100644
> --- a/tests/kms_async_flips.c
> +++ b/tests/kms_async_flips.c
> @@ -105,12 +105,14 @@ typedef struct {
> uint32_t crtc_id;
> uint32_t refresh_rate;
> struct igt_fb bufs[NUM_FBS];
> + struct igt_fb bufs_overlay[NUM_FBS];
> igt_display_t display;
> igt_output_t *output;
> unsigned long flip_timestamp_us;
> double flip_interval;
> uint64_t modifier;
> igt_plane_t *plane;
> + igt_plane_t *plane_overlay;
> igt_pipe_crc_t *pipe_crc;
> igt_crc_t ref_crc;
> int flip_count;
> @@ -122,6 +124,7 @@ typedef struct {
> bool allow_fail;
> struct buf_ops *bops;
> bool atomic_path;
> + bool overlay_path;
> } data_t;
>
> static void flip_handler(int fd_, unsigned int sequence, unsigned int tv_sec,
> @@ -207,6 +210,18 @@ static void require_monotonic_timestamp(int fd)
> "Monotonic timestamps not supported\n");
> }
>
> +static void require_overlay_flip_support(data_t *data)
> +{
> + struct igt_fb *bufs = data->bufs_overlay;
> + igt_plane_t *plane = data->plane_overlay;
> + int flags = DRM_MODE_PAGE_FLIP_ASYNC | DRM_MODE_PAGE_FLIP_EVENT;
> +
> + igt_plane_set_fb(plane, &bufs[0]);
> +
> + igt_require_f(!igt_display_try_commit_atomic(&data->display, flags, data),
> + "Async flip for overlay planes not supported\n");
> +}
> +
> static void test_init(data_t *data)
> {
> drmModeModeInfo *mode;
> @@ -222,6 +237,8 @@ static void test_init(data_t *data)
> igt_output_set_pipe(data->output, data->pipe);
>
> data->plane = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
> + if (data->overlay_path)
> + data->plane_overlay = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_OVERLAY);
> }
>
> static void test_init_fbs(data_t *data)
> @@ -242,16 +259,27 @@ static void test_init_fbs(data_t *data)
> prev_modifier = data->modifier;
>
> if (data->bufs[0].fb_id) {
> - for (i = 0; i < NUM_FBS; i++)
> + for (i = 0; i < NUM_FBS; i++) {
> igt_remove_fb(data->drm_fd, &data->bufs[i]);
> + if (data->overlay_path)
> + igt_remove_fb(data->drm_fd, &data->bufs_overlay[i]);
> + }
> }
>
> - for (i = 0; i < NUM_FBS; i++)
> + for (i = 0; i < NUM_FBS; i++) {
> make_fb(data, &data->bufs[i], width, height, i);
> + if (data->overlay_path)
> + make_fb(data, &data->bufs_overlay[i], width, height, i);
> + }
> }
>
> igt_plane_set_fb(data->plane, &data->bufs[0]);
> igt_plane_set_size(data->plane, width, height);
> +
> + if (data->overlay_path) {
> + igt_plane_set_fb(data->plane_overlay, &data->bufs[0]);
> + igt_plane_set_size(data->plane_overlay, width, height);
> + }
> }
>
> static bool async_flip_needs_extra_frame(data_t *data)
> @@ -279,12 +307,17 @@ static bool async_flip_needs_extra_frame(data_t *data)
> static int perform_flip(data_t *data, int frame, int flags)
> {
> int ret;
> + igt_plane_t *plane;
> + struct igt_fb *bufs;
> +
> + plane = data->overlay_path ? data->plane_overlay : data->plane;
> + bufs = data->overlay_path ? data->bufs_overlay : data->bufs;
>
> if (!data->atomic_path) {
> ret = drmModePageFlip(data->drm_fd, data->crtc_id,
> - data->bufs[frame % NUM_FBS].fb_id, flags, data);
> + bufs[frame % NUM_FBS].fb_id, flags, data);
> } else {
> - igt_plane_set_fb(data->plane, &data->bufs[frame % NUM_FBS]);
> + igt_plane_set_fb(plane, &bufs[frame % NUM_FBS]);
> ret = igt_display_try_commit_atomic(&data->display, flags, data);
> }
>
> @@ -300,6 +333,9 @@ static void test_async_flip(data_t *data)
>
> igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
>
> + if (data->overlay_path)
> + require_overlay_flip_support(data);
> +
> gettimeofday(&start, NULL);
> frame = 1;
> do {
> @@ -711,6 +747,7 @@ static void run_test(data_t *data, void (*test)(data_t *))
>
> data->alternate_sync_async = false;
> data->atomic_path = false;
> + data->overlay_path = false;
> }
>
> static void run_test_with_modifiers(data_t *data, void (*test)(data_t *))
> @@ -744,6 +781,7 @@ static void run_test_with_modifiers(data_t *data, void (*test)(data_t *))
>
> data->alternate_sync_async = false;
> data->atomic_path = false;
> + data->overlay_path = false;
> }
>
> static data_t data;
> @@ -766,6 +804,7 @@ igt_main
>
> data.alternate_sync_async = false;
> data.atomic_path = false;
> + data.overlay_path = false;
As commented in the previous patch, we can make it simpler and reduce
future issues by cleaning data in a single call.
> }
>
> igt_describe("Verify the async flip functionality and the fps during async flips");
> @@ -804,6 +843,14 @@ igt_main
> run_test(&data, test_async_flip);
> }
Also, compilation fails on my side due to missing documentation. You've
added it in the previous version and removed in this one.
BR,
Melissa
>
> + igt_describe("Verify overlay planes with async flips in atomic API");
> + igt_subtest_with_dynamic("overlay-atomic") {
> + igt_require(is_amdgpu_device(data.drm_fd));
> + data.atomic_path = true;
> + data.overlay_path = true;
> + run_test(&data, test_async_flip);
> + }
> +
> igt_describe("Verify that the async flip timestamp does not "
> "coincide with either previous or next vblank");
> igt_subtest_with_dynamic("test-time-stamp") {
> --
> 2.49.0
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-03-24 21:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-20 14:00 [PATCH v3 0/2] tests/kms_async_flips: Create subtest for overlay planes André Almeida
2025-03-20 14:00 ` [PATCH v3 1/2] kms_async_flips: Refactor data options André Almeida
2025-03-24 21:22 ` Melissa Wen
2025-03-20 14:00 ` [PATCH v3 2/2] tests/kms_async_flips: Create subtest for overlay planes André Almeida
2025-03-24 21:32 ` Melissa Wen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox