[Cogl] [PATCH] Convert the two SDL examples to use the frame callback

Neil Roberts neil at linux.intel.com
Thu Jan 31 04:06:52 PST 2013


The two SDL examples now throttle their rendering to the
COGL_FRAME_EVENT_SYNC event. Previously the examples would redraw
whenever a mouse motion event is received but now they additionally
wait for the sync event which means that if another mouse event comes
immediately after rendering the last frame it theoretically could
avoid blocking waiting for the last frame to complete. In practice
however the SDL winsys doesn't support swap events so it will get the
sync event immediately anyway, but it's nice to have the code as an
example and a test.

This patch also changes the mainloop a bit to do the equivalent steps
without the outer main loop which I think makes it a bit easier to
follow.
---
 examples/cogl-sdl-hello.c  | 52 +++++++++++++++++++++++++++++++---------------
 examples/cogl-sdl2-hello.c | 52 +++++++++++++++++++++++++++++++---------------
 2 files changed, 70 insertions(+), 34 deletions(-)

diff --git a/examples/cogl-sdl-hello.c b/examples/cogl-sdl-hello.c
index 987cc13..961137a 100644
--- a/examples/cogl-sdl-hello.c
+++ b/examples/cogl-sdl-hello.c
@@ -13,9 +13,10 @@ typedef struct Data
   CoglFramebuffer *fb;
   CoglBool quit;
   CoglBool redraw_queued;
+  CoglBool ready_to_draw;
 } Data;
 
-static CoglBool
+static void
 redraw (Data *data)
 {
   CoglFramebuffer *fb = data->fb;
@@ -29,8 +30,6 @@ redraw (Data *data)
   cogl_framebuffer_pop_matrix (fb);
 
   cogl_onscreen_swap_buffers (COGL_ONSCREEN (fb));
-
-  return FALSE;
 }
 
 static void
@@ -62,6 +61,18 @@ handle_event (Data *data, SDL_Event *event)
     }
 }
 
+static void
+frame_cb (CoglOnscreen *onscreen,
+          CoglFrameEvent event,
+          CoglFrameInfo *info,
+          void *user_data)
+{
+  Data *data = user_data;
+
+  if (event == COGL_FRAME_EVENT_SYNC)
+    data->ready_to_draw = TRUE;
+}
+
 int
 main (int argc, char **argv)
 {
@@ -86,6 +97,11 @@ main (int argc, char **argv)
   onscreen = cogl_onscreen_new (ctx, 800, 600);
   data.fb = COGL_FRAMEBUFFER (onscreen);
 
+  cogl_onscreen_add_frame_callback (onscreen,
+                                    frame_cb,
+                                    &data,
+                                    NULL /* destroy callback */);
+
   data.center_x = 0.0f;
   data.center_y = 0.0f;
   data.quit = FALSE;
@@ -97,28 +113,30 @@ main (int argc, char **argv)
   data.pipeline = cogl_pipeline_new (ctx);
 
   data.redraw_queued = TRUE;
+  data.ready_to_draw = TRUE;
+
   while (!data.quit)
     {
-      while (!data.quit)
+      if (!SDL_PollEvent (&event))
         {
-          if (!SDL_PollEvent (&event))
+          if (data.redraw_queued && data.ready_to_draw)
             {
-              if (data.redraw_queued)
-                break;
-
-              cogl_sdl_idle (ctx);
-              if (!SDL_WaitEvent (&event))
-                {
-                  fprintf (stderr, "Error waiting for SDL events");
-                  return 1;
-                }
+              redraw (&data);
+              data.redraw_queued = FALSE;
+              data.ready_to_draw = FALSE;
+              continue;
             }
 
-          handle_event (&data, &event);
-          cogl_sdl_handle_event (ctx, &event);
+          cogl_sdl_idle (ctx);
+          if (!SDL_WaitEvent (&event))
+            {
+              fprintf (stderr, "Error waiting for SDL events");
+              return 1;
+            }
         }
 
-      data.redraw_queued = redraw (&data);
+      handle_event (&data, &event);
+      cogl_sdl_handle_event (ctx, &event);
     }
 
   cogl_object_unref (ctx);
diff --git a/examples/cogl-sdl2-hello.c b/examples/cogl-sdl2-hello.c
index 0370460..405cb92 100644
--- a/examples/cogl-sdl2-hello.c
+++ b/examples/cogl-sdl2-hello.c
@@ -13,9 +13,10 @@ typedef struct Data
   CoglFramebuffer *fb;
   CoglBool quit;
   CoglBool redraw_queued;
+  CoglBool ready_to_draw;
 } Data;
 
-static CoglBool
+static void
 redraw (Data *data)
 {
   CoglFramebuffer *fb = data->fb;
@@ -29,8 +30,6 @@ redraw (Data *data)
   cogl_framebuffer_pop_matrix (fb);
 
   cogl_onscreen_swap_buffers (COGL_ONSCREEN (fb));
-
-  return FALSE;
 }
 
 static void
@@ -71,6 +70,18 @@ handle_event (Data *data, SDL_Event *event)
     }
 }
 
+static void
+frame_cb (CoglOnscreen *onscreen,
+          CoglFrameEvent event,
+          CoglFrameInfo *info,
+          void *user_data)
+{
+  Data *data = user_data;
+
+  if (event == COGL_FRAME_EVENT_SYNC)
+    data->ready_to_draw = TRUE;
+}
+
 int
 main (int argc, char **argv)
 {
@@ -95,6 +106,11 @@ main (int argc, char **argv)
   onscreen = cogl_onscreen_new (ctx, 800, 600);
   data.fb = COGL_FRAMEBUFFER (onscreen);
 
+  cogl_onscreen_add_frame_callback (onscreen,
+                                    frame_cb,
+                                    &data,
+                                    NULL /* destroy callback */);
+
   data.center_x = 0.0f;
   data.center_y = 0.0f;
   data.quit = FALSE;
@@ -110,28 +126,30 @@ main (int argc, char **argv)
   data.pipeline = cogl_pipeline_new (ctx);
 
   data.redraw_queued = TRUE;
+  data.ready_to_draw = TRUE;
+
   while (!data.quit)
     {
-      while (!data.quit)
+      if (!SDL_PollEvent (&event))
         {
-          if (!SDL_PollEvent (&event))
+          if (data.redraw_queued && data.ready_to_draw)
             {
-              if (data.redraw_queued)
-                break;
-
-              cogl_sdl_idle (ctx);
-              if (!SDL_WaitEvent (&event))
-                {
-                  fprintf (stderr, "Error waiting for SDL events");
-                  return 1;
-                }
+              redraw (&data);
+              data.redraw_queued = FALSE;
+              data.ready_to_draw = FALSE;
+              continue;
             }
 
-          handle_event (&data, &event);
-          cogl_sdl_handle_event (ctx, &event);
+          cogl_sdl_idle (ctx);
+          if (!SDL_WaitEvent (&event))
+            {
+              fprintf (stderr, "Error waiting for SDL events");
+              return 1;
+            }
         }
 
-      data.redraw_queued = redraw (&data);
+      handle_event (&data, &event);
+      cogl_sdl_handle_event (ctx, &event);
     }
 
   cogl_object_unref (ctx);
-- 
1.7.11.3.g3c3efa5



More information about the Cogl mailing list