From ba4a4eae051cd932e59e3092ef36d4f6cded0159 Mon Sep 17 00:00:00 2001 From: Chuanbo Weng Date: Tue, 2 Oct 2012 13:58:49 +0200 Subject: [PATCH] gl/msaa: Use GL_IMG_multisampled_render_to_texture when available Some OpenGLES platforms support GL_IMG_multisampled_render_to_texture instead of GL_EXT_multisampled_render_to_texture. --- src/cairo-gl-device.c | 8 ++++++++ src/cairo-gl-dispatch-private.h | 10 +++++++--- src/cairo-gl-dispatch.c | 26 ++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/cairo-gl-device.c b/src/cairo-gl-device.c index 89d66f2a6..37c837d27 100644 --- a/src/cairo-gl-device.c +++ b/src/cairo-gl-device.c @@ -249,6 +249,14 @@ _cairo_gl_context_init (cairo_gl_context_t *ctx) glGetIntegerv(GL_MAX_SAMPLES_EXT, &ctx->num_samples); } #endif + +#if CAIRO_HAS_GLESV2_SURFACE && defined(GL_MAX_SAMPLES_IMG) + if (ctx->has_packed_depth_stencil && + _cairo_gl_has_extension ("GL_IMG_multisampled_render_to_texture")) { + glGetIntegerv(GL_MAX_SAMPLES_IMG, &ctx->num_samples); + } +#endif + ctx->supports_msaa = ctx->num_samples > 1; if (ctx->num_samples > MAX_MSAA_SAMPLES) ctx->num_samples = MAX_MSAA_SAMPLES; diff --git a/src/cairo-gl-dispatch-private.h b/src/cairo-gl-dispatch-private.h index 0c5dc3900..cabf76f0d 100644 --- a/src/cairo-gl-dispatch-private.h +++ b/src/cairo-gl-dispatch-private.h @@ -53,7 +53,7 @@ typedef struct _cairo_gl_dispatch_entry { offsetof(cairo_gl_dispatch_t, name) } #define DISPATCH_ENTRY_ARB_OES(name) { { "gl"#name, "gl"#name"ARB", "gl"#name"OES" }, \ offsetof(cairo_gl_dispatch_t, name) } -#define DISPATCH_ENTRY_EXT_EXT(name) { { "gl"#name, "gl"#name"EXT", "gl"#name"EXT" }, \ +#define DISPATCH_ENTRY_EXT_IMG(name) { { "gl"#name, "gl"#name"EXT", "gl"#name"IMG" }, \ offsetof(cairo_gl_dispatch_t, name) } #define DISPATCH_ENTRY_CUSTOM(name, name2) { { "gl"#name, "gl"#name2, "gl"#name }, \ offsetof(cairo_gl_dispatch_t, name)} @@ -117,8 +117,12 @@ cairo_private cairo_gl_dispatch_entry_t dispatch_fbo_entries[] = { DISPATCH_ENTRY_EXT (FramebufferRenderbuffer), DISPATCH_ENTRY_EXT (DeleteRenderbuffers), DISPATCH_ENTRY_EXT (BlitFramebuffer), - DISPATCH_ENTRY_EXT_EXT (RenderbufferStorageMultisample), - DISPATCH_ENTRY_EXT_EXT (FramebufferTexture2DMultisample), + DISPATCH_ENTRY_LAST +}; + +cairo_private cairo_gl_dispatch_entry_t dispatch_multisampling_entries[] = { + DISPATCH_ENTRY_EXT_IMG (RenderbufferStorageMultisample), + DISPATCH_ENTRY_EXT_IMG (FramebufferTexture2DMultisample), DISPATCH_ENTRY_LAST }; diff --git a/src/cairo-gl-dispatch.c b/src/cairo-gl-dispatch.c index 5bffdddad..76c3115ba 100644 --- a/src/cairo-gl-dispatch.c +++ b/src/cairo-gl-dispatch.c @@ -205,6 +205,27 @@ _cairo_gl_dispatch_init_fbo (cairo_gl_dispatch_t *dispatch, return CAIRO_STATUS_SUCCESS; } +static cairo_status_t +_cairo_gl_dispatch_init_multisampling (cairo_gl_dispatch_t *dispatch, + cairo_gl_get_proc_addr_func_t get_proc_addr, + int gl_version, + cairo_gl_flavor_t gl_flavor) +{ + /* For the multisampling table, there are two GLES versions of the + * extension, so we put one in the EXT slot and one in the real ES slot.*/ + cairo_gl_dispatch_name_t dispatch_name = CAIRO_GL_DISPATCH_NAME_CORE; + if (gl_flavor == CAIRO_GL_FLAVOR_ES) { + if (_cairo_gl_has_extension ("GL_EXT_multisampled_render_to_texture")) + dispatch_name = CAIRO_GL_DISPATCH_NAME_EXT; + else if (_cairo_gl_has_extension ("GL_IMG_multisampled_render_to_texture")) + dispatch_name = CAIRO_GL_DISPATCH_NAME_ES; + } + _cairo_gl_dispatch_init_entries (dispatch, get_proc_addr, + dispatch_multisampling_entries, + dispatch_name); + return CAIRO_STATUS_SUCCESS; +} + cairo_status_t _cairo_gl_dispatch_init (cairo_gl_dispatch_t *dispatch, cairo_gl_get_proc_addr_func_t get_proc_addr) @@ -231,5 +252,10 @@ _cairo_gl_dispatch_init (cairo_gl_dispatch_t *dispatch, if (status != CAIRO_STATUS_SUCCESS) return status; + status = _cairo_gl_dispatch_init_multisampling (dispatch, get_proc_addr, + gl_version, gl_flavor); + if (status != CAIRO_STATUS_SUCCESS) + return status; + return CAIRO_STATUS_SUCCESS; }