summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2008-12-15 17:23:47 -0500
committerKristian Høgsberg <krh@redhat.com>2008-12-15 17:23:47 -0500
commit8684ecf0166629773b2ef1b1e049bf0afd0c6e68 (patch)
treeffb50b209e150e78b1a0b6268f526e42d9ddb911
parent1cad8659b9e199209d0a4d8ba3b65e254d6e2871 (diff)
Create framebuffer and pick config instead of hardcoding these.
-rw-r--r--test.c164
1 files changed, 127 insertions, 37 deletions
diff --git a/test.c b/test.c
index 5b6fef6..cad2949 100644
--- a/test.c
+++ b/test.c
@@ -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[])