diff options
author | Eric Anholt <eric@anholt.net> | 2009-03-02 11:17:27 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-03-02 11:21:02 -0800 |
commit | c0d91bd3ffea329058b63e648d2eae05edd9ad8a (patch) | |
tree | 80d271229f580183444365b298f5cf637e44b95a | |
parent | 5441be42649e4f969ac16c323de2fb5ed93b271a (diff) |
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.
(cherry picked from commit 5bfd73cd31ba197a62f549cdbad1a1270b571027)
-rw-r--r-- | src/i830.h | 11 | ||||
-rw-r--r-- | src/i830_dri.c | 25 | ||||
-rw-r--r-- | src/i830_exa.c | 35 |
3 files changed, 44 insertions, 27 deletions
@@ -1095,4 +1095,15 @@ extern const int I830CopyROP[16]; #define QUIRK_IGNORE_CRT 0x00000080 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 0b156569..bc8d6463 100644 --- a/src/i830_dri.c +++ b/src/i830_dri.c @@ -1862,36 +1862,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 e61f6619..85d884fb 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -883,29 +883,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); |