From dbb577bfcf097f2c7c66281b51d130f17402e1d7 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 23 Mar 2010 17:28:22 +0000 Subject: [PATCH] uxa: Default to using TILING_X for pixmaps. On memory constrained hardware, tiling is vital for good performance as it minimizes cache misses. The downside is that for older hardware (which often suffers from the lack of bandwidth) requires the use of fences for many operations, which are in short supply and so may cause shorter batchbuffers. However our batch buffers are typically short and so this is unlikely to be a concern and not affect the performance wins. Fixes: Bug 25375 - Performance issue using texture from pixmap (tfp) glx extension on 945 http://bugs.freedesktop.org/show_bug.cgi?id=25375 Signed-off-by: Chris Wilson --- src/i830_uxa.c | 21 +++++++++++++++------ 1 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/i830_uxa.c b/src/i830_uxa.c index fec5378..ded931d 100644 --- a/src/i830_uxa.c +++ b/src/i830_uxa.c @@ -135,8 +135,16 @@ i830_uxa_pixmap_compute_size(PixmapPtr pixmap, pitch_align = intel->accel_pixmap_pitch_alignment; size = ROUND_TO((w * pixmap->drawable.bitsPerPixel + 7) / 8, pitch_align) * ALIGN (h, 2); - if (size < 4096) + if (size <= 4096) { *tiling = I915_TILING_NONE; + } else if (!IS_I965G(intel)) { + /* Older hardware requires massive fences to be pot + * size aligned with a minimum of 1 MiB, so + * causes massive overallocation for small textures. + */ + if (size <= 1024*1024/2) + *tiling = I915_TILING_NONE; + } } repeat: @@ -863,12 +871,13 @@ i830_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth, return NullPixmap; } - if (usage == INTEL_CREATE_PIXMAP_TILING_X) - priv->tiling = I915_TILING_X; - else if (usage == INTEL_CREATE_PIXMAP_TILING_Y) + /* Always attempt to tile, compute_size() will remove the + * tiling for pixmaps that are either too large or too small + * to be effectively tiled. + */ + priv->tiling = I915_TILING_X; + if (usage == INTEL_CREATE_PIXMAP_TILING_Y) priv->tiling = I915_TILING_Y; - else - priv->tiling = I915_TILING_NONE; size = i830_uxa_pixmap_compute_size(pixmap, w, h, &priv->tiling, &stride); -- 1.7.0.3