cannot create opengl by dynamically loading wayland symbols from library

Jason Ekstrand jason at jlekstrand.net
Wed Apr 16 12:45:20 PDT 2014


On Apr 16, 2014 2:01 PM, "Jasper St. Pierre" <jstpierre at mecheye.net> wrote:
>
>
>
>
> On Wed, Apr 16, 2014 at 2:27 PM, Pekka Paalanen <ppaalanen at gmail.com>
wrote:
>>
>> Hi,
>>
>> I'm moving this conversation to where it belongs.
>>
>> On Wed, 16 Apr 2014 11:25:26 +0000
>> bugzilla-daemon at freedesktop.org wrote:
>>
>> > https://bugs.freedesktop.org/show_bug.cgi?id=77521
>> >
>> >           Priority: medium
>> >             Bug ID: 77521
>> >           Assignee: wayland-bugs at lists.freedesktop.org
>> >            Summary: cannot create opengl by dynamically loading wayland
>> >                     symbols from library
>> >           Severity: blocker
>> >     Classification: Unclassified
>> >                 OS: All
>> >           Reporter: pulkitnandan at gmail.com
>> >           Hardware: All
>> >             Status: NEW
>> >            Version: 1.3.0
>> >          Component: wayland
>> >            Product: Wayland
>> >
>> > I was trying to implement a window system agnostic library which will
be used
>> > in creating opengl apps with different windows systems. Lets name that
library
>> > as WSAL.Now to achieve this WSAL implements window system interfaces
which is
>> > used in creating native windows etc of specific window system while
egl calls
>> > are in main WSAL library.Consider wayland and X as examples of such two
>> > libraries. As I separate several implementations of wayland and and X
from
>> > different team members.So to test them efficiently I have to create
several
>> > function pointers and object pointers that are present in those library
>> > implementations and load them with symbols from libraries using dlsym
utility
>> > so that at compile time I donot have to link with any library.
>> >
>> > For X I was successfully in creating X backend.
>> > For wayland I first got stuck at functions which are inline in
>> > wayland_client_protocol.h. For them I cannot do the same.Instead I
created a
>> > function pointer which these functions actually calls in inline
definition.
>> >
>> > Like when wl_display_get_registry is called
wl_proxy_marshal_constructor is
>> > ultimately called.
>> >
>> > The terrible fucntions are wl_proxy_marshal_constructor and
wl_proxy_marshal as
>> > they are defined with variable arguments.So I declared
>> > new_wl_proxy_marshal_constructor a function pointer of same type as
>> > wl_proxy_marshal_constructor and loaded the symbol from library using
dlsym
>> > into new_wl_proxy_marshal_constructor.
>> >
>> > But faced a fundamental problem of determing argument types as these
terrible
>> > functions (TFs) don't have constant argument signature i.e it may
sometime pass
>> > a int as its 4th aguments in one inline expansion while a char * in
some other
>> > inline function.
>>
>> Why do you need to know the arguments?
>> Why cannot you just use it as is, with variable arguments?
>>
>> Btw. if the generated inline wrapper functions do not suit you, I
>> think you could generate your own from the XML files, that end up
>> calling the real functions exported from libwayland-client. That is
>> how bindings to other programming languages are supposed work to my
>> understanding.

You are more than welcome to write your own protocol parser that dumps out
something that uses function pointers.  That should be a fine way to do
it.  However, if you do so, you will want to use the
wl_proxy_do_something_array versions such as
wl_proxy_marshal_constructor_array.  These take an array of things of the
type wl_argument instead of variable argument lists.  These should dlsym
nicely.  If you want, you could write nice variable-argument wrappers that
internally call your function pointers that call the _array version of the
corresponding function.  (That's actually what libwayland does sans the
function pointers part.)

> This won't work with EGL, as EGL expects libwayland-client. It's the same
issue with X11: you can't just use XCB because GLX expects Xlib's Display /
Window pointers.

As long as they're still using libwayland-client and passing around
wl_proxy structures and not re-implementing the wire protocol, it should
work fine.

>
>>
>> > So I explored this wl_proxy_marshal_constructor which actually calls
>> > wl_proxy_marshal_array_constructor after forming a variable arguments
to a
>> > single argument using some wl_proxy object signature which I have no
access to
>> > in main wayland interface.
>> >
>> > dlsym option of using rtld_now doesnot work.
>> >
>> > How to implement such functionality in wayland or provide a way to
create a app
>> > with no linking at build time.
>>
>> Have you looked at SDL2?
>> http://hg.libsdl.org/SDL/file/tip/src/video/wayland
>>
>> To me it seems like it uses dlopen and dlsym equivalents to load
>> Wayland libraries. I don't know if it is complete or in use yet,
>> there seems to be also a non-dlopen path.

Thanks,
--Jason Ekstrand
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20140416/a8739aa0/attachment.html>


More information about the wayland-devel mailing list