@ -32,6 +32,11 @@
# include "weston-test-client-helper.h"
# include "wayland-server-protocol.h"
/* We need to use the pixman renderer, since a few of the tests depend
* on the renderer holding onto a surface buffer until the next one
* is committed , which the noop renderer doesn ' t do . */
char * server_parameters = " --use-pixman " ;
static struct zwp_linux_explicit_synchronization_v1 *
get_linux_explicit_synchronization ( struct client * client )
{
@ -276,7 +281,14 @@ struct zwp_linux_buffer_release_v1_listener buffer_release_listener = {
buffer_release_immediate_handler
} ;
TEST ( get_release_events_are_emitted )
/* The following release event tests depend on the behavior of the used
* backend , in this case the pixman backend . This doesn ' t limit their
* usefulness , though , since it allows them to check if , given a typical
* backend implementation , weston core supports the per commit nature of the
* release events .
*/
TEST ( get_release_events_are_emitted_for_different_buffers )
{
struct client * client = create_test_client ( ) ;
struct zwp_linux_explicit_synchronization_v1 * sync =
@ -302,8 +314,9 @@ TEST(get_release_events_are_emitted)
frame_callback_set ( surface , & frame ) ;
wl_surface_commit ( surface ) ;
frame_callback_wait ( client , & frame ) ;
/* Check that exactly one buffer_release event was emitted. */
assert ( buf_released1 = = 1 ) ;
/* No release event should have been emitted yet (we are using the
* pixman renderer , which holds buffers until they are replaced ) . */
assert ( buf_released1 = = 0 ) ;
buffer_release2 =
zwp_linux_surface_synchronization_v1_get_release ( surface_sync ) ;
@ -314,10 +327,18 @@ TEST(get_release_events_are_emitted)
frame_callback_set ( surface , & frame ) ;
wl_surface_commit ( surface ) ;
frame_callback_wait ( client , & frame ) ;
/* Check that we didn't get any new events on the inactive
* buffer_release . */
/* Check that exactly one buffer_release event was emitted for the
* previous commit ( buf1 ) . */
assert ( buf_released1 = = 1 ) ;
assert ( buf_released2 = = 0 ) ;
wl_surface_attach ( surface , buf1 - > proxy , 0 , 0 ) ;
frame_callback_set ( surface , & frame ) ;
wl_surface_commit ( surface ) ;
frame_callback_wait ( client , & frame ) ;
/* Check that exactly one buffer_release event was emitted for the
* previous commit ( buf2 ) . */
assert ( buf_released1 = = 1 ) ;
/* Check that exactly one buffer_release event was emitted. */
assert ( buf_released2 = = 1 ) ;
buffer_destroy ( buf2 ) ;
@ -327,3 +348,139 @@ TEST(get_release_events_are_emitted)
zwp_linux_surface_synchronization_v1_destroy ( surface_sync ) ;
zwp_linux_explicit_synchronization_v1_destroy ( sync ) ;
}
TEST ( get_release_events_are_emitted_for_same_buffer_on_surface )
{
struct client * client = create_test_client ( ) ;
struct zwp_linux_explicit_synchronization_v1 * sync =
get_linux_explicit_synchronization ( client ) ;
struct zwp_linux_surface_synchronization_v1 * surface_sync =
zwp_linux_explicit_synchronization_v1_get_synchronization (
sync , client - > surface - > wl_surface ) ;
struct buffer * buf = create_shm_buffer_a8r8g8b8 ( client , 100 , 100 ) ;
struct wl_surface * surface = client - > surface - > wl_surface ;
struct zwp_linux_buffer_release_v1 * buffer_release1 ;
struct zwp_linux_buffer_release_v1 * buffer_release2 ;
int buf_released1 = 0 ;
int buf_released2 = 0 ;
int frame ;
buffer_release1 =
zwp_linux_surface_synchronization_v1_get_release ( surface_sync ) ;
zwp_linux_buffer_release_v1_add_listener ( buffer_release1 ,
& buffer_release_listener ,
& buf_released1 ) ;
wl_surface_attach ( surface , buf - > proxy , 0 , 0 ) ;
frame_callback_set ( surface , & frame ) ;
wl_surface_commit ( surface ) ;
frame_callback_wait ( client , & frame ) ;
/* No release event should have been emitted yet (we are using the
* pixman renderer , which holds buffers until they are replaced ) . */
assert ( buf_released1 = = 0 ) ;
buffer_release2 =
zwp_linux_surface_synchronization_v1_get_release ( surface_sync ) ;
zwp_linux_buffer_release_v1_add_listener ( buffer_release2 ,
& buffer_release_listener ,
& buf_released2 ) ;
wl_surface_attach ( surface , buf - > proxy , 0 , 0 ) ;
frame_callback_set ( surface , & frame ) ;
wl_surface_commit ( surface ) ;
frame_callback_wait ( client , & frame ) ;
/* Check that exactly one buffer_release event was emitted for the
* previous commit ( buf ) . */
assert ( buf_released1 = = 1 ) ;
assert ( buf_released2 = = 0 ) ;
wl_surface_attach ( surface , buf - > proxy , 0 , 0 ) ;
frame_callback_set ( surface , & frame ) ;
wl_surface_commit ( surface ) ;
frame_callback_wait ( client , & frame ) ;
/* Check that exactly one buffer_release event was emitted for the
* previous commit ( buf again ) . */
assert ( buf_released1 = = 1 ) ;
assert ( buf_released2 = = 1 ) ;
buffer_destroy ( buf ) ;
zwp_linux_buffer_release_v1_destroy ( buffer_release2 ) ;
zwp_linux_buffer_release_v1_destroy ( buffer_release1 ) ;
zwp_linux_surface_synchronization_v1_destroy ( surface_sync ) ;
zwp_linux_explicit_synchronization_v1_destroy ( sync ) ;
}
TEST ( get_release_events_are_emitted_for_same_buffer_on_different_surfaces )
{
struct client * client = create_test_client ( ) ;
struct surface * other_surface = create_test_surface ( client ) ;
struct wl_surface * surface1 = client - > surface - > wl_surface ;
struct wl_surface * surface2 = other_surface - > wl_surface ;
struct zwp_linux_explicit_synchronization_v1 * sync =
get_linux_explicit_synchronization ( client ) ;
struct zwp_linux_surface_synchronization_v1 * surface_sync1 =
zwp_linux_explicit_synchronization_v1_get_synchronization (
sync , surface1 ) ;
struct zwp_linux_surface_synchronization_v1 * surface_sync2 =
zwp_linux_explicit_synchronization_v1_get_synchronization (
sync , surface2 ) ;
struct buffer * buf1 = create_shm_buffer_a8r8g8b8 ( client , 100 , 100 ) ;
struct buffer * buf2 = create_shm_buffer_a8r8g8b8 ( client , 100 , 100 ) ;
struct zwp_linux_buffer_release_v1 * buffer_release1 ;
struct zwp_linux_buffer_release_v1 * buffer_release2 ;
int buf_released1 = 0 ;
int buf_released2 = 0 ;
int frame ;
weston_test_move_surface ( client - > test - > weston_test , surface2 , 0 , 0 ) ;
/* Attach buf1 to both surface1 and surface2. */
buffer_release1 =
zwp_linux_surface_synchronization_v1_get_release ( surface_sync1 ) ;
zwp_linux_buffer_release_v1_add_listener ( buffer_release1 ,
& buffer_release_listener ,
& buf_released1 ) ;
wl_surface_attach ( surface1 , buf1 - > proxy , 0 , 0 ) ;
frame_callback_set ( surface1 , & frame ) ;
wl_surface_commit ( surface1 ) ;
frame_callback_wait ( client , & frame ) ;
buffer_release2 =
zwp_linux_surface_synchronization_v1_get_release ( surface_sync2 ) ;
zwp_linux_buffer_release_v1_add_listener ( buffer_release2 ,
& buffer_release_listener ,
& buf_released2 ) ;
wl_surface_attach ( surface2 , buf1 - > proxy , 0 , 0 ) ;
frame_callback_set ( surface2 , & frame ) ;
wl_surface_commit ( surface2 ) ;
frame_callback_wait ( client , & frame ) ;
assert ( buf_released1 = = 0 ) ;
assert ( buf_released2 = = 0 ) ;
/* Attach buf2 to surface1, and check that a buffer_release event for
* the previous commit ( buf1 ) for that surface is emitted . */
wl_surface_attach ( surface1 , buf2 - > proxy , 0 , 0 ) ;
frame_callback_set ( surface1 , & frame ) ;
wl_surface_commit ( surface1 ) ;
frame_callback_wait ( client , & frame ) ;
assert ( buf_released1 = = 1 ) ;
assert ( buf_released2 = = 0 ) ;
/* Attach buf2 to surface2, and check that a buffer_release event for
* the previous commit ( buf1 ) for that surface is emitted . */
wl_surface_attach ( surface2 , buf2 - > proxy , 0 , 0 ) ;
frame_callback_set ( surface2 , & frame ) ;
wl_surface_commit ( surface2 ) ;
frame_callback_wait ( client , & frame ) ;
assert ( buf_released1 = = 1 ) ;
assert ( buf_released2 = = 1 ) ;
buffer_destroy ( buf2 ) ;
buffer_destroy ( buf1 ) ;
zwp_linux_buffer_release_v1_destroy ( buffer_release2 ) ;
zwp_linux_buffer_release_v1_destroy ( buffer_release1 ) ;
zwp_linux_surface_synchronization_v1_destroy ( surface_sync2 ) ;
zwp_linux_surface_synchronization_v1_destroy ( surface_sync1 ) ;
zwp_linux_explicit_synchronization_v1_destroy ( sync ) ;
}