Let's applications like Weston create EGL onscreen-surfaces on bare DRM devices.
Signed-off-by: Lucas Stach <l.st...@pengutronix.de> --- src/gallium/state_trackers/egl/drm/native_drm.c | 11 ++++++ src/gallium/state_trackers/gbm/gbm_drm.c | 44 ++++++++++++++++++++++ .../state_trackers/gbm/gbm_gallium_drmint.h | 12 ++++++ 3 files changed, 67 insertions(+) diff --git a/src/gallium/state_trackers/egl/drm/native_drm.c b/src/gallium/state_trackers/egl/drm/native_drm.c index c82bbe4d7417..10a77603d2aa 100644 --- a/src/gallium/state_trackers/egl/drm/native_drm.c +++ b/src/gallium/state_trackers/egl/drm/native_drm.c @@ -83,6 +83,7 @@ drm_display_get_configs(struct native_display *ndpy, int *num_configs) } nconf->color_format = format; + nconf->window_bit = TRUE; /* support KMS */ if (drmdpy->resources) @@ -211,6 +212,15 @@ drm_create_pixmap_surface(struct native_display *ndpy, return drm_display_create_surface_from_resource(ndpy, bo->resource); } +static struct native_surface * +drm_create_window_surface(struct native_display *ndpy, + EGLNativeWindowType win, + const struct native_config *nconf) +{ + struct gbm_gallium_drm_surface *surf = (void *) win; + return drm_display_create_surface_from_resource(ndpy, surf->bo->resource); +} + static boolean drm_display_init_screen(struct native_display *ndpy) { @@ -246,6 +256,7 @@ drm_create_display(struct gbm_gallium_drm_device *gbmdrm, int own_gbm, drmdpy->base.get_configs = drm_display_get_configs; drmdpy->base.create_pixmap_surface = drm_create_pixmap_surface; + drmdpy->base.create_window_surface = drm_create_window_surface; drmdpy->base.buffer = &drm_display_buffer; #ifdef HAVE_WAYLAND_BACKEND diff --git a/src/gallium/state_trackers/gbm/gbm_drm.c b/src/gallium/state_trackers/gbm/gbm_drm.c index 725f12f6dad5..ad1c4a5c5639 100644 --- a/src/gallium/state_trackers/gbm/gbm_drm.c +++ b/src/gallium/state_trackers/gbm/gbm_drm.c @@ -218,6 +218,47 @@ gbm_gallium_drm_bo_create(struct gbm_device *gbm, return &bo->base.base; } +static struct gbm_surface * +gbm_gallium_drm_surface_create(struct gbm_device *gbm, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags) +{ + struct gbm_gallium_drm_surface *surf; + + surf = calloc(1, sizeof *surf); + if (surf == NULL) + return NULL; + + surf->base.gbm = gbm; + surf->base.width = width; + surf->base.height = height; + surf->base.format = format; + surf->base.flags = flags; + + surf->bo = gbm_gallium_drm_bo_create(gbm, width, height, format, + GBM_BO_USE_RENDERING); + + return &surf->base; +} + +static void +gbm_gallium_drm_surface_destroy(struct gbm_surface *_surf) +{ + struct gbm_gallium_drm_surface *surf = gbm_gallium_drm_surface(_surf); + + gbm_gallium_drm_bo_destroy(&surf->bo->base.base); + + free(surf); +} + +static struct gbm_bo * +gbm_gallium_drm_lock_front_buffer(struct gbm_surface *_surf) +{ + struct gbm_gallium_drm_surface *surf = gbm_gallium_drm_surface(_surf); + + return surf->bo; +} + static void gbm_gallium_drm_destroy(struct gbm_device *gbm) { @@ -240,6 +281,9 @@ gbm_gallium_drm_device_create(int fd) gdrm->base.base.bo_import = gbm_gallium_drm_bo_import; gdrm->base.base.bo_destroy = gbm_gallium_drm_bo_destroy; gdrm->base.base.is_format_supported = gbm_gallium_drm_is_format_supported; + gdrm->base.base.surface_create = gbm_gallium_drm_surface_create; + gdrm->base.base.surface_destroy = gbm_gallium_drm_surface_destroy; + gdrm->base.base.surface_lock_front_buffer = gbm_gallium_drm_lock_front_buffer; gdrm->base.base.destroy = gbm_gallium_drm_destroy; gdrm->base.type = GBM_DRM_DRIVER_TYPE_GALLIUM; diff --git a/src/gallium/state_trackers/gbm/gbm_gallium_drmint.h b/src/gallium/state_trackers/gbm/gbm_gallium_drmint.h index a5d6d834737b..e873e9174d45 100644 --- a/src/gallium/state_trackers/gbm/gbm_gallium_drmint.h +++ b/src/gallium/state_trackers/gbm/gbm_gallium_drmint.h @@ -53,6 +53,12 @@ struct gbm_gallium_drm_bo { struct pipe_resource *resource; }; +struct gbm_gallium_drm_surface { + struct gbm_surface base; + + struct gbm_gallium_drm_bo *bo; +}; + static inline struct gbm_gallium_drm_device * gbm_gallium_drm_device(struct gbm_device *gbm) { @@ -65,6 +71,12 @@ gbm_gallium_drm_bo(struct gbm_bo *bo) return (struct gbm_gallium_drm_bo *) bo; } +static inline struct gbm_gallium_drm_surface * +gbm_gallium_drm_surface(struct gbm_surface *surface) +{ + return (struct gbm_gallium_drm_surface *) surface; +} + struct gbm_device * gbm_gallium_drm_device_create(int fd); -- 1.8.4.rc3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev