<div dir="ltr">Thanks Henry, I'll give it a try.<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/1/11 Henry (Yu) Song - SISA <span dir="ltr"><<a href="mailto:hsong@sisa.samsung.com" target="_blank">hsong@sisa.samsung.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
Please add XInitThreads() in your main.  For multithreaded application using gl_surface is not a good idea for the moment unless you have intel/radeon/nouveau drivers, otherwise, you will have very sloooooow performance.<br>

<br>
We will resolve that soon in cairo for gl backend, I hope.<br>
<br>
Henry<br>
________________________________________<br>
From: cairo-bounces+henry.song=<a href="mailto:samsung.com@cairographics.org">samsung.com@cairographics.org</a> [cairo-bounces+henry.song=<a href="mailto:samsung.com@cairographics.org">samsung.com@cairographics.org</a>] on behalf of Carlos López González [<a href="mailto:genetita@gmail.com">genetita@gmail.com</a>]<br>

Sent: Thursday, January 10, 2013 11:26 AM<br>
To: <a href="mailto:cairo@cairographics.org">cairo@cairographics.org</a><br>
Subject: [cairo] Threaded animation with cairo_gl backend over a GtkWidget<br>
<div class="HOEnZb"><div class="h5"><br>
Hi!<br>
I've made a modified version [1] of the example of threaded animation using Cairo [2].<br>
<br>
First I've used the method to create a cairo_gl_surface from the test/gl_source_surface.c file adapted to create the surface for a given widget instead for a defined size.<br>
<br>
Also, for simplicity, I removed all the handled signals except the destroy one.<br>
<br>
To handle the drawing for the window widget using the cairo_gl backend I use the create_gl_surface_for_window function passing it the proper widget information.<br>
<br>
So far, for a single drawing execution it works as expected:<br>
1) In main() create the window_surface<br>
2) The do_draw function creates a context based on window_surface<br>
3) Once done the drawings with Cairo then the buffers are swapped and the content is shown on screen.<br>
<br>
Notice that the window_surface is never destroyed explicitly because it is owned by the window widget and so it will be destroyed when the window is destroyed by gtk.<br>
<br>
The problem comes when I enable the multithreading support by uncommenting the line:<br>
<br>
<br>
//(void)g_timeout_add(33, (GSourceFunc)timer_exe, window);<br>
<br>
It triggers the timer_exe function 33 times per second and then it creates threads that will call do_draw each time.<br>
<br>
Once enabled it crashes at the first painting function from Cairo.<br>
<br>
I believe that the problem is that the window_surface belongs to the window widget when I created it and then I can't modify it outside the main gtk thread.<br>
<br>
How can I solve this? If I enclose the Cairo painting operations inside a gdk_threads_enter and<br>
gdk_threads_leave I would add a lot of time consuming operations to the main gtk thread, which is precisely what I want to avoid using multithreading.<br>
<br>
Any help? I would like to know at last, if my assumptions of the window_surface ownership are true or not.<br>
<br>
Thanks!<br>
<br>
[1] <a href="https://github.com/genete/my-test-area/blob/direct_draw/src/cairo_sample.c" target="_blank">https://github.com/genete/my-test-area/blob/direct_draw/src/cairo_sample.c</a><br>
[2] <a href="http://cairographics.org/threaded_animation_with_cairo/" target="_blank">http://cairographics.org/threaded_animation_with_cairo/</a><br>
<br>
--<br>
Carlos<br>
<a href="http://synfig.org" target="_blank">http://synfig.org</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Carlos<br><a href="http://synfig.org" target="_blank">http://synfig.org</a><br>
</div>