diff --git a/cogl/cogl-framebuffer-private.h b/cogl/cogl-framebuffer-private.h index a6f8e1643..e168b6e0c 100644 --- a/cogl/cogl-framebuffer-private.h +++ b/cogl/cogl-framebuffer-private.h @@ -91,6 +91,8 @@ struct _CoglFramebuffer gboolean dither_enabled; CoglColorMask color_mask; + int samples_per_pixel; + /* We journal the textured rectangles we want to submit to OpenGL so * we have an oppertunity to batch them together into less draw * calls. */ diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c index 5116f109e..3144c9527 100644 --- a/cogl/cogl-framebuffer.c +++ b/cogl/cogl-framebuffer.c @@ -92,6 +92,9 @@ #ifndef GL_DRAW_FRAMEBUFFER #define GL_DRAW_FRAMEBUFFER 0x8CA9 #endif +#ifndef GL_TEXTURE_SAMPLES_IMG +#define GL_TEXTURE_SAMPLES_IMG 0x9136 +#endif typedef enum { _TRY_DEPTH_STENCIL = 1L<<0, @@ -163,6 +166,8 @@ _cogl_framebuffer_init (CoglFramebuffer *framebuffer, framebuffer->color_mask = COGL_COLOR_MASK_ALL; + framebuffer->samples_per_pixel = 0; + /* Initialise the clip stack */ _cogl_clip_state_init (&framebuffer->clip_state); @@ -941,6 +946,21 @@ try_creating_fbo (CoglOffscreen *offscreen, return FALSE; } + /* Update the real number of samples_per_pixel now that we have a + * complete framebuffer */ + if (n_samples) + { + GLenum attachment = GL_COLOR_ATTACHMENT0; + GLenum pname = GL_TEXTURE_SAMPLES_IMG; + int texture_samples; + + GE( ctx, glGetFramebufferAttachmentParameteriv (GL_FRAMEBUFFER, + attachment, + pname, + &texture_samples) ); + fb->samples_per_pixel = texture_samples; + } + return TRUE; } @@ -1526,6 +1546,15 @@ cogl_framebuffer_get_color_format (CoglFramebuffer *framebuffer) return framebuffer->format; } +int +cogl_framebuffer_get_samples_per_pixel (CoglFramebuffer *framebuffer) +{ + if (framebuffer->allocated) + return framebuffer->samples_per_pixel; + else + return framebuffer->config.samples_per_pixel; +} + void cogl_framebuffer_set_samples_per_pixel (CoglFramebuffer *framebuffer, int samples_per_pixel) diff --git a/cogl/cogl-framebuffer.h b/cogl/cogl-framebuffer.h index 48f888e4b..1234b36a4 100644 --- a/cogl/cogl-framebuffer.h +++ b/cogl/cogl-framebuffer.h @@ -326,6 +326,36 @@ void cogl_framebuffer_set_samples_per_pixel (CoglFramebuffer *framebuffer, int samples_per_pixel); +#define cogl_framebuffer_get_samples_per_pixel \ + cogl_framebuffer_get_samples_per_pixel_EXP +/** + * cogl_framebuffer_get_samples_per_pixel: + * @framebuffer: A #CoglFramebuffer framebuffer + * + * Gets the number of points that are sampled per-pixel when + * rasterizing geometry. Usually by default this will return 0 which + * means that single-sample not multisample rendering has been chosen. + * When using a GPU supporting multisample rendering it's possible to + * increase the number of samples per pixel using + * cogl_framebuffer_set_samples_per_pixel(). + * + * Calling cogl_framebuffer_get_samples_per_pixel() before the + * framebuffer has been allocated will simply return the value set + * using cogl_framebuffer_set_samples_per_pixel(). After the + * framebuffer has been allocated the value will reflect the actual + * number of samples that will be made by the GPU. + * + * Returns: The number of point samples made per pixel when + * rasterizing geometry or 0 if single-sample rendering + * has been chosen. + * + * Since: 1.10 + * Stability: unstable + */ +int +cogl_framebuffer_get_samples_per_pixel (CoglFramebuffer *framebuffer); + + #define cogl_framebuffer_resolve_samples \ cogl_framebuffer_resolve_samples_EXP /** diff --git a/cogl/winsys/cogl-winsys-egl.c b/cogl/winsys/cogl-winsys-egl.c index 0c7c4c80a..5cb37fc96 100644 --- a/cogl/winsys/cogl-winsys-egl.c +++ b/cogl/winsys/cogl-winsys-egl.c @@ -1251,6 +1251,18 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen, return FALSE; } + /* Update the real number of samples_per_pixel now that we have + * found an egl_config... */ + if (framebuffer->config.samples_per_pixel) + { + EGLint samples; + status = eglGetConfigAttrib (egl_renderer->edpy, + egl_config, + EGL_SAMPLES, &samples); + g_return_val_if_fail (status == EGL_TRUE, TRUE); + framebuffer->samples_per_pixel = samples; + } + #ifdef COGL_HAS_EGL_PLATFORM_POWERVR_X11_SUPPORT /* FIXME: We need to explicitly Select for ConfigureNotify events. diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c index dec96a1ec..cd67b0054 100644 --- a/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/winsys/cogl-winsys-glx.c @@ -818,6 +818,19 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen, return FALSE; } + /* Update the real number of samples_per_pixel now that we have + * found an fbconfig... */ + if (framebuffer->config.samples_per_pixel) + { + int samples; + int status = glx_renderer->glXGetFBConfigAttrib (xlib_renderer->xdpy, + fbconfig, + GLX_SAMPLES, + &samples); + g_return_val_if_fail (status == Success, TRUE); + framebuffer->samples_per_pixel = samples; + } + /* FIXME: We need to explicitly Select for ConfigureNotify events. * For foreign windows we need to be careful not to mess up any * existing event mask. diff --git a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt index 6aa3945c7..c65582ab1 100644 --- a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt +++ b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt @@ -348,6 +348,8 @@ cogl_framebuffer_get_blue_bits cogl_framebuffer_get_blue_bits cogl_framebuffer_get_color_mask cogl_framebuffer_set_color_mask +cogl_framebuffer_get_point_samples_per_pixel +cogl_framebuffer_set_point_samples_per_pixel cogl_framebuffer_get_context cogl_framebuffer_clear cogl_framebuffer_clear4f