<div dir="ltr"><div><div>With the below change in simple-shm.c, weston+fbdev backend will be stuck and other compositors may work. It depends on compositor implementation and the actual behavior supposed to be is not clearly defined. I'm still trying to identify fix in weston, it looks like state information is overwritten before idle_repaint is being called.<br><br>    window->callback = wl_surface_frame(window->surface);<br>    wl_callback_add_listener(window->callback, &frame_listener, window);<br>    wl_surface_commit(window->surface);<br>    <br>   + wl_surface_attach(window->surface, 0, 0, 0);<br>    +wl_surface_damage(window->surface,<br>              0, 0, 0, 0);<br>   + wl_surface_commit(window->surface);<br><br>But the cause is wl_buffer set to null from the client and as per discussions it is not recommended. So we are trying to get this issue fixed in the QTWayland plugin.<br><a href="https://bugreports.qt.io/browse/QTBUG-47902">https://bugreports.qt.io/browse/QTBUG-47902</a><br><br></div>Some proposal to hide the surface would be greatly appreciated.<br></div>Below the discussion in the thread.<br><div><p>"I did a quick check on gtk+ and it seems that in:<br>
 gdk_wayland_window_hide_surface (GdkWindow *window)<br>
they actually destroy* the surface ... which sounds wrong as well?</p>

<p>I tried to dig into EFL code as well .. but gave up due to not 
finding the implementation of efl_gfx_visible_set (if someone can either
 point to that or find the actual function to look at, that would be 
nice)"</p><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 24, 2015 at 4:35 AM, Pekka Paalanen <span dir="ltr"><<a href="mailto:ppaalanen@gmail.com" target="_blank">ppaalanen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Fri, 21 Aug 2015 19:04:11 -0500<br>
Prabhu S <<a href="mailto:prabhusundar@gmail.com">prabhusundar@gmail.com</a>> wrote:<br>
<br>
> Below is the case where I'm getting stuck with the actual test case.<br>
> Wondering why there is no callback wl_callback@25.done or<br>
> wl_buffer@29.release<br>
> The EGL implementation depends on these callback/buffer release.<br>
<br>
</span>You will not get wl_callback@25.done, because the NULL wl_buffer has<br>
overwritten the other wl_buffer, leaving the wl_surface without any<br>
content, which makes it disappear from screen. Frame callbacks are not<br>
intended to be posted for non-visible wl_surfaces.<br>
<br>
You should get wl_buffer@29.release though. I bet you actually do get<br>
it, but something else is stopping the incoming Wayland events from<br>
being dispatched. See:<br>
<a href="http://lists.freedesktop.org/archives/wayland-devel/2014-April/014121.html" rel="noreferrer" target="_blank">http://lists.freedesktop.org/archives/wayland-devel/2014-April/014121.html</a><br>
and "protocol dumpers" on:<br>
<a href="http://wayland.freedesktop.org/extras.html" rel="noreferrer" target="_blank">http://wayland.freedesktop.org/extras.html</a><br>
<br>
My wild guess would be that something is blocking, waiting on the frame<br>
callback, likely EGL. It's not really EGL's bug but the application's<br>
(or Qt).<br>
<span class=""><br>
> Also noticed if the valid buffer is attached immediately after null buffer,<br>
> everything is fine, so most of the time it is unnoticed. If the frame is<br>
<br>
</span>Hmm, no, things should not be fine in that case. Well, it depends on<br>
what role the wl_surface you are committing on has, but the very least<br>
it may cause flicker.<br>
<br>
You definetely want to get rid of that null attach. You do not want to<br>
just ignore it.<br>
<span class=""><br>
> complex, egl will attach after null frame.<br>
><br>
<br>
</span>It sounds like your application is committing to the wl_surface behind<br>
Qt's back somehow, and it only works occasionally by luck.<br>
<span class=""><br>
> I will keep debug if any other race conditions in my implementation.<br>
><br>
> [3741557.293]  -> wl_surface@20.frame(new id wl_callback@25)<br>
> [3741557.476]  -> wl_surface@20.attach(wl_buffer@29, 0, 0)<br>
> [3741557.676]  -> wl_surface@20.damage(0, 0, 800, 480)<br>
> [3741557.906]  -> wl_surface@20.commit() <=EGL<br>
> [3741558.500]  -> wl_surface@20.attach(nil, 0, 0) <=QTWayland<br>
> [3741558.604]  -> wl_surface@20.commit() <=QTWayland<br>
> stuck<br>
><br>
><br>
> On Fri, Aug 21, 2015 at 12:16 PM, Jasper St. Pierre <<a href="mailto:jstpierre@mecheye.net">jstpierre@mecheye.net</a>><br>
> wrote:<br>
<br>
</span>...<br>
<div><div class="h5"><br>
> > However crazy it is, the logic sort of makes sense -- the "frame"<br>
> > event is guaranteed to be called once a frame when the surface content<br>
> > is painted and shown on the screen. When there's no surface content,<br>
> > it isn't painted, so the frame event isn't called.<br>
> ><br>
> > I'm not sure what you mean about a buffer release event -- you never<br>
> > attached a buffer to begin with, so I can't imagine how you'll get an<br>
> > event on it.<br>
> ><br>
> > On Fri, Aug 21, 2015 at 10:03 AM, Prabhu S <<a href="mailto:prabhusundar@gmail.com">prabhusundar@gmail.com</a>> wrote:<br>
> > > Hi,<br>
> > > Based on the wayland protocol specification for wl_surface::attach<br>
> > >>>If wl_surface.attach is sent with a NULL wl_buffer, the following<br>
> > >>> wl_surface.commit will remove the surface content.<br>
> > ><br>
> > > Wondering if wl_surface_attach called with wl_buffer=NULL, will there be<br>
> > any<br>
> > > wl_buffer release event or frame callbacks?<br>
> > ><br>
> > > Modified the redraw in simple-shm.c as below and not receiving any<br>
> > callback<br>
> > > or buffer release. It just got stuck.<br>
> > > The same thing is being done in qtwayland to hide the surface and it is<br>
> > > getting stuck. Some help to check this case would be helpful.<br>
> > ><br>
> > > static int odd = 1;<br>
> > > if(odd == 1){<br>
> > >         wl_surface_attach(window->surface, buffer->buffer, 0, 0);<br>
> > >         wl_surface_damage(window->surface,<br>
> > >                           20, 20, window->width - 40, window->height -<br>
> > 40);<br>
> > >         odd = 0;<br>
> > >     }<br>
> > >     else{<br>
> > >             wl_surface_attach(window->surface, 0, 0, 0);<br>
> > >             wl_surface_damage(window->surface,<br>
> > >                           0, 0, 0, 0);<br>
> > >             odd=1;<br>
> > >     }<br>
> > ><br>
> > ><br>
> > ><br>
> > > [823379.816]  -> wl_compositor@4.create_surface(new id wl_surface@3)<br>
> > > [823379.949]  -> xdg_shell@6.get_xdg_surface(new id xdg_surface@7,<br>
> > > wl_surface@3)<br>
> > > [823380.120]  -> xdg_surface@7.set_title("simple-shm")<br>
> > > [823380.244]  -> wl_surface@3.damage(0, 0, 250, 250)<br>
> > > [823381.333]  -> wl_shm@5.create_pool(new id wl_shm_pool@8, fd 5,<br>
> > 250000)<br>
> > > [823381.561]  -> wl_shm_pool@8.create_buffer(new id wl_buffer@9, 0, 250,<br>
> > > 250, 1000, 1)<br>
> > > [823381.870]  -> wl_shm_pool@8.destroy()<br>
> > > [823384.880]  -> wl_surface@3.attach(wl_buffer@9, 0, 0)<br>
> > > [823385.095]  -> wl_surface@3.damage(20, 20, 210, 210)<br>
> > > [823385.317]  -> wl_surface@3.frame(new id wl_callback@10)<br>
> > > [823385.443]  -> wl_surface@3.commit()<br>
> > > [823388.852] wl_display@1.delete_id(8)<br>
> > > [823388.979] xdg_surface@7.configure(0, 0, array, 4)<br>
> > > [823389.238]  -> xdg_surface@7.ack_configure(4)<br>
> > > [823401.773] wl_display@1.delete_id(10)<br>
> > > [823401.908] wl_buffer@9.release()<br>
<br>
</div></div>This is the buffer release you expected. Note, that release can come<br>
before the next buffer is attached, like here. This is typical for a<br>
compositor using GL while the client is using software rendering<br>
(wl_shm). Things can differ if the client is using GL or if the<br>
compositor is not using GL.<br>
<span class=""><br>
> > > [823401.991] wl_callback@10.done(4056537)<br>
> > > [823404.239]  -> wl_surface@3.attach(nil, 0, 0)<br>
> > > [823404.442]  -> wl_surface@3.damage(0, 0, 0, 0)<br>
> > > [823404.663]  -> wl_surface@3.frame(new id wl_callback@10)<br>
> > > [823404.792]  -> wl_surface@3.commit()<br>
> > > [823406.292] xdg_surface@7.configure(0, 0, array, 5)<br>
> > > [823406.524]  -> xdg_surface@7.ack_configure(5)<br>
<br>
</span>Just like Jasper explained, wl_callback@10 will not be signalled until<br>
the surface is composited the next time. Without a wl_buffer, it won't<br>
get composited. The spec for wl_surface.frame says:<br>
<br>
        "A server should avoid signalling the frame callbacks if the<br>
        surface is not visible in any way"<br>
<br>
Committing a NULL wl_buffer causes the wl_surface to be not visible.<br>
<br>
<br>
Thanks,<br>
pq<br>
</blockquote></div><br></div>