diff --git a/cogl/Makefile.am b/cogl/Makefile.am
index 6da9764d4..d92643f77 100644
--- a/cogl/Makefile.am
+++ b/cogl/Makefile.am
@@ -73,6 +73,7 @@ cogl_public_h = \
$(srcdir)/cogl-primitives.h \
$(srcdir)/cogl-path.h \
$(srcdir)/cogl-pixel-buffer.h \
+ $(srcdir)/cogl-poll.h \
$(srcdir)/cogl-shader.h \
$(srcdir)/cogl-texture.h \
$(srcdir)/cogl-texture-3d.h \
@@ -335,6 +336,7 @@ cogl_sources_c = \
$(srcdir)/cogl-boxed-value.c \
$(srcdir)/cogl-snippet-private.h \
$(srcdir)/cogl-snippet.c \
+ $(srcdir)/cogl-poll.c \
$(srcdir)/gl-prototypes/cogl-all-functions.h \
$(srcdir)/gl-prototypes/cogl-gles1-functions.h \
$(srcdir)/gl-prototypes/cogl-gles2-functions.h \
diff --git a/cogl/cogl-poll.c b/cogl/cogl-poll.c
new file mode 100644
index 000000000..4501f47d3
--- /dev/null
+++ b/cogl/cogl-poll.c
@@ -0,0 +1,77 @@
+/*
+ * Cogl
+ *
+ * An object oriented GL/GLES Abstraction/Utility Layer
+ *
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ *
+ * Authors:
+ * Neil Roberts
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "cogl-poll.h"
+#include "cogl-winsys-private.h"
+#include "cogl-context-private.h"
+
+void
+cogl_poll_get_info (CoglContext *context,
+ CoglPollFD **poll_fds,
+ int *n_poll_fds,
+ gint64 *timeout)
+{
+ const CoglWinsysVtable *winsys;
+
+ _COGL_RETURN_IF_FAIL (cogl_is_context (context));
+ _COGL_RETURN_IF_FAIL (poll_fds != NULL);
+ _COGL_RETURN_IF_FAIL (n_poll_fds != NULL);
+ _COGL_RETURN_IF_FAIL (timeout != NULL);
+
+ winsys = _cogl_context_get_winsys (context);
+
+ if (winsys->poll_get_info)
+ {
+ winsys->poll_get_info (context,
+ poll_fds,
+ n_poll_fds,
+ timeout);
+ return;
+ }
+
+ /* By default we'll assume Cogl doesn't need to block on anything */
+ *poll_fds = NULL;
+ *n_poll_fds = 0;
+ *timeout = -1; /* no timeout */
+}
+
+void
+cogl_poll_dispatch (CoglContext *context,
+ const CoglPollFD *poll_fds,
+ int n_poll_fds)
+{
+ const CoglWinsysVtable *winsys;
+
+ _COGL_RETURN_IF_FAIL (cogl_is_context (context));
+
+ winsys = _cogl_context_get_winsys (context);
+
+ if (winsys->poll_dispatch)
+ winsys->poll_dispatch (context, poll_fds, n_poll_fds);
+}
diff --git a/cogl/cogl-poll.h b/cogl/cogl-poll.h
new file mode 100644
index 000000000..979f9525e
--- /dev/null
+++ b/cogl/cogl-poll.h
@@ -0,0 +1,166 @@
+/*
+ * Cogl
+ *
+ * An object oriented GL/GLES Abstraction/Utility Layer
+ *
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ *
+ *
+ * Authors:
+ * Neil Roberts
+ */
+
+#if !defined(__COGL_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
+#error "Only can be included directly."
+#endif
+
+#ifndef __COGL_POLL_H__
+#define __COGL_POLL_H__
+
+#include
+#include
+#include
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION:cogl-poll
+ * @short_description: Functions for integrating Cogl with an
+ * application's main loop
+ *
+ * Cogl needs to integrate with the application's main loop so that it
+ * can internally handle some events from the driver. All Cogl
+ * applications must use these functions. They provide enough
+ * information to describe the state that Cogl will need to wake up
+ * on. An application using the GLib main loop can instead use
+ * cogl_glib_source_new() which provides a #GSource ready to be added
+ * to the main loop.
+ */
+
+/**
+ * CoglPollFDEvent:
+ *
+ * A bitmask of events that Cogl may need to wake on for a file
+ * descriptor. Note that these all have the same values as the
+ * corresponding defines for the poll function call on Unix so they
+ * may be directly passed to poll.
+ *
+ * Since: 1.10
+ * Stability: unstable
+ */
+typedef enum
+{
+ COGL_POLL_FD_EVENT_IN = COGL_SYSDEF_POLLIN,
+ COGL_POLL_FD_EVENT_PRI = COGL_SYSDEF_POLLPRI,
+ COGL_POLL_FD_EVENT_OUT = COGL_SYSDEF_POLLOUT,
+ COGL_POLL_FD_EVENT_ERR = COGL_SYSDEF_POLLERR,
+ COGL_POLL_FD_EVENT_HUP = COGL_SYSDEF_POLLHUP,
+ COGL_POLL_FD_EVENT_NVAL = COGL_SYSDEF_POLLNVAL
+} CoglPollFDEvent;
+
+/**
+ * CoglPollFD:
+ * @fd: The file descriptor to block on
+ * @events: A bitmask of events to block on
+ * @revents: A bitmask of returned events
+ *
+ * A struct for describing the state of a file descriptor that Cogl
+ * needs to block on. The @events field contains a bitmask of
+ * #CoglPollFDEvents that should cause the application to wake
+ * up. After the application is woken up from idle it should pass back
+ * an array of #CoglPollFDs to Cogl and update the @revents
+ * mask to the actual events that occurred on the file descriptor.
+ *
+ * Note that CoglPollFD is deliberately exactly the same as struct
+ * pollfd on Unix so that it can simply be cast when calling poll.
+ *
+ * Since: 1.10
+ * Stability: unstable
+ */
+typedef struct {
+ int fd;
+ short int events;
+ short int revents;
+} CoglPollFD;
+
+/**
+ * cogl_poll_get_info:
+ * @context: A #CoglContext
+ * @poll_fds: A return location for a pointer to an array
+ * of #CoglPollFDs
+ * @n_poll_fds: A return location for the number of entries in *@poll_fds
+ * @timeout: A return location for the maximum length of time to wait
+ * in microseconds, or -1 to wait indefinitely.
+ *
+ * This should be called whenever an application is about to go idle
+ * so that Cogl has a chance to describe what state it needs to be
+ * woken up on. The assumption is that the application is using a main
+ * loop with something like the poll function call on Unix or the GLib
+ * main loop.
+ *
+ * After the function is called *@poll_fds will contain a pointer to
+ * an array of #CoglPollFD structs describing the file descriptors
+ * that Cogl expects. The fd and events members will be updated
+ * accordingly. After the application has completed its idle it is
+ * expected to either update the revents members directly in this
+ * array or to create a copy of the array and update them
+ * there. Either way it should pass a pointer to either array back to
+ * Cogl when calling cogl_poll_dispatch().
+ *
+ * When using the %COGL_WINSYS_ID_WGL winsys (where file descriptors
+ * don't make any sense) or %COGL_WINSYS_ID_SDL (where the event
+ * handling functions of SDL don't allow blocking on a file
+ * descriptor) *n_poll_fds is guaranteed to be zero.
+ *
+ * @timeout will contain a maximum amount of time to wait in
+ * microseconds before the application should wake up or -1 if the
+ * application should wait indefinitely. This can also be 0 zero if
+ * Cogl needs to be woken up immediately.
+ *
+ * Stability: unstable
+ * Since: 1.10
+ */
+void
+cogl_poll_get_info (CoglContext *context,
+ CoglPollFD **poll_fds,
+ int *n_poll_fds,
+ gint64 *timeout);
+
+/**
+ * cogl_poll_dispatch:
+ * @context: A #CoglContext
+ * @poll_fds: An array of #CoglPollFDs describing the events
+ * that have occurred since the application went idle.
+ * @n_poll_fds: The length of the @poll_fds array.
+ *
+ * This should be called whenever an application is woken up from
+ * going idle in its main loop. The @poll_fds array should contain a
+ * list of file descriptors matched with the events that occurred in
+ * revents. The events field is ignored. It is safe to pass in extra
+ * file descriptors that Cogl didn't request from
+ * cogl_context_begin_idle() or a shorter array missing some file
+ * descriptors that Cogl requested.
+ *
+ * Stability: unstable
+ * Since: 1.10
+ */
+void
+cogl_poll_dispatch (CoglContext *context,
+ const CoglPollFD *poll_fds,
+ int n_poll_fds);
+
+#endif /* __COGL_POLL_H__ */
diff --git a/cogl/cogl.h b/cogl/cogl.h
index ec2ccc785..d04dc6324 100644
--- a/cogl/cogl.h
+++ b/cogl/cogl.h
@@ -97,6 +97,7 @@ typedef struct _CoglFramebuffer CoglFramebuffer;
#include
#include
#include
+#include
#if defined (COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT)
#include
#endif
diff --git a/cogl/winsys/cogl-winsys-private.h b/cogl/winsys/cogl-winsys-private.h
index 7686d23bc..3c235edb7 100644
--- a/cogl/winsys/cogl-winsys-private.h
+++ b/cogl/winsys/cogl-winsys-private.h
@@ -151,6 +151,16 @@ typedef struct _CoglWinsysVtable
(*onscreen_remove_swap_buffers_callback) (CoglOnscreen *onscreen,
unsigned int id);
+ void
+ (*poll_get_info) (CoglContext *context,
+ CoglPollFD **poll_fds,
+ int *n_poll_fds,
+ gint64 *timeout);
+ void
+ (*poll_dispatch) (CoglContext *context,
+ const CoglPollFD *poll_fds,
+ int n_poll_fds);
+
#ifdef COGL_HAS_XLIB_SUPPORT
gboolean
(*texture_pixmap_x11_create) (CoglTexturePixmapX11 *tex_pixmap);
diff --git a/configure.ac b/configure.ac
index 52ee04272..755cb5f2c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1023,10 +1023,48 @@ dnl The 'ffs' function is part of C99 so it isn't always
dnl available. Cogl has a fallback if needed.
AC_CHECK_FUNCS([ffs])
+dnl ================================================================
+dnl Platform values
+dnl ================================================================
+
+dnl These are values from system headers that we want to copy into the
+dnl public Cogl headers without having to include the system header
+AC_CHECK_HEADER(poll.h,
+ [
+ AC_COMPUTE_INT(COGL_SYSDEF_POLLIN, POLLIN, [#include ],
+ AC_MSG_ERROR([Unable to get value of POLLIN]))
+ AC_COMPUTE_INT(COGL_SYSDEF_POLLPRI, POLLPRI, [#include ],
+ AC_MSG_ERROR([Unable to get value of POLLPRI]))
+ AC_COMPUTE_INT(COGL_SYSDEF_POLLOUT, POLLOUT, [#include ],
+ AC_MSG_ERROR([Unable to get value of POLLOUT]))
+ AC_COMPUTE_INT(COGL_SYSDEF_POLLERR, POLLERR, [#include ],
+ AC_MSG_ERROR([Unable to get value of POLLERR]))
+ AC_COMPUTE_INT(COGL_SYSDEF_POLLHUP, POLLHUP, [#include ],
+ AC_MSG_ERROR([Unable to get value of POLLHUP]))
+ AC_COMPUTE_INT(COGL_SYSDEF_POLLNVAL, POLLNVAL, [#include ],
+ AC_MSG_ERROR([Unable to get value of POLLNVAL]))
+ ],
+ [
+ COGL_SYSDEF_POLLIN=1
+ COGL_SYSDEF_POLLPRI=2
+ COGL_SYSDEF_POLLOUT=4
+ COGL_SYSDEF_POLLERR=8
+ COGL_SYSDEF_POLLHUP=16
+ COGL_SYSDEF_POLLNVAL=32
+ ])
+COGL_DEFINES_EXTRA="$COGL_DEFINES_EXTRA
+#define COGL_SYSDEF_POLLIN $COGL_SYSDEF_POLLIN
+#define COGL_SYSDEF_POLLPRI $COGL_SYSDEF_POLLPRI
+#define COGL_SYSDEF_POLLOUT $COGL_SYSDEF_POLLOUT
+#define COGL_SYSDEF_POLLERR $COGL_SYSDEF_POLLERR
+#define COGL_SYSDEF_POLLHUP $COGL_SYSDEF_POLLHUP
+#define COGL_SYSDEF_POLLNVAL $COGL_SYSDEF_POLLNVAL
+"
+
dnl ================================================================
dnl What needs to be substituted in other files
dnl ================================================================
-COGL_DEFINES=""
+COGL_DEFINES="$COGL_DEFINES_EXTRA"
for x in $COGL_DEFINES_SYMBOLS; do
COGL_DEFINES="$COGL_DEFINES
#define $x 1"
diff --git a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
index 378e53110..be5b76c55 100644
--- a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
+++ b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
@@ -62,6 +62,7 @@
+
Setting Up A GPU Pipeline
diff --git a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
index 70bb21c3a..cbd07a006 100644
--- a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
+++ b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
@@ -167,6 +167,15 @@ COGL_UNORDERED_MASK
COGL_UNPREMULT_MASK
+
+cogl-poll
+Main loop integeration
+CoglPollFDEvent
+CoglPollFD
+cogl_poll_get_info
+cogl_poll_dispatch
+
+