summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-11-28 18:21:19 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2011-11-28 18:59:50 +0000
commit4e38d22105da2bd97db005dc505e75dcd22291d3 (patch)
tree2bd963950a3c512a7fbf299bdcf227854105bcfd
parent04f47e52da06cc20c2a266da92ba3f8e961433cb (diff)
sna: Tidy kgem_choose_tiling()
Reduce the calls to compute the surface size down to one. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c52
1 files changed, 17 insertions, 35 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 4dea5271..1936ef2f 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -463,7 +463,7 @@ static uint32_t kgem_surface_size(struct kgem *kgem,
/* If it is too wide for the blitter, don't even bother. */
*pitch = ALIGN(width * bpp / 8, tile_width);
if (kgem->gen < 40) {
- if(tiling != I915_TILING_NONE) {
+ if (tiling != I915_TILING_NONE) {
if (*pitch > 8192)
return 0;
for (size = tile_width; size < *pitch; size <<= 1)
@@ -1338,63 +1338,47 @@ int kgem_choose_tiling(struct kgem *kgem, int tiling, int width, int height, int
uint32_t pitch;
if (DBG_NO_TILING)
- return I915_TILING_NONE;
+ return tiling < 0 ? tiling : I915_TILING_NONE;
if (kgem->gen < 40) {
if (tiling) {
if (width * bpp > 8192 * 8) {
DBG(("%s: pitch too large for tliing [%d]\n",
__FUNCTION__, width*bpp/8));
- return I915_TILING_NONE;
- }
-
- if ((width > 2048 || height > 2048) &&
- kgem_surface_size(kgem, false,
- width, height, bpp, I915_TILING_X,
- &pitch) < kgem->max_object_size) {
+ tiling = I915_TILING_NONE;
+ goto done;
+ } else if (width > 2048 || height > 2048) {
DBG(("%s: large buffer (%dx%d), forcing TILING_X\n",
__FUNCTION__, width, height));
- return -I915_TILING_X;
+ tiling = -I915_TILING_X;
}
}
} else {
- if (width*bpp > (MAXSHORT-512) * 8 &&
- kgem_surface_size(kgem, false,
- width, height, bpp, I915_TILING_X,
- &pitch) < kgem->max_object_size) {
+ if (width*bpp > (MAXSHORT-512) * 8) {
DBG(("%s: large pitch [%d], forcing TILING_X\n",
__FUNCTION__, width*bpp/8));
- return -I915_TILING_X;
- }
-
- if (tiling && (width > 8192 || height > 8192) &&
- kgem_surface_size(kgem, false,
- width, height, bpp, I915_TILING_X,
- &pitch) < kgem->max_object_size) {
+ tiling = -I915_TILING_X;
+ } else if (tiling && (width > 8192 || height > 8192)) {
DBG(("%s: large tiled buffer [%dx%d], forcing TILING_X\n",
__FUNCTION__, width, height));
- return -I915_TILING_X;
+ tiling = -I915_TILING_X;
}
}
- if (tiling < 0) {
- assert(kgem_surface_size(kgem, false,
- width, height, bpp, -tiling,
- &pitch) < kgem->max_object_size);
- return tiling;
- }
-
/* First check that we can fence the whole object */
if (tiling &&
kgem_surface_size(kgem, false,
width, height, bpp, tiling,
- &pitch) >= kgem->max_object_size) {
+ &pitch) > kgem->max_object_size) {
DBG(("%s: too large (%dx%d) to be fenced, discarding tiling\n",
__FUNCTION__, width, height));
tiling = I915_TILING_NONE;
goto done;
}
+ if (tiling < 0)
+ return tiling;
+
if (tiling == I915_TILING_Y && height <= 16) {
DBG(("%s: too short [%d] for TILING_Y\n",
__FUNCTION__,height));
@@ -1433,10 +1417,8 @@ int kgem_choose_tiling(struct kgem *kgem, int tiling, int width, int height, int
}
}
- if (tiling &&
- ALIGN(height, 2) * ALIGN(width*bpp, 8*64) < 4096 * 8) {
- DBG(("%s: too small [%d] for TILING_%c\n",
- __FUNCTION__,
+ if (tiling && ALIGN(height, 2) * ALIGN(width*bpp, 8*64) <= 4096 * 8) {
+ DBG(("%s: too small [%d] for TILING_%c\n", __FUNCTION__,
ALIGN(height, 2) * ALIGN(width*bpp, 8*64) / 8,
tiling == I915_TILING_X ? 'X' : 'Y'));
tiling = I915_TILING_NONE;
@@ -1464,7 +1446,7 @@ static bool _kgem_can_create_2d(struct kgem *kgem,
size = kgem_surface_size(kgem, false,
width, height, bpp, tiling, &pitch);
- if (size == 0 || size >= kgem->max_object_size)
+ if (size == 0 || size > kgem->max_object_size)
size = kgem_surface_size(kgem, false,
width, height, bpp,
I915_TILING_NONE, &pitch);