xf86-video-intel: 2 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen4_vertex.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/gen8_render.c src/sna/gen8_vertex.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Jan 24 06:23:28 PST 2014
src/sna/gen2_render.c | 54 ++++++++++++++++++++++++--------------------------
src/sna/gen3_render.c | 45 ++++++++++++++++++++---------------------
src/sna/gen4_render.c | 14 +++++++++---
src/sna/gen4_vertex.c | 2 -
src/sna/gen5_render.c | 14 +++++++++---
src/sna/gen6_render.c | 14 +++++++++---
src/sna/gen7_render.c | 14 +++++++++---
src/sna/gen8_render.c | 14 +++++++++---
src/sna/gen8_vertex.c | 2 -
9 files changed, 100 insertions(+), 73 deletions(-)
New commits:
commit 294180b3bf78f2c0ae2f1197e1c0819d99009356
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jan 24 14:21:44 2014 +0000
sna/gen3+: Allow for spill when aligning vertices
We need to flush the batch if we run out of space aligning our vertex
buffer - but the test must anticipate the space required for the new
alignment.
Reported-by: Arkadiusz Miskiewicz
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 941b633..5601f4c 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3137,7 +3137,7 @@ gen3_align_vertex(struct sna *sna,
if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) {
DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n",
__FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex));
- if (gen3_vertex_finish(sna) < op->floats_per_vertex)
+ if (gen3_vertex_finish(sna) < 2*op->floats_per_vertex)
kgem_submit(&sna->kgem);
vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex;
diff --git a/src/sna/gen4_vertex.c b/src/sna/gen4_vertex.c
index 38f4cf3..4b3496c 100644
--- a/src/sna/gen4_vertex.c
+++ b/src/sna/gen4_vertex.c
@@ -48,7 +48,7 @@ void gen4_vertex_align(struct sna *sna, const struct sna_composite_op *op)
if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) {
DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n",
__FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex));
- if (gen4_vertex_finish(sna) < op->floats_per_rect) {
+ if (gen4_vertex_finish(sna) < 2*op->floats_per_rect) {
kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
diff --git a/src/sna/gen8_vertex.c b/src/sna/gen8_vertex.c
index dfa4cce..c66d864 100644
--- a/src/sna/gen8_vertex.c
+++ b/src/sna/gen8_vertex.c
@@ -44,7 +44,7 @@ void gen8_vertex_align(struct sna *sna, const struct sna_composite_op *op)
if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) {
DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n",
__FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex));
- if (gen8_vertex_finish(sna) < op->floats_per_rect) {
+ if (gen8_vertex_finish(sna) < 2*op->floats_per_rect) {
kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
commit 4385724dc49dd090e0a5956e287f80b92ebd70e8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jan 24 11:29:26 2014 +0000
sna/gen2+: Inspect composite flags to discard unneeded CPU damage
We can now check whether the Composite operation will require existing
CPU damage and if not discard it.
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 0cb7207..da7049c 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1570,9 +1570,11 @@ static bool
gen2_composite_set_target(struct sna *sna,
struct sna_composite_op *op,
PicturePtr dst,
- int x, int y, int w, int h)
+ int x, int y, int w, int h,
+ bool partial)
{
BoxRec box;
+ unsigned hint;
op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
op->dst.format = dst->format;
@@ -1587,9 +1589,14 @@ gen2_composite_set_target(struct sna *sna,
} else
sna_render_picture_extents(dst, &box);
- op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
- PREFER_GPU | FORCE_GPU | RENDER_GPU,
- &box, &op->damage);
+ hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+ if (!partial) {
+ hint |= IGNORE_CPU;
+ if (w == op->dst.width && h == op->dst.height)
+ hint |= REPLACES;
+ }
+
+ op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
if (op->dst.bo == NULL)
return false;
@@ -1607,6 +1614,12 @@ gen2_composite_set_target(struct sna *sna,
op->damage ? *op->damage : (void *)-1));
assert(op->dst.bo->proxy == NULL);
+
+ if (((too_large(op->dst.width, op->dst.height) ||
+ op->dst.bo->pitch > MAX_3D_PITCH)) &&
+ !sna_render_composite_redirect(sna, op, x, y, w, h, partial))
+ return false;
+
return true;
}
@@ -1856,24 +1869,17 @@ gen2_render_composite(struct sna *sna,
width, height,
tmp);
+ tmp->op = op;
+ sna_render_composite_redirect_init(tmp);
+
if (!gen2_composite_set_target(sna, tmp, dst,
- dst_x, dst_y, width, height)) {
+ dst_x, dst_y, width, height,
+ flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data != NULL)) {
DBG(("%s: unable to set render target\n",
__FUNCTION__));
goto fallback;
}
- tmp->op = op;
-
- sna_render_composite_redirect_init(tmp);
- if (too_large(tmp->dst.width, tmp->dst.height) ||
- tmp->dst.bo->pitch > MAX_3D_PITCH) {
- if (!sna_render_composite_redirect(sna, tmp,
- dst_x, dst_y, width, height,
- op > PictOpSrc || dst->pCompositeClip->data != NULL))
- goto fallback;
- }
-
switch (gen2_composite_picture(sna, src, &tmp->src,
src_x, src_y,
width, height,
@@ -2531,24 +2537,16 @@ gen2_render_composite_spans(struct sna *sna,
width, height, flags, tmp);
}
+ tmp->base.op = op;
+ sna_render_composite_redirect_init(&tmp->base);
if (!gen2_composite_set_target(sna, &tmp->base, dst,
- dst_x, dst_y, width, height)) {
+ dst_x, dst_y, width, height,
+ true)) {
DBG(("%s: unable to set render target\n",
__FUNCTION__));
return false;
}
- tmp->base.op = op;
-
- sna_render_composite_redirect_init(&tmp->base);
- if (too_large(tmp->base.dst.width, tmp->base.dst.height) ||
- tmp->base.dst.bo->pitch > MAX_3D_PITCH) {
- if (!sna_render_composite_redirect(sna, &tmp->base,
- dst_x, dst_y, width, height,
- true))
- return false;
- }
-
switch (gen2_composite_picture(sna, src, &tmp->base.src,
src_x, src_y,
width, height,
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 0079bad..941b633 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3151,9 +3151,11 @@ static bool
gen3_composite_set_target(struct sna *sna,
struct sna_composite_op *op,
PicturePtr dst,
- int x, int y, int w, int h)
+ int x, int y, int w, int h,
+ bool partial)
{
BoxRec box;
+ unsigned hint;
op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
op->dst.format = dst->format;
@@ -3168,9 +3170,14 @@ gen3_composite_set_target(struct sna *sna,
} else
sna_render_picture_extents(dst, &box);
- op->dst.bo = sna_drawable_use_bo(dst->pDrawable,
- PREFER_GPU | FORCE_GPU | RENDER_GPU,
- &box, &op->damage);
+ hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+ if (!partial) {
+ hint |= IGNORE_CPU;
+ if (w == op->dst.width && h == op->dst.height)
+ hint |= REPLACES;
+ }
+
+ op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
if (op->dst.bo == NULL)
return false;
@@ -3196,6 +3203,12 @@ gen3_composite_set_target(struct sna *sna,
op->damage ? *op->damage : (void *)-1));
assert(op->dst.bo->proxy == NULL);
+
+ if ((too_large(op->dst.width, op->dst.height) ||
+ !gen3_check_pitch_3d(op->dst.bo)) &&
+ !sna_render_composite_redirect(sna, op, x, y, w, h, partial))
+ return false;
+
return true;
}
@@ -3489,7 +3502,8 @@ gen3_render_composite(struct sna *sna,
tmp);
if (!gen3_composite_set_target(sna, tmp, dst,
- dst_x, dst_y, width, height)) {
+ dst_x, dst_y, width, height,
+ flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data)) {
DBG(("%s: unable to set render target\n",
__FUNCTION__));
goto fallback;
@@ -3497,14 +3511,6 @@ gen3_render_composite(struct sna *sna,
tmp->op = op;
tmp->rb_reversed = gen3_dst_rb_reversed(tmp->dst.format);
- if (too_large(tmp->dst.width, tmp->dst.height) ||
- !gen3_check_pitch_3d(tmp->dst.bo)) {
- if (!sna_render_composite_redirect(sna, tmp,
- dst_x, dst_y, width, height,
- op > PictOpSrc || dst->pCompositeClip->data))
- goto fallback;
- }
-
tmp->u.gen3.num_constants = 0;
tmp->src.u.gen3.type = SHADER_TEXTURE;
tmp->src.is_affine = true;
@@ -4848,7 +4854,8 @@ gen3_render_composite_spans(struct sna *sna,
}
if (!gen3_composite_set_target(sna, &tmp->base, dst,
- dst_x, dst_y, width, height)) {
+ dst_x, dst_y, width, height,
+ true)) {
DBG(("%s: unable to set render target\n",
__FUNCTION__));
return false;
@@ -4856,14 +4863,6 @@ gen3_render_composite_spans(struct sna *sna,
tmp->base.op = op;
tmp->base.rb_reversed = gen3_dst_rb_reversed(tmp->base.dst.format);
- if (too_large(tmp->base.dst.width, tmp->base.dst.height) ||
- !gen3_check_pitch_3d(tmp->base.dst.bo)) {
- if (!sna_render_composite_redirect(sna, &tmp->base,
- dst_x, dst_y, width, height,
- true))
- return false;
- }
-
tmp->base.src.u.gen3.type = SHADER_TEXTURE;
tmp->base.src.is_affine = true;
DBG(("%s: preparing source\n", __FUNCTION__));
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 1a559f0..4f4a4c8 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1635,6 +1635,7 @@ gen4_composite_set_target(struct sna *sna,
bool partial)
{
BoxRec box;
+ unsigned hint;
op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
op->dst.width = op->dst.pixmap->drawable.width;
@@ -1648,9 +1649,14 @@ gen4_composite_set_target(struct sna *sna,
} else
sna_render_picture_extents(dst, &box);
- op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
- PREFER_GPU | FORCE_GPU | RENDER_GPU,
- &box, &op->damage);
+ hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+ if (!partial) {
+ hint |= IGNORE_CPU;
+ if (w == op->dst.width && h == op->dst.height)
+ hint |= REPLACES;
+ }
+
+ op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
if (op->dst.bo == NULL)
return false;
@@ -1924,7 +1930,7 @@ gen4_render_composite(struct sna *sna,
if (!gen4_composite_set_target(sna, tmp, dst,
dst_x, dst_y, width, height,
- op > PictOpSrc || dst->pCompositeClip->data)) {
+ flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data)) {
DBG(("%s: failed to set composite target\n", __FUNCTION__));
goto fallback;
}
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 23b0c14..3396acd 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1571,6 +1571,7 @@ gen5_composite_set_target(struct sna *sna,
bool partial)
{
BoxRec box;
+ unsigned hint;
op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
op->dst.width = op->dst.pixmap->drawable.width;
@@ -1584,9 +1585,14 @@ gen5_composite_set_target(struct sna *sna,
} else
sna_render_picture_extents(dst, &box);
- op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
- PREFER_GPU | FORCE_GPU | RENDER_GPU,
- &box, &op->damage);
+ hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+ if (!partial) {
+ hint |= IGNORE_CPU;
+ if (w == op->dst.width && h == op->dst.height)
+ hint |= REPLACES;
+ }
+
+ op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
if (op->dst.bo == NULL)
return false;
@@ -1863,7 +1869,7 @@ gen5_render_composite(struct sna *sna,
if (!gen5_composite_set_target(sna, tmp, dst,
dst_x, dst_y, width, height,
- op > PictOpSrc || dst->pCompositeClip->data)) {
+ flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data)) {
DBG(("%s: failed to set composite target\n", __FUNCTION__));
goto fallback;
}
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index d0e202f..a117bf8 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1828,6 +1828,7 @@ gen6_composite_set_target(struct sna *sna,
bool partial)
{
BoxRec box;
+ unsigned int hint;
op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
op->dst.format = dst->format;
@@ -1842,9 +1843,14 @@ gen6_composite_set_target(struct sna *sna,
} else
sna_render_picture_extents(dst, &box);
- op->dst.bo = sna_drawable_use_bo(dst->pDrawable,
- PREFER_GPU | FORCE_GPU | RENDER_GPU,
- &box, &op->damage);
+ hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+ if (!partial) {
+ hint |= IGNORE_CPU;
+ if (w == op->dst.width && h == op->dst.height)
+ hint |= REPLACES;
+ }
+
+ op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
if (op->dst.bo == NULL)
return false;
@@ -2159,7 +2165,7 @@ gen6_render_composite(struct sna *sna,
tmp->op = op;
if (!gen6_composite_set_target(sna, tmp, dst,
dst_x, dst_y, width, height,
- op > PictOpSrc || dst->pCompositeClip->data))
+ flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data))
goto fallback;
switch (gen6_composite_picture(sna, src, &tmp->src,
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 1ea7392..eec6d65 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2108,6 +2108,7 @@ gen7_composite_set_target(struct sna *sna,
bool partial)
{
BoxRec box;
+ unsigned int hint;
op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
op->dst.format = dst->format;
@@ -2123,9 +2124,14 @@ gen7_composite_set_target(struct sna *sna,
} else
sna_render_picture_extents(dst, &box);
- op->dst.bo = sna_drawable_use_bo(dst->pDrawable,
- PREFER_GPU | FORCE_GPU | RENDER_GPU,
- &box, &op->damage);
+ hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+ if (!partial) {
+ hint |= IGNORE_CPU;
+ if (w == op->dst.width && h == op->dst.height)
+ hint |= REPLACES;
+ }
+
+ op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
if (op->dst.bo == NULL)
return false;
@@ -2440,7 +2446,7 @@ gen7_render_composite(struct sna *sna,
tmp->op = op;
if (!gen7_composite_set_target(sna, tmp, dst,
dst_x, dst_y, width, height,
- op > PictOpSrc || dst->pCompositeClip->data))
+ flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data))
goto fallback;
switch (gen7_composite_picture(sna, src, &tmp->src,
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index 13e1662..fcc37ab 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -1859,6 +1859,7 @@ gen8_composite_set_target(struct sna *sna,
bool partial)
{
BoxRec box;
+ unsigned int hint;
op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
op->dst.format = dst->format;
@@ -1874,9 +1875,14 @@ gen8_composite_set_target(struct sna *sna,
} else
sna_render_picture_extents(dst, &box);
- op->dst.bo = sna_drawable_use_bo(dst->pDrawable,
- PREFER_GPU | FORCE_GPU | RENDER_GPU,
- &box, &op->damage);
+ hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+ if (!partial) {
+ hint |= IGNORE_CPU;
+ if (w == op->dst.width && h == op->dst.height)
+ hint |= REPLACES;
+ }
+
+ op->dst.bo = sna_drawable_use_bo(dst->pDrawable, hint, &box, &op->damage);
if (op->dst.bo == NULL)
return false;
@@ -2191,7 +2197,7 @@ gen8_render_composite(struct sna *sna,
tmp->op = op;
if (!gen8_composite_set_target(sna, tmp, dst,
dst_x, dst_y, width, height,
- op > PictOpSrc || dst->pCompositeClip->data))
+ flags & COMPOSITE_PARTIAL || op > PictOpSrc || dst->pCompositeClip->data))
goto fallback;
switch (gen8_composite_picture(sna, src, &tmp->src,
More information about the xorg-commit
mailing list