diff options
Diffstat (limited to 'media-libs/clutter/files/clutter-9999-perfneu4.patch')
-rw-r--r-- | media-libs/clutter/files/clutter-9999-perfneu4.patch | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/media-libs/clutter/files/clutter-9999-perfneu4.patch b/media-libs/clutter/files/clutter-9999-perfneu4.patch new file mode 100644 index 0000000..fb7b55a --- /dev/null +++ b/media-libs/clutter/files/clutter-9999-perfneu4.patch @@ -0,0 +1,128 @@ +From c2a5d27a28e2bbf9f839f06a149253688e83071e Mon Sep 17 00:00:00 2001 +From: Neil Roberts <neil@linux.intel.com> +Date: Wed, 17 Nov 2010 17:57:17 +0000 +Subject: [PATCH] cogl-framebuffer: Try to track format of the framebuffer + +Previously in cogl_read_pixels we assume the format of the framebuffer +is always premultiplied because that is the most likely format with +the default Cogl blend mode. However when the framebuffer is bound to +a texture we should be able to make a better guess at the format +because we know the texture keeps track of the premult status. This +patch adds an internal format member to CoglFramebuffer. For onscreen +framebuffers we still assume it is RGBA_8888_PRE but for offscreen to +textures we copy the texture format. cogl_read_pixels uses this to +determine whether the data returned by glReadPixels will be +premultiplied. + +http://bugzilla.clutter-project.org/show_bug.cgi?id=2414 +--- + clutter/cogl/cogl/cogl-framebuffer-private.h | 3 +++ + clutter/cogl/cogl/cogl-framebuffer.c | 15 +++++++++++++++ + clutter/cogl/cogl/cogl.c | 22 ++++++++++------------ + 3 files changed, 28 insertions(+), 12 deletions(-) + +diff --git a/clutter/cogl/cogl/cogl-framebuffer-private.h b/clutter/cogl/cogl/cogl-framebuffer-private.h +index 803befd..a831ba7 100644 +--- a/clutter/cogl/cogl/cogl-framebuffer-private.h ++++ b/clutter/cogl/cogl/cogl-framebuffer-private.h +@@ -39,6 +39,9 @@ struct _CoglFramebuffer + CoglFramebufferType type; + int width; + int height; ++ /* Format of the pixels in the framebuffer (including the expected ++ premult state) */ ++ CoglPixelFormat format; + + CoglMatrixStack *modelview_stack; + CoglMatrixStack *projection_stack; +diff --git a/clutter/cogl/cogl/cogl-framebuffer.c b/clutter/cogl/cogl/cogl-framebuffer.c +index 5e832b1..ade7344 100644 +--- a/clutter/cogl/cogl/cogl-framebuffer.c ++++ b/clutter/cogl/cogl/cogl-framebuffer.c +@@ -139,12 +139,14 @@ _cogl_is_framebuffer (void *object) + static void + _cogl_framebuffer_init (CoglFramebuffer *framebuffer, + CoglFramebufferType type, ++ CoglPixelFormat format, + int width, + int height) + { + framebuffer->type = type; + framebuffer->width = width; + framebuffer->height = height; ++ framebuffer->format = format; + framebuffer->viewport_x = 0; + framebuffer->viewport_y = 0; + framebuffer->viewport_width = width; +@@ -540,6 +542,7 @@ _cogl_offscreen_new_to_texture_full (CoglHandle texhandle, + { + _cogl_framebuffer_init (COGL_FRAMEBUFFER (offscreen), + COGL_FRAMEBUFFER_TYPE_OFFSCREEN, ++ cogl_texture_get_format (texhandle), + data.level_width, + data.level_height); + +@@ -594,9 +597,21 @@ _cogl_onscreen_new (void) + * implement CoglOnscreen framebuffers, since we can't, e.g. keep track of + * the window size. */ + ++ /* FIXME: We are assuming onscreen buffers will always be ++ premultiplied so we'll set the premult flag on the bitmap ++ format. This will usually be correct because the result of the ++ default blending operations for Cogl ends up with premultiplied ++ data in the framebuffer. However it is possible for the ++ framebuffer to be in whatever format depending on what ++ CoglPipeline is used to render to it. Eventually we may want to ++ add a way for an application to inform Cogl that the framebuffer ++ is not premultiplied in case it is being used for some special ++ purpose. */ ++ + onscreen = g_new0 (CoglOnscreen, 1); + _cogl_framebuffer_init (COGL_FRAMEBUFFER (onscreen), + COGL_FRAMEBUFFER_TYPE_ONSCREEN, ++ COGL_PIXEL_FORMAT_RGBA_8888_PRE, + 0xdeadbeef, /* width */ + 0xdeadbeef); /* height */ + +diff --git a/clutter/cogl/cogl/cogl.c b/clutter/cogl/cogl/cogl.c +index a2a4109..1aeef9e 100644 +--- a/clutter/cogl/cogl/cogl.c ++++ b/clutter/cogl/cogl/cogl.c +@@ -603,17 +603,14 @@ _cogl_read_pixels_full (int x, + + if ((format & COGL_A_BIT)) + { +- /* FIXME: We are assuming glReadPixels will always give us +- premultiplied data so we'll set the premult flag on the +- bitmap format. This will usually be correct because the +- result of the default blending operations for Cogl ends up +- with premultiplied data in the framebuffer. However it is +- possible for the framebuffer to be in whatever format +- depending on what CoglPipeline is used to render to +- it. Eventually we may want to add a way for an application to +- inform Cogl that the framebuffer is not premultiplied in case +- it is being used for some special purpose. */ +- bmp_format |= COGL_PREMULT_BIT; ++ /* We match the premultiplied state of the target buffer to the ++ * premultiplied state of the framebuffer so that it will get ++ * converted to the right format below */ ++ ++ if ((framebuffer->format & COGL_PREMULT_BIT)) ++ bmp_format |= COGL_PREMULT_BIT; ++ else ++ bmp_format &= ~COGL_PREMULT_BIT; + } + + bmp = _cogl_bitmap_new_from_data (pixels, +@@ -640,7 +637,8 @@ _cogl_read_pixels_full (int x, + guint8 *tmp_data = g_malloc (width * height * 4); + + tmp_bmp = _cogl_bitmap_new_from_data (tmp_data, +- COGL_PIXEL_FORMAT_RGBA_8888_PRE, ++ COGL_PIXEL_FORMAT_RGBA_8888 | ++ (bmp_format & COGL_PREMULT_BIT), + width, height, 4 * width, + (CoglBitmapDestroyNotify) g_free, + NULL); +-- +1.7.3.16.g9464b
\ No newline at end of file |