diff options
| author | Kristian Høgsberg <krh@bitplanet.net> | 2010-03-03 09:54:29 -0500 |
|---|---|---|
| committer | Kristian Høgsberg <krh@bitplanet.net> | 2010-03-03 10:34:35 -0500 |
| commit | 3afd45d49c8103878c2c1bcc689c0f1f22db45c9 (patch) | |
| tree | 564df0b6a84c8e1a7b0748641329e0617cd7cb5a /gears.c | |
| parent | Import Eric Anholts hash table implementation (diff) | |
| download | wayland-3afd45d49c8103878c2c1bcc689c0f1f22db45c9.tar wayland-3afd45d49c8103878c2c1bcc689c0f1f22db45c9.tar.gz wayland-3afd45d49c8103878c2c1bcc689c0f1f22db45c9.tar.bz2 wayland-3afd45d49c8103878c2c1bcc689c0f1f22db45c9.tar.lz wayland-3afd45d49c8103878c2c1bcc689c0f1f22db45c9.tar.xz wayland-3afd45d49c8103878c2c1bcc689c0f1f22db45c9.tar.zst wayland-3afd45d49c8103878c2c1bcc689c0f1f22db45c9.zip | |
Switch to using mesa EGL
Diffstat (limited to 'gears.c')
| -rw-r--r-- | gears.c | 54 |
1 files changed, 33 insertions, 21 deletions
@@ -33,8 +33,10 @@ #include <cairo-drm.h> #define GL_GLEXT_PROTOTYPES +#define EGL_EGLEXT_PROTOTYPES #include <GL/gl.h> -#include <eagle.h> +#include <EGL/egl.h> +#include <EGL/eglext.h> #include "wayland-util.h" #include "wayland-client.h" @@ -54,6 +56,8 @@ struct gears { EGLDisplay display; EGLContext context; + EGLImageKHR image; + int drm_fd; int resized; GLfloat angle; cairo_surface_t *cairo_surface; @@ -244,6 +248,15 @@ draw_gears(struct gears *gears) static void resize_window(struct gears *gears) { + EGLint attribs[] = { + EGL_IMAGE_WIDTH_INTEL, 0, + EGL_IMAGE_HEIGHT_INTEL, 0, + EGL_IMAGE_FORMAT_INTEL, EGL_FORMAT_RGBA_8888_KHR, + EGL_IMAGE_USE_INTEL, EGL_IMAGE_USE_SHARE_INTEL | + EGL_IMAGE_USE_SCANOUT_INTEL, + EGL_NONE + }; + /* Constrain child size to be square and at least 300x300 */ window_get_child_rectangle(gears->window, &gears->rectangle); if (gears->rectangle.width > gears->rectangle.height) @@ -258,11 +271,16 @@ resize_window(struct gears *gears) window_draw(gears->window); + if (gears->image) + eglDestroyImageKHR(gears->display, gears->image); + attribs[1] = gears->rectangle.width; + attribs[1] = gears->rectangle.height; + gears->image = eglCreateImageKHR(gears->display, gears->context, + EGL_SYSTEM_IMAGE_INTEL, + NULL, attribs); + glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->color_rbo); - glRenderbufferStorage(GL_RENDERBUFFER_EXT, - GL_RGBA, - gears->rectangle.width, - gears->rectangle.height); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, gears->image); glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->depth_rbo); glRenderbufferStorage(GL_RENDERBUFFER_EXT, @@ -323,15 +341,10 @@ handle_frame(void *data, uint32_t frame, uint32_t timestamp) { struct gears *gears = data; - GLint name, stride; + EGLint name, handle, stride; - glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->color_rbo); - glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, - GL_RENDERBUFFER_STRIDE_INTEL, - &stride); - glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, - GL_RENDERBUFFER_NAME_INTEL, - &name); + eglShareImageINTEL(gears->display, gears->context, + gears->image, 0, &name, &handle, &stride); window_copy(gears->window, &gears->rectangle, name, stride); @@ -346,25 +359,24 @@ static const struct wl_compositor_listener compositor_listener = { }; static struct gears * -gears_create(struct display *display) +gears_create(struct display *display, int drm_fd) { const int x = 200, y = 200, width = 450, height = 500; EGLint major, minor; - struct udev *udev; - struct udev_device *device; + EGLDisplayTypeDRMMESA drm_display; struct gears *gears; int i; - udev = udev_new(); - device = udev_device_new_from_syspath(udev, "/sys/class/drm/card0"); - gears = malloc(sizeof *gears); memset(gears, 0, sizeof *gears); gears->d = display; gears->window = window_create(display, "Wayland Gears", x, y, width, height); - gears->display = eglCreateDisplayNative(device); + drm_display.type = EGL_DISPLAY_TYPE_DRM_MESA; + drm_display.device = NULL; + drm_display.fd = drm_fd; + gears->display = eglGetDisplay((EGLNativeDisplayType) &drm_display); if (gears->display == NULL) die("failed to create egl display\n"); @@ -460,7 +472,7 @@ int main(int argc, char *argv[]) source = wl_glib_source_new(display); g_source_attach(source, NULL); - gears = gears_create(d); + gears = gears_create(d, fd); g_main_loop_run(loop); |
