From 405cacabe23786db93742e0cf17100ae413050bc Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Tue, 23 Aug 2011 14:47:35 +0100 Subject: [PATCH] examples: Adds a simple 4x msaa example This adds a very basic test of onscreen and offscreen multisample rendering with 4 samples per pixel. The test simply draws two triangles; the one on the left is rendered directly to the onscreen framebuffer and the other is first rendered offscreen before copying it onscreen. Reviewed-by: Neil Roberts --- examples/Makefile.am | 4 +- examples/cogl-msaa.c | 112 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 examples/cogl-msaa.c diff --git a/examples/Makefile.am b/examples/Makefile.am index 32923205a..9abece3b9 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -18,12 +18,14 @@ common_ldadd = \ $(COGL_DEP_LIBS) \ $(top_builddir)/cogl/libcogl.la -programs = cogl-hello +programs = cogl-hello cogl-msaa examples_datadir = $(pkgdatadir)/examples-data examples_data_DATA = cogl_hello_SOURCES = cogl-hello.c cogl_hello_LDADD = $(common_ldadd) +cogl_msaa_SOURCES = cogl-msaa.c +cogl_msaa_LDADD = $(common_ldadd) if BUILD_COGL_PANGO programs += cogl-crate diff --git a/examples/cogl-msaa.c b/examples/cogl-msaa.c new file mode 100644 index 000000000..8d7d358b0 --- /dev/null +++ b/examples/cogl-msaa.c @@ -0,0 +1,112 @@ +#include +#include +#include + +CoglColor black; + +int +main (int argc, char **argv) +{ + CoglOnscreenTemplate *onscreen_template; + CoglDisplay *display; + CoglContext *ctx; + CoglOnscreen *onscreen; + CoglFramebuffer *fb; + GError *error = NULL; + CoglVertexP2C4 triangle_vertices[] = { + {0, 0.7, 0xff, 0x00, 0x00, 0x80}, + {-0.7, -0.7, 0x00, 0xff, 0x00, 0xff}, + {0.7, -0.7, 0x00, 0x00, 0xff, 0xff} + }; + CoglPrimitive *triangle; + CoglHandle tex; + CoglHandle offscreen; + CoglFramebuffer *offscreen_fb; + CoglPipeline *pipeline; + + onscreen_template = cogl_onscreen_template_new (NULL); + cogl_onscreen_template_set_samples_per_pixel (onscreen_template, 4); + display = cogl_display_new (NULL, onscreen_template); + + if (!cogl_display_setup (display, &error)) + { + fprintf (stderr, "Platform doesn't support onscreen 4x msaa rendering: %s\n", + error->message); + return 1; + } + + ctx = cogl_context_new (display, &error); + if (!ctx) + { + fprintf (stderr, "Failed to create context: %s\n", error->message); + return 1; + } + + onscreen = cogl_onscreen_new (ctx, 640, 480); + /* Eventually there will be an implicit allocate on first use so this + * will become optional... */ + fb = COGL_FRAMEBUFFER (onscreen); + + cogl_framebuffer_set_samples_per_pixel (fb, 4); + + if (!cogl_framebuffer_allocate (fb, &error)) + { + g_error_free (error); + fprintf (stderr, "Failed to allocate 4x msaa offscreen framebuffer, " + "disabling msaa for onscreen rendering\n"); + cogl_framebuffer_set_samples_per_pixel (fb, 0); + + error = NULL; + if (!cogl_framebuffer_allocate (fb, &error)) + { + fprintf (stderr, "Failed to allocate framebuffer: %s\n", error->message); + return 1; + } + } + + cogl_onscreen_show (onscreen); + + tex = cogl_texture_new_with_size (320, 480, + COGL_TEXTURE_NO_SLICING, + COGL_PIXEL_FORMAT_ANY); + offscreen = cogl_offscreen_new_to_texture (tex); + offscreen_fb = COGL_FRAMEBUFFER (offscreen); + cogl_framebuffer_set_samples_per_pixel (offscreen_fb, 4); + if (!cogl_framebuffer_allocate (offscreen_fb, &error)) + { + g_error_free (error); + error = NULL; + fprintf (stderr, "Failed to allocate 4x msaa offscreen framebuffer, " + "disabling msaa for offscreen rendering"); + cogl_framebuffer_set_samples_per_pixel (offscreen_fb, 0); + } + + cogl_push_framebuffer (fb); + + triangle = cogl_primitive_new_p2c4 (COGL_VERTICES_MODE_TRIANGLES, + 3, triangle_vertices); + pipeline = cogl_pipeline_new (); + + for (;;) { + cogl_clear (&black, COGL_BUFFER_BIT_COLOR); + + cogl_push_matrix (); + cogl_scale (0.5, 1, 1); + cogl_translate (-1, 0, 0); + cogl_set_source (pipeline); + cogl_primitive_draw (triangle); + cogl_pop_matrix (); + + cogl_push_framebuffer (offscreen_fb); + cogl_primitive_draw (triangle); + cogl_framebuffer_resolve_samples (offscreen_fb); + cogl_pop_framebuffer (); + + cogl_set_source_texture (tex); + cogl_rectangle (0, 1, 1, -1); + + cogl_framebuffer_swap_buffers (fb); + } + + return 0; +}