xf86-video-intel: src/sna/kgem.c src/sna/sna_accel.c src/sna/sna_dri.c
Chris Wilson
ickle at kemper.freedesktop.org
Wed Feb 20 10:55:48 PST 2013
src/sna/kgem.c | 14 ++------------
src/sna/sna_accel.c | 16 +++++++++++-----
src/sna/sna_dri.c | 9 +++++++++
3 files changed, 22 insertions(+), 17 deletions(-)
New commits:
commit b7a96df9b0872867c823dc945add5be04d51c30a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Feb 20 18:46:01 2013 +0000
sna: Honour LinearFramebuffer
The Option was untested, and unsurprisingly was broken.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index e0f804e..c9b2011 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1208,14 +1208,6 @@ inline static uint32_t kgem_pitch_alignment(struct kgem *kgem, unsigned flags)
return kgem->min_alignment;
}
-static uint32_t kgem_untiled_pitch(struct kgem *kgem,
- uint32_t width, uint32_t bpp,
- unsigned flags)
-{
- width = ALIGN(width, 2) * bpp >> 3;
- return ALIGN(width, kgem_pitch_alignment(kgem, flags));
-}
-
void kgem_get_tile_size(struct kgem *kgem, int tiling,
int *tile_width, int *tile_height, int *tile_size)
{
@@ -3473,7 +3465,7 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
{
struct list *cache;
struct kgem_bo *bo;
- uint32_t pitch, untiled_pitch, tiled_height, size;
+ uint32_t pitch, tiled_height, size;
uint32_t handle;
int i, bucket, retry;
@@ -3535,7 +3527,6 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
goto large_inactive;
tiled_height = kgem_aligned_height(kgem, height, tiling);
- untiled_pitch = kgem_untiled_pitch(kgem, width, bpp, flags);
list_for_each_entry(bo, &kgem->large, list) {
assert(!bo->purged);
@@ -3800,7 +3791,6 @@ search_again:
}
if ((flags & CREATE_EXACT) == 0) { /* allow an active near-miss? */
- untiled_pitch = kgem_untiled_pitch(kgem, width, bpp, flags);
i = tiling;
while (--i >= 0) {
tiled_height = kgem_surface_size(kgem, kgem->has_relaxed_fencing, flags,
@@ -3822,7 +3812,7 @@ search_again:
continue;
}
} else
- bo->pitch = untiled_pitch;
+ bo->pitch = pitch;
if (bo->pitch * tiled_height > bytes(bo))
continue;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index a577af6..802fd19 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -557,7 +557,7 @@ pure static uint32_t sna_pixmap_choose_tiling(PixmapPtr pixmap,
tiling = default_tiling(pixmap, tiling);
bit = SNA_TILING_2D;
}
- if ((sna->tiling && (1 << bit)) == 0)
+ if ((sna->tiling & bit) == 0)
tiling = I915_TILING_NONE;
/* Also adjust tiling if it is not supported or likely to
@@ -1372,6 +1372,7 @@ sna_pixmap_create_mappable_gpu(PixmapPtr pixmap)
{
struct sna *sna = to_sna_from_pixmap(pixmap);
struct sna_pixmap *priv = sna_pixmap(pixmap);;
+ unsigned create;
if (wedged(sna))
return false;
@@ -1383,13 +1384,18 @@ sna_pixmap_create_mappable_gpu(PixmapPtr pixmap)
assert(priv->gpu_damage == NULL);
assert(priv->gpu_bo == NULL);
+
+ create = CREATE_GTT_MAP | CREATE_INACTIVE;
+ if (pixmap->usage_hint == SNA_CREATE_FB)
+ create |= CREATE_EXACT | CREATE_SCANOUT;
+
priv->gpu_bo =
kgem_create_2d(&sna->kgem,
pixmap->drawable.width,
pixmap->drawable.height,
pixmap->drawable.bitsPerPixel,
sna_pixmap_choose_tiling(pixmap, DEFAULT_TILING),
- CREATE_GTT_MAP | CREATE_INACTIVE);
+ create);
return priv->gpu_bo && kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo);
}
@@ -3096,10 +3102,10 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
tiling = sna_pixmap_choose_tiling(pixmap, tiling);
create = 0;
- if (priv->cpu_damage && priv->cpu_bo == NULL)
- create = CREATE_GTT_MAP | CREATE_INACTIVE;
- if (flags & MOVE_INPLACE_HINT)
+ if (flags & MOVE_INPLACE_HINT || (priv->cpu_damage && priv->cpu_bo == NULL))
create = CREATE_GTT_MAP | CREATE_INACTIVE;
+ if (pixmap->usage_hint == SNA_CREATE_FB)
+ create |= CREATE_EXACT | CREATE_SCANOUT;
priv->gpu_bo =
kgem_create_2d(&sna->kgem,
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 6979a30..31edf8c 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -1321,6 +1321,15 @@ can_exchange(struct sna * sna,
}
assert(get_private(back)->size == get_private(front)->size);
+ /* prevent an implicit tiling mode change */
+ if (get_private(front)->bo->tiling != get_private(back)->bo->tiling) {
+ DBG(("%s -- no, tiling mismatch: front %d, back=%d\n",
+ __FUNCTION__,
+ get_private(front)->bo->tiling,
+ get_private(back)->bo->tiling));
+ return false;
+ }
+
return true;
}
More information about the xorg-commit
mailing list