<div dir="ltr">Running Ubuntu 12.04 32 bits. Using Cmake to generate the makefile. CMAKE_BUILD_TYPE set to 'Debug' in Cmake gui. This is what I get:<div><br></div><div><div>carlos@laptop:~/my-test-area/build$ LANG=C gdb ./cairo-sample</div>
<div>GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04</div><div>Copyright (C) 2012 Free Software Foundation, Inc.</div><div>License GPLv3+: GNU GPL version 3 or later <<a href="http://gnu.org/licenses/gpl.html">http://gnu.org/licenses/gpl.html</a>></div>
<div>This is free software: you are free to change and redistribute it.</div><div>There is NO WARRANTY, to the extent permitted by law.  Type "show copying"</div><div>and "show warranty" for details.</div>
<div>This GDB was configured as "i686-linux-gnu".</div><div>For bug reporting instructions, please see:</div><div><<a href="http://bugs.launchpad.net/gdb-linaro/">http://bugs.launchpad.net/gdb-linaro/</a>>...</div>
<div>Reading symbols from /home/carlos/my-test-area/build/cairo-sample...done.</div><div>(gdb) run</div><div>Starting program: /home/carlos/my-test-area/build/cairo-sample </div><div>[Thread debugging using libthread_db enabled]</div>
<div>Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".</div><div>[New Thread 0xb5e14b40 (LWP 3623)]</div><div>[New Thread 0xb54ffb40 (LWP 3624)]</div><div>[New Thread 0xb4738b40 (LWP 3625)]</div>
<div>The program 'cairo-sample' received an X Window System error.</div><div>This probably reflects a bug in the program.</div><div>The error was 'BadMatch (invalid parameter attributes)'.</div><div>  (Details: serial 230 error_code 8 request_code 135 minor_code 5)</div>
<div>  (Note to programmers: normally, X errors are reported asynchronously;</div><div>   that is, you will receive the error a while after causing it.</div><div>   To debug your program, run it with the --sync command line</div>
<div>   option to change this behavior. You can then get a meaningful</div><div>   backtrace from your debugger if you break on the gdk_x_error() function.)</div><div>[Thread 0xb4738b40 (LWP 3625) exited]</div><div>[Thread 0xb54ffb40 (LWP 3624) exited]</div>
<div>[Thread 0xb6224880 (LWP 3620) exited]</div><div>[Inferior 1 (process 3620) exited with code 01]</div><div>(gdb) where</div><div>No stack.</div><div>(gdb) </div></div><div><br></div><div><br></div><div style>How can I add the --sync option?</div>
<div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/1/14 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">




<div>
<div style="direction:ltr;font-size:10pt;font-family:Tahoma">That is weird.  I have no problem on intel/nvidia/fglrx drivers.  Did you try to run gdb on it and where is the seg fault point? 
<br>
<br>
Henry<br>
<br>
<div style="font-size:16px;font-family:Times New Roman">
<hr>
<div style="direction:ltr"><font face="Tahoma" color="#000000"><div class="im"><b>From:</b> cairo-bounces+henry.song=<a href="mailto:samsung.com@cairographics.org" target="_blank">samsung.com@cairographics.org</a> [cairo-bounces+henry.song=<a href="mailto:samsung.com@cairographics.org" target="_blank">samsung.com@cairographics.org</a>] on behalf of Carlos López González [<a href="mailto:genetita@gmail.com" target="_blank">genetita@gmail.com</a>]<br>

</div><b>Sent:</b> Saturday, January 12, 2013 2:29 AM<br>
<b>To:</b> Henry (Yu) Song - SISA<br>
<b>Cc:</b> <a href="mailto:cairo@cairographics.org" target="_blank">cairo@cairographics.org</a><br>
<b>Subject:</b> Re: [cairo] Threaded animation with cairo_gl backend over a GtkWidget<br>
</font><br>
</div><div><div class="h5">
<div></div>
<div>
<div dir="ltr">Hi!
<div>looks like it doesn't work. I've added XInitThreads() and it still crashing. Also added XLockDisplay and XUnlockDisplay with the same result.</div>
<div>Any idea?</div>
<div>Thanks!</div>
<div>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><br>
</p>
<p style="margin:0px;font-size:11px;font-family:Menlo"><span style="color:rgb(187,44,162)">int</span> main (<span style="color:rgb(187,44,162)">int</span> argc,
<span style="color:rgb(187,44,162)">char</span> *argv[])</p>
<p style="margin:0px;font-size:11px;font-family:Menlo">{</p>
<p style="margin:0px;font-size:11px;font-family:Menlo"><span style="color:rgb(187,44,162)">    if</span><span style>(!</span><span style="color:rgb(61,29,129)">XInitThreads</span><span style>())</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(187,44,162)">         return<span style="color:rgb(0,0,0)">
</span><span style="color:rgb(39,42,216)">0</span><span style="color:rgb(0,0,0)">;</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)"><br>
</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)">    gdk_threads_init<span style="color:rgb(0,0,0)">();</span><span style="white-space:pre-wrap">
</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)">    gdk_threads_enter<span style="color:rgb(0,0,0)">();</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="color:rgb(61,29,129)">    gtk_init</span>(&argc, &argv);</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="color:rgb(112,61,170)"><br>
</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="color:rgb(112,61,170)">    GtkWidget</span><span style> *window =
</span><span style="color:rgb(61,29,129)">gtk_window_new</span><span style>(</span><span style="color:rgb(61,29,129)">GTK_WINDOW_TOPLEVEL</span><span style>);</span><br>
</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="color:rgb(120,73,42)">    g_signal_connect</span><span style>(window,
</span><span style="color:rgb(209,47,27)">"destroy"</span><span style>,
</span><span style="color:rgb(120,73,42)">G_CALLBACK</span><span style>(</span><span style="color:rgb(61,29,129)">gtk_main_quit</span><span style>),
</span><span style="color:rgb(187,44,162)">NULL</span><span style>);</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="color:rgb(61,29,129)">    gtk_window_set_title</span><span style>(</span><span style="color:rgb(120,73,42)">GTK_WINDOW</span><span style>(window),
</span><span style="color:rgb(209,47,27)">"cairo_gl"</span><span style>);</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)">    gtk_window_set_default_size<span style="color:rgb(0,0,0)">(</span><span style="color:rgb(120,73,42)">GTK_WINDOW</span><span style="color:rgb(0,0,0)">(window),
</span><span style="color:rgb(39,42,216)">400</span><span style="color:rgb(0,0,0)">,
</span><span style="color:rgb(39,42,216)">300</span><span style="color:rgb(0,0,0)">);</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)">    gtk_widget_set_app_paintable<span style="color:rgb(0,0,0)">(window,
</span><span style="color:rgb(187,44,162)">TRUE</span><span style="color:rgb(0,0,0)">);</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)">    gtk_widget_set_double_buffered<span style="color:rgb(0,0,0)">(window,
</span><span style="color:rgb(187,44,162)">FALSE</span><span style="color:rgb(0,0,0)">);</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)"><span style="color:rgb(0,0,0)"><br>
</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)">    gtk_widget_show_all<span style="color:rgb(0,0,0)">(window);</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(49,89,93)"><span style="color:rgb(79,129,135)">    window_surface</span><span style="color:rgb(0,0,0)">=</span>create_source_surface_for_widget<span style="color:rgb(0,0,0)">(window);</span></p>

<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo">    (<span style="color:rgb(187,44,162)">void</span>)<span style="color:rgb(61,29,129)">g_timeout_add</span>(<span style="color:rgb(39,42,216)">33</span>, (<span style="color:rgb(112,61,170)">GSourceFunc</span>)<span style="color:rgb(49,89,93)">timer_exe</span>,
 window);</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(0,132,0)">    //do_draw(NULL);</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><br>
</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)">    gtk_main<span style="color:rgb(0,0,0)">();</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><br>
</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(61,29,129)">    gdk_threads_leave<span style="color:rgb(0,0,0)">();</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(187,44,162)">    return<span style="color:rgb(0,0,0)">
</span><span style="color:rgb(39,42,216)">0</span><span style="color:rgb(0,0,0)">;</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo">}</p>
<div><br>
</div>
</div>
<div><br>
</div>
<div>
<p style="margin:0px;font-size:11px;font-family:Menlo"><span style="color:rgb(187,44,162)">void</span> *do_draw(<span style="color:rgb(187,44,162)">void</span> *ptr)</p>
<p style="margin:0px;font-size:11px;font-family:Menlo">{</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(79,129,135)"><span style="color:rgb(0,0,0)">   
</span>rendering<span style="color:rgb(0,0,0)">=</span><span style="color:rgb(187,44,162)">TRUE</span><span style="color:rgb(0,0,0)">;</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo">    <span style="color:rgb(112,61,170)">
cairo_t</span> *cr = <span style="color:rgb(61,29,129)">cairo_create</span>(<span style="color:rgb(79,129,135)">window_surface</span>);</p>
<p style="margin:0px;font-size:11px;font-family:Menlo"><font color="#000000"><span style="white-space:pre-wrap"> 
</span></font><span style="color:rgb(187,44,162)">if</span><span style>(</span><font color="#3d1d81">cairo_status</font><span style>(cr))</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)"><span style="white-space:pre-wrap"></span></span>return<span style="color:rgb(0,0,0)">
</span>NULL<span style="color:rgb(0,0,0)">;</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo"><font color="#000000"><span style="white-space:pre-wrap"> 
</span></font><span style="color:rgb(112,61,170)">Display</span><span style> *dpy =</span><font color="#3d1d81">cairo_glx_device_get_display</font><span style>((</span><font color="#3d1d81">cairo_surface_get_device</font><span style>(</span><span style="color:rgb(79,129,135)">window_surface</span><span style>)));</span></p>

<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(0,132,0)"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(61,29,129)">XLockDisplay</span><span style="color:rgb(0,0,0)">(dpy);</span><br>
</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(0,132,0)"><span style="color:rgb(0,0,0)">    </span>//do some time-consuming drawing here ...</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"></p>
<p style="margin:0px;color:rgb(0,132,0)"><span style="color:rgb(0,0,0)">    </span>// ...</p>
<div>
<p style="margin:0px;color:rgb(0,132,0)"><span style="color:rgb(0,0,0)">    </span>// ...</p>
</div>
<div><br>
</div>
<p></p>
<p style="margin:0px;font-size:11px;font-family:Menlo"><font color="#000000"><span style="white-space:pre-wrap"> 
</span></font><span style="color:rgb(61,29,129)">cairo_destroy</span><span style>(cr);</span><br>
</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="color:rgb(61,29,129)"><br>
</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="color:rgb(61,29,129)">    cairo_gl_surface_swapbuffers</span><span style> (</span><span style="color:rgb(79,129,135)">window_surface</span><span style>);</span><br>

</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo"><font color="#000000"><span style="white-space:pre-wrap"> 
</span></font><span style="color:rgb(61,29,129)">XUnlockDisplay<span style="color:rgb(0,0,0)">(dpy);</span></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span style="white-space:pre-wrap"></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo"><font color="#000000"><span style="white-space:pre-wrap"> 
</span></font><span style="color:rgb(79,129,135)">rendering<span style="color:rgb(0,0,0)">=</span><span style="color:rgb(187,44,162)">FALSE</span><span style="color:rgb(0,0,0)">;</span></span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><br>
</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(187,44,162)"><span style="color:rgb(0,0,0)">   
</span>return<span style="color:rgb(0,0,0)"> </span>NULL<span style="color:rgb(0,0,0)">;</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo">}</p>
<div><br>
</div>
</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<br>
<div class="gmail_quote">2013/1/11 Carlos López González <span dir="ltr"><<a href="mailto:genetita@gmail.com" target="_blank">genetita@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<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>
<div>
<div><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" target="_blank">samsung.com@cairographics.org</a> [cairo-bounces+henry.song=<a href="mailto:samsung.com@cairographics.org" target="_blank">samsung.com@cairographics.org</a>] on behalf
 of Carlos López González [<a href="mailto:genetita@gmail.com" target="_blank">genetita@gmail.com</a>]<br>
Sent: Thursday, January 10, 2013 11:26 AM<br>
To: <a href="mailto:cairo@cairographics.org" target="_blank">cairo@cairographics.org</a><br>
Subject: [cairo] Threaded animation with cairo_gl backend over a GtkWidget<br>
<div>
<div><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>
</div>
</div>
<span><font color="#888888"><br>
<br clear="all">
<br>
-- <br>
Carlos<br>
<a href="http://synfig.org" target="_blank">http://synfig.org</a><br>
</font></span></div>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
Carlos<br>
<a href="http://synfig.org" target="_blank">http://synfig.org</a><br>
</div>
</div>
</div></div></div>
</div>
</div>

</blockquote></div><br><br clear="all"><div><br></div>-- <br>Carlos<br><a href="http://synfig.org" target="_blank">http://synfig.org</a><br>
</div>