[waffle] [PATCH 5/7] surfaceless_egl: Implement new platform

Chad Versace chadversary at chromium.org
Sat Oct 29 17:59:48 UTC 2016


On Wed 19 Oct 2016, Emil Velikov wrote:
> On 18 October 2016 at 18:33, Chad Versace <chadversary at chromium.org> wrote:
> > Now waffle_init() supports WAFFLE_PLATFORM_SURFACELESS_EGL.
> >
> > Cc: Gurchetan Singh <gurchetansingh at chromium.org>
> > Cc: Haixia Shi <hshi at chromium.org>
> > ---
> >  include/waffle/waffle.h                  |   1 +
> >  man/waffle_init.3.xml                    |   9 ++
> >  src/waffle/CMakeLists.txt                |   9 ++
> >  src/waffle/api/waffle_init.c             |  12 +++
> >  src/waffle/egl/wegl_platform.c           |   6 ++
> >  src/waffle/surfaceless_egl/sl_display.c  |  70 +++++++++++++++
> >  src/waffle/surfaceless_egl/sl_display.h  |  45 ++++++++++
> >  src/waffle/surfaceless_egl/sl_platform.c | 144 +++++++++++++++++++++++++++++++
> >  src/waffle/surfaceless_egl/sl_platform.h |  49 +++++++++++
> >  src/waffle/surfaceless_egl/sl_window.c   |  92 ++++++++++++++++++++
> >  src/waffle/surfaceless_egl/sl_window.h   |  53 ++++++++++++
> >  11 files changed, 490 insertions(+)
> >  create mode 100644 src/waffle/surfaceless_egl/sl_display.c
> >  create mode 100644 src/waffle/surfaceless_egl/sl_display.h
> >  create mode 100644 src/waffle/surfaceless_egl/sl_platform.c
> >  create mode 100644 src/waffle/surfaceless_egl/sl_platform.h
> >  create mode 100644 src/waffle/surfaceless_egl/sl_window.c
> >  create mode 100644 src/waffle/surfaceless_egl/sl_window.h
> >

> Should there be an extra case in src/waffle/core/wcore_util.c's
> wcore_enum_to_string() ?

Oops. I squashed the fix into this patch.

> > +// [chadv] I regret the design of the get_native interface, and wish to
> > +// deprecate and replace it with the interface that Ian Romanick orignally
> > +// recommended: waffle_display_get_egl_display(),
> > +// waffle_display_get_gbm_device(), waffle_display_get_xlib_display(), etc.  As
> > +// a first step towards that goal, I choose to not support the interface on new
> > +// platforms.

> Silly question: what's wrong with the current [generic] get_native_{foo,bar} ?

Each get_native function returns a non-extensible struct. The problem is
the non-extensibility.

    Example 1:

        On Wayland, waffle_window_get_window() returns

            struct waffle_wayland_window {                  
                struct waffle_wayland_display display; // Definition below
                struct wl_surface *wl_surface;              
                struct wl_shell_surface *wl_shell_surface;  
                struct wl_egl_window *wl_window;            
                EGLSurface egl_surface;                     
            };                                              

            struct waffle_wayland_display {              
                struct wl_display *wl_display;           
                struct wl_compositor *wl_compositor;     
                struct wl_shell *wl_shell;               
                EGLDisplay egl_display;                  
            };                                               

        If in the future we need to add more members to that struct, or even remove
        members, due to changes in Wayland, then there is no good way to do that.

    Example 2:

        I want to add the ability to do KMS with waffle_window/waffle_display on
        the gbm and surfaceless platforms. Again, because the get_native structs
        are non-extensible, there is no good way for
        waffle_window_get_native()/waffle_display_get_native() to return things
        such as the CRTC.

So I see two solutions:

    Solution 1: Change the get_native APIs to return "extensible" structs. If
        someone is going to go through all that trouble, though, they might as
        well go with solution 2, which is cleaner and less work.

    Solution 2: For each possible native resourse of each Waffle resource, add
    a specific getter that returns null-or-whatever if it doesn't exist.  For example,

        EGLSurface waffle_window_get_egl_surface(...);
        struct gbm_surface *waffle_window_get_gbm_surface(...);


More information about the waffle mailing list