diff options
author | Robert Bragg <robert@linux.intel.com> | 2011-08-23 14:47:35 +0100 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2011-09-21 22:03:09 +0100 |
commit | 60bc43448bed5d195cd996165020c8fb4b2f979e (patch) | |
tree | 064db318a70290aed180b5d50fef42f4cb699a88 | |
parent | dc8c096514d2e74d2bc4174e089a8b9910906d43 (diff) | |
download | cogl-60bc43448bed5d195cd996165020c8fb4b2f979e.tar.gz |
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.
-rw-r--r-- | examples/Makefile.am | 4 | ||||
-rw-r--r-- | examples/msaa.c | 112 |
2 files changed, 115 insertions, 1 deletions
diff --git a/examples/Makefile.am b/examples/Makefile.am index 8b55c09d..6741ceb1 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -20,10 +20,12 @@ common_ldadd = \ $(COGL_DEP_LIBS) \ $(top_builddir)/cogl/libcogl.la -noinst_PROGRAMS = hello +noinst_PROGRAMS = hello msaa hello_SOURCES = hello.c hello_LDADD = $(common_ldadd) +msaa_SOURCES = msaa.c +msaa_LDADD = $(common_ldadd) if BUILD_COGL_PANGO noinst_PROGRAMS += crate diff --git a/examples/msaa.c b/examples/msaa.c new file mode 100644 index 00000000..26cb21d7 --- /dev/null +++ b/examples/msaa.c @@ -0,0 +1,112 @@ +#include <cogl/cogl.h> +#include <glib.h> +#include <stdio.h> + +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_point_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", + 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); +#warning "This isn't resulting in a failure to allocate on drivers not supporting msaa!" + cogl_framebuffer_set_point_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"); + cogl_framebuffer_set_point_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_point_samples_per_pixel (offscreen_fb, 4); + if (!cogl_framebuffer_allocate (offscreen_fb, &error)) + { + g_error_free (error); + error = NULL; + g_warning ("Failed to allocate 4x msaa offscreen framebuffer, " + "disabling msaa for offscreen rendering"); + cogl_framebuffer_set_point_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; +} |