summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-10-11 09:59:13 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-10-11 10:54:53 +0100
commit5050fead0ef81785a2a9be735852921463377e04 (patch)
tree8751881e5c440d16b341704b56a09f587d712def
parentd0184b59095d5b8fab1a65ceba075d29189130d4 (diff)
sna/gen3: avoid applying zero offset to common spans
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen3_render.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index dcaf0ff7..e25e71ba 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2454,6 +2454,21 @@ gen3_emit_composite_spans_primitive_zero(struct sna *sna,
}
static void
+gen3_emit_composite_spans_primitive_zero_no_offset(struct sna *sna,
+ const struct sna_composite_spans_op *op,
+ const BoxRec *box,
+ float opacity)
+{
+ float *v = sna->render.vertex_data + sna->render.vertex_used;
+ sna->render.vertex_used += 6;
+
+ v[0] = box->x2;
+ v[3] = v[1] = box->y2;
+ v[4] = v[2] = box->x1;
+ v[5] = box->y1;
+}
+
+static void
gen3_emit_composite_spans_primitive_constant(struct sna *sna,
const struct sna_composite_spans_op *op,
const BoxRec *box,
@@ -2470,6 +2485,22 @@ gen3_emit_composite_spans_primitive_constant(struct sna *sna,
}
static void
+gen3_emit_composite_spans_primitive_constant_no_offset(struct sna *sna,
+ const struct sna_composite_spans_op *op,
+ const BoxRec *box,
+ float opacity)
+{
+ float *v = sna->render.vertex_data + sna->render.vertex_used;
+ sna->render.vertex_used += 9;
+
+ v[0] = box->x2;
+ v[6] = v[3] = box->x1;
+ v[4] = v[1] = box->y2;
+ v[7] = box->y1;
+ v[8] = v[5] = v[2] = opacity;
+}
+
+static void
gen3_emit_composite_spans_primitive_identity_source(struct sna *sna,
const struct sna_composite_spans_op *op,
const BoxRec *box,
@@ -2698,6 +2729,8 @@ gen3_render_composite_spans(struct sna *sna,
int16_t width, int16_t height,
struct sna_composite_spans_op *tmp)
{
+ bool no_offset;
+
DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
src_x, src_y, dst_x, dst_y, width, height));
@@ -2759,15 +2792,16 @@ gen3_render_composite_spans(struct sna *sna,
if (tmp->base.src.u.gen3.type != SHADER_ZERO)
tmp->base.mask.u.gen3.type = SHADER_OPACITY;
+ no_offset = tmp->base.dst.x == 0 && tmp->base.dst.y == 0;
tmp->prim_emit = gen3_emit_composite_spans_primitive;
switch (tmp->base.src.u.gen3.type) {
case SHADER_NONE:
assert(0);
case SHADER_ZERO:
- tmp->prim_emit = gen3_emit_composite_spans_primitive_zero;
+ tmp->prim_emit = no_offset ? gen3_emit_composite_spans_primitive_zero_no_offset : gen3_emit_composite_spans_primitive_zero;
break;
case SHADER_CONSTANT:
- tmp->prim_emit = gen3_emit_composite_spans_primitive_constant;
+ tmp->prim_emit = no_offset ? gen3_emit_composite_spans_primitive_constant_no_offset : gen3_emit_composite_spans_primitive_constant;
break;
case SHADER_LINEAR:
case SHADER_RADIAL: