gears: Use wayland egl surface instead of images
diff --git a/clients/gears.c b/clients/gears.c
index 2df79c3..e64ff3e 100644
--- a/clients/gears.c
+++ b/clients/gears.c
@@ -30,11 +30,8 @@
#include <unistd.h>
#include <math.h>
#include <time.h>
-#include <cairo.h>
#include <glib.h>
-#define GL_GLEXT_PROTOTYPES
-#define EGL_EGLEXT_PROTOTYPES
#include <GL/gl.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
@@ -51,14 +48,11 @@
struct display *d;
EGLDisplay display;
+ EGLDisplay config;
EGLContext context;
GLfloat angle;
- cairo_surface_t *cairo_surface;
GLint gear_list[3];
- GLuint fbo, color_rbo[2], depth_rbo;
- cairo_surface_t *surface[2];
- int current;
};
struct gear_template {
@@ -203,55 +197,27 @@
}
static void
-allocate_buffer(struct gears *gears)
+draw_gears(struct gears *gears)
{
- EGLImageKHR image;
+ GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
+ struct rectangle window_allocation;
struct rectangle allocation;
window_draw(gears->window);
- gears->surface[gears->current] = window_get_surface(gears->window);
-#ifdef HAVE_CAIRO_EGL
- image = display_get_image_for_egl_image_surface(gears->display,
- gears->surface[gears->current]);
-#else /* XXX: hack to make Wayland compile, even if this example doesn't run */
- die("gears cannot allocate buffer: it was compiled without cairo-gl\n");
- return;
-#endif
- if (!eglMakeCurrent(gears->display, NULL, NULL, gears->context))
- die("faile to make context current\n");
-
- glBindRenderbuffer(GL_RENDERBUFFER_EXT,
- gears->color_rbo[gears->current]);
- glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, image);
-
- glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->depth_rbo);
window_get_child_allocation(gears->window, &allocation);
- glRenderbufferStorage(GL_RENDERBUFFER_EXT,
- GL_DEPTH_COMPONENT,
- allocation.width + 20 + 32,
- allocation.height + 60 + 32);
-}
+ window_get_allocation(gears->window, &window_allocation);
-static void
-draw_gears(struct gears *gears)
-{
- GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
- struct rectangle allocation;
-
- if (gears->surface[gears->current] == NULL)
- allocate_buffer(gears);
-
- glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_RENDERBUFFER_EXT,
- gears->color_rbo[gears->current]);
-
- window_get_child_allocation(gears->window, &allocation);
- glViewport(allocation.x, allocation.y,
+ display_acquire_window_surface(gears->d,
+ gears->window,
+ gears->context);
+
+ glViewport(allocation.x,
+ window_allocation.height - allocation.height - allocation.x,
allocation.width, allocation.height);
- glScissor(allocation.x, allocation.y,
- allocation.width, allocation.height);
+ glScissor(allocation.x,
+ window_allocation.height - allocation.height - allocation.y,
+ allocation.width, allocation.height);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -286,7 +252,7 @@
glFlush();
- window_set_surface(gears->window, gears->surface[gears->current]);
+ display_release(gears->d);
window_flush(gears->window);
}
@@ -296,11 +262,6 @@
{
struct gears *gears = data;
- cairo_surface_destroy(gears->surface[0]);
- gears->surface[0] = NULL;
- cairo_surface_destroy(gears->surface[1]);
- gears->surface[1] = NULL;
-
/* Constrain child size to be square and at least 300x300 */
if (width > height)
height = width;
@@ -338,8 +299,6 @@
{
struct gears *gears = data;
- gears->current = 1 - gears->current;
-
gears->angle = (GLfloat) (time % 8192) * 360 / 8192.0;
window_schedule_redraw(gears->window);
@@ -359,7 +318,6 @@
gears->d = display;
gears->window = window_create(display, width, height);
window_set_title(gears->window, "Wayland Gears");
- window_set_buffer_type(gears->window, WINDOW_BUFFER_TYPE_EGL_IMAGE);
gears->display = display_get_egl_display(gears->d);
if (gears->display == NULL)
@@ -367,24 +325,16 @@
eglBindAPI(EGL_OPENGL_API);
- gears->context = eglCreateContext(gears->display,
- NULL, EGL_NO_CONTEXT, NULL);
+ gears->config = display_get_egl_config(gears->d);
+
+ gears->context = eglCreateContext(gears->display, gears->config,
+ EGL_NO_CONTEXT, NULL);
if (gears->context == NULL)
die("failed to create context\n");
if (!eglMakeCurrent(gears->display, NULL, NULL, gears->context))
die("faile to make context current\n");
- glGenFramebuffers(1, &gears->fbo);
- glBindFramebuffer(GL_FRAMEBUFFER_EXT, gears->fbo);
-
- glGenRenderbuffers(2, gears->color_rbo);
- glGenRenderbuffers(1, &gears->depth_rbo);
- glBindRenderbuffer(GL_RENDERBUFFER_EXT, gears->depth_rbo);
- glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT,
- GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT,
- gears->depth_rbo);
for (i = 0; i < 3; i++) {
gears->gear_list[i] = glGenLists(1);
glNewList(gears->gear_list[i], GL_COMPILE);