[cairo] Information required for cairo gl backend regarding CAIRO_OPERATOR_SOURCE

Henry (Yu) Song - SISA hsong at sisa.samsung.com
Thu Sep 27 12:26:47 PDT 2012


Hi, Yuanhan

If you apply two patcesh I submitted (two patches follow) on cairo upstream, your sample works for SOURCE operator.  My guess is right - your driver does not take any formats except GL_RGBA/GL_RGB when uploading image to texture.

Thanks

Henry

>From 5f5ef3030db287dd2a925b80a22cf3012c5b84d9 Mon Sep 17 00:00:00 2001
From: Henry Song <henry.song at samsung.com>
Date: Thu, 27 Sep 2012 12:19:40 -0700
Subject: [PATCH] gl/traps: we need to create RGBA format image when uploading
 it to texture for GLES2.

---
 src/cairo-gl-traps-compositor.c |   37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/src/cairo-gl-traps-compositor.c b/src/cairo-gl-traps-compositor.c
index a87fd16..13b1d4f 100644
--- a/src/cairo-gl-traps-compositor.c
+++ b/src/cairo-gl-traps-compositor.c
@@ -50,6 +50,7 @@
 #include "cairo-image-surface-private.h"
 #include "cairo-spans-compositor-private.h"
 #include "cairo-surface-backend-private.h"
+#include "cairo-surface-offset-private.h"
 
 static cairo_int_status_t
 acquire (void *abstract_dst)
@@ -281,6 +282,8 @@ traps_to_operand (void *_dst,
     pixman_format_code_t pixman_format;
     pixman_image_t *pixman_image;
     cairo_surface_t *image, *mask;
+    cairo_surface_t *orig_image = NULL; 
+    cairo_surface_t *rgba_image = NULL;
     cairo_surface_pattern_t pattern;
     cairo_status_t status;
 
@@ -300,12 +303,43 @@ traps_to_operand (void *_dst,
 	return image->status;
     }
 
+    /* GLES2 only supports RGB/RGBA when uploading */
+    if (_cairo_gl_get_flavor () == CAIRO_GL_FLAVOR_ES) {
+	cairo_pattern_t *pat = cairo_pattern_create_for_surface (image);
+	int image_width = ((cairo_image_surface_t *) image)->width;
+	int image_height = ((cairo_image_surface_t *) image)->height;
+	pixman_format_code_t rgba_format = PIXMAN_r8g8b8a8;
+
+	if (_cairo_is_little_endian ())
+	    rgba_format = PIXMAN_a8b8g8r8;
+
+	rgba_image = 
+	    _cairo_image_surface_create_with_pixman_format (NULL,
+							    rgba_format,
+							    image_width,
+							    image_height,
+							    -1);
+	status = _cairo_surface_offset_paint (rgba_image, 0, 0,
+					      CAIRO_OPERATOR_SOURCE,
+					      pat, NULL);
+	if (unlikely (status)) {
+	    cairo_surface_destroy (image);
+	    cairo_surface_destroy (rgba_image);
+	    return status;
+	}
+	
+	orig_image = image;
+	image = rgba_image;
+    }
+
     mask = _cairo_surface_create_similar_scratch (_dst,
 						  CAIRO_CONTENT_COLOR_ALPHA,
 						  extents->width,
 						  extents->height);
     if (unlikely (mask->status)) {
 	cairo_surface_destroy (image);
+	if (orig_image)
+	    cairo_surface_destroy (orig_image);
 	return mask->status;
     }
 
@@ -315,6 +349,9 @@ traps_to_operand (void *_dst,
 					   extents->width, extents->height,
 					   0, 0);
     cairo_surface_destroy (image);
+    if (orig_image)
+	cairo_surface_destroy (orig_image);
+
     if (unlikely (status))
 	goto error;
 
-- 
1.7.9.5


>From 6d6495e7301aefcc19a22bddf82b231fcc73a971 Mon Sep 17 00:00:00 2001
From: Henry Song <henry.song at samsung.com>
Date: Thu, 27 Sep 2012 11:26:27 -0700
Subject: [PATCH] gl: GLES only supports GL_DEPTH24_STENCIL8_OES

---
 src/cairo-gl-device.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/cairo-gl-device.c b/src/cairo-gl-device.c
index 9cb0c21..6563b3b 100644
--- a/src/cairo-gl-device.c
+++ b/src/cairo-gl-device.c
@@ -321,7 +321,7 @@ _get_depth_stencil_format (cairo_gl_context_t *ctx)
 
 #if CAIRO_HAS_GLESV2_SURFACE
     if (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP)
-       return GL_DEPTH24_STENCIL8;
+       return GL_DEPTH24_STENCIL8_OES;
 #endif
 
 #if CAIRO_HAS_GL_SURFACE
-- 
1.7.9.5



________________________________________
From: cairo-bounces+henry.song=samsung.com at cairographics.org [cairo-bounces+henry.song=samsung.com at cairographics.org] on behalf of Henry (Yu) Song - SISA [hsong at sisa.samsung.com]
Sent: Thursday, September 27, 2012 10:54 AM
To: sumit.panwar at samsung.com; Yuanhan Liu
Cc: cairo at cairographics.org
Subject: Re: [cairo] Information required for cairo gl backend regarding CAIRO_OPERATOR_SOURCE

Hi, Yuanhan

Which cairo do you use?  The gl/gles backend from cairo upstream is less stable and contains more bugs.  I suggest you to use our cairogles backend for cairo.  It is available in http://code.google.com/p/cairogles.  It is faster, stable and supports MSAA.  If your driver supports MSAA (number of samples > 1 and has glFramebufferTexture2DMultisampleEXT), I would suggest to use our cairogles.  We have not entirely upstreamed our code yet, but it is in progress.

To use our cairogles

1. set env - export CAIRO_GL_COMPOSITOR=msaa
2. add EGL_SAMPLES, {2 | 4 | 8}, and EGL_SAMPLE_BUFFERS, 1, to your egl attributes - recompile your code

I have tested your code under radeon driver (on PC) and my embedded device with MSAA-supported driver, they both works with our cairogles (OVER, SOURCE)

The reason that SOURCE fails in upstream gles backend probably is your image_surface is BGRA format while your driver only allows RGB/RGBA format when you upload image (glTexSubImage2D()) - this is just my guess

More things to point out if you want to optimize your performance.
1. If you application is not multithreading, add cairo_gl_device_set_thread_aware (device, FALSE) to your code to reduce context switches
2. Instead of painting an image_surface to a gl_surface directly, you should first create a gl_surface same size as your image_surface, paint your image to the new gl_surface, and during each loop, you paint your new gl_surface to the final gl_surface where you want to show result.  The reason is that if you paint image_surface to gl_surface during every loop, the image in system memory has to be uploaded to texture every time, You definitely want to avoid this that slows down your app.

Please let us know if you have more questions and encouter any problems

Thanks

Henry

________________________________________
From: cairo-bounces+henry.song=samsung.com at cairographics.org [cairo-bounces+henry.song=samsung.com at cairographics.org] on behalf of SUMIT PANWAR [sumit.panwar at samsung.com]
Sent: Tuesday, May 29, 2012 2:34 AM
To: Yuanhan Liu
Cc: cairo at cairographics.org
Subject: Re: [cairo] Information required for cairo gl backend regarding CAIRO_OPERATOR_SOURCE

Hi,

I have attached the sample code for the issue. It takes command line argument to execute for OPERATOR SRC /OPERATOR OVER and to use cairo_paint or cairo_fill like

./sample  ------->>>> EGL_BACKEND, ROP OVER WITH CLIP (works)
./sample  -rop_source ------> ROP_SOURCE  (NOT working)
./sample  -rop_source  -cairo_fill ------> ROP_SOURCE WITH FILL (works)

The attached code uses X window to render the final output.

Please let me know if there is any issue in the sample.



Thanks,

Sumit



------- Original Message -------

Sender : Yuanhan Liu<yuanhan.liu at linux.intel.com>

Date : May 29, 2012 10:51 (GMT+09:00)

Title : Re: [cairo] Information required for cairo gl backend regarding CAIRO_OPERATOR_SOURCE



On Mon, May 28, 2012 at 02:05:22PM +0000, SUMIT PANWAR wrote:
> Hi,
>
> We are writing some test cases to compare cairo gl backend with cairo image
> backend.
>
> 1) Image clipping does not work for CAIRO_OPERATOR_SOURCE.
>
> Though it works with bounded rectangle with cairo_fill.
>
> Below applicaiton code does NOT work. It throws gl error 1282(Invalid
> Operation)
>
> ---------------------------------------------------------
> cairo_rectangle(m_cr, 0, 0, width,height);
> cairo_clip(m_cr);
> cairo_set_source_surface(m_cr,glSrcSurface, 0 , 0);
> cairo_paint(m_cr);
> ---------------------------------------------------------
> What works is below:
> -------------------------
> cairo_rectangle(m_cr, 0, 0, width,height);
> cairo_set_source_surface(m_cr, glSrcSurface, 0 , 0);
> cairo_fill(m_cr);
> -------------------------

Hi,

It would be good if you attach a full test code that can produce your
issue here.

Thanks,
Yuanhan Liu

>
> Image clipping with image surface works well.
>
> Please suggest waht could be the issue.
>
> Thanks in advance,
>
> Sumit
>
>
>
>
>
> [cid]
>
> *



> --
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo








[cid:BEI0XT4NZ5JE at namo.co.kr]





More information about the cairo mailing list