From bf9541ffa34b1bdd94157bae47c4edc4aabecb69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 25 Nov 2008 12:10:09 -0500 Subject: [PATCH] Allocate and set mode in egl-compositor. Pass the front buffer name to eglCreateSurfaceForName to create the fullscreen EGLSurface. --- egl-compositor.c | 108 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 102 insertions(+), 6 deletions(-) diff --git a/egl-compositor.c b/egl-compositor.c index 72681f15..0cf77f69 100644 --- a/egl-compositor.c +++ b/egl-compositor.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "wayland.h" #include "cairo-util.h" @@ -711,6 +712,98 @@ create_input_devices(struct wl_display *display) wl_display_add_object(display, obj); } +static uint32_t +create_frontbuffer(int fd, int *width, int *height, int *stride) +{ + drmModeConnector *connector; + drmModeRes *resources; + drmModeEncoder *encoder; + struct drm_mode_modeinfo *mode; + struct drm_i915_gem_create create; + struct drm_i915_gem_pin pin; + struct drm_gem_flink flink; + unsigned int fb_id; + int i, ret; + + resources = drmModeGetResources(fd); + if (!resources) { + fprintf(stderr, "drmModeGetResources failed\n"); + return 0; + } + + for (i = 0; i < resources->count_connectors; i++) { + connector = drmModeGetConnector(fd, resources->connectors[i]); + if (connector == NULL) + continue; + + if (connector->connection == DRM_MODE_CONNECTED && + connector->count_modes > 0) + break; + + drmModeFreeConnector(connector); + } + + if (i == resources->count_connectors) { + fprintf(stderr, "No currently active connector found.\n"); + return -1; + } + + mode = &connector->modes[0]; + + for (i = 0; i < resources->count_encoders; i++) { + encoder = drmModeGetEncoder(fd, resources->encoders[i]); + + if (encoder == NULL) + continue; + + if (encoder->encoder_id == connector->encoder_id) + break; + + drmModeFreeEncoder(encoder); + } + + /* Mode size at 32 bpp */ + create.size = mode->hdisplay * mode->vdisplay * 4; + if (ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create) != 0) { + fprintf(stderr, "gem create failed: %m\n"); + return 0; + } + + pin.handle = create.handle; + pin.alignment = 4096; + if (ioctl(fd, DRM_IOCTL_I915_GEM_PIN, &pin)) { + fprintf(stderr, "failed to pin buffer: %m\n"); + return 0; + } + + ret = drmModeAddFB(fd, mode->hdisplay, mode->vdisplay, + 32, 32, mode->hdisplay * 4, create.handle, &fb_id); + if (ret) { + fprintf(stderr, "failed to add fb: %m\n"); + return 0; + } + + ret = drmModeSetCrtc(fd, encoder->crtc_id, fb_id, 0, 0, + &connector->connector_id, 1, mode); + if (ret) { + fprintf(stderr, "failed to set mode: %m\n"); + return 0; + } + + flink.handle = create.handle; + if (ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink) != 0) { + fprintf(stderr, "gem flink failed: %m\n"); + return 0; + } + + *width = mode->hdisplay; + *height = mode->vdisplay; + *stride = mode->hdisplay * 4; + + return flink.name; +} + + static const char gem_device[] = "/dev/dri/card0"; WL_EXPORT struct wl_compositor * @@ -721,14 +814,15 @@ wl_compositor_create(struct wl_display *display) struct egl_compositor *ec; const char *filename; struct screenshooter *shooter; + uint32_t fb_name; + int stride; + const static EGLint attribs[] = + { EGL_RENDER_BUFFER, EGL_BACK_BUFFER, EGL_NONE }; ec = malloc(sizeof *ec); if (ec == NULL) return NULL; - ec->width = 1280; - ec->height = 800; - ec->base.interface = &interface; ec->wl_display = display; @@ -747,10 +841,12 @@ wl_compositor_create(struct wl_display *display) fprintf(stderr, "failed to get configs\n"); return NULL; } - + ec->config = configs[24]; - ec->surface = eglCreateSurfaceNative(ec->display, ec->config, - 0, 0, ec->width, ec->height); + fb_name = create_frontbuffer(eglGetDisplayFD(ec->display), + &ec->width, &ec->height, &stride); + ec->surface = eglCreateSurfaceForName(ec->display, ec->config, + fb_name, ec->width, ec->height, stride, attribs); if (ec->surface == NULL) { fprintf(stderr, "failed to create surface\n"); return NULL;