diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-10-11 09:59:13 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-10-11 10:54:53 +0100 |
commit | 5050fead0ef81785a2a9be735852921463377e04 (patch) | |
tree | 8751881e5c440d16b341704b56a09f587d712def | |
parent | d0184b59095d5b8fab1a65ceba075d29189130d4 (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.c | 38 |
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: |