<div dir="auto"><div>Hi Pekka,</div><div dir="auto"><br></div><div dir="auto">Thanks for the reply. Sorry I forgot to say that `frame_callback` was a hack for me. It has historical reason. Initially I designed the client using EGL and found that I could only create the glprogram, creating shaders after having wl_surface. Since I used the same shader I thought that why creating new shaders every time when opening windows. So I decided to reuse shaders, where it set up the potential trap for me. However I found the `frame_callback` works really well for me, currently it is the most natural way.</div><div dir="auto"><br></div><div dir="auto">Regarding the second problem, the client doesn't really send another frame immediately after receiving one. It renders based on input events, so it doesn't really send any frame if nothing new to render. Again, I designed it to save as much resources as I can. But thanks for your concern, I may switch to destroying `wl_surface` approach at next refactoring.</div><div dir="auto"><br></div><div dir="auto">Thanks,</div><div dir="auto">Sichem</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br><div class="gmail_quote" dir="auto"><div dir="ltr">Le lun. 6 août 2018 04 h 44, Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com">ppaalanen@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Fri, 3 Aug 2018 18:04:36 -0400<br>
Sichem Zhou <<a href="mailto:sichem.zh@gmail.com" target="_blank" rel="noreferrer">sichem.zh@gmail.com</a>> wrote:<br>
<br>
> Hi Pekka,<br>
> <br>
> Thanks for your reply. Yes, preferably if I can hide the map and unmap from<br>
> client, in this case I cannot because it is part of a desktop shell. After<br>
> I unmap it and remap the view next time, it is not expected the shell to<br>
> continue from last draw. I would want the shell be drawing total different<br>
> things instead. If I simply remap, I shall see the last frame that did get<br>
> drawed.<br>
> <br>
> It can be seen as a problem in the application, designing smarter clients<br>
> which is aware of such details, by not sending the last frame for example,<br>
> but I found an easier solution by unmap the view in the `frame_signal`. It<br>
> worked quite well.<br>
<br>
Hi,<br>
<br>
if you need the unmap to happen immediately without round-tripping to<br>
the helper client, I think a good solution for your case would be for<br>
the desktop-shell to unmap the surface and send an event to the helper<br>
client telling that the surface is unmapped. That way the client can<br>
destroy the wl_surface, which will make the compositor automatically<br>
release buffers it might have held, and there is no chance of showing<br>
outdated content on the next time.<br>
<br>
In my opinion, the frame_signal solution is a hack. It is not really<br>
meant for what you are doing it with it, and it does not allow the<br>
compositor to release buffers it would not have released anyway.<br>
<br>
It also does not guarantee that the client would not block inside<br>
eglSwapBuffers, you have to prevent that in the client anyway. Usually<br>
unmapping a window permanently is initiated by the client by e.g.<br>
destroying the wl_surface, which naturally avoids an indefinite wait<br>
for a frame callback. That could be a response to a specific event.<br>
<br>
With the frame_signal hack, even if you unmap the view after sending<br>
out the frame callbacks, what will guarantee that the client will not<br>
post another frame as a response to the frame callback you just sent?<br>
And then another frame after that would again hit the indefinite<br>
blocking inside eglSwapBuffers(). I suspect your design is quite<br>
fragile as is.<br>
<br>
<br>
Thanks,<br>
pq<br>
</blockquote></div></div></div>