summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Bragg <robert@linux.intel.com>2011-09-28 15:19:38 +0100
committerRobert Bragg <robert@linux.intel.com>2011-09-28 15:19:38 +0100
commit90f8c200ec8a3ec731573f3d25b55fd5ffe9f9bf (patch)
tree68a3cfb4be91fa952624f96652f6d5afc7cf9e1e
parent60bc43448bed5d195cd996165020c8fb4b2f979e (diff)
downloadcogl-90f8c200ec8a3ec731573f3d25b55fd5ffe9f9bf.tar.gz
framebuffer: Adds experimental _finish() API
This adds a new experimental function, cogl_framebuffer_finish(), which can be used to explicitly synchronize the CPU with the GPU. It's rare that this level of explicit synchronization is desirable but for example it can be useful during performance analysys to make sure measurements reflect the working time of the GPU not just the time to queue commands. Reviewed-by: Neil Roberts <neil@linux.intel.com>
-rw-r--r--cogl/cogl-framebuffer.c7
-rw-r--r--cogl/cogl-framebuffer.h19
-rw-r--r--doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt1
3 files changed, 27 insertions, 0 deletions
diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
index b70ff400..b4fe55be 100644
--- a/cogl/cogl-framebuffer.c
+++ b/cogl/cogl-framebuffer.c
@@ -2020,6 +2020,13 @@ cogl_framebuffer_remove_swap_buffers_callback (CoglFramebuffer *framebuffer,
}
void
+cogl_framebuffer_finish (CoglFramebuffer *framebuffer)
+{
+ _cogl_framebuffer_flush_journal (framebuffer);
+ GE (framebuffer->context, glFinish ());
+}
+
+void
cogl_onscreen_set_swap_throttled (CoglOnscreen *onscreen,
gboolean throttled)
{
diff --git a/cogl/cogl-framebuffer.h b/cogl/cogl-framebuffer.h
index e2fe35f1..85ae7002 100644
--- a/cogl/cogl-framebuffer.h
+++ b/cogl/cogl-framebuffer.h
@@ -544,6 +544,25 @@ void
cogl_framebuffer_remove_swap_buffers_callback (CoglFramebuffer *framebuffer,
unsigned int id);
+/**
+ * cogl_framebuffer_finish:
+ * @framebuffer: A #CoglFramebuffer pointer
+ *
+ * This blocks the CPU until all pending rendering associated with the
+ * specified framebuffer has completed. It's very rare that developers should
+ * ever need this level of synchronization with the GPU and should never be
+ * used unless you clearly understand why you need to explicitly force
+ * synchronization.
+ *
+ * One example might be for benchmarking purposes to be sure timing
+ * measurements reflect the time that the GPU is busy for not just the time it
+ * takes to queue rendering commands.
+ *
+ * Stability: unstable
+ * Since: 1.10
+ */
+void
+cogl_framebuffer_finish (CoglFramebuffer *framebuffer);
typedef struct _CoglOnscreen CoglOnscreen;
#define COGL_ONSCREEN(X) ((CoglOnscreen *)(X))
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 571c84ba..c3a9679f 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
@@ -332,6 +332,7 @@ cogl_framebuffer_swap_buffers
cogl_framebuffer_swap_region
cogl_framebuffer_add_swap_buffers_callback
cogl_framebuffer_remove_swap_buffers_callback
+cogl_framebuffer_finish
<SUBSECTION>
cogl_get_draw_framebuffer