From 5a9b973a016706fd9cbe37c3b05ed3f00d1e900f Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Fri, 3 Aug 2007 15:55:54 -0700 Subject: [PATCH] Add what_exa_gets_right entry --- src/exa/what_exa_gets_right.mdwn | 95 ++++++++++++++++++ .../what_exa_gets_right/rectangle-fill.png | Bin 0 -> 10334 bytes src/exa/what_exa_gets_right/window-copy.png | Bin 0 -> 10795 bytes 3 files changed, 95 insertions(+) create mode 100644 src/exa/what_exa_gets_right.mdwn create mode 100644 src/exa/what_exa_gets_right/rectangle-fill.png create mode 100644 src/exa/what_exa_gets_right/window-copy.png diff --git a/src/exa/what_exa_gets_right.mdwn b/src/exa/what_exa_gets_right.mdwn new file mode 100644 index 0000000..29d705b --- /dev/null +++ b/src/exa/what_exa_gets_right.mdwn @@ -0,0 +1,95 @@ +[[meta title="What EXA gets right already"]] + +[[tag exa performance xorg]] + +I've been writing various posts about [[EXA|tag/exa]] for a couple of +months now. And for the most part, they've been fairly negative, +(showing big slowdowns compared to running an X server without +acceleration at all, for example). + +As I've talked to people that have read the posts, it's clear that +I've managed to spread some misconceptions. So let me clear things up +now: + + * Running your server with NoAccel is not a good idea + + * EXA does accelerate a lot of things already + + * EXA is not doomed, nor were its authors idiots to have written it + +The reason my posts have focused on negative performance aspects is +because I was looking for things that could be sped up, and as is only +appropriate I looked for, found, and have been focused on the biggest +performance problem with EXA I could find, (which turns out to be +glyph rendering). + +So, briefly here, I want to mention a couple of things that EXA is +doing a fine job with. The first is the big reason why you don't want +to run an X server with NoAccel: scrolling will hurt very badly. Take +a look at these rates for a window-to-window copy of a +rectangle of various sizes. + +[All tests here are with very recent checkouts of xserver, mesa, and +xf86-video-intel. Tests are run on an Intel Core 2 CPU @ 2.13GHz with +an Intel 965 graphics card. Thanks, Intel for the donation of hardware +for this testing!] + +[[window-copy.png]] + + +
Window-to-window copy performance (Millions of pixels/sec.) +
Rectangle size 10x10 100x100 500x500 +
NoAccel 14.2 26.5 23.475 +
XAA 57.8 438 587.5 +
EXA 77.6 464 587.5 +
+ +So here we can see that EXA is from 5 to 25 times faster for scrolling +windows, depending on the size. And I can assure you that you +definitely don't want windows to start scrolling 25 times slower +(chug, chug, chug). Meanwhile, EXA is marginally faster than XAA on +this test, but not significantly. + +Second, let's look at another common operation, filling solid +rectangles. This is an essential step in almost any rending, (for +clearing to the background color), as well as for actually rendering +some content. + +[[rectangle-fill.png]] + + +
Solid rectangle fill rate (Millions of pixels/sec.) +
Rectangle size 1x1 10x10 100x100 500x500 +
NoAccel 10.5 99.6 392 662.5 +
XAA 1.5 90.9 698 842.5 +
EXA 2.5 250 1150 847.5 +
+ +Again, EXA outperforms NoAccel here (from 1.3x to 2.9x faster), for +all but the tiniest of rectangles. Interestingly, EXA also outperforms +XAA by up to 2.7x for the 10x10 rectangle. Also, it's quite +interesting to note, (and it's hard to see on the bar chart), that +NoAccel outperforms EXA (4.2x) and XAA (7x) for the case of a 1x1 +rectangle. Presumably the overhead of setting up hardware rendering +for a single-pixel object just plain isn't worth it, (which really +shouldn't be that surprising). + +So those are a couple of the operations where EXA and XAA are already +performing quite well. Some of you will note that Keith Packard has +often joked that an X server doesn't need more acceleration than these +two operations to perform well. And if you look at the whole set of +operations in the XAA interface, indeed you'll find many there that +modern applications won't use at all. + +But meanwhile, applications are now using the Render extension more +and more extensively to draw things. And this is where EXA should +afford some acceleration possibilities that XAA does not. And this is +also where I've been identifying several problems. If "copy" and +"solid fill" are the two most fundamental operations, maybe the next +two are "compositing" and "compositing glyphs". I've been talking +about problems in those operations for a while, and I plan to start +talking about actual solutions soon. + +Stay tuned. + + diff --git a/src/exa/what_exa_gets_right/rectangle-fill.png b/src/exa/what_exa_gets_right/rectangle-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..41e2d713c3d118de1ee79ed3adddb9d996691374 GIT binary patch literal 10334 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 literal 0 HcmV?d00001 diff --git a/src/exa/what_exa_gets_right/window-copy.png b/src/exa/what_exa_gets_right/window-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..af8382bc6e1f15dacaa2984ce84dbed7b86caefa GIT binary patch literal 10795 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