<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 15, 2016 at 1:56 PM, Chad Versace <span dir="ltr"><<a href="mailto:chad.versace@intel.com" target="_blank">chad.versace@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 04/15/2016 09:36 AM, Jason Ekstrand wrote:<br>
> On Fri, Apr 15, 2016 at 3:03 AM, Emil Velikov <<a href="mailto:emil.l.velikov@gmail.com">emil.l.velikov@gmail.com</a> <mailto:<a href="mailto:emil.l.velikov@gmail.com">emil.l.velikov@gmail.com</a>>> wrote:<br>
<span class="">><br>
>     On 15 April 2016 at 03:32, Michel Dänzer <<a href="mailto:michel@daenzer.net">michel@daenzer.net</a> <mailto:<a href="mailto:michel@daenzer.net">michel@daenzer.net</a>>> wrote:<br>
>     > On 15.04.2016 11:14, Michel Dänzer wrote:<br>
>     >> On 14.04.2016 22:16, Emil Velikov wrote:<br>
</span>>     >>> On 14 April 2016 at 09:23, Michel Dänzer <<a href="mailto:michel@daenzer.net">michel@daenzer.net</a> <mailto:<a href="mailto:michel@daenzer.net">michel@daenzer.net</a>>> wrote:<br>
>     >>>> From: Michel Dänzer <<a href="mailto:michel.daenzer@amd.com">michel.daenzer@amd.com</a> <mailto:<a href="mailto:michel.daenzer@amd.com">michel.daenzer@amd.com</a>>><br>
<span class="">>     >>>><br>
>     >>>> Fixes build failure due to wl_proxy_marshal_constructor_versioned being<br>
>     >>>> unresolved when building against current wayland.<br>
>     >>>><br>
>     >>>> This API was introduced in wayland 1.9.91 by commit 557032e3 ("Track<br>
>     >>>> protocol object versions inside wl_proxy."). The waffle code doesn't<br>
>     >>>> reference wl_proxy_marshal_constructor_versioned directly but<br>
>     >>>> indirectly via wayland-scanner.<br>
>     >>>><br>
>     >>>> v2:<br>
>     >>>> * Add paragraph about how wl_proxy_marshal_constructor_versioned was<br>
>     >>>>   introduced. (Emil Velikov)<br>
>     >>>> * Only resolve wl_proxy_marshal_constructor_versioned with wayland >=<br>
>     >>>>   1.9.91.<br>
>     >>>><br>
</span>>     >>>> Signed-off-by: Michel Dänzer <<a href="mailto:michel.daenzer@amd.com">michel.daenzer@amd.com</a> <mailto:<a href="mailto:michel.daenzer@amd.com">michel.daenzer@amd.com</a>>><br>
<span class="">>     >>>> ---<br>
>     >>>>  src/waffle/wayland/wayland_wrapper.c | 5 +++++<br>
>     >>>>  src/waffle/wayland/wayland_wrapper.h | 8 ++++++++<br>
>     >>>>  2 files changed, 13 insertions(+)<br>
>     >>>><br>
>     >>>> diff --git a/src/waffle/wayland/wayland_wrapper.c b/src/waffle/wayland/wayland_wrapper.c<br>
>     >>>> index 6ffd5a9..fb66f9a 100644<br>
>     >>>> --- a/src/waffle/wayland/wayland_wrapper.c<br>
>     >>>> +++ b/src/waffle/wayland/wayland_wrapper.c<br>
>     >>>> @@ -106,6 +106,11 @@ wayland_wrapper_init(void)<br>
>     >>>>      RETRIEVE_WL_CLIENT_SYMBOL(wl_proxy_add_listener);<br>
>     >>>>      RETRIEVE_WL_CLIENT_SYMBOL(wl_proxy_marshal);<br>
>     >>>>      RETRIEVE_WL_CLIENT_SYMBOL(wl_proxy_marshal_constructor);<br>
>     >>>> +#if WAYLAND_VERSION_MAJOR == 1 && \<br>
>     >>>> +    (WAYLAND_VERSION_MINOR > 9 || \<br>
>     >>>> +     (WAYLAND_VERSION_MINOR == 9 && WAYLAND_VERSION_MICRO >= 91))<br>
>     >>>> +    RETRIEVE_WL_CLIENT_SYMBOL(wl_proxy_marshal_constructor_versioned);<br>
>     >>>> +#endif<br>
>     >>>>  #undef RETRIEVE_WL_CLIENT_SYMBOL<br>
>     >>>><br>
>     >>> I am slightly worried about this approach. It adds a so called 'hidden<br>
>     >>> dependency' and with it a possibility of things going horribly wrong.<br>
>     >>> It is something that we try to avoid with mesa as the deps version at<br>
>     >>> build time != run-time one. Or in other words, one might build against<br>
>     >>> wayland 1.9 and things will go crazy as you run wayland 1.10, or vice<br>
>     >>> versa.<br>
<br>
</span>I prefer to avoid adding this "hidden dependency" (as Emil calls it) for<br>
a Wayland function that Waffle doesn't use or need. Jason's solution of<br>
importing wayland-client-protocol.h avoids that dependency, and it also<br>
prevents this build-breakage problem from occuring in the future.<br>
<span class=""><br>
> I think this is actually mostly ok.  In the Wayland project, we were very<br>
> careful to ensure that anything built against 1.9 would work when linked<br>
> against 1.10.  This should continue to be the case even with waffle's<br>
> shim-layer.<br>
><br>
> The problem is not that libwayland added a new symbol nor is it a problem<br>
> that wayland-protocol.h was updated to use that new symbol.  The problem is<br>
> that waffle sticks a shim layer in between wayland-protocol.h and libwayland.<br>
> This makes the wayland-protocol.h file effectively internal to waffle but<br>
> still updatable by the distro.  This is a layering violation.  To keep this<br>
> from happening in the future, you probably want to just check a version of<br>
> wayland-client-protocol.h into the waffle repo so that it doesn't change out<br>
> from under you and make waffle just use wayland-client-core.h.  You can even<br>
> check in the version from libwayland 1.9 if you'd like to keep waffle<br>
> building against older versions.<br>
<br>
</span>I think I understand you, but I'm not confident. Wayland's header dependencies<br>
are, we can all admit, confusing.<br>
<br>
If Waffle does the following...<br>
<br>
    a. Check into the repo the wayland-client-protocol.h from Wayland 1.9.<br>
<br>
... then ...<br>
<br>
    c. Waffle will successfully build against distro-provided Wayland headers<br>
       for wayland >= 1.9. Specifically, the system's wayland-client.h will<br>
       include Waffle's imported wayland-client-protocol.h, and nothing will<br>
       explode.<br>
<br>
    d. If Waffle is built against the system's wayland-client.h from Wayland<br>
       1.x (where x >= 9), the libwaffle can successfully dlopen and run against<br>
       libwayland 1.y (where y > x).<br>
<br>
Jason, is that correct?<br></blockquote><div><br></div><div>It should be, yes.  It's best to make sure that the header file you stash in the repo uses wayland-client-core.h, but I think the include guards will probably be enough in any case.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
To allow Waffle to continue building against older Wayland version, we may be<br>
able to import Wayland 1.8's (instead of 1.9's) wayland-client-protocol.h, as<br>
1.8 is the first release in which the wayland-client-protocol.h was split out<br>
from wayland-client.h.<br>
<span class=""><br>
> Another option would be to add a wrapper around<br>
> wl_proxy_marshal_constructor_versioned that calls<br>
> wl_proxy_marshal_constructor_versioned if it's available and falls back to<br>
> wl_proxy_marshal_constructor it it's not.  Then pull in the header from<br>
> wayland 1.10.  That way it will build and even link against any libwayland<br>
> version but will use the new versioned constructor function when it's<br>
> available.<br>
<br>
</span>I don't like the above option. I think Waffle should *not* provide its own<br>
re-implementation of any Wayland function.<br>
<br>
Is there a signficant benefit to Waffle if it uses the versioned constructor?<br>
Keep in mind that Waffle uses Wayland very minimally. It probably doesn't<br>
care about versioned objects.<span class=""><br></span></blockquote><div><br></div><div>If you want newer features. In particular if you want EGL_EXT_swap_buffers_with_damage to work correctly, you need to use wl_surface version 4 (or maybe it's 5) and use the versioned constructors.<br><br></div><div>If you don't care about newer features, then just checking in the 1.9 header is probably fine.<br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
> In either case, I think checking wayland-client-protocol.h into the repo is<br>
> a must.<br>
<br>
</span>I'm convinced.<br>
</blockquote></div><br></div></div>