<span style="color:rgb(0,0,102)">Dear Chris, Dear Cairo Developers/Users,</span><br style="color:rgb(0,0,102)"><br style="color:rgb(0,0,102)"><span style="color:rgb(0,0,102)">I had a few more questions regarding my older post, </span><i style="color:rgb(0,0,102)">i.e.</i><span style="color:rgb(0,0,102)"> being able to draw millions of small rectangles on a Cairo surface provided by GTK/GDK. </span><br style="color:rgb(0,0,102)">
<br style="color:rgb(0,0,102)"><span style="color:rgb(0,0,102)">Chris Wilson was kind enough to explain that my Cairo drawing is slow as I use a non-integer, non-uniform scaling factor, and has improved the Cairo code for new releases; however, I am stuck with the older Cairo version which I mention in my older email (for O/S compatibility), so I am back to probing this issue further, as I really need to speed up zoom-in/zoom-out for my rectangles.</span><br style="color:rgb(0,0,102)">
<br style="color:rgb(0,0,102)"><span style="color:rgb(0,0,102)">My two questions are the following:</span><br style="color:rgb(0,0,102)"><ol style="color:rgb(0,0,102)"><li>Does Cairo <b><i>always use or not use</i></b> 2D Hardware Rendering? How can this be enabled or verified using Cairo code? If not, where can I find a Cairo code snippet which enables X acceleration?<br>
<br></li><li>As I mention in a prior message I used two methods for "double-buffering", drawing to an image surface OR drawing to a similar surface (<span style="font-family:courier new,monospace">cairo_surface_create_similar</span>). Funnily enough, the latter was faster. Is there a reason for this? It seems mysterious...<br>
<br></li><li>Related to my first question, I tried to use Cairo/X interaction to verify if this would improve drawing, <i>i.e.</i> if I used an Xlib surface.<br>I used the following code:<br><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace"> xdisplay = gdk_x11_drawable_get_xdisplay(maincanvas_drawable);</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"> xid = gdk_x11_drawable_get_xid(maincanvas_drawable);</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace"> visual = gdk_x11_visual_get_xvisual(gtk_widget_get_visual(GTK_WIDGET(maincanvas)));</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace"> maincanvas_sf = cairo_xlib_surface_create(xdisplay, xid, visual, maincanvasWidth, maincanvasHeight);</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"> maincanvas_cs = cairo_create(maincanvas_sf);</span><br>
<br>However, drawing to the Xlib surface did not help either (actually made matters worse, as GDK/GTK interaction with scrollbars stopped working). So, coming back to my first question, how can I guarantee 2D acceleration and why is an Xlib surface not helping? How can an Xlib surface be used properly?<br>
</li></ol><p style="color:rgb(0,0,102)">Thanks in advance for any feedback/help!<br></p><p><span style="color:rgb(0,0,102)">Christos.</span><br></p><br><div class="gmail_quote">On 20 March 2012 12:25, Chris Wilson <span dir="ltr"><<a href="mailto:chris@chris-wilson.co.uk" target="_blank">chris@chris-wilson.co.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, 20 Mar 2012 11:57:58 +0200, Christos Sotiriou <<a href="mailto:csotiriou@gmail.com">csotiriou@gmail.com</a>> wrote:<br>

> On 20 March 2012 11:32, Chris Wilson <<a href="mailto:chris@chris-wilson.co.uk">chris@chris-wilson.co.uk</a>> wrote:<br>
><br>
> > On Tue, 20 Mar 2012 09:42:19 +0200, Christos Sotiriou <<a href="mailto:csotiriou@gmail.com">csotiriou@gmail.com</a>><br>
> > wrote:<br>
> > > On 19 March 2012 20:27, Chris Wilson <<a href="mailto:chris@chris-wilson.co.uk">chris@chris-wilson.co.uk</a>> wrote:<br>
> > > > The truly puzzling part for me is that they seem viable candidates to<br>
> > > > hit the fast-paths, yet end up in the general polygon code.<br>
> > > ><br>
> > > >  << /content //COLOR_ALPHA /width 500 /height 500 >> surface context<br>
> > > > n 22.726562 22.726562 454.546875 454.546875 rectangle<br>
> > > > 0 0.65 1 rgb set-source<br>
> > > > 0.295602 0.913843 scale<br>
> > > > 3.655372 set-line-width<br>
> > > > stroke+<br>
> > > > pop<br>
> > > ><br>
> > > > Oh, I see. A non-uniform, non-integer scale factor. That would explain<br>
> > > > it. Let's see if I can cook up something faster for you.<br>
> > > ><br>
> > ><br>
> > > I can round the scaling factor for the cairo_scale() function call; would<br>
> > > that make a big performance difference?<br>
> ><br>
> > I've already fixed the fast-path to catch this case as well. The other<br>
> > thing worth asking about is that in the trace you use an image surface<br>
> > for your rendering. Is this a deliberate change from earlier? For the<br>
> > rendering you are performing, with a good driver, all the overhead will<br>
> > be in cairo converting the strokes into geometry, though I suspect<br>
> > the transfer of the image will be smaller than all the geometry. With<br>
> > cairo-1.12, you may like to use cairo_surface_create_similar_image()<br>
> > instead, as that opens up the possibilities of doing zero-copy uploads.<br>
> ><br>
><br>
> I tried two approaches for "double-buffering",<br>
><br>
> (1) using an image surface,<br>
> (2) using cairo_surface_create_similar(), as I read in the mailing lists,<br>
> that it achieved better performance.<br>
><br>
> I actually found that (1) is faster, surprisingly enough! This is what<br>
> worried me in the first place with respect to 2D performance.<br>
<br>
</div></div>Yes, drivers are typically crap.<br>
<div class="im"><br>
> When you say that "you already fixed the fast-path to catch this case as<br>
> well", I guess you mean that this change will be included in the next Cairo<br>
> version, correct?<br>
<br>
</div>Which all going well should be before the week is out...<br>
<div class="im"><br>
> Hence, for the current version I guess the only suggestion for increasing<br>
> performance, based on my existing cairo rendering implementation, is to<br>
> round the scaling to an integer, is that right?<br>
<br>
</div>Not sufficient sorry. The fast rectilinear stroking path was limited to no<br>
scaling in those versions. This is one area where cairo-1.12 has made<br>
significant improvements.<br>
<div class="im"><br>
><br>
> Thanks again for your time,<br>
><br>
> Christos.<br>
><br>
> P.S. a quick and related question on suface copying for increasing<br>
> performance - if I draw on a large image surface, say 2000x2000, and then<br>
> use cairo_set_source_surface() to copy this surface to a smaller one, say<br>
> 200x200, is the expected behaviour for cairo_set_source_surface() to<br>
> automatically shrink and map the original image (map) to the target,<br>
> smaller surface?<br>
<br>
</div>No, you have to specify the pattern transformation yourself. Normally it<br>
is taken from the current transformation matrix at the time of setting<br>
the source, with the pattern transform itself remaining identity.<br>
Howerver, you can also set a transformation on the pattern itself using<br>
cairo_pattern_set_matrix().<br>
<br>
Although I'm not going to recommend doing a 10x down-scaling.<br>
<div class="HOEnZb"><div class="h5">-Chris<br>
<br>
--<br>
Chris Wilson, Intel Open Source Technology Centre<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>--------------------------------------------------------------------------<br>Christos P. Sotiriou<br>email: <a href="mailto:csotiriou@gmail.com">csotiriou@gmail.com</a><br>
Cell: +30 697 8984 222<br>