diff options
author | Kristian Høgsberg <krh@redhat.com> | 2009-05-27 17:45:16 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2009-05-27 17:45:16 -0400 |
commit | 5af77e7525f42d7c5fa4429a633cf844d6b935f2 (patch) | |
tree | 33508bb3d0a1efc22bee5acae7132eac337c8eec | |
parent | ab2fd1164cd22698247f46fdf8656c219185b635 (diff) |
Change the API to let the application swap and cycle buffers as it wants
Stop trying to make eglSwapBuffer work and just let the application
get at the color buffers.
-rw-r--r-- | eagle-internal.h | 7 | ||||
-rw-r--r-- | eagle.c | 54 | ||||
-rw-r--r-- | eagle.h | 26 | ||||
-rw-r--r-- | intel.c | 204 | ||||
-rw-r--r-- | test/Makefile.in | 4 | ||||
-rw-r--r-- | test/gears.c | 46 | ||||
-rw-r--r-- | test/setup.c | 108 | ||||
-rw-r--r-- | test/setup.h | 4 | ||||
-rw-r--r-- | test/texture.c | 7 | ||||
-rw-r--r-- | x11-dri2.c | 1 |
10 files changed, 231 insertions, 230 deletions
diff --git a/eagle-internal.h b/eagle-internal.h index 5d09e8e..6adc18d 100644 --- a/eagle-internal.h +++ b/eagle-internal.h @@ -57,7 +57,7 @@ struct EGLDisplay { int width, height; - __DRIcopyBufferExtension *copyBuffer; + __DRI2flushExtension *flush; const struct EagleBackend *backend; void *backendPrivate; @@ -97,13 +97,8 @@ struct EagleBackend { void (*getBuffers)(EGLSurface surface, uint32_t *attachments, int count); - EGLBoolean (*swapBuffers)(EGLDisplay display, - EGLSurface surface); EGLBoolean (*destroySurface)(EGLDisplay display, EGLSurface surface); - EGLSurface (*createSurfaceForName)(EGLDisplay display, EGLConfig config, - uint32_t name, uint32_t width, - uint32_t height, uint32_t stride, const EGLint *attribList); }; int eglInitDisplay(EGLDisplay display, @@ -202,10 +202,10 @@ eglInitDisplay(EGLDisplay display, (__DRItexBufferExtension *) extensions[i]; } - if (strcmp(extensions[i]->name, __DRI_COPY_BUFFER) == 0 && - extensions[i]->version >= __DRI_COPY_BUFFER_VERSION) { - display->copyBuffer = - (__DRIcopyBufferExtension *) extensions[i]; + if (strcmp(extensions[i]->name, __DRI2_FLUSH) == 0 && + extensions[i]->version >= 2) { + display->flush = + (__DRI2flushExtension *) extensions[i]; } } @@ -214,8 +214,8 @@ eglInitDisplay(EGLDisplay display, goto fail; } - if (display->copyBuffer == NULL) { - fprintf(stderr, "dri driver has no copyBuffer extension\n"); + if (display->flush == NULL) { + fprintf(stderr, "dri driver has no flush extension\n"); goto fail; } @@ -564,15 +564,6 @@ eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, return EGL_NO_SURFACE; } -EAGLE_EXPORT EGLSurface -eglCreateSurfaceForName(EGLDisplay display, EGLConfig config, - uint32_t name, uint32_t width, - uint32_t height, uint32_t stride, const EGLint *attribList) -{ - return display->backend->createSurfaceForName(display, config, name, - width, height, stride, attribList); -} - EAGLE_EXPORT EGLBoolean eglDestroySurface(EGLDisplay display, EGLSurface surface) { @@ -761,7 +752,7 @@ eglWaitNative(EGLint engine) EAGLE_EXPORT EGLBoolean eglSwapBuffers(EGLDisplay display, EGLSurface surface) { - return display->backend->swapBuffers(display, surface); + return EGL_FALSE; /* Sorry... */ } EAGLE_EXPORT EGLBoolean @@ -790,34 +781,3 @@ EAGLE_EXPORT void { return NULL; } - -EAGLE_EXPORT EGLBoolean -eglCopyNativeBuffers(EGLDisplay display, - EGLSurface dst, GLenum dstBuffer, int32_t dst_x, int32_t dst_y, - EGLSurface src, GLenum srcBuffer, int32_t x, int32_t y, int32_t width, int32_t height) -{ - EGLContext context; - __DRIbuffer *dstDRIBuffer; - unsigned int attachments[1]; - - context = eglGetCurrentContext(); - - /* FIXME: glCopyPixels should work, but then we'll have to - * call eglMakeCurrent to set up the src and dest surfaces - * first. This seems cheaper, but maybe there's a better way - * to accomplish this. */ - - attachments[0] = __DRI_BUFFER_FRONT_LEFT; - display->backend->getBuffers(src, attachments, 1); - - /* FIXME: Actually use dstBuffer and srcBuffer (eg - * GL_FRONT_LEFT) to look up the buffers to use. */ - - dstDRIBuffer = &dst->buffers[0]; - - return display->copyBuffer->copyBuffer(context->driContext, - dstDRIBuffer, - dst_x, dst_y, - src->driDrawable, __DRI_BUFFER_FRONT_LEFT, - x, y, width, height); -} @@ -248,6 +248,13 @@ extern EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLNativePixmapType pixmap, const EGLint *attribList); +extern EGLSurface eglCreateSurface(EGLDisplay display, + EGLConfig config, + uint32_t width, + uint32_t height, + uint32_t colorBufferCount, + const EGLint *attribList); + extern EGLSurface eglCreateSurfaceForName(EGLDisplay dpy, EGLConfig config, GLuint name, @@ -255,18 +262,15 @@ extern EGLSurface eglCreateSurfaceForName(EGLDisplay dpy, GLuint height, GLuint stride, const EGLint *attribList); +extern EGLBoolean eglGetColorBuffer(EGLSurface surface, + uint32_t index, + uint32_t *name, + uint32_t *handle, + uint32_t *stride); -extern EGLBoolean eglGetNativeBuffer(EGLSurface surface, - GLenum buffer, - uint32_t *name, - uint32_t *handle, - uint32_t *stride); - -extern EGLBoolean eglCopyNativeBuffers(EGLDisplay display, - EGLSurface dst, GLenum dstBuffer, - GLint dst_x, GLint dst_y, - EGLSurface src, GLenum srcBuffer, - GLint x, GLint y, GLint width, GLint height); +extern EGLBoolean eglBindColorBuffer(EGLDisplay display, + EGLSurface surface, + uint32_t index); extern void *eglReadBuffer(EGLDisplay display, EGLSurface surface, GLenum buffer, GLuint *stride); @@ -37,10 +37,11 @@ typedef struct EGLSurfaceNative *EGLSurfaceNative; struct EGLSurfaceNative { struct EGLSurface base; + __DRIbuffer *current; + __DRIbuffer colorBuffers[2]; + int colorBufferCount; + uint32_t colorBufferHandles[2]; uint32_t handles[10]; - EGLBoolean backBuffer; - __DRIbuffer front; - uint32_t frontHandle; }; static inline uint32_t @@ -179,8 +180,12 @@ intelGetBuffers(EGLSurface surface, unsigned int *attachments, int count) { EGLSurfaceNative nativeSurface = (EGLSurfaceNative) surface; __DRIbuffer *buffer; - struct drm_gem_open open_arg; - int i, ret; + int i; + + buffer = &surface->buffers[0]; + buffer->pitch = nativeSurface->current->pitch; + buffer->name = nativeSurface->current->name; + buffer->cpp = nativeSurface->current->cpp; if (count == surface->count) return; @@ -192,16 +197,10 @@ intelGetBuffers(EGLSurface surface, unsigned int *attachments, int count) buffer = &surface->buffers[i]; buffer->attachment = attachments[i]; - if (buffer->attachment == __DRI_BUFFER_FRONT_LEFT && - nativeSurface->front.name != ~0 && - !nativeSurface->backBuffer) { - buffer->name = nativeSurface->front.name; - buffer->pitch = nativeSurface->front.pitch; - buffer->cpp = 4; - open_arg.name = buffer->name; - ret = ioctl(surface->display->fd, - DRM_IOCTL_GEM_OPEN, &open_arg); - nativeSurface->handles[i] = open_arg.handle; + if (buffer->attachment == __DRI_BUFFER_FRONT_LEFT) { + buffer->pitch = nativeSurface->current->pitch; + buffer->name = nativeSurface->current->name; + buffer->cpp = nativeSurface->current->cpp; continue; } @@ -229,6 +228,12 @@ intelDestroySurface(EGLDisplay display, EGLSurface surface) struct drm_gem_close close; int i; + for (i = 0; i < nativeSurface->colorBufferCount; i++) { + close.handle = nativeSurface->colorBufferHandles[i]; + if (ioctl(surface->display->fd, DRM_IOCTL_GEM_CLOSE, &close) < 0) + fprintf(stderr, "close of bo %d failed\n", close.handle); + } + for (i = 0; i < surface->count; i++) { close.handle = nativeSurface->handles[i]; if (ioctl(surface->display->fd, DRM_IOCTL_GEM_CLOSE, &close) < 0) @@ -240,127 +245,134 @@ intelDestroySurface(EGLDisplay display, EGLSurface surface) return EGL_TRUE; } -static EGLBoolean -intelSwapBuffers(EGLDisplay display, EGLSurface surface) +static const struct EagleBackend intelBackend = { + intelGetBuffers, + intelDestroySurface, +}; + +static EGLDisplay +intelCreateDisplay(struct udev_device *device, const char *driver) { - EGLSurfaceNative nativeSurface = (EGLSurfaceNative) surface; - EGLContext context; + EGLDisplay display; + const char *path; - if (!nativeSurface->backBuffer) - return EGL_TRUE; + display = malloc(sizeof *display); + if (display == NULL) + return NULL; + + path = udev_device_get_devnode(device); + if (eglInitDisplay(display, path, driver) < 0) { + free(display); + return NULL; + } - context = eglGetCurrentContext(); + display->backend = &intelBackend; - display->copyBuffer->copyBuffer(context->driContext, - &nativeSurface->front, - 0, 0, - surface->driDrawable, __DRI_BUFFER_FRONT_LEFT, - 0, 0, - surface->width, - surface->height); + return display; +} - glFlush(); +EGLDisplay +i915CreateDisplay(struct udev_device *device) +{ + return intelCreateDisplay(device, "i915"); +} - return EGL_TRUE; +EGLDisplay +i965CreateDisplay(struct udev_device *device) +{ + return intelCreateDisplay(device, "i965"); } -static EGLSurface -intelCreateSurfaceForName(EGLDisplay display, EGLConfig config, - uint32_t name, uint32_t width, - uint32_t height, uint32_t stride, const EGLint *attribList) +EAGLE_EXPORT EGLSurface +eglCreateSurface(EGLDisplay display, EGLConfig config, + uint32_t width, uint32_t height, + uint32_t colorBufferCount, const EGLint *attribList) { EGLSurfaceNative nativeSurface; int i; + if (colorBufferCount < 1 || colorBufferCount > 2) + return NULL; + nativeSurface = malloc(sizeof *nativeSurface); if (nativeSurface == NULL) return NULL; - nativeSurface->backBuffer = EGL_FALSE; - - nativeSurface->front.attachment = __DRI_BUFFER_FRONT_LEFT; - if (name == 0) { - nativeSurface->frontHandle = + nativeSurface->current = &nativeSurface->colorBuffers[0]; + nativeSurface->colorBufferCount = colorBufferCount; + for (i = 0; i < colorBufferCount; i++) { + nativeSurface->colorBufferHandles[i] = intelCreateBuffer(display->fd, - width, height, - &nativeSurface->front); - } else { - nativeSurface->front.name = name; - nativeSurface->front.pitch = stride; - nativeSurface->front.cpp = 4; - nativeSurface->front.flags = 0; - nativeSurface->frontHandle = 0; + width, + height, + &nativeSurface->colorBuffers[i]); } eglInitSurface(&nativeSurface->base, display, config, width, height); - for (i = 0; attribList && attribList[i] != EGL_NONE; i += 2) { - if (attribList[i] == EGL_RENDER_BUFFER && - attribList[i + 1] == EGL_BACK_BUFFER) - nativeSurface->backBuffer = EGL_TRUE; - } - return &nativeSurface->base; } -static const struct EagleBackend intelBackend = { - intelGetBuffers, - intelSwapBuffers, - intelDestroySurface, - intelCreateSurfaceForName -}; - -static EGLDisplay -intelCreateDisplay(struct udev_device *device, const char *driver) +EAGLE_EXPORT EGLSurface +eglCreateSurfaceForName(EGLDisplay display, EGLConfig config, + uint32_t name, uint32_t width, + uint32_t height, uint32_t stride, const EGLint *attribList) { - EGLDisplay display; - const char *path; + EGLSurfaceNative nativeSurface; + struct drm_gem_open open_arg; + int ret; - display = malloc(sizeof *display); - if (display == NULL) + nativeSurface = malloc(sizeof *nativeSurface); + if (nativeSurface == NULL) return NULL; - - path = udev_device_get_devnode(device); - if (eglInitDisplay(display, path, driver) < 0) { - free(display); + + nativeSurface->current = &nativeSurface->colorBuffers[0]; + nativeSurface->colorBufferCount = 1; + nativeSurface->colorBuffers[0].attachment = __DRI_BUFFER_FRONT_LEFT; + nativeSurface->colorBuffers[0].name = name; + nativeSurface->colorBuffers[0].pitch = stride; + nativeSurface->colorBuffers[0].cpp = 4; + nativeSurface->colorBuffers[0].flags = 0; + + open_arg.name = name; + ret = ioctl(display->fd, DRM_IOCTL_GEM_OPEN, &open_arg); + if (ret < 0) { + free(nativeSurface); return NULL; } + nativeSurface->colorBufferHandles[0] = open_arg.handle; - display->backend = &intelBackend; + eglInitSurface(&nativeSurface->base, display, config, width, height); - return display; + return &nativeSurface->base; } EAGLE_EXPORT EGLBoolean -eglGetNativeBuffer(EGLSurface surface, GLenum buffer, - uint32_t *name, uint32_t *handle, uint32_t *stride) +eglGetColorBuffer(EGLSurface surface, uint32_t index, + uint32_t *name, uint32_t *handle, uint32_t *stride) { EGLSurfaceNative nativeSurface = (EGLSurfaceNative) surface; - switch (buffer) { - case GL_FRONT_LEFT: - *name = nativeSurface->front.name; - *handle = nativeSurface->frontHandle; - *stride = nativeSurface->front.pitch; - return EGL_TRUE; - case GL_BACK_LEFT: - *name = surface->buffers[0].name; - *handle = nativeSurface->handles[0]; - *stride = surface->buffers[0].pitch; - return EGL_TRUE; - default: + if (index >= nativeSurface->colorBufferCount) return EGL_FALSE; - } -} -EGLDisplay -i915CreateDisplay(struct udev_device *device) -{ - return intelCreateDisplay(device, "i915"); + *name = nativeSurface->colorBuffers[index].name; + *handle = nativeSurface->colorBufferHandles[index]; + *stride = nativeSurface->colorBuffers[index].pitch; + + return EGL_TRUE; } -EGLDisplay -i965CreateDisplay(struct udev_device *device) +EAGLE_EXPORT EGLBoolean +eglBindColorBuffer(EGLDisplay display, EGLSurface surface, uint32_t index) { - return intelCreateDisplay(device, "i965"); + EGLSurfaceNative nativeSurface = (EGLSurfaceNative) surface; + + if (index >= nativeSurface->colorBufferCount) + return EGL_FALSE; + + display->flush->flushInvalidate(surface->driDrawable); + nativeSurface->current = &nativeSurface->colorBuffers[index]; + + return EGL_TRUE; } diff --git a/test/Makefile.in b/test/Makefile.in index 743d61f..cec3f3d 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -9,12 +9,12 @@ all : gears texture gears_objs = gears.o setup.o gears : ../libeagle.so $(gears_objs) - gcc -o $@ -L.. -leagle -lm $(gears_objs) + gcc -o $@ -L.. -leagle $(LDLIBS) -lm $(gears_objs) texture_objs = texture.o setup.o texture : ../libeagle.so $(texture_objs) - gcc -o $@ -L.. -leagle -lm $(texture_objs) + gcc -o $@ -L.. -leagle $(LDLIBS) -lm $(texture_objs) clean : rm -f *.o glapi/*.o libeagle.so test diff --git a/test/gears.c b/test/gears.c index 34da966..2083850 100644 --- a/test/gears.c +++ b/test/gears.c @@ -35,6 +35,7 @@ struct gears { int width, height; GLint gear1, gear2, gear3; + GLfloat angle; }; static void @@ -165,6 +166,8 @@ gears_create(int width, int height) GLfloat h; gears = malloc(sizeof *gears); + gears->angle = 0; + /* make the gears */ gears->gear1 = glGenLists(1); glNewList(gears->gear1, GL_COMPILE); @@ -246,38 +249,25 @@ gears_draw(struct gears *gears, GLfloat angle) glFlush(); } +static int init(struct state *state) +{ + state->data = gears_create(state->width, state->height); + + return 0; +} + static int render(struct state *state) { - struct pollfd p[1]; - GLfloat angle = 0.0; - struct gears *gears; - struct timeval before, now; - int count, elapsed, slice = 300; - - gears = gears_create(state->width, state->height); - p[0].fd = STDIN_FILENO; - p[0].events = POLLIN; - count = 0; - gettimeofday(&before, NULL); - while (1) { - glClear(GL_COLOR_BUFFER_BIT); - gears_draw(gears, angle); - eglSwapBuffers(state->display, state->surface); - angle += 0.4; - count += 1; - if (count == slice) { - gettimeofday(&now, NULL); - elapsed = (now.tv_sec - before.tv_sec) * 1000 + - (now.tv_usec - before.tv_usec) / 1000; - before = now; - printf("%d frames in %d seconds: %f fps\n", - slice, elapsed, (float) 1000 * slice / elapsed); - count = 0; - } - } + struct gears *gears = state->data; + + glClear(GL_COLOR_BUFFER_BIT); + gears_draw(gears, gears->angle); + gears->angle += 0.4; + + return 0; } int main(int argc, char *argv[]) { - return setup(argc, argv, render); + return setup(argc, argv, init, render); } diff --git a/test/setup.c b/test/setup.c index 3fa0753..35070b5 100644 --- a/test/setup.c +++ b/test/setup.c @@ -7,9 +7,11 @@ #include "../eagle.h" #include <sys/time.h> #include <drm_mode.h> +#include <xf86drm.h> #include <xf86drmMode.h> #include <sys/ioctl.h> #include <i915_drm.h> +#include <string.h> #include "setup.h" @@ -21,19 +23,6 @@ void die(const char *msg) exit(EXIT_FAILURE); } -static void run(struct state *state, render_func_t render) -{ - state->context = eglCreateContext(state->display, state->config, NULL, NULL); - if (state->context == NULL) - die("failed to create context\n"); - - if (!eglMakeCurrent(state->display, state->surface, state->surface, state->context)) - die("failed to make context current\n"); - - render(state); - eglTerminate(state->display); -} - static const EGLint config_attribs[] = { EGL_DEPTH_SIZE, 24, EGL_RED_SIZE, 8, @@ -44,7 +33,7 @@ static const EGLint config_attribs[] = { EGL_NONE }; -static void run_dri2(int x, int y, int width, int height, render_func_t render) +static void run_dri2(int x, int y, int width, int height, init_func_t init, render_func_t render) { EGLint major, minor; Display *x11_display; @@ -98,10 +87,30 @@ static void run_dri2(int x, int y, int width, int height, render_func_t render) if (state.surface == NULL) die("failed to create surface\n"); - run(&state, render); + state.context = eglCreateContext(state.display, state.config, NULL, NULL); + if (state.context == NULL) + die("failed to create context\n"); + + if (!eglMakeCurrent(state.display, state.surface, state.surface, state.context)) + die("failed to make context current\n"); + + init(&state); + + render(&state); + + eglTerminate(state.display); +} + +static void +page_flip_handler(int fd, unsigned int frame, + unsigned int sec, unsigned int usec, void *data) +{ + int *done = data; + + *done = 1; } -static void run_native(int x, int y, int width, int height, render_func_t render) +static void run_native(int x, int y, int width, int height, init_func_t init, render_func_t render) { EGLint major, minor; struct udev *udev; @@ -111,11 +120,12 @@ static void run_native(int x, int y, int width, int height, render_func_t render drmModeRes *resources; drmModeEncoder *encoder; drmModeModeInfo *mode; - unsigned int fb_id; - uint32_t name, handle, stride; - int i, ret, fd; - const static EGLint attribs[] = - { EGL_RENDER_BUFFER, EGL_BACK_BUFFER, EGL_NONE }; + int i, ret, fd, done; + drmEventContext evctx; + struct buffer { + unsigned int fb_id; + uint32_t name, handle, stride; + } b[2]; udev = udev_new(); device = udev_device_new_from_syspath(udev, "/sys/class/drm/card0"); @@ -170,37 +180,61 @@ static void run_native(int x, int y, int width, int height, render_func_t render drmModeFreeEncoder(encoder); } - state.surface = eglCreateSurfaceForName(state.display, state.config, - 0, mode->hdisplay, mode->vdisplay, - 0, attribs); - eglGetNativeBuffer(state.surface, - GL_FRONT_LEFT, &name, &handle, &stride); - - ret = drmModeAddFB(fd, mode->hdisplay, mode->vdisplay, - 32, 32, stride, handle, &fb_id); - if (ret) { - fprintf(stderr, "failed to add fb: %m\n"); - return; + state.surface = eglCreateSurface(state.display, state.config, + mode->hdisplay, mode->vdisplay, 2, NULL); + for (i = 0; i < 2; i++) { + eglGetColorBuffer(state.surface, + i, &b[i].name, &b[i].handle, &b[i].stride); + + ret = drmModeAddFB(fd, mode->hdisplay, mode->vdisplay, + 32, 32, b[i].stride, b[i].handle, &b[i].fb_id); + if (ret) { + fprintf(stderr, "failed to add fb %d: %m\n", i); + return; + } } - ret = drmModeSetCrtc(fd, encoder->crtc_id, fb_id, 0, 0, + ret = drmModeSetCrtc(fd, encoder->crtc_id, b[1].fb_id, 0, 0, &connector->connector_id, 1, mode); if (ret) { fprintf(stderr, "failed to set mode: %m\n"); return; } - run(&state, render); + state.context = eglCreateContext(state.display, state.config, NULL, NULL); + if (state.context == NULL) + die("failed to create context\n"); + + if (!eglMakeCurrent(state.display, state.surface, state.surface, state.context)) + die("failed to make context current\n"); + + init(&state); + + memset(&evctx, 0, sizeof evctx); + evctx.version = DRM_EVENT_CONTEXT_VERSION; + evctx.page_flip_handler = page_flip_handler; + i = 0; + while (1) { + render(&state); + eglBindColorBuffer(state.display, state.surface, i ^ 1); + drmModePageFlip(fd, encoder->crtc_id, b[i].fb_id, &done); + i ^= 1; + done = 0; + while (!done) + drmHandleEvent(fd, &evctx); + } + + eglTerminate(state.display); } -int setup(int argc, char *argv[], render_func_t render) +int setup(int argc, char *argv[], init_func_t init, render_func_t render) { const int x = 100, y = 100, width = 300, height = 300; - run_dri2(x, y, width, height, render); + run_dri2(x, y, width, height, init, render); fprintf(stderr, "open x11 display failed, trying drmfb\n"); - run_native(x, y, width, height, render); + run_native(x, y, width, height, init, render); return 0; } diff --git a/test/setup.h b/test/setup.h index fe453ad..ca949a3 100644 --- a/test/setup.h +++ b/test/setup.h @@ -10,10 +10,12 @@ struct state { EGLContext context; int width; int height; + void *data; }; +typedef int (*init_func_t)(struct state *state); typedef int (*render_func_t)(struct state *state); -int setup(int argc, char *argv[], render_func_t render); +int setup(int argc, char *argv[], init_func_t init, render_func_t render); #endif diff --git a/test/texture.c b/test/texture.c index 7d181d5..9cd1a8f 100644 --- a/test/texture.c +++ b/test/texture.c @@ -32,6 +32,11 @@ #include "../eagle.h" #include "setup.h" +static int init(struct state *state) +{ + return 0; +} + static int render(struct state *state) { GLfloat vertices[12]; @@ -105,5 +110,5 @@ static int render(struct state *state) int main(int argc, char *argv[]) { - return setup(argc, argv, render); + return setup(argc, argv, init, render); } @@ -115,7 +115,6 @@ x11DestroySurface(EGLDisplay display, EGLSurface surface) static const struct EagleBackend x11Backend = { x11GetBuffers, - x11SwapBuffers, x11DestroySurface }; |