[PATCH weston 2/3] shot: add test for sub-surface with unmapped parent

Pekka Paalanen ppaalanen at gmail.com
Tue Feb 21 10:17:32 UTC 2017


On Fri,  3 Feb 2017 16:10:38 +0100
Emilio Pozuelo Monfort <pochu27 at gmail.com> wrote:

> This reproduces https://bugs.freedesktop.org/show_bug.cgi?id=94735.
> 
> The test currently fails, so mark it as expected to fail.
> 
> Signed-off-by: Emilio Pozuelo Monfort <emilio.pozuelo at collabora.co.uk>

Hi,

there is a problem with this test that the conditions are not quite
right for the bug we want to reproduce.

Because of that, you also need to re-evaluate the fix (the following
patch). I suspect the fix needs to happen somewhere else, but we'll see
only after the test conditions are right.

> ---
>  tests/reference/subsurface_mapped-00.png | Bin 0 -> 799 bytes
>  tests/reference/subsurface_mapped-01.png | Bin 0 -> 841 bytes
>  tests/subsurface-shot-test.c             |  79 +++++++++++++++++++++++++++++++
>  3 files changed, 79 insertions(+)
>  create mode 100644 tests/reference/subsurface_mapped-00.png
>  create mode 100644 tests/reference/subsurface_mapped-01.png
> 
> diff --git a/tests/reference/subsurface_mapped-00.png b/tests/reference/subsurface_mapped-00.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..32cf32a0ed11d38b9028eda29109e06c99dce000
> GIT binary patch
> literal 799
> zcmeAS at N?(olHy`uVBq!ia0y~yU~~YoKX5Ps$$$P at Hb9Ck$=lt9;Xep2*t>i(0|V0)  
> zPZ!6KiaBpDJMtb-U^sBV(DcSZzE>X)w43Y<zTkg6<~Q at Kf7clg*fKlMXjD9NKp-uF
> u!`PrjQsNK~Pa<2J!Km<Pm<+lE!M8n->GIc&-r>L$&*16m=d#Wzp$P!YDfm(V
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/reference/subsurface_mapped-01.png b/tests/reference/subsurface_mapped-01.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..4e7196a2229a2e63adbf49d32a8c47db043f1c1c
> GIT binary patch
> literal 841
> zcmeAS at N?(olHy`uVBq!ia0y~yU~~YoKX5Ps$$$P at Hb9Ck$=lt9;Xep2*t>i(0|V1P  
> zPZ!6KiaBquZsa}Wz`){YUu2kf{Oyc6Wg6{8K0QxPoXkGz!#aIUUe52048Hw0nHzqy
> z at FX&|88AA}Xi)SyAfT4OA#BjXDRF32cth#8hDqmtn^qrc-8g5ndd!V)&);y?A7max
> zA$7y5+Tmoxxtqcd+SvzD9B$b7_V^p#1HN)}PDa0(vIRL#J}^{z1<V@^p00i_>zopr
> E02fd6egFUf
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/subsurface-shot-test.c b/tests/subsurface-shot-test.c
> index df72ec28..e7da1e0e 100644
> --- a/tests/subsurface-shot-test.c
> +++ b/tests/subsurface-shot-test.c
> @@ -260,3 +260,82 @@ TEST(subsurface_z_order)
>  		if (bufs[i])
>  			buffer_destroy(bufs[i]);
>  }
> +
> +FAIL_TEST(subsurface_mapped)
> +{
> +	const char *test_name = get_test_name();
> +	struct client *client;
> +	struct wl_surface *surface;
> +	struct rectangle clip;
> +	int fail = 0;
> +	struct wl_subcompositor *subco;
> +	struct wl_surface *child;
> +	struct wl_subsurface *sub;
> +	struct buffer *buf, *child_buf;
> +	pixman_color_t red, blue;
> +
> +	color(&red, 255, 0, 0);
> +	color(&blue, 0, 0, 255);
> +
> +	/* Create the client */
> +	client = create_client();
> +	assert(client);
> +	client->surface = create_test_surface(client);
> +	surface = client->surface->wl_surface;
> +
> +	/* move the pointer clearly away from our screenshooting area */
> +	weston_test_move_pointer(client->test->weston_test, 2, 30);
> +
> +	client->surface->x = 100;
> +	client->surface->y = 100;
> +	weston_test_move_surface(client->test->weston_test, client->surface->wl_surface,
> +				 client->surface->x, client->surface->y);

Quite subtle behaviour here, because of of the test plugin works.
weston-test.c:test_surface_committed() marks both the view and the
surface mapped regardless whether there is content.

A contentless surface can become mapped if the
weston_surface::committed hook is triggered by viewport changes or an
attach with a NULL buffer. Whether that is a bug or a feature of the
test plugin, I'm not sure. It certainly allows a surface to become
mapped without content which is kind of not expected.(*)

> +
> +	/* we need one of these so that buffer_viewport.changed gets set and the commit
> +	 * has an effect */
> +	wl_surface_set_buffer_scale(surface, 1);
> +	wl_surface_set_buffer_transform(surface, WL_OUTPUT_TRANSFORM_NORMAL);
> +
> +	wl_surface_commit(surface);

Here we deliberately trigger that effect, so now we have a mapped
surface without content.

> +
> +	clip.x = 100;
> +	clip.y = 100;
> +	clip.width = 100;
> +	clip.height = 100;
> +	printf("Clip: %d,%d %d x %d\n", clip.x, clip.y, clip.width, clip.height);
> +
> +	/* create a wl_surface */
> +	subco = get_subcompositor(client);
> +	assert(subco);
> +
> +	child = wl_compositor_create_surface(client->wl_compositor);
> +	assert(child);
> +
> +	/* make it a sub-surface */
> +	sub = wl_subcompositor_get_subsurface(subco, child, surface);
> +	assert(sub);
> +
> +	/* let the subsurface be drawn async from its parent */
> +	wl_subsurface_set_desync(sub);
> +
> +	/* give it content */
> +	child_buf = surface_commit_color(client, child, &red, 50, 50);
> +
> +	/* verify that the sub-surface is not mapped */
> +	fail += check_screen(client, test_name, 0, &clip, 0);

That causes a dilemma here. The test plugin clearly marks the surface
as mapped, but here we assume it is not mapped and test behaviour based
on that.

I would argue that the test here is wrong by deliberately invoking a
mapped surface, then checking it's not mapped.

> +
> +	/* give a buffer to the parent surface and make sure both the
> +	 * parent and the child get mapped */
> +	buf = surface_commit_color(client, surface, &blue, 100, 100);
> +
> +	fail += check_screen(client, test_name, 1, &clip, 1);

This part is correct.

> +
> +	printf("Test complete\n");
> +	assert(fail == 0);
> +
> +	wl_subsurface_destroy(sub);
> +	wl_surface_destroy(child);
> +	buffer_destroy(child_buf);
> +	wl_surface_destroy(surface);
> +	buffer_destroy(buf);
> +}

Reading again the log from https://bugs.freedesktop.org/show_bug.cgi?id=94735

- wl_surface at 27 is a wl_shell_surface "org.kde.systemsettings5" and has
  content
- wl_surface at 44 is a sub-surface for parent wl_surface at 27
- wl_surface at 46 is a sub-surface for parent wl_surface at 44
- wl_surface at 49 is a sub-surface for parent wl_surface at 46
- wl_surface at 51 is a sub-surface for parent wl_surface at 49
- wl_surface at 53 is a sub-surface for parent wl_surface at 51
- wl_surface at 57 is a sub-surface for parent wl_surface at 53
- wl_surface at 59 is a sub-surface for parent wl_surface at 57
- wl_surface at 61 is a sub-surface for parent wl_surface at 59
- wl_surface at 63 is a sub-surface for parent wl_surface at 61
- wl_surface at 65 is a sub-surface for parent wl_surface at 63
- wl_surface at 97 is a sub-surface for parent wl_surface at 65

If you read the protocol dump, mind that wl_surface ids are re-used,
one needs to track back from the point where wl_surface at 97 is created.

All mentioned wl_surfaces 44 - 65 go through { set_buffer_scale,
set_buffer_transform, commit } with no attach.

So I think the test case should be:
- main surface, has content, mapped
  - sub-surface, no content
    - subsurface, has content, bug: visible when should not

That should avoid the issues of the test plugin marking a surface
without content to be mapped, which can confuse sub-surface logic.

(*) is probably what happens, but not just in the test plugin; that
would be the real bug, I imagine.


Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 801 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20170221/d873687e/attachment-0001.sig>


More information about the wayland-devel mailing list