Weston 2.0.0: Pop-up window does not stay on the Weston screen
This problem was observed when we upgraded from Weston 1.11 to Weston 2.0.0. A control menu should pop up on the screen when the mouse is right clicked at one of our QT application. The control menu does show up, but only stays for one frame time.
System description:
TI Sitara ARM-based SoC: Arm and Arm64: A8, A9, A15, A53
OS: Linux kernel 4.14
Weston: 2.0.0
Wayland:1.13.0
Wayland-protocols: 1.10
QT 5.9.7
Based on the Wayland log, the control menu has been delivered to Weston a few times as shown below:
[120319.921] -> wl_compositor@4.create_surface(new id wl_surface@34)
[120324.843] -> xdg_shell@21.get_xdg_surface(new id xdg_surface@26, wl_surface@34)
[120324.921] -> xdg_surface@26.set_title("deform")
[120324.971] -> xdg_surface@26.set_app_id("deform")
[120325.007] -> wl_surface@34.set_buffer_scale(1)
[120328.716] -> wl_surface@34.set_buffer_transform(0)
[120328.765] -> wl_surface@34.commit()
[120329.128] -> wl_shm@7.create_pool(new id wl_shm_pool@27, fd 11, 219992)
[120329.216] -> wl_shm_pool@27.create_buffer(new id wl_buffer@30, 0, 214, 257, 856, 0)
[120350.805] -> wl_surface@34.frame(new id wl_callback@31)
[120350.866] -> wl_surface@34.attach(wl_buffer@30, 0, 0)
[120350.918] -> wl_surface@34.damage(3, 30, 208, 224)
[120350.974] -> wl_surface@34.commit()
[120351.035] -> wl_surface@34.frame(new id wl_callback@35)
[120351.070] -> wl_surface@34.attach(wl_buffer@30, 0, 0)
[120351.118] -> wl_surface@34.damage(3, 30, 208, 224)
[120351.172] -> wl_surface@34.commit()
[120351.955] -> wl_shm@7.create_pool(new id wl_shm_pool@36, fd 11, 219992)
[120352.077] -> wl_shm_pool@36.create_buffer(new id wl_buffer@37, 0, 214, 257, 856, 0)
[120356.438] -> wl_surface@34.frame(new id wl_callback@38)
[120356.479] -> wl_surface@34.attach(wl_buffer@37, 0, 0)
[120356.521] -> wl_surface@34.damage(3, 30, 208, 224)
[120356.570] -> wl_surface@34.commit()
[120356.627] wl_surface@34.enter(wl_output@10)
[120356.751] wl_keyboard@3.leave(19, wl_surface@18)
[120356.832] wl_keyboard@3.modifiers(20, 0, 0, 0, 0)
[120356.897] wl_keyboard@3.enter(20, wl_surface@34, array)
[120356.935] wl_data_device@9.selection(nil)
[120356.960] xdg_surface@22.configure(800, 480, array, 21)
[120357.018] -> wl_display@1.sync(new id wl_callback@39)
[120357.077] -> xdg_surface@22.ack_configure(21)
[120357.113] xdg_surface@26.configure(0, 0, array, 22)
[120357.168] -> xdg_surface@26.ack_configure(22)
[120364.599] -> wl_surface@18.frame(new id wl_callback@25)
[120364.650] -> wl_surface@18.attach(wl_buffer@29, 0, 0)
[120364.693] -> wl_surface@18.damage(0, 0, 800, 480)
[120364.739] -> wl_surface@18.commit()
[120364.782] -> wl_surface@18.frame(new id wl_callback@40)
[120364.810] -> wl_surface@18.attach(wl_buffer@29, 0, 0)
[120364.848] -> wl_surface@18.damage(0, 0, 800, 480)
[120364.890] -> wl_surface@18.commit()
[120364.960] wl_display@1.delete_id(35)
[120364.986] wl_display@1.delete_id(31)
[120365.005] wl_display@1.delete_id(39)
[120365.024] wl_buffer@30.release()
[120365.039] wl_pointer@14.leave(23, wl_surface@18)
[120365.103] wl_pointer@14.enter(24, wl_surface@34, 14.558594, 17.167969)
[120365.222] -> wl_pointer@14.set_cursor(24, wl_surface@15, 1, 1)
[120365.310] -> wl_surface@15.attach(wl_buffer@20, 0, 0)
[120365.351] -> wl_surface@15.damage(0, 0, 10, 16)
[120365.413] -> wl_surface@15.commit()
[120365.464] xdg_shell@21.ping(25)
[120365.487] -> xdg_shell@21.pong(25)
[120365.507] wl_callback@39.done(25)
[120367.917] -> wl_surface@34.frame(new id wl_callback@39)
[120367.958] -> wl_surface@34.attach(wl_buffer@30, 0, 0)
[120367.997] -> wl_surface@34.damage(27, 142, 160, 26)
[120368.040] -> wl_surface@34.commit()
There is no more wl_surface@34 beyond this point.
We have also added some weston_log at gl-render.c and found out that the texture corresponding to the control menu had been rendered once and then the pixman_region32_not_empty() check would fail at draw_view() for some reason.
Here is the correspond log with some explanation:
// Last call before the pop-up menu
// flush (reload texture if necessary, not for display
[21:43:49.300] flush_damage(pack): glBindTexture: 0xad300->560008
// display calls
[21:43:49.300] repaint_views: call draw_view for every view
// no redraw necessary for the followings views including
//0x89db0: Weston background
//0x925d8: head bar
[21:43:49.300] draw_view: view 0x921f8, output 0x70b10, damage 0xbe851440, gs 0xa7110
[21:43:49.300] draw_view: view 0x89db0, output 0x70b10, damage 0xbe851440, gs 0xc0ef8
[21:43:49.300] draw_view: view 0x91e18, output 0x70b10, damage 0xbe851440, gs 0xa69a8
[21:43:49.300] draw_view: view 0x925d8, output 0x70b10, damage 0xbe851440, gs 0xa7800
// 210003: 0xadb48: screen background draw calls without texture
[21:43:49.300] draw_view: view 0xadb48, output 0x70b10, damage 0xbe851440, gs 0xae9e8
[21:43:49.300] draw_view (not empty): gs->shader 0x353f0
[21:43:49.300] glUseProgram(210003)
[21:43:49.300] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
// 420006: 0xacf08->560008: deform checker and bubble
[21:43:49.300] draw_view: view 0xacf08, output 0x70b10, damage 0xbe851440, gs 0xad300
[21:43:49.300] draw_view (not empty): gs->shader 0x352bc
[21:43:49.300] glUseProgram(420006)
[21:43:49.300] draw_view: glBindTexture(gs->target, gs->textures[i]):0xad300->560008
[21:43:49.301] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.304] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
// 420006: 0xcc670->490007: mouse
[21:43:49.304] draw_view: view 0xcc670, output 0x70b10, damage 0xbe851440, gs 0xac720
[21:43:49.304] draw_view (not empty): gs->shader 0x352bc
[21:43:49.304] draw_view: glBindTexture(gs->target, gs->textures[i]):0xac720->490007
[21:43:49.304] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.304] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
[21:43:49.304] draw_output_borders: use_shader 0x352bc
// Register new texture 630009 for control menu
[21:43:49.540] ensure_textures(): glBindTexture: 630009
[21:43:49.540] ensure_textures(): glBindTexture(gs->target(3553), 0)
[21:43:49.541] flush_damage(pack): glBindTexture: 0xaeea8->630009
// First repaint call after the control menu is ready
[21:43:49.549] flush_damage(pack): glBindTexture: 0xaeea8->630009
[21:43:49.549] repaint_views: call draw_view for every view
[21:43:49.549] draw_view: view 0x921f8, output 0x70b10, damage 0xbe851440, gs 0xa7110
// 630009: 0x89db0-> 350005: Weston background
[21:43:49.549] draw_view: view 0x89db0, output 0x70b10, damage 0xbe851440, gs 0xc0ef8
[21:43:49.549] draw_view (not empty): gs->shader 0x352bc
[21:43:49.549] draw_view: glBindTexture(gs->target, gs->textures[i]):0xc0ef8->350005
[21:43:49.549] draw_view: use texture_shader_rgbx
[21:43:49.549] glUseProgram(630009)
[21:43:49.550] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
// 420006: 0xacf08->560008: deform checker and bubble
[21:43:49.550] draw_view: view 0xacf08, output 0x70b10, damage 0xbe851440, gs 0xad300
[21:43:49.550] draw_view (not empty): gs->shader 0x352bc
[21:43:49.550] glUseProgram(420006)
[21:43:49.550] draw_view: glBindTexture(gs->target, gs->textures[i]):0xad300->560008
[21:43:49.550] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.550] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
// 420006: 0xae6d0->630009: control menu
[21:43:49.550] draw_view: view 0xae6d0, output 0x70b10, damage 0xbe851440, gs 0xaeea8
[21:43:49.550] draw_view (not empty): gs->shader 0x352bc
[21:43:49.550] draw_view: glBindTexture(gs->target, gs->textures[i]):0xaeea8->630009
[21:43:49.550] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.550] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
[21:43:49.551] draw_view: view 0x91e18, output 0x70b10, damage 0xbe851440, gs 0xa69a8
// 420006: 0x925d8->280004: head bar
[21:43:49.551] draw_view: view 0x925d8, output 0x70b10, damage 0xbe851440, gs 0xa7800
[21:43:49.551] draw_view (not empty): gs->shader 0x352bc
[21:43:49.551] draw_view: glBindTexture(gs->target, gs->textures[i]):0xa7800->280004
[21:43:49.551] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.551] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
// 420006: 0xcc670->490007: mouse
[21:43:49.551] draw_view: view 0xcc670, output 0x70b10, damage 0xbe851440, gs 0xac720
[21:43:49.551] draw_view (not empty): gs->shader 0x352bc
[21:43:49.551] draw_view: glBindTexture(gs->target, gs->textures[i]):0xac720->490007
[21:43:49.551] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.551] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
[21:43:49.551] draw_output_borders: use_shader 0x352bc
// Previous frame is good, but it only lasts for 16ms
// The next frame is bad, due to empty check return positive for control menu
// 630009 is reflused every time, but it does not help
[21:43:49.566] flush_damage(pack): glBindTexture: 0xac720->490007
[21:43:49.569] flush_damage(pack): glBindTexture: 0xad300->560008
[21:43:49.570] flush_damage(pack): glBindTexture: 0xaeea8->630009
// The following reppaint calls
// All the following views are empty including
// 0x89db0: Weston background
// 0xae6d0: control menu
// 0x925d8: head bar
[21:43:49.570] repaint_views: call draw_view for every view
[21:43:49.570] draw_view: view 0x921f8, output 0x70b10, damage 0xbe851440, gs 0xa7110
[21:43:49.570] draw_view: view 0x89db0, output 0x70b10, damage 0xbe851440, gs 0xc0ef8
[21:43:49.570] draw_view: view 0xae6d0, output 0x70b10, damage 0xbe851440, gs 0xaeea8
[21:43:49.570] draw_view: view 0x91e18, output 0x70b10, damage 0xbe851440, gs 0xa69a8
[21:43:49.570] draw_view: view 0x925d8, output 0x70b10, damage 0xbe851440, gs 0xa7800
// 210003: 0xadb48: system background
[21:43:49.570] draw_view: view 0xadb48, output 0x70b10, damage 0xbe851440, gs 0xaf4c0
[21:43:49.570] draw_view (not empty): gs->shader 0x353f0
[21:43:49.570] glUseProgram(210003)
[21:43:49.570] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
// 420006: 0xacf08->560008: deform checker and bubble
[21:43:49.570] draw_view: view 0xacf08, output 0x70b10, damage 0xbe851440, gs 0xad300
[21:43:49.570] draw_view (not empty): gs->shader 0x352bc
[21:43:49.570] glUseProgram(420006)
[21:43:49.570] draw_view: glBindTexture(gs->target, gs->textures[i]):0xad300->560008
[21:43:49.570] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.573] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
// 420006: 0xcc670->490007: mouse
[21:43:49.574] draw_view: view 0xcc670, output 0x70b10, damage 0xbe851440, gs 0xac720
[21:43:49.574] draw_view (not empty): gs->shader 0x352bc
[21:43:49.574] draw_view: glBindTexture(gs->target, gs->textures[i]):0xac720->490007
[21:43:49.574] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.574] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
[21:43:49.574] draw_output_borders: use_shader 0x352bc
// The next frame is similar
[21:43:49.599] flush_damage(pack): glBindTexture: 0xac720->490007
[21:43:49.603] flush_damage(pack): glBindTexture: 0xad300->560008
[21:43:49.603] flush_damage(pack): glBindTexture: 0xaeea8->630009
[21:43:49.603] repaint_views: call draw_view for every view
[21:43:49.603] draw_view: view 0x921f8, output 0x70b10, damage 0xbe851440, gs 0xa7110
[21:43:49.603] draw_view: view 0x89db0, output 0x70b10, damage 0xbe851440, gs 0xc0ef8
[21:43:49.603] draw_view: view 0xae6d0, output 0x70b10, damage 0xbe851440, gs 0xaeea8
[21:43:49.603] draw_view: view 0x91e18, output 0x70b10, damage 0xbe851440, gs 0xa69a8
[21:43:49.603] draw_view: view 0x925d8, output 0x70b10, damage 0xbe851440, gs 0xa7800
[21:43:49.603] draw_view: view 0xad918, output 0x70b10, damage 0xbe851440, gs 0xadac8
[21:43:49.603] draw_view (not empty): gs->shader 0x353f0
[21:43:49.603] glUseProgram(210003)
[21:43:49.603] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
[21:43:49.603] draw_view: view 0xacf08, output 0x70b10, damage 0xbe851440, gs 0xad300
[21:43:49.603] draw_view (not empty): gs->shader 0x352bc
[21:43:49.603] glUseProgram(420006)
[21:43:49.603] draw_view: glBindTexture(gs->target, gs->textures[i]):0xad300->560008
[21:43:49.603] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.607] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
[21:43:49.607] draw_view: view 0xcc670, output 0x70b10, damage 0xbe851440, gs 0xac720
[21:43:49.607] draw_view (not empty): gs->shader 0x352bc
[21:43:49.607] draw_view: glBindTexture(gs->target, gs->textures[i]):0xac720->490007
[21:43:49.607] draw_view: use_shader for pixman_region32_not_empty
[21:43:49.607] glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
[21:43:49.607] draw_output_borders: use_shader 0x352bc
Therefore the root problem is that the pixman_region32_not_empty() returns 0 for the view corresponding to control menu after the first drawing.
draw_view():
/* In case of a runtime switch of renderers, we may not have received
* an attach for this surface since the switch. In that case we don't
* have a valid buffer or a proper shader set up so skip rendering. */
if (!gs->shader)
return;
pixman_region32_init(&repaint);
pixman_region32_intersect(&repaint,
&ev->transform.boundingbox, damage);
pixman_region32_subtract(&repaint, &repaint, &ev->clip);
if (!pixman_region32_not_empty(&repaint))
goto out;
Please note that the same operation works well with Weston 1.11 and qwindow-compositor.
The complete log files are attched for your reference!