[cairo] trouble with GL and GLES surfaces

Theo Veenker theo.veenker at beexy.nl
Wed Jan 10 17:08:14 UTC 2018

On 01/10/2018 01:08 AM, Bryce Harrington wrote:
> On Fri, Dec 29, 2017 at 05:26:32PM +0100, Theo Veenker wrote:
>> Hi all,
>> I decided to spend some time on playing with cairo's GL backend. First I
>> looked at 1.15.11 (this is all under Linux Mint 18 64-bit, kernel 4.4.0-98,
>> X.Org 1.18.4).
> Thanks for testing the gles code.
>> Cairo 1.15.11 configured with --enable-gl worked for me. I could use
>> cairo_gl_surface_create_for_window(), cairo_gl_surface_create() and
>> cairo_surface_create_similar() as advertised.
>> However when configured with --enable-glesv2 I ran into some problems:
>> - Cairo_gl_surface_create_for_egl() is fine, but both
>> cairo_gl_surface_create() and cairo_surface_create_similar() consistently
> Unfortunately CAIRO_STATUS_DEVICE_ERROR is used as kind of a generic
> "something's wrong" error message.  Could be anything from a driver
> issue on up.  I wouldn't rule out some flaw in my patch, either,
> although if you're seeing problems creating gl surfaces on 1.14 too,
> then might be a deeper issue.
> I verified glesv2 worked and generated graphics for me identically
> between 1.14 and 1.15 before landing, although it's possible you're
> setting up the surfaces in a different way that I didn't test.  If you
> can give me the snippet of code you're using to set things up, or a
> minimal test case or somesuch, I can examine it compared with my own and
> see if I can see the same issue as you and maybe isolate why.

I have cooked up a few test programs. Tested on two platforms (one with Radeon HD 5670 and 
one with an Intel something). I get same results on both platforms. I'll send the test 
code with a readme to you, so you can check it yourself.

>> Then I tried the same thing using cairo 1.14.2. Here I don't see any of the
>> problems mentioned above. However I did notice a different problem with the
>> regular GL (non-GLES) backend:
>> - It appears I can't use a GL surface (as created by
>> cairo_gl_surface_create() or cairo_surface_create_similar()) as a source for
>> cairo_set_source_surface(). No error is reported by
>> cairo_set_source_surface() or cairo_paint(). This does however work
>> correctly when configured with --enable-glesv2.
> As far as I know that *should* work.  Is there a possibility that
> there's an error in your setup code?  That could explain a lot of the
> problems you've described.  Again, if you can send me a sample
> reproducer I can take a deeper look.  If it does turn out to be a
> regression in the new code, your example could help me isolate it and
> improve my own tests to cover that case.

I don't know what I could be doing wrong. I'm only swapping one function call for a 
similar one. For 1.15 this works, for 1.14 it does not (tested on both platforms). The 
only thing I can think of is waiting until the window is fully mapped before creating GL 
surfaces on it. Not tried. Don't know if it makes sense.

>> I did not test the GLESv3 backend as I have no idea where to get the glesv3
>> package referred to by cairo.pc.
> The glesv3 support may be installed with glesv2.  You can look in
> /usr/include and /usr/lib to see if the gles 3 stuff is there, or just
> try --enable-glesv3.  I doubt it'll make a difference for your problem
> though, but might be broken in a more interesting way.

Aha. So the GLESv3 code if any is included in libGLESv2.so? I do appear to have the GLES3 
headers. Maybe the glesv3 reference in cairo.pc should be dropped then? Otherwise 
"pkg-config --cflags/libs cairo" commands will unnecessarily fail if no glesv3 package can 
be found. Does it even exist ATM?


Theo Veenker  |  Beexy - Behavioral Experiment Software
+31(0)524-541531  |  +31(0)6-42525777 mobile
theo.veenker at beexy.nl  |  www.beexy.nl

More information about the cairo mailing list