[Intel-gfx] [PATCH] uxa: Default to using TILING_X for pixmaps.

Chris Wilson chris at chris-wilson.co.uk
Tue Mar 23 18:51:23 CET 2010


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 <chris at chris-wilson.co.uk>
---
 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




More information about the Intel-gfx mailing list