diff options
author | Kristian Høgsberg <krh@redhat.com> | 2008-12-15 17:23:47 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2008-12-15 17:23:47 -0500 |
commit | 8684ecf0166629773b2ef1b1e049bf0afd0c6e68 (patch) | |
tree | ffb50b209e150e78b1a0b6268f526e42d9ddb911 | |
parent | 1cad8659b9e199209d0a4d8ba3b65e254d6e2871 (diff) |
Create framebuffer and pick config instead of hardcoding these.
-rw-r--r-- | test.c | 164 |
1 files changed, 127 insertions, 37 deletions
@@ -63,12 +63,56 @@ static void run(EGLDisplay display, EGLSurface surface, EGLConfig config, eglTerminate(display); } +static EGLConfig +pick_config(EGLDisplay display) +{ + EGLConfig config, configs[100]; + EGLint value, count; + int i; + + if (!eglGetConfigs(display, configs, ARRAY_SIZE(configs), &count)) { + fprintf(stderr, "failed to get configs\n"); + return EGL_NO_CONFIG; + } + + config = EGL_NO_CONFIG; + for (i = 0; i < count; i++) { + eglGetConfigAttrib(display, + configs[i], + EGL_DEPTH_SIZE, + &value); + if (value == 0) { + fprintf(stderr, "config %d has depth size %d\n", i, value); + continue; + } + + eglGetConfigAttrib(display, + configs[i], + EGL_CONFIG_CAVEAT, + &value); + if (value != EGL_NONE) { + fprintf(stderr, "config %d has caveat %d\n", i, value); + continue; + } + + config = configs[i]; + break; + } + + if (config == EGL_NO_CONFIG) { + fprintf(stderr, "found no config without depth or stencil buffers\n"); + return EGL_NO_CONFIG; + } + + return config; +} + static void run_dri2(int x, int y, int width, int height) { EGLDisplay display; EGLSurface surface; - EGLConfig configs[64]; - EGLint major, minor, count; + EGLConfig config; + EGLint major, minor; Display *x11_display; Window root, window; XSetWindowAttributes attributes; @@ -110,55 +154,103 @@ static void run_dri2(int x, int y, int width, int height) if (!eglInitialize(display, &major, &minor)) die("failed to initialize display\n"); - if (!eglGetConfigs(display, configs, ARRAY_SIZE(configs), &count)) - die("failed to get configs\n"); - - surface = eglCreateSurfaceX11(display, configs[24], - window, width, height); + config = pick_config(display); + surface = eglCreateSurfaceX11(display, config, window, width, height); if (surface == NULL) die("failed to create surface\n"); - run(display, surface, configs[24], width, height); + run(display, surface, config, width, height); } -static int -get_fb_name(EGLDisplay display, int *width, int *height, int *stride) +static uint32_t +create_frontbuffer(EGLDisplay display, int *width, int *height, int *stride) { - drmModeResPtr mode_res; - drmModeCrtcPtr crtc; - drmModeFBPtr fb; + 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; - int fd; + unsigned int fb_id; + int i, ret, fd; fd = eglGetDisplayFD(display); - mode_res = drmModeGetResources(fd); - if (mode_res == NULL) { - fprintf(stderr, "drmModeGetResources returns NULL\n"); + 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; } - crtc = drmModeGetCrtc(fd, mode_res->crtcs[1]); - if (crtc == NULL) { - fprintf(stderr, "drmModeGetCrtc returns NULL\n"); + 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; } - fb = drmModeGetFB(fd, crtc->buffer_id); - if (fb == NULL) { - fprintf(stderr, "drmModeGetFB returns NULL\n"); + 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; } - flink.handle = fb->handle; - if (ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) { - fprintf(stderr, "failed to create buffer\n"); + 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; } - *width = fb->width; - *height = fb->height; - *stride = fb->pitch; + 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; } @@ -167,8 +259,8 @@ static void run_native(int x, int y, int width, int height) { EGLDisplay display; EGLSurface surface; - EGLConfig configs[64]; - EGLint major, minor, count; + EGLConfig config; + EGLint major, minor; uint32_t name; int fb_width, fb_height, fb_stride; const static EGLint attribs[] = @@ -181,16 +273,14 @@ static void run_native(int x, int y, int width, int height) if (!eglInitialize(display, &major, &minor)) die("failed to initialize display\n"); - if (!eglGetConfigs(display, configs, ARRAY_SIZE(configs), &count)) - die("failed to get configs\n"); - - name = get_fb_name(display, &fb_width, &fb_height, &fb_stride); - surface = eglCreateSurfaceForName(display, configs[24], + config = pick_config(display); + name = create_frontbuffer(display, &fb_width, &fb_height, &fb_stride); + surface = eglCreateSurfaceForName(display, config, name, width, height, fb_stride, attribs); if (surface == NULL) die("failed to create surface\n"); - run(display, surface, configs[24], width, height); + run(display, surface, config, width, height); } int main(int argc, char *argv[]) |