[waffle] [RFC] waffle: support for swap completion callback

Tapani Pälli tapani.palli at intel.com
Mon Feb 2 05:08:01 PST 2015


Patch introduces a new API that enables application to register
a callback to be called when swapbuffers has finished. This can be
used to throttle rendering loop.

Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
---
(This is a API proposal for swap event callback.)

 include/CMakeLists.txt           |  1 +
 include/waffle/waffle.h          |  4 ++++
 include/waffle/waffle_typedefs.h | 38 ++++++++++++++++++++++++++++++++++++++
 src/waffle/api/waffle_gl_misc.c  | 17 +++++++++++++++++
 src/waffle/core/wcore_platform.h |  9 +++++++++
 src/waffle/waffle.def.in         |  3 ++-
 6 files changed, 71 insertions(+), 1 deletion(-)
 create mode 100644 include/waffle/waffle_typedefs.h

diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index e190a76..ba84e95 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -7,6 +7,7 @@ install(
         waffle/waffle.h
         waffle/waffle_gbm.h
         waffle/waffle_glx.h
+        waffle/waffle_typedefs.h
         waffle/waffle_version.h
         waffle/waffle_wayland.h
         waffle/waffle_x11_egl.h
diff --git a/include/waffle/waffle.h b/include/waffle/waffle.h
index 77885a4..e421375 100644
--- a/include/waffle/waffle.h
+++ b/include/waffle/waffle.h
@@ -31,6 +31,7 @@
 #include <stdlib.h>
 
 #include "waffle_version.h"
+#include "waffle_typedefs.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -173,6 +174,9 @@ bool
 waffle_is_extension_in_string(const char *extension_string,
                               const char *extension_name);
 
+bool
+waffle_register_swap_callback(waffle_swapbuffers_cb func);
+
 // ---------------------------------------------------------------------------
 // waffle_display
 // ---------------------------------------------------------------------------
diff --git a/include/waffle/waffle_typedefs.h b/include/waffle/waffle_typedefs.h
new file mode 100644
index 0000000..6532de4
--- /dev/null
+++ b/include/waffle/waffle_typedefs.h
@@ -0,0 +1,38 @@
+// Copyright 2015 Intel Corporation
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// - Redistributions of source code must retain the above copyright notice, this
+//   list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright notice,
+//   this list of conditions and the following disclaimer in the documentation
+//   and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct waffle_window;
+
+typedef void (*waffle_swapbuffers_cb) (const struct waffle_window *window);
+
+#ifdef __cplusplus
+} // end extern "C"
+#endif
diff --git a/src/waffle/api/waffle_gl_misc.c b/src/waffle/api/waffle_gl_misc.c
index 138974d..ac155c0 100644
--- a/src/waffle/api/waffle_gl_misc.c
+++ b/src/waffle/api/waffle_gl_misc.c
@@ -108,3 +108,20 @@ waffle_get_proc_address(const char *name)
 
     return api_platform->vtbl->get_proc_address(api_platform, name);
 }
+
+WAFFLE_API bool
+waffle_register_swap_callback(waffle_swapbuffers_cb func)
+{
+    const struct api_object *obj_list[] = {
+        (void*) func,
+    };
+
+    if (!api_check_entry(obj_list, 1))
+        return false;
+
+    if (api_platform->vtbl->register_swap_callback)
+        return api_platform->vtbl->register_swap_callback(api_platform, func);
+
+    wcore_error(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM);
+    return NULL;
+}
diff --git a/src/waffle/core/wcore_platform.h b/src/waffle/core/wcore_platform.h
index 77943e4..5f53ab8 100644
--- a/src/waffle/core/wcore_platform.h
+++ b/src/waffle/core/wcore_platform.h
@@ -30,6 +30,8 @@
 #include <stdint.h>
 #include "c99_compat.h"
 
+#include "waffle_typedefs.h"
+
 struct wcore_config;
 struct wcore_config_attrs;
 struct wcore_context;
@@ -64,6 +66,12 @@ struct wcore_platform_vtbl {
             int32_t waffle_dl,
             const char *symbol);
 
+    /// May be null.
+    bool
+    (*register_swap_callback)(
+            struct wcore_platform *self,
+            waffle_swapbuffers_cb callback);
+
     struct wcore_display_vtbl {
         struct wcore_display*
         (*connect)(struct wcore_platform *platform,
@@ -134,6 +142,7 @@ struct wcore_platform_vtbl {
         union waffle_native_window*
         (*get_native)(struct wcore_window *window);
     } window;
+
 };
 
 struct wcore_platform {
diff --git a/src/waffle/waffle.def.in b/src/waffle/waffle.def.in
index db8464f..0b3de66 100644
--- a/src/waffle/waffle.def.in
+++ b/src/waffle/waffle.def.in
@@ -30,4 +30,5 @@ EXPORTS
     waffle_attrib_list_length
     waffle_attrib_list_get
     waffle_attrib_list_get_with_default
-    waffle_attrib_list_update
\ No newline at end of file
+    waffle_attrib_list_update
+    waffle_register_swap_callback
-- 
2.1.0



More information about the waffle mailing list