From 8e702044b3816002011488c56f1ec9c6b9682eee Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 4 Mar 2010 17:13:02 +0000 Subject: [PATCH] drm/i915: Handle clip/combine coords for spans. --- src/drm/cairo-drm-i915-spans.c | 71 ++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/src/drm/cairo-drm-i915-spans.c b/src/drm/cairo-drm-i915-spans.c index 38bdfed38..6ede4cc4e 100644 --- a/src/drm/cairo-drm-i915-spans.c +++ b/src/drm/cairo-drm-i915-spans.c @@ -280,8 +280,13 @@ i915_span_generic (i915_spans_t *spans, *vertices++ = alpha; if (spans->need_clip_surface) { s = x1, t = y1; - cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); - *vertices++ = s; *vertices++ = t; + cairo_matrix_transform_point (&spans->shader.clip.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } + if (spans->shader.need_combine) { + s = x1, t = y1; + cairo_matrix_transform_point (&spans->shader.dst.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); } /* bottom left */ @@ -305,8 +310,13 @@ i915_span_generic (i915_spans_t *spans, *vertices++ = alpha; if (spans->need_clip_surface) { s = x0, t = y1; - cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); - *vertices++ = s; *vertices++ = t; + cairo_matrix_transform_point (&spans->shader.clip.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } + if (spans->shader.need_combine) { + s = x0, t = y1; + cairo_matrix_transform_point (&spans->shader.dst.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); } /* top left */ @@ -330,8 +340,13 @@ i915_span_generic (i915_spans_t *spans, *vertices++ = alpha; if (spans->need_clip_surface) { s = x0, t = y0; - cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); - *vertices++ = s; *vertices++ = t; + cairo_matrix_transform_point (&spans->shader.clip.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } + if (spans->shader.need_combine) { + s = x0, t = y0; + cairo_matrix_transform_point (&spans->shader.dst.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); } } @@ -543,28 +558,6 @@ i915_spans_init (i915_spans_t *spans, if (unlikely (status)) return status; - if (! spans->need_clip_surface) { - switch (spans->shader.source.type.vertex) { - case VS_CONSTANT: - spans->span = i915_span_constant; - break; - case VS_LINEAR: - spans->span = i915_span_linear; - break; - case VS_TEXTURE: - spans->span = i915_span_texture; - break; - case VS_TEXTURE_16: - spans->span = i915_span_texture16; - break; - default: - spans->span = i915_span_generic; - break; - } - } else { - spans->span = i915_span_generic; - } - spans->rectangle_size = 3 * (2 + i915_shader_num_texcoords (&spans->shader)); return CAIRO_STATUS_SUCCESS; } @@ -626,6 +619,28 @@ i915_clip_and_composite_spans (i915_surface_t *dst, if (unlikely (status)) goto CLEANUP_DEVICE; + if (!spans.shader.need_combine && ! spans.need_clip_surface) { + switch (spans.shader.source.type.vertex) { + case VS_CONSTANT: + spans.span = i915_span_constant; + break; + case VS_LINEAR: + spans.span = i915_span_linear; + break; + case VS_TEXTURE: + spans.span = i915_span_texture; + break; + case VS_TEXTURE_16: + spans.span = i915_span_texture16; + break; + default: + spans.span = i915_span_generic; + break; + } + } else { + spans.span = i915_span_generic; + } + status = draw_func (draw_closure, &spans.renderer, spans.extents); if (spans.clip_region != NULL && status == CAIRO_STATUS_SUCCESS) { intel_bo_unmap (spans.tail->bo);