xf86-video-intel: 6 commits - src/intel_list.h src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/sna_accel.c src/sna/sna_composite.c
Chris Wilson
ickle at kemper.freedesktop.org
Thu Mar 8 03:19:06 PST 2012
src/intel_list.h | 2 -
src/sna/gen2_render.c | 26 ++++++++-------------
src/sna/gen3_render.c | 39 +++++++++-----------------------
src/sna/gen4_render.c | 31 ++++++++++---------------
src/sna/gen5_render.c | 31 ++++++++++---------------
src/sna/gen6_render.c | 31 ++++++++++---------------
src/sna/gen7_render.c | 31 ++++++++++---------------
src/sna/kgem.c | 21 +++++++++++------
src/sna/sna_accel.c | 21 ++++++++++++++---
src/sna/sna_composite.c | 58 +++++++++++++++++-------------------------------
10 files changed, 127 insertions(+), 164 deletions(-)
New commits:
commit 5c5ebd6a3ecf3bd83747003bc272a736b7c333c0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 8 11:13:34 2012 +0000
intel: Fix typo s/asert/assert/
The joy of conditional compiles masked this compilation failure when
testing.
Reported-by: Reinhard Karcher <reinhard.karcher at gmx.net>
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/intel_list.h b/src/intel_list.h
index cbadebf..cfaa1ad 100644
--- a/src/intel_list.h
+++ b/src/intel_list.h
@@ -207,7 +207,7 @@ list_append(struct list *entry, struct list *head)
static inline void
__list_del(struct list *prev, struct list *next)
{
- asert(next->prev == prev->next);
+ assert(next->prev == prev->next);
next->prev = prev;
prev->next = next;
}
commit f6474883d325cff443da9ceaa99ec734e6cdc1d6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 8 11:04:05 2012 +0000
sna/gen2+: Use the reduced operator from CompositeRectangles
Do not attempt to further reduce the operator locally in each backend as
the reduction is already performed in the upper layer.
References: https://bugs.freedesktop.org/show_bug.cgi?id=42606
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 597d5f3..6907dd6 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -2348,30 +2348,24 @@ gen2_render_fill_boxes_try_blt(struct sna *sna,
PixmapPtr dst, struct kgem_bo *dst_bo,
const BoxRec *box, int n)
{
- uint8_t alu = GXcopy;
+ uint8_t alu;
uint32_t pixel;
- if (!sna_get_pixel_from_rgba(&pixel,
- color->red,
- color->green,
- color->blue,
- color->alpha,
- format))
+ if (op > PictOpSrc)
return FALSE;
if (op == PictOpClear) {
alu = GXclear;
pixel = 0;
- op = PictOpSrc;
- }
-
- if (op == PictOpOver) {
- if ((pixel & 0xff000000) == 0xff000000)
- op = PictOpSrc;
- }
-
- if (op != PictOpSrc)
+ } else if (!sna_get_pixel_from_rgba(&pixel,
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha,
+ format))
return FALSE;
+ else
+ alu = GXcopy;
return sna_blt_fill_boxes(sna, alu,
dst_bo, dst->drawable.bitsPerPixel,
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 2a18631..d3ed2ef 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -4153,7 +4153,7 @@ gen3_render_fill_boxes_try_blt(struct sna *sna,
PixmapPtr dst, struct kgem_bo *dst_bo,
const BoxRec *box, int n)
{
- uint8_t alu = GXcopy;
+ uint8_t alu;
uint32_t pixel;
if (dst_bo->tiling == I915_TILING_Y) {
@@ -4162,36 +4162,21 @@ gen3_render_fill_boxes_try_blt(struct sna *sna,
return FALSE;
}
- if (color->alpha >= 0xff00) {
- if (op == PictOpOver)
- op = PictOpSrc;
- else if (op == PictOpOutReverse)
- op = PictOpClear;
- else if (op == PictOpAdd &&
- (color->red & color->green & color->blue) >= 0xff00)
- op = PictOpSrc;
- }
+ if (op > PictOpSrc)
+ return FALSE;
- pixel = 0;
if (op == PictOpClear) {
alu = GXclear;
- } else if (op == PictOpSrc) {
- if (color->alpha <= 0x00ff)
- alu = GXclear;
- else if (!sna_get_pixel_from_rgba(&pixel,
- color->red,
- color->green,
- color->blue,
- color->alpha,
- format)) {
- DBG(("%s: unknown format %x\n", __FUNCTION__,
- (uint32_t)format));
- return FALSE;
- }
- } else {
- DBG(("%s: unhandle op %d\n", __FUNCTION__, alu));
+ pixel = 0;
+ } else if (!sna_get_pixel_from_rgba(&pixel,
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha,
+ format))
return FALSE;
- }
+ else
+ alu = GXcopy;
return sna_blt_fill_boxes(sna, alu,
dst_bo, dst->drawable.bitsPerPixel,
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 02454b2..a69852e 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2901,29 +2901,24 @@ gen4_render_fill_boxes(struct sna *sna,
return FALSE;
}
- if (prefer_blt(sna) ||
- too_large(dst->drawable.width, dst->drawable.height) ||
- !gen4_check_dst_format(format)) {
+ if (op <= PictOpSrc &&
+ (prefer_blt(sna) ||
+ too_large(dst->drawable.width, dst->drawable.height) ||
+ !gen4_check_dst_format(format))) {
uint8_t alu = -1;
- if (op == PictOpClear || (op == PictOpOutReverse && color->alpha >= 0xff00))
+ pixel = 0;
+ if (op == PictOpClear)
alu = GXclear;
-
- if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00)) {
+ else if (sna_get_pixel_from_rgba(&pixel,
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha,
+ format))
alu = GXcopy;
- if (color->alpha <= 0x00ff)
- alu = GXclear;
- }
- pixel = 0;
- if ((alu == GXclear ||
- (alu == GXcopy &&
- sna_get_pixel_from_rgba(&pixel,
- color->red,
- color->green,
- color->blue,
- color->alpha,
- format))) &&
+ if (alu != -1 &&
sna_blt_fill_boxes(sna, alu,
dst_bo, dst->drawable.bitsPerPixel,
pixel, box, n))
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 6763edf..01604ef 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -3241,29 +3241,24 @@ gen5_render_fill_boxes(struct sna *sna,
return FALSE;
}
- if (prefer_blt_fill(sna) ||
- too_large(dst->drawable.width, dst->drawable.height) ||
- !gen5_check_dst_format(format)) {
+ if (op <= PictOpSrc &&
+ (prefer_blt_fill(sna) ||
+ too_large(dst->drawable.width, dst->drawable.height) ||
+ !gen5_check_dst_format(format))) {
uint8_t alu = -1;
- if (op == PictOpClear || (op == PictOpOutReverse && color->alpha >= 0xff00))
+ pixel = 0;
+ if (op == PictOpClear)
alu = GXclear;
-
- if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00)) {
+ else if (sna_get_pixel_from_rgba(&pixel,
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha,
+ format))
alu = GXcopy;
- if (color->alpha <= 0x00ff)
- alu = GXclear;
- }
- pixel = 0;
- if ((alu == GXclear ||
- (alu == GXcopy &&
- sna_get_pixel_from_rgba(&pixel,
- color->red,
- color->green,
- color->blue,
- color->alpha,
- format))) &&
+ if (alu != -1 &&
sna_blt_fill_boxes(sna, alu,
dst_bo, dst->drawable.bitsPerPixel,
pixel, box, n))
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 390cb0a..764b629 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3655,29 +3655,24 @@ gen6_render_fill_boxes(struct sna *sna,
return FALSE;
}
- if (prefer_blt_fill(sna, dst_bo) ||
- too_large(dst->drawable.width, dst->drawable.height) ||
- !gen6_check_dst_format(format)) {
+ if (op <= PictOpSrc &&
+ (prefer_blt_fill(sna, dst_bo) ||
+ too_large(dst->drawable.width, dst->drawable.height) ||
+ !gen6_check_dst_format(format))) {
uint8_t alu = -1;
- if (op == PictOpClear || (op == PictOpOutReverse && color->alpha >= 0xff00))
+ pixel = 0;
+ if (op == PictOpClear)
alu = GXclear;
-
- if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00)) {
+ else if (sna_get_pixel_from_rgba(&pixel,
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha,
+ format))
alu = GXcopy;
- if (color->alpha <= 0x00ff)
- alu = GXclear;
- }
- pixel = 0;
- if ((alu == GXclear ||
- (alu == GXcopy &&
- sna_get_pixel_from_rgba(&pixel,
- color->red,
- color->green,
- color->blue,
- color->alpha,
- format))) &&
+ if (alu != -1 &&
sna_blt_fill_boxes(sna, alu,
dst_bo, dst->drawable.bitsPerPixel,
pixel, box, n))
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 2b3f67b..36ea8a1 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3738,29 +3738,24 @@ gen7_render_fill_boxes(struct sna *sna,
return FALSE;
}
- if (prefer_blt_fill(sna, dst_bo) ||
- too_large(dst->drawable.width, dst->drawable.height) ||
- !gen7_check_dst_format(format)) {
+ if (op <= PictOpSrc &&
+ (prefer_blt_fill(sna, dst_bo) ||
+ too_large(dst->drawable.width, dst->drawable.height) ||
+ !gen7_check_dst_format(format))) {
uint8_t alu = -1;
- if (op == PictOpClear || (op == PictOpOutReverse && color->alpha >= 0xff00))
+ pixel = 0;
+ if (op == PictOpClear)
alu = GXclear;
-
- if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00)) {
+ else if (sna_get_pixel_from_rgba(&pixel,
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha,
+ format))
alu = GXcopy;
- if (color->alpha <= 0x00ff)
- alu = GXclear;
- }
- pixel = 0;
- if ((alu == GXclear ||
- (alu == GXcopy &&
- sna_get_pixel_from_rgba(&pixel,
- color->red,
- color->green,
- color->blue,
- color->alpha,
- format))) &&
+ if (alu != -1 &&
sna_blt_fill_boxes(sna, alu,
dst_bo, dst->drawable.bitsPerPixel,
pixel, box, n))
commit 2ae3cd36ae98fa43716ef482e70364e7563cf1ea
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 8 10:51:05 2012 +0000
sna: Tidy marking pixmap->clear for CompositeRectangles
Reduce the two unsightly checks into one.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 38ff99d..a610e7c 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -781,45 +781,29 @@ sna_composite_rectangles(CARD8 op,
/* Clearing a pixmap after creation is a common operation, so take
* advantage and reduce further damage operations.
*/
+ if (region.data == NULL &&
+ region.extents.x2 - region.extents.x1 == pixmap->drawable.width &&
+ region.extents.y2 - region.extents.y1 == pixmap->drawable.height) {
+ sna_damage_all(&priv->gpu_damage,
+ pixmap->drawable.width, pixmap->drawable.height);
+ priv->undamaged = false;
+ if (op <= PictOpSrc) {
+ priv->clear = true;
+ priv->clear_color = 0;
+ if (op == PictOpSrc)
+ sna_get_pixel_from_rgba(&priv->clear_color,
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha,
+ dst->format);
+ DBG(("%s: marking clear [%08x]\n",
+ __FUNCTION__, priv->clear_color));
+ }
+ }
if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
assert_pixmap_contains_box(pixmap, RegionExtents(®ion));
-
- if (region.data == NULL &&
- region.extents.x2 - region.extents.x1 == pixmap->drawable.width &&
- region.extents.y2 - region.extents.y1 == pixmap->drawable.height) {
- sna_damage_all(&priv->gpu_damage,
- pixmap->drawable.width, pixmap->drawable.height);
- priv->undamaged = false;
- if (op <= PictOpSrc) {
- priv->clear = true;
- priv->clear_color = 0;
- if (op == PictOpSrc)
- sna_get_pixel_from_rgba(&priv->clear_color,
- color->red,
- color->green,
- color->blue,
- color->alpha,
- dst->format);
- DBG(("%s: marking clear [%08x]\n",
- __FUNCTION__, priv->clear_color));
- }
- } else
- sna_damage_add(&priv->gpu_damage, ®ion);
- } else if (op <= PictOpSrc &&
- region.data == NULL &&
- region.extents.x2 - region.extents.x1 == pixmap->drawable.width &&
- region.extents.y2 - region.extents.y1 == pixmap->drawable.height) {
- priv->clear = true;
- priv->clear_color = 0;
- if (op == PictOpSrc)
- sna_get_pixel_from_rgba(&priv->clear_color,
- color->red,
- color->green,
- color->blue,
- color->alpha,
- dst->format);
- DBG(("%s: marking clear [%08x]\n",
- __FUNCTION__, priv->clear_color));
+ sna_damage_add(&priv->gpu_damage, ®ion);
}
goto done;
commit 8b21659ef2f9cec799b8215a2e5481667bc744bf
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 8 10:50:32 2012 +0000
sna: Add some assertions around pixmap creation for render operations
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index e961c2c..419d1c6 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2023,6 +2023,7 @@ sna_pixmap_create_upload(ScreenPtr screen,
static inline struct sna_pixmap *
sna_pixmap_mark_active(struct sna *sna, struct sna_pixmap *priv)
{
+ assert(priv->gpu_bo);
if (!priv->pinned && (priv->create & KGEM_CAN_CREATE_LARGE) == 0)
list_move(&priv->inactive, &sna->active_pixmaps);
priv->clear = false;
@@ -2051,7 +2052,7 @@ sna_pixmap_force_to_gpu(PixmapPtr pixmap, unsigned flags)
unsigned mode;
mode = 0;
- if (priv->cpu_damage)
+ if (priv->cpu_damage && !priv->cpu_bo)
mode |= CREATE_INACTIVE;
if (pixmap->usage_hint == SNA_CREATE_FB)
mode |= CREATE_EXACT | CREATE_SCANOUT;
@@ -2132,14 +2133,25 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
sna_damage_reduce(&priv->cpu_damage);
DBG(("%s: CPU damage? %d\n", __FUNCTION__, priv->cpu_damage != NULL));
if (priv->gpu_bo == NULL) {
- if (!wedged(sna) && priv->create & KGEM_CAN_CREATE_GPU)
+ DBG(("%s: creating GPU bo (%dx%d@%d), create=%x\n",
+ __FUNCTION__,
+ pixmap->drawable.width,
+ pixmap->drawable.height,
+ pixmap->drawable.bitsPerPixel,
+ priv->create));
+ assert(!priv->mapped);
+ if (!wedged(sna) && priv->create & KGEM_CAN_CREATE_GPU) {
+ assert(pixmap->drawable.width > 0);
+ assert(pixmap->drawable.height > 0);
+ assert(pixmap->drawable.bitsPerPixel >= 8);
priv->gpu_bo =
kgem_create_2d(&sna->kgem,
pixmap->drawable.width,
pixmap->drawable.height,
pixmap->drawable.bitsPerPixel,
sna_pixmap_choose_tiling(pixmap),
- priv->cpu_damage ? CREATE_GTT_MAP | CREATE_INACTIVE : 0);
+ (priv->cpu_damage && priv->cpu_bo == NULL) ? CREATE_GTT_MAP | CREATE_INACTIVE : 0);
+ }
if (priv->gpu_bo == NULL) {
DBG(("%s: not creating GPU bo\n", __FUNCTION__));
assert(list_is_empty(&priv->list));
@@ -2179,6 +2191,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
Bool ok;
assert(pixmap_contains_damage(pixmap, priv->cpu_damage));
+ DBG(("%s: uploading %d damage boxes\n", __FUNCTION__, n));
ok = FALSE;
if (priv->cpu_bo)
@@ -2225,7 +2238,7 @@ done:
}
}
active:
- return sna_pixmap_mark_active(to_sna_from_pixmap(pixmap), priv);
+ return sna_pixmap_mark_active(sna, priv);
}
static bool must_check sna_validate_pixmap(DrawablePtr draw, PixmapPtr pixmap)
commit 7d74300647dd815ae5b4399f84ea339045d12563
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 8 09:54:16 2012 +0000
sna: Discard unbound partial buffers
Instead of keeping a virgin partial buffer around on its inactive list,
just transfer it to the global bo cache (in actuality destroy it since
it is just a kmalloc with no pages bound).
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index b036d26..2dff2ed 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1246,13 +1246,12 @@ static void kgem_retire_partials(struct kgem *kgem)
assert(bo->base.refcnt == 1);
assert(bo->base.exec == NULL);
- if (!bo->mmapped) {
+ if (!bo->mmapped || bo->base.presumed_offset == 0) {
list_del(&bo->base.list);
kgem_bo_unref(kgem, &bo->base);
continue;
}
- assert(kgem->has_llc || !IS_CPU_MAP(bo->base.map));
bo->base.dirty = false;
bo->base.needs_flush = false;
bo->used = 0;
commit 9eb8ba4df2a99342dbb3569c043d84aa82506aba
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 8 09:42:58 2012 +0000
sna: Preserve the offset alignment when trimming unused rows from partials
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 8e3de97..b036d26 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2062,7 +2062,7 @@ search_linear_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags)
__FUNCTION__));
if ((flags & CREATE_NO_RETIRE) == 0) {
- DBG(("%s: can not retire\n"));
+ DBG(("%s: can not retire\n", __FUNCTION__));
return NULL;
}
@@ -3340,7 +3340,7 @@ void kgem_sync(struct kgem *kgem)
list_for_each_entry(bo, &kgem->sync_list, list)
kgem_bo_sync__cpu(kgem, bo);
- assert (kgem->sync == NULL);
+ assert(kgem->sync == NULL);
}
void kgem_clear_dirty(struct kgem *kgem)
@@ -3812,15 +3812,23 @@ struct kgem_bo *kgem_create_buffer_2d(struct kgem *kgem,
if (height & 1) {
struct kgem_partial_bo *io = (struct kgem_partial_bo *)bo->proxy;
+ int min;
+
+ assert(io->used);
/* Having padded this surface to ensure that accesses to
* the last pair of rows is valid, remove the padding so
* that it can be allocated to other pixmaps.
*/
- if (io->used)
- io->used -= stride;
+ min = bo->delta + height * stride;
+ min = ALIGN(min, 64);
+ if (io->used != min) {
+ DBG(("%s: trimming partial buffer from %d to %d\n",
+ __FUNCTION__, io->used, min));
+ io->used = min;
+ bubble_sort_partial(&kgem->active_partials, io);
+ }
bo->size.bytes -= stride;
- bubble_sort_partial(&kgem->active_partials, io);
}
bo->pitch = stride;
More information about the xorg-commit
mailing list