On Wed, 2015-03-11 at 16:05 +0200, Pekka Paalanen wrote:
> On Tue, 10 Mar 2015 11:34:45 +0900
> Ryo Munakata <ryomnk...@gmail.com> wrote:
> 
> > This was a TODO:
> > "Ideally, available frame buffers should be enumerated
> > using udev, rather than passing a device node in as a
> > parameter."
> 
> Hi,
> 
> I'm CC'ing the person responsible for the TODO-comment.

.o/

> > Signed-off-by: Ryo Munakata <ryomnk...@gmail.com>
> > ---
> >  src/compositor-fbdev.c | 55 
> > +++++++++++++++++++++++++++++++++++++++++++++++---
> >  1 file changed, 52 insertions(+), 3 deletions(-)
> > 
> > diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
> > index eedf252..c0e6985 100644
> > --- a/src/compositor-fbdev.c
> > +++ b/src/compositor-fbdev.c
> > @@ -46,6 +46,8 @@
> >  #include "gl-renderer.h"
> >  #include "presentation_timing-server-protocol.h"
> >  
> > +#define FBDEV_MAJOR_NUMBER (29)
> > +
> >  struct fbdev_compositor {
> >     struct weston_compositor base;
> >     uint32_t prev_state;
> > @@ -690,6 +692,9 @@ fbdev_output_destroy(struct weston_output *base)
> >             gl_renderer->output_destroy(base);
> >     }
> >  
> > +   if (output->device)
> > +           free((char *)output->device);
> 
> No need to cast. Also no need for 'if' because free(NULL) is perfectly
> legal.
> 
> > +
> >     /* Remove the output. */
> >     weston_output_destroy(&output->base);
> >  
> > @@ -748,6 +753,7 @@ fbdev_output_reenable(struct fbdev_compositor 
> > *compositor,
> >              * the frame buffer X/Y resolution (such as the shadow buffer)
> >              * are re-initialised. */
> >             device = output->device;
> > +           output->device = NULL;
> 
> Why NULLing it here? Seem like this would make repeated reenable to
> fail, no?
> 
> >             fbdev_output_destroy(base);
> >             fbdev_output_create(compositor, device);
> >  
> > @@ -795,6 +801,7 @@ fbdev_compositor_destroy(struct weston_compositor *base)
> >     struct fbdev_compositor *compositor = to_fbdev_compositor(base);
> >  
> >     udev_input_destroy(&compositor->input);
> > +   udev_unref(compositor->udev);
> >  
> >     /* Destroy the output. */
> >     weston_compositor_shutdown(&compositor->base);
> > @@ -861,6 +868,47 @@ switch_vt_binding(struct weston_seat *seat, uint32_t 
> > time, uint32_t key, void *d
> >     weston_launcher_activate_vt(compositor->launcher, key - KEY_F1 + 1);
> >  }
> >  
> > +static char *
> > +udev_get_fbdev(struct udev *udev)
> > +{
> > +   char *fbdev = NULL;
> > +   struct udev_enumerate *enumerate;
> > +   struct udev_list_entry *list, *entry;
> > +
> > +   if (!(enumerate = udev_enumerate_new(udev)))
> > +           goto err;
> > +
> > +   udev_enumerate_add_match_subsystem(enumerate, "graphics");
> > +   udev_enumerate_scan_devices(enumerate);
> > +
> > +   list = udev_enumerate_get_list_entry(enumerate);
> > +   udev_list_entry_foreach(entry, list) {
> > +           const char *devnode;
> > +           const char *syspath = udev_list_entry_get_name(entry);
> > +           struct udev_device *device;
> > +
> > +           if (fbdev)
> > +                   break;

Why break here? Why not break where you actually assign to fbdev, just
below?

> > +
> > +           if (!(device = udev_device_new_from_syspath(udev, syspath)))
> > +                   continue;
> > +
> > +           devnode = udev_device_get_devnode(device);
> > +           if (devnode) {
> > +                   dev_t devnum = udev_device_get_devnum(device);
> > +
> > +                   if (major(devnum) == FBDEV_MAJOR_NUMBER)
> > +                           fbdev = strdup(devnode);
> > +           }
> > +
> > +           udev_device_unref(device);
> > +   }
> > +
> > +   udev_enumerate_unref(enumerate);
> > +err:
> > +   return fbdev ? fbdev : strdup("/dev/fb0");
> > +}
> > +
> >  static struct weston_compositor *
> >  fbdev_compositor_create(struct wl_display *display, int *argc, char 
> > *argv[],
> >                          struct weston_config *config,
> > @@ -933,6 +981,9 @@ fbdev_compositor_create(struct wl_display *display, int 
> > *argc, char *argv[],
> >             }
> >     }
> >  
> > +   if (!param->device)
> > +           param->device = udev_get_fbdev(compositor->udev);
> > +
> >     if (fbdev_output_create(compositor, param->device) < 0)
> >             goto out_pixman;
> >  
> > @@ -962,11 +1013,9 @@ WL_EXPORT struct weston_compositor *
> >  backend_init(struct wl_display *display, int *argc, char *argv[],
> >          struct weston_config *config)
> >  {
> > -   /* TODO: Ideally, available frame buffers should be enumerated using
> > -    * udev, rather than passing a device node in as a parameter. */
> >     struct fbdev_parameters param = {
> >             .tty = 0, /* default to current tty */
> > -           .device = "/dev/fb0", /* default frame buffer */
> > +           .device = NULL,
> >             .use_gl = 0,
> >     };
> >  
> 
> Philip, is this what you had in mind?

Yes, it is. Although I suspect the original intention was also to
support outputting to all the framebuffer devices simultaneously. That’s
a separate issue; grabbing the first framebuffer from udev is a good
start.

Philip

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to