Author: arekm Date: Sat Feb 28 09:36:23 2009 GMT Module: SOURCES Tag: HEAD ---- Log message: - mem leak fixes from git
---- Files affected: SOURCES: xorg-driver-video-intel-fixes.patch (NONE -> 1.1) (NEW) ---- Diffs: ================================================================ Index: SOURCES/xorg-driver-video-intel-fixes.patch diff -u /dev/null SOURCES/xorg-driver-video-intel-fixes.patch:1.1 --- /dev/null Sat Feb 28 10:36:24 2009 +++ SOURCES/xorg-driver-video-intel-fixes.patch Sat Feb 28 10:36:17 2009 @@ -0,0 +1,137 @@ +commit 5bfd73cd31ba197a62f549cdbad1a1270b571027 +Author: Eric Anholt <[email protected]> +Date: Fri Feb 27 19:09:49 2009 -0800 + + Only allocate pixmaps aligned for tiling when requested by DRI2 GetBuffers. + + This saves massive quantities of memory on pre-965 since the DRI2 tiling + enable caused the minimum size of any pixmap to be 1MB. + +diff --git a/src/i830.h b/src/i830.h +index a0ae571..cd9c38a 100644 +--- a/src/i830.h ++++ b/src/i830.h +@@ -1090,4 +1090,15 @@ extern const int I830CopyROP[16]; + #define QUIRK_BROKEN_ACPI_LID 0x00000100 + extern void i830_fixup_devices(ScrnInfoPtr); + ++/** ++ * Hints to CreatePixmap to tell the driver how the pixmap is going to be ++ * used. ++ * ++ * Compare to CREATE_PIXMAP_USAGE_* in the server. ++ */ ++enum { ++ INTEL_CREATE_PIXMAP_TILING_X = 0x10000000, ++ INTEL_CREATE_PIXMAP_TILING_Y, ++}; ++ + #endif /* _I830_H_ */ +diff --git a/src/i830_dri.c b/src/i830_dri.c +index 540bf5e..96c711e 100644 +--- a/src/i830_dri.c ++++ b/src/i830_dri.c +@@ -1561,36 +1561,33 @@ I830DRI2CreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count) + pPixmap = pDepthPixmap; + pPixmap->refcnt++; + } else { +- uint32_t tiling = I915_TILING_NONE; ++ unsigned int hint = 0; + +- pPixmap = (*pScreen->CreatePixmap)(pScreen, +- pDraw->width, +- pDraw->height, +- pDraw->depth, 0); + switch (attachments[i]) { + case DRI2BufferDepth: + if (SUPPORTS_YTILING(pI830)) +- tiling = I915_TILING_Y; ++ hint = INTEL_CREATE_PIXMAP_TILING_Y; + else +- tiling = I915_TILING_X; ++ hint = INTEL_CREATE_PIXMAP_TILING_X; + break; + case DRI2BufferFakeFrontLeft: + case DRI2BufferFakeFrontRight: + case DRI2BufferBackLeft: + case DRI2BufferBackRight: +- tiling = I915_TILING_X; ++ hint = INTEL_CREATE_PIXMAP_TILING_X; + break; + } + + if (!pI830->tiling || + (!IS_I965G(pI830) && !pI830->kernel_exec_fencing)) +- tiling = I915_TILING_NONE; ++ hint = 0; ++ ++ pPixmap = (*pScreen->CreatePixmap)(pScreen, ++ pDraw->width, ++ pDraw->height, ++ pDraw->depth, ++ hint); + +- if (tiling != I915_TILING_NONE) { +- bo = i830_get_pixmap_bo(pPixmap); +- drm_intel_bo_set_tiling(bo, &tiling, +- intel_get_pixmap_pitch(pPixmap)); +- } + } + + if (attachments[i] == DRI2BufferDepth) +diff --git a/src/i830_exa.c b/src/i830_exa.c +index b9d6c64..0a22486 100644 +--- a/src/i830_exa.c ++++ b/src/i830_exa.c +@@ -935,29 +935,38 @@ i830_uxa_create_pixmap (ScreenPtr screen, int w, int h, int depth, unsigned usag + if (w && h) + { + unsigned int size; ++ uint32_t tiling = I915_TILING_NONE; + + stride = ROUND_TO((w * pixmap->drawable.bitsPerPixel + 7) / 8, + i830->accel_pixmap_pitch_alignment); + +- /* Use the I915_FENCE_TILING_X even if it may end up being TILING_Y, +- * as it just results in larger alignment. Really, we need to use the +- * usage hint to tell what the pixmap's going to be. +- */ +- stride = i830_get_fence_pitch(i830, stride, I915_TILING_X); +- /* Round the object up to the size of the fence it will live in +- * if necessary. We could potentially make the kernel allocate +- * a larger aperture space and just bind the subset of pages in, +- * but this is easier and also keeps us out of trouble (as much) +- * with drm_intel_bufmgr_check_aperture(). +- */ +- size = i830_get_fence_size(i830, stride * h); ++ if (usage == INTEL_CREATE_PIXMAP_TILING_X) ++ tiling = I915_TILING_X; ++ else if (usage == INTEL_CREATE_PIXMAP_TILING_Y) ++ tiling = I915_TILING_Y; ++ ++ if (tiling == I915_TILING_NONE) { ++ size = stride * h; ++ } else { ++ stride = i830_get_fence_pitch(i830, stride, tiling); ++ /* Round the object up to the size of the fence it will live in ++ * if necessary. We could potentially make the kernel allocate ++ * a larger aperture space and just bind the subset of pages in, ++ * but this is easier and also keeps us out of trouble (as much) ++ * with drm_intel_bufmgr_check_aperture(). ++ */ ++ size = i830_get_fence_size(i830, stride * h); ++ } + + bo = drm_intel_bo_alloc_for_render(i830->bufmgr, "pixmap", size, 0); + if (!bo) { + fbDestroyPixmap (pixmap); + return NullPixmap; + } +- ++ ++ if (tiling != I915_TILING_NONE) ++ drm_intel_bo_set_tiling(bo, &tiling, stride); ++ + screen->ModifyPixmapHeader (pixmap, w, h, 0, 0, stride, NULL); + + i830_uxa_set_pixmap_bo (pixmap, bo); ================================================================ _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
