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 +
+
cogl-clipping Clipping