Commit Graph

2858 Commits

Author SHA1 Message Date
Chris Wilson 995a4b2b1d i965: Sanity check ComponentAlpha status in prepare_composite
Fixes:

  Bug 28446 - Garbled Font with Mathematica 7
  https://bugs.freedesktop.org/show_bug.cgi?id=28446

Rewriting the glyphs to render to the destination directly and removing
the more expensive multiple invocations of CompositePicture per picture
was a great performance boost -- except that it needs special handling
in the backend in order to not fallback. Having done so for i915, I
neglected to ensure the sanity checking in i965_prepare_composite() was
sufficient. As it turns out, it was not and so we misrendered CA-glyphs
when rendering directly to the destination. This causes us to fallback
properly, but is a performance regression as we no longer try the 2-pass
magic helper before resorting to s/w. At the moment, I'd rather live
with the temporary regression and fix i965 to do the same magic as i915,
as it critical to fixing the severe performance issues currently
crippling i965, as I believe that this regression only affects the
minority of applications (incorrect, as it turns out, as the glyphs are
overlapping) rendering directly to the destination.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-14 12:14:30 +01:00
Chris Wilson 84d65bace5 Compile fix for alternate list.h from xserver-1.9
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-14 11:31:40 +01:00
Chris Wilson 5a0a8a1cf6 i830: Limit disabling acceleration following EIO to !i965
Following a conversation with Owain G. Ainsworth, it was decided that
the second best approach to handling a wedged GPU was to hope that the
kernel could successfully reset it, which currently is only possible for
i965 and later chipsets.

The best approach is of course to prevent such hangs from ever occurring
in the first place.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-10 23:02:34 +01:00
Chris Wilson 3bf4ca2cdc i830: Only emit the disabling GPU error message once.
But emit the warning about rendering corruption every time for the
transient errors like out-of-memory.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-10 23:02:34 +01:00
Chris Wilson 8c1a8d2297 Revert "xp:trapezoids"
This reverts commit f429fb9d87.

An experimental patch I forgot was on my main branch as I was bugfixing.
ARGH!
2010-06-09 10:03:29 +01:00
Chris Wilson f429fb9d87 xp:trapezoids 2010-06-08 19:52:46 +01:00
Chris Wilson 0776a42b70 implicit-flush 2010-06-08 15:00:16 +01:00
Eric Anholt d41684d545 Allocate rotate shadow buffers using the usual framebuffer allocator.
This means we can get tiling on them, which should significantly boost
performance, and also allow for FBC.
2010-06-07 11:18:09 -07:00
Eric Anholt b5c9de10ba Allocate a correctly sized framebuffer when tiling by using libdrm's support.
When I made libdrm stop overallocating so much memory for the purpose
of bo caching, things started scribbling on the bottom of my
frontbuffer (and vice versa, leading to GPU hangs).  We had the usual
mistake of size = tiled_pitch * height instead of size = tiled_pitch *
tile_aligned_height.
2010-06-07 11:15:28 -07:00
Chris Wilson e6acbc7632 uxa: Setup acceleration functions prior to the damage layer
We need to install the acceleration functions so that they are wrapped
by the Damage layer. This fixes the corruption under a compositing WM
introduced in commit 8700673157.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reported-and-tested-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
2010-06-07 18:23:17 +01:00
Chris Wilson 1788b16eb2 i915: Fix typo from previous commit.
A trivial change, I thought, having tested it before rebasing, unworthy
even of a perfunctory compile test. How wrong I was.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-07 15:31:47 +01:00
Chris Wilson d9bc36ae03 i915: Remove screen size limit from video setup.
The i915 textured video routine know how to handle drawing on an output
larger than the 3D pipe, so allow them to do so.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-07 15:30:07 +01:00
Chris Wilson 6555ef5fd1 i915: Replace structure passing with macros for shader generation.
gcc is horribly bad at collapsing the constants:

  text     data     bss     dec     hex filename
282336     8720     256  291312   471f0 intel_drv.so.old
269280     8720     256  278256   43ef0 intel_drv.so

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-07 14:23:11 +01:00
Chris Wilson d56ea7a852 Use the direct dixGevPrivate() API when available
This is quicker and smaller than the old indirect function call to
dixLookupPrivate().

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-07 00:20:35 +01:00
Chris Wilson 8700673157 Adapt glyphs for changes in devPrivates API
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-07 00:17:32 +01:00
Keith Packard 42ddc39430 Adapt to DevPrivate API changes
This allows the driver to be built against either the old or new
DevPrivate API.

Signed-off-by: Keith Packard <keithp@keithp.com>
2010-06-06 16:00:12 -07:00
Eric Anholt 2c1fda08e8 Use libc instead of deprecated libc wrappers for malloc/calloc/free. 2010-06-06 15:56:35 -07:00
Chris Wilson 6db1e5231b dri: Protect against NULL dereference following GPU hang.
References:

  Bug 28361 - "glresize" causes server segfault with single buffering.
  https://bugs.freedesktop.org/show_bug.cgi?id=28361

[ 14528.767] (EE) intel(0): Failed to submit batch buffer, expect rendering corruption or even a frozen display: Input/output error.
[ 14528.767] (EE) intel(0): Disabling acceleration.
[ 14528.788] Backtrace:
[ 14528.858] 0: /usr/bin/X (xorg_backtrace+0x28) [0x491818]
[ 14528.858] 1: /usr/bin/X (0x400000+0x65ca9) [0x465ca9]
[ 14528.858] 2: /lib/libpthread.so.0 (0x7f9df2dc9000+0xedf0) [0x7f9df2dd7df0]
[ 14528.858] 3: /usr/local/lib/libdrm_intel.so.1 (drm_intel_bo_flink+0x0) [0x7f9defd60c60]
[ 14528.858] 4: /usr/local/lib/xorg/modules/drivers/intel_drv.so (0x7f9deff6a000+0x2fdfd) [0x7f9deff99dfd]
[ 14528.858] 5: /usr/lib/xorg/modules/extensions/libdri2.so (0x7f9df01b8000+0x19e7) [0x7f9df01b99e7]
[ 14528.858] 6: /usr/lib/xorg/modules/extensions/libdri2.so (0x7f9df01b8000+0x1fdb) [0x7f9df01b9fdb]
[ 14528.858] 7: /usr/lib/xorg/modules/extensions/libdri2.so (DRI2GetBuffersWithFormat+0x10) [0x7f9df01ba250]
[ 14528.858] 8: /usr/lib/xorg/modules/extensions/libdri2.so (0x7f9df01b8000+0x3834) [0x7f9df01bb834]
[ 14528.858] 9: /usr/bin/X (0x400000+0x2fc2c) [0x42fc2c]
[ 14528.858] 10: /usr/bin/X (0x400000+0x24da5) [0x424da5]
[ 14528.858] 11: /lib/libc.so.6 (__libc_start_main+0xe6) [0x7f9df1d60a26]
[ 14528.858] 12: /usr/bin/X (0x400000+0x24959) [0x424959]
[ 14528.858] Segmentation fault at address 0x20
[ 14528.858] Fatal server error:
[ 14528.858] Caught signal 11 (Segmentation fault). Server aborting

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-02 20:43:49 +01:00
Chris Wilson 2989f51caf i830: Remove unused coord-adjust.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-01 23:15:02 +01:00
Chris Wilson dc402334f4 i915: Centre sampling.
Use centre sampling of textures to match pixman, and remove numerous
off-by-one and visual artefacts when rendering. The classic example for
this is cairo/text/xcomposite-projection where the edge of the rotated
rectangle is jaggy due to the incorrect sample position.

Fixes:

  Bug 16917  - [i915] Blur on y-axis also when only x-axis is scaled
               billiear
  https://bugs.freedesktop.org/show_bug.cgi?id=16917

And about 15 tests from the Cairo test suite.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-01 23:15:02 +01:00
Chris Wilson f74b3f82ba i915; Avoid the implicit flush on changing BUF_INFO
3DSTATE_BUF_INFO is an implicit flush of the piepline, so avoid emitting
that and associated state unless the destination pixmap has actually
changed. This is a win of around 3-5% for cairo-perf-trace, notably for
firefox.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-06-01 23:15:02 +01:00
Jesse Barnes f227240203 DRI2: fix new buffer exchange check
Chris's new buffer exchange check is a good one, but we don't want to
hit the immediate blit fallback path if it fails.  We still want to
schedule a blit for sometime in the future, and we need to use it
wherever an exchange might occur (like the secondary flip check or the
currently disabled CanExchange check).

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=28252.

Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
2010-06-01 13:46:15 -07:00
Chris Wilson cd38b705be Disable acceleration if we detect a hardware error.
This is wildly optimistic, but it should work in a surprising number of
error situations and some output in those cases will be hopefully be
better than none...

If we submit a batchbuffer and the kernel reports the GPU is hung (which
will be caused by an earlier execbuffer, and so the kernel should have
had enough time to determine whether or not it could reset the GPU) then
disable any further attempt to accelerate gfx and force fallbacks to map
the buffers and use the CPU. We cannot normally map any more buffers if
the GPU is hung, so only those already mapped prior to the hang can be
written to, or those allocated in system memory. However, we can expect
that the framebuffer is already mapped, and so have a reasonable
expectation to continue to see the display update.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-31 18:00:11 +01:00
Chris Wilson 5fff430046 uxa: Mega-Glyphs!
Rewrite glyph rendering to avoid the intermediate buffer, accumulating
the glyph rectangles directly in the backend composite routines. And
modify the glyph cache routines to fully utilise the allocated size of
the tiled buffer on older hardware. To do this we alias all glyph sizes
into the same texture using a technique suggested by Keith Packard.

PineView:
  885/856-> 1150/1110 kglyph/s (aa/rgb)

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-31 14:03:42 +01:00
Chris Wilson d31abccd41 i915: Support textured video on an extended desktop.
Handle rendering textured video onto an extended desktop (>2048) by
using a temporary pixmap. Note that we still cannot handle rendering to
a greater than 2048 destination region, for that we will need to tile.
Hmm, time to request a 2560x1600, 10bpc monitor...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-31 12:23:29 +01:00
Chris Wilson 2cfd5bc134 dri: Compilation fix.
17:53 < arekm> ickle: i830_dri.c:630:28: error: ‘DrawableRec’ has no member named ‘bpp’
17:53 < arekm> ickle: i830_dri.c:630:57: error: ‘DrawableRec’ has no member named ‘bpp’

* sigh. I need to fix this machine to have the right version of the
* headers.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-29 17:55:19 +01:00
Chris Wilson e2615cdeef dri: Only flip if the front and back pixmaps match.
An unredirected window (thanks Michel for the reminder) is backed by the
Screen pixmap, and so uses a reference of that as its front buffer. The
back buffer is a pixmap appropriately sized for the drawable. When the
application requests to swap its buffers, obviously we cannot simply
exchange the front and back buffer as they do not match, but need to copy
the appropriate region from the back to the front.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-29 16:40:06 +01:00
Chris Wilson 8b2039187f Revert "dri: Use size from backing pixmap when creating buffers."
This reverts commit 44d45d3fa5.

Michel Dänzer pointed out the flaw in using the pixmap size instead of
the drawable size:

  Using the backing pixmap dimensions for this is not desirable. In
  particular, it means that the DRI2 buffers of non-redirected windows
  always have the same size as the screen. But even for redirected windows
  it wastes some graphics memory with a re-parenting window manager, that
  is if it doesn't break in various ways due to the top left corner of the
  DRI2 buffers no longer corresponding to the top left corner of the window.
2010-05-29 12:14:55 +01:00
Chris Wilson 44d45d3fa5 dri: Use size from backing pixmap when creating buffers.
This avoid using the garbage values stored in the Screen drawable,
instead of the true values which are only maintained in its backing
pixmap. The consequence of using the wrong size was to hand a 1x1
pixmap to metacity/mutter and have it believe it was a full screen
drawable; GPU hangs ensued if using page flipping.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-29 10:39:28 +01:00
Chris Wilson 90c74a4314 i915: Don't re-emit vertex size unless it has changed.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-28 21:50:04 +01:00
Chris Wilson 73111cf2a2 Decouple non-reusuable pixmaps from batch lists on unref.
==7596== Invalid write of size 4
==7596==    at 0x491ACA8: intel_batch_teardown (i830_batchbuffer.c:118)
==7596==    by 0x491C9D6: I830CloseScreen (i830_driver.c:1419)
==7596==    by 0x8103A9C: RRCloseScreen (randr.c:105)
==7596==    by 0x80DE794: xf86CrtcCloseScreen (xf86Crtc.c:759)
==7596==    by 0x80BEBA3: DGACloseScreen (xf86DGA.c:268)
==7596==    by 0x80D044B: DPMSClose (xf86DPMS.c:134)
==7596==    by 0x488B050: XvCloseScreen (xvmain.c:320)
==7596==    by 0x81841B1: VidModeClose (xf86VidMode.c:110)
==7596==    by 0x80EB12F: CursorCloseScreen (cursor.c:191)
==7596==    by 0x810CA17: AnimCurCloseScreen (animcur.c:108)
==7596==    by 0x816937E: compCloseScreen (compinit.c:86)
==7596==    by 0x48D39B9: glxCloseScreen (glxscreens.c:221)
==7596==  Address 0x49c1a50 is 24 bytes inside a block of size 52 free'd
==7596==    at 0x4024866: free (vg_replace_malloc.c:325)
==7596==    by 0x80B023C: Xfree (utils.c:1096)
==7596==    by 0x4927CFD: i830_set_pixmap_bo (i830_uxa.c:647)
==7596==    by 0x491C9B4: I830CloseScreen (i830_driver.c:1413)
==7596==    by 0x8103A9C: RRCloseScreen (randr.c:105)
==7596==    by 0x80DE794: xf86CrtcCloseScreen (xf86Crtc.c:759)
==7596==    by 0x80BEBA3: DGACloseScreen (xf86DGA.c:268)
==7596==    by 0x80D044B: DPMSClose (xf86DPMS.c:134)
==7596==    by 0x488B050: XvCloseScreen (xvmain.c:320)
==7596==    by 0x81841B1: VidModeClose (xf86VidMode.c:110)
==7596==    by 0x80EB12F: CursorCloseScreen (cursor.c:191)
==7596==    by 0x810CA17: AnimCurCloseScreen (animcur.c:108)

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-26 21:07:46 +01:00
Chris Wilson a6fb6aa5f9 Add vertex bo to the list of buffers to be torn down.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-26 20:31:45 +01:00
Chris Wilson 5dce69002d i965: Remove ATOMIC_BATCH.
This paranoid check is deceased; pining for the fjords.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-26 20:27:29 +01:00
Eric Anholt 06ebb55d30 Add a workaround for Ironlake errata relating to disabling the clipper. 2010-05-26 12:21:09 -07:00
Eric Anholt 158a158dad Add a workaround for Ironlake errata regarding blits and other engines. 2010-05-26 12:21:09 -07:00
Eric Anholt 3461f8f4bc Remove remaining REG_DUMPER build stuff. 2010-05-26 12:21:09 -07:00
Chris Wilson 309bd3a299 i830: Skip an empty fill.
In the extremely unlikely event that the higher layer erroneous gave us
an empty fill, skip it.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-26 10:21:03 +01:00
Chris Wilson ea07535240 i915: Emit CA over using OutReverse + Add passes
On PineView:
  578/621 -> 610/617 kglyphs/sec [rgb/aa]
2010-05-24 18:31:16 +01:00
Chris Wilson 80a9e64f50 uxa: Use temporary dest when target is too large for compositor
If the destination cannot fit into the 3D pipeline when we need to
composite, we fallback to doing the operation on the CPU. This is very
slow, and quite easy to trigger on i915 by plugging in an external
display.

An alternative is to extract the extents of the operation from the
destination using the blitter which can usually handle much larger
operations. This gives us a temporary target that can fit into the 3D
pipeline and thus be accelerated, before copying back into the larger
real destination.

For x11perf this boosts glyph rendering on PineView, from 38kglyphs/s to
480kglyphs/s. Just a little shy of the native performance of 601kglyphs/s

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-24 18:31:16 +01:00
Chris Wilson e3ece83f57 i915: compute normalized texcoords using a scale factor.
500 -> 580kglyphs/s on i945.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-24 09:42:18 +01:00
Chris Wilson 2adf823b80 i915: Add special case primitive emitters for glyphs.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-24 09:40:26 +01:00
Chris Wilson f64ab9e0d9 i915: Move vertices into a vertex buffer object.
In theory this should allow us to pack far more operations into a single
batch buffer, and reduce our overheads.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-24 09:36:23 +01:00
Chris Wilson 2b050f330f Use pwrite to upload the batch buffer
By using pwrite() instead of dri_bo_map() we can write to the batch buffer
through the GTT and not be forced to map it back into the CPU domain and
out again, eliminating a double clflush.

Measing x11perf text performance on PineView:

Before:
16000000 trep @   0.0020 msec (511000.0/sec): Char in 80-char aa line (Charter 10)
16000000 trep @   0.0021 msec (480000.0/sec): Char in 80-char rgb line (Charter 10)
After:
16000000 trep @   0.0019 msec (532000.0/sec): Char in 80-char aa line (Charter 10)
16000000 trep @   0.0020 msec (496000.0/sec): Char in 80-char rgb line (Charter 10)

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-24 09:33:37 +01:00
Chris Wilson dcef703a7c Kill paranoid assertions on every write into the batchbuffer.
On my PineView box these represent ~5% overhead on x11perf text:

Before:
16000000 trep @   0.0020 msec (495000.0/sec): Char in 80-char aa line (Charter 10)
12000000 trep @   0.0022 msec (461000.0/sec): Char in 80-char rgb line (Charter 10)

After:
16000000 trep @   0.0020 msec (511000.0/sec): Char in 80-char aa line (Charter 10)
16000000 trep @   0.0021 msec (480000.0/sec): Char in 80-char rgb line (Charter 10)

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-24 09:33:35 +01:00
Chris Wilson bc41f84e01 i915: Emit composite primitive with specialised functions.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-24 09:32:30 +01:00
Chris Wilson 4a3476ea09 i915: amalgamate composite into a single primitive list
Combine all the calls to composite between prepare_composite and
done_composite into a single primitive list, rather than a primitive
call per composite().

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-23 18:52:15 +01:00
Kristian Høgsberg 509df27c74 dri: Clean up DRI2 API #ifdefs a bit
Signed-off-by: Kristian Høgsberg <krh@bitplanet.net>
2010-05-18 10:01:52 -04:00
Chris Wilson 5e04a81369 i830: Remove vestigal debugging ALWAYS_FLUSH and ALWAYS_SYNC
These are now debugging options exposed in Xorg.conf, and now unused int
the source code.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-17 15:16:25 +01:00
Chris Wilson 723cc45b27 dri: Check error code from GetScratchGC()
It may fail so be prepared, and do use the right drawable!

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-17 15:14:55 +01:00
Chris Wilson 2c69709d8a i830: Encode surface bpp into format
References:

  Bug 28135 - [855GM] Slowdown/High CPU-Usage after Git-Commit
              926fbc7d90
  https://bugs.freedesktop.org/show_bug.cgi?id=28135

The simple answer is that I had assumed that 0 was a reserved value.
However, without the bbp encoded into the format 0 was used for a8r8g8b8
and r5g6b5, which are very common formats!

The other possibility for the slowdown is that gtkperf is using of the
now verboten xrgb formats -- but would in fact be valid if the source
covers the clip and we could fixup the alpha value in the fixed function
combine.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-05-16 18:41:52 +01:00