[waffle] [PATCH v2 3/4] gbm: initial functional gbm support
Chad Versace
chad.versace at linux.intel.com
Mon Aug 20 10:05:05 PDT 2012
On 08/13/2012 05:11 PM, Jordan Justen wrote:
> src/waffle/gbm is based on src/waffle/wayland, and then heavily
> modified.
>
> Tested as functional with: examples/gl_basic gbm gl|gles2
>
> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> ---
> CMakeLists.txt | 23 ++++-
> include/waffle/waffle_config.h | 2 +
> include/waffle/waffle_enum.h | 1 +
include/waffle/native/waffle_gbm.h is missing.
> diff --git a/CMakeLists.txt b/CMakeLists.txt
> +if(waffle_has_gbm)
> + waffle_find_library(waffle_GL_library GL)
> + waffle_find_library(waffle_udev_library udev)
> +endif()
Is libGL really necessary here?
I expected to find `waffle_find_library(waffle_gbm_library). I haven't tested
the patches yet, but without that I don't
expect them to build. Or is it that libEGL pulls in libgbm as a dependency? If
that is the case, then we should still explicitly link to libgbm because GNU's
ld and Clang's gold behave differently with respect to transitive shared library
dependencies.
> --- a/src/waffle/CMakeLists.txt
> +++ b/src/waffle/CMakeLists.txt
> @@ -111,6 +111,22 @@ if(waffle_has_x11_egl)
> )
> endif()
>
> +if(waffle_has_gbm)
> + list(APPEND waffle_sources
> + gbm/gbm_config.c
> + gbm/gbm_context.c
> + gbm/gbm_display.c
> + gbm/gbm_platform.c
> + gbm/gbm_priv_egl.c
> + gbm/gbm_window.c
> + )
> + list(APPEND waffle_libdeps
> + ${waffle_gbm-client_library}
> + ${waffle_gbm-egl_library}
> + ${waffle_udev_library}
> + )
> +endif()
I can't find where waffle_gbm-client_library and waffle_gbm-eg_library are
defined in this patch. Copy-paste error from Wayland?
> +struct wcore_config*
> +gbm_config_choose(struct wcore_platform *wc_plat,
> + struct wcore_display *wc_dpy,
> + const struct wcore_config_attrs *attrs)
> +{
> + struct gbm_config *self;
> + struct gbm_display *dpy = gbm_display(wc_dpy);
> + bool ok = true;
Here, the config needs to be rejected if there is no corresponding GBM_FORMAT.
See my comments on gbm_window_create().
> +
> + self = wcore_calloc(sizeof(*self));
> + if (self == NULL)
> + return NULL;
> +
> + ok = wcore_config_init(&self->wcore, wc_dpy);
> + if (!ok)
> + goto error;
> +
> + ok = egl_get_render_buffer_attrib(attrs, &self->egl_render_buffer);
> + if (!ok)
> + goto error;
> +
> + self->egl = egl_choose_config(wc_plat, dpy->egl, attrs);
> + if (!self->egl)
> + goto error;
> +
> + self->waffle_context_api = attrs->context_api;
> + self->wcore.vtbl = &gbm_config_wcore_vtbl;
> + return &self->wcore;
> +
> +error:
> + gbm_config_destroy(&self->wcore);
> + return NULL;
> +}
> +static int
> +gbm_get_fd(void)
> +{
> + struct udev *ud;
> + struct udev_enumerate *en;
> + struct udev_list_entry *entry;
> + const char *path, *filename;
> + struct udev_device *device;
> + int fd;
> +
> + ud = udev_new();
> + en = udev_enumerate_new(ud);
> + udev_enumerate_add_match_subsystem(en, "drm");
> + udev_enumerate_add_match_sysname(en, "card[0-9]*");
> + udev_enumerate_scan_devices(en);
> +
> + udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(en)) {
> + path = udev_list_entry_get_name(entry);
> + device = udev_device_new_from_syspath(ud, path);
> + filename = udev_device_get_devnode(device);
> + fd = open(filename, O_RDWR | O_CLOEXEC);
> + udev_device_unref(device);
> + if (fd >= 0) {
> + return fd;
> + }
> + }
> +
> + return -1;
> +}
Is the `path` variable a filepath? Is it a udev path, whatever that is? I don't
know udev, and that little bit confused me.
> +struct wcore_window*
> +gbm_window_create(struct wcore_platform *wc_plat,
> + struct wcore_config *wc_config,
> + int width,
> + int height)
> +{
> + struct gbm_window *self;
> + struct gbm_config *config = gbm_config(wc_config);
> + struct gbm_display *dpy = gbm_display(wc_config->display);
> + bool ok = true;
> +
> + self = wcore_calloc(sizeof(*self));
> + if (self == NULL)
> + return NULL;
> +
> + ok = wcore_window_init(&self->wcore, wc_config);
> + if (!ok)
> + goto error;
> +
> + self->gbm_surface = gbm_surface_create(dpy->gbm_device, width, height,
> + GBM_FORMAT_XRGB8888,
> + GBM_BO_USE_RENDERING);
Here, waffle needs to respect the color bits with which the waffle_config was
created.
As an aside, GBM has no formats with depth bits. In order to run all Piglit
tests under GBM, we will need to extend to GBM somehow.
> + if (!self->gbm_surface) {
> + wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> + "gbm_surface_create failed");
> + goto error;
> + }
> +
> + self->egl = gbm_egl_create_window_surface(dpy->egl,
> + config->egl,
> + self->gbm_surface,
> + config->egl_render_buffer);
> + if (!self->egl)
> + goto error;
> +
> + self->wcore.vtbl = &gbm_window_wcore_vtbl;
> + return &self->wcore;
> +
> +error:
> + gbm_window_destroy(&self->wcore);
> + return NULL;
> +}
> +static union waffle_native_window*
> +gbm_window_get_native(struct wcore_window *wc_self)
> +{
> + struct gbm_window *self = gbm_window(wc_self);
> + struct gbm_display *dpy = gbm_display(wc_self->display);
> + struct waffle_gbm_window *n_window;
> +
> + n_window = wcore_malloc(sizeof(*n_window));
> + if (n_window == NULL)
> + return NULL;
> +
> + gbm_display_fill_native(dpy, &n_window->display);
> + n_window->egl_surface = self->egl;
n_window->gbm_surface = self->gbm_surface?
> +
> + return (union waffle_native_window*) n_window;
> +}
More information about the waffle
mailing list