xf86-video-intel: src/sna/kgem.c
Chris Wilson
ickle at kemper.freedesktop.org
Sun May 31 04:36:00 PDT 2015
src/sna/kgem.c | 85 +++++++++++++++++++++++++++++----------------------------
1 file changed, 44 insertions(+), 41 deletions(-)
New commits:
commit db78a3449cfba6cfa4760b2333bf7c083eb991d6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sun May 31 12:30:16 2015 +0100
sna: Keep pitch even for I915_TILING_NONE surfaces
We have to ignore the return value of the pitch for untiled 2D surfaces
(since the kernel clears the tiling stride parameter).
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index ef1c12d..832ddb1 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -445,6 +445,15 @@ static bool kgem_set_tiling(struct kgem *kgem, struct kgem_bo *bo,
struct drm_i915_gem_set_tiling set_tiling;
int err;
+ if (tiling == bo->tiling) {
+ if (tiling == I915_TILING_NONE) {
+ bo->pitch = stride;
+ return true;
+ }
+ if (stride == bo->pitch)
+ return true;
+ }
+
if (DBG_NO_TILING)
return false;
@@ -452,11 +461,11 @@ static bool kgem_set_tiling(struct kgem *kgem, struct kgem_bo *bo,
restart:
set_tiling.handle = bo->handle;
set_tiling.tiling_mode = tiling;
- set_tiling.stride = stride;
+ set_tiling.stride = tiling ? stride : 0;
if (ioctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling) == 0) {
bo->tiling = set_tiling.tiling_mode;
- bo->pitch = set_tiling.stride;
+ bo->pitch = set_tiling.tiling_mode ? set_tiling.stride : stride;
return set_tiling.tiling_mode == tiling;
}
@@ -4356,7 +4365,7 @@ retry_large:
goto discard;
if (bo->tiling != I915_TILING_NONE) {
- if (use_active)
+ if (use_active && kgem->gen < 040)
goto discard;
if (!kgem_set_tiling(kgem, bo,
@@ -4445,9 +4454,10 @@ discard:
break;
}
- if (I915_TILING_NONE != bo->tiling &&
- !kgem_set_tiling(kgem, bo, I915_TILING_NONE, 0))
- continue;
+ if (!kgem_set_tiling(kgem, bo, I915_TILING_NONE, 0)) {
+ kgem_bo_free(kgem, bo);
+ break;
+ }
kgem_bo_remove_from_inactive(kgem, bo);
assert(list_is_empty(&bo->vma));
@@ -4500,8 +4510,10 @@ discard:
if (first)
continue;
- if (!kgem_set_tiling(kgem, bo, I915_TILING_NONE, 0))
- continue;
+ if (!kgem_set_tiling(kgem, bo, I915_TILING_NONE, 0)) {
+ kgem_bo_free(kgem, bo);
+ break;
+ }
}
assert(bo->tiling == I915_TILING_NONE);
assert(bo->pitch == 0);
@@ -5261,11 +5273,8 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
if (num_pages(bo) < size)
continue;
- if (bo->pitch != pitch || bo->tiling != tiling) {
- if (!kgem_set_tiling(kgem, bo,
- tiling, pitch))
- continue;
- }
+ if (!kgem_set_tiling(kgem, bo, tiling, pitch))
+ continue;
}
kgem_bo_remove_from_active(kgem, bo);
@@ -5291,11 +5300,8 @@ large_inactive:
if (size > num_pages(bo))
continue;
- if (bo->tiling != tiling ||
- (tiling != I915_TILING_NONE && bo->pitch != pitch)) {
- if (!kgem_set_tiling(kgem, bo, tiling, pitch))
- continue;
- }
+ if (!kgem_set_tiling(kgem, bo, tiling, pitch))
+ continue;
if (bo->purged && !kgem_bo_clear_purgeable(kgem, bo)) {
kgem_bo_free(kgem, bo);
@@ -5368,7 +5374,7 @@ large_inactive:
}
assert(bo->tiling == tiling);
- bo->pitch = pitch;
+ assert(bo->pitch >= pitch);
bo->delta = 0;
bo->unique_id = kgem_get_unique_id(kgem);
@@ -5434,12 +5440,13 @@ search_active:
if (num_pages(bo) < size)
continue;
- if (bo->pitch != pitch &&
- !kgem_set_tiling(kgem, bo, tiling, pitch)) {
+ if (!kgem_set_tiling(kgem, bo, tiling, pitch)) {
kgem_bo_free(kgem, bo);
break;
}
}
+ assert(bo->tiling == tiling);
+ assert(bo->pitch >= pitch);
kgem_bo_remove_from_active(kgem, bo);
@@ -5494,14 +5501,12 @@ search_active:
if (num_pages(bo) < size)
continue;
- if (bo->tiling != tiling ||
- (tiling != I915_TILING_NONE && bo->pitch != pitch)) {
- if (!kgem_set_tiling(kgem, bo,
- tiling, pitch)) {
- kgem_bo_free(kgem, bo);
- break;
- }
+ if (!kgem_set_tiling(kgem, bo, tiling, pitch)) {
+ kgem_bo_free(kgem, bo);
+ break;
}
+ assert(bo->tiling == tiling);
+ assert(bo->pitch >= pitch);
kgem_bo_remove_from_active(kgem, bo);
@@ -5583,12 +5588,9 @@ search_inactive:
continue;
}
- if (bo->tiling != tiling ||
- (tiling != I915_TILING_NONE && bo->pitch != pitch)) {
- if (!kgem_set_tiling(kgem, bo, tiling, pitch)) {
- kgem_bo_free(kgem, bo);
- break;
- }
+ if (!kgem_set_tiling(kgem, bo, tiling, pitch)) {
+ kgem_bo_free(kgem, bo);
+ break;
}
if (bo->purged && !kgem_bo_clear_purgeable(kgem, bo)) {
@@ -5599,6 +5601,8 @@ search_inactive:
kgem_bo_remove_from_inactive(kgem, bo);
assert(list_is_empty(&bo->list));
assert(list_is_empty(&bo->vma));
+ assert(bo->tiling == tiling);
+ assert(bo->pitch >= pitch);
bo->delta = 0;
bo->unique_id = kgem_get_unique_id(kgem);
@@ -5646,12 +5650,12 @@ search_inactive:
kgem_bo_remove_from_active(kgem, bo);
__kgem_bo_clear_busy(bo);
- if (tiling != I915_TILING_NONE && bo->pitch != pitch) {
- if (!kgem_set_tiling(kgem, bo, tiling, pitch)) {
- kgem_bo_free(kgem, bo);
- goto no_retire;
- }
+ if (!kgem_set_tiling(kgem, bo, tiling, pitch)) {
+ kgem_bo_free(kgem, bo);
+ goto no_retire;
}
+ assert(bo->tiling == tiling);
+ assert(bo->pitch >= pitch);
bo->unique_id = kgem_get_unique_id(kgem);
bo->delta = 0;
@@ -5697,8 +5701,7 @@ create:
}
bo->unique_id = kgem_get_unique_id(kgem);
- if (tiling == I915_TILING_NONE ||
- kgem_set_tiling(kgem, bo, tiling, pitch)) {
+ if (kgem_set_tiling(kgem, bo, tiling, pitch)) {
if (flags & CREATE_SCANOUT)
__kgem_bo_make_scanout(kgem, bo, width, height);
} else {
More information about the xorg-commit
mailing list