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

Robert Bragg robert at sixbynine.org
Thu Jan 31 07:46:06 PST 2013


This looks good to land to me:

Reviewed-by: Robert Bragg <robert at linux.intel.com>

thanks,
- Robert

On Thu, Jan 31, 2013 at 12:06 PM, Neil Roberts <neil at linux.intel.com> wrote:
> 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
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl


More information about the Cogl mailing list