xf86-video-intel: 3 commits - src/i830.h src/i830_uxa.c src/i915_render.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Jun 1 15:16:43 PDT 2010


 src/i830.h        |    4 
 src/i830_uxa.c    |    4 
 src/i915_render.c |  296 +++++++++++++++++++++---------------------------------
 3 files changed, 125 insertions(+), 179 deletions(-)

New commits:
commit 2989f51caf3134460c2551de597e7e54fe74ee92
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jun 1 23:08:02 2010 +0100

    i830: Remove unused coord-adjust.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i830.h b/src/i830.h
index 9a46af0..8c96841 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -332,9 +332,6 @@ typedef struct intel_screen_private {
 	float scale_units[2][2];
 	/** Transform pointers for src/mask, or NULL if identity */
 	PictTransform *transform[2];
-	float dst_coord_adjust;
-	float src_coord_adjust;
-	float mask_coord_adjust;
 
 	PixmapPtr render_source, render_mask, render_dest;
 	PicturePtr render_source_picture, render_mask_picture, render_dest_picture;
commit dc402334f4e9b0de624bc89cd77eae4ec7cf1708
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jun 1 23:03:19 2010 +0100

    i915: Centre sampling.
    
    Use centre sampling of textures to match pixman, and remove numerous
    off-by-one and visual artefacts when rendering. The classic example for
    this is cairo/text/xcomposite-projection where the edge of the rotated
    rectangle is jaggy due to the incorrect sample position.
    
    Fixes:
    
      Bug 16917  - [i915] Blur on y-axis also when only x-axis is scaled
                   billiear
      https://bugs.freedesktop.org/show_bug.cgi?id=16917
    
    And about 15 tests from the Cairo test suite.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i915_render.c b/src/i915_render.c
index 96ac09d..c71a7c8 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -35,8 +35,6 @@
 #include "i915_reg.h"
 #include "i915_3d.h"
 
-#define PIXEL_CENTRE_SAMPLE 0
-
 struct formatinfo {
 	int fmt;
 	uint32_t card_fmt;
@@ -176,9 +174,7 @@ static Bool i915_get_dest_format(PicturePtr dest_picture, uint32_t * dst_format)
 				     (int)dest_picture->format);
 		return FALSE;
 	}
-#if PIXEL_CENTRE_SAMPLE
 	*dst_format |= DSTORG_HORT_BIAS(0x8) | DSTORG_VERT_BIAS(0x8);
-#endif
 	return TRUE;
 }
 
@@ -397,19 +393,15 @@ i915_emit_composite_primitive_constant(PixmapPtr dest,
 {
 	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	float x, y;
-
-	x = dstX + intel->dst_coord_adjust;
-	y = dstY + intel->dst_coord_adjust;
 
-	OUT_VERTEX(x + w);
-	OUT_VERTEX(y + h);
+	OUT_VERTEX(dstX + w);
+	OUT_VERTEX(dstY + h);
 
-	OUT_VERTEX(x);
-	OUT_VERTEX(y + h);
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY + h);
 
-	OUT_VERTEX(x);
-	OUT_VERTEX(y);
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY);
 }
 
 static void
@@ -421,27 +413,21 @@ i915_emit_composite_primitive_identity_source(PixmapPtr dest,
 {
 	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	float dst_x, dst_y, src_x, src_y;
-
-	dst_x = dstX + intel->dst_coord_adjust;
-	dst_y = dstY + intel->dst_coord_adjust;
-	src_x = srcX + intel->src_coord_adjust;
-	src_y = srcY + intel->src_coord_adjust;
-
-	OUT_VERTEX(dst_x + w);
-	OUT_VERTEX(dst_y + h);
-	OUT_VERTEX((src_x + w) * intel->scale_units[0][0]);
-	OUT_VERTEX((src_y + h) * intel->scale_units[0][1]);
-
-	OUT_VERTEX(dst_x);
-	OUT_VERTEX(dst_y + h);
-	OUT_VERTEX(src_x * intel->scale_units[0][0]);
-	OUT_VERTEX((src_y + h) * intel->scale_units[0][1]);
-
-	OUT_VERTEX(dst_x);
-	OUT_VERTEX(dst_y);
-	OUT_VERTEX(src_x * intel->scale_units[0][0]);
-	OUT_VERTEX(src_y * intel->scale_units[0][1]);
+
+	OUT_VERTEX(dstX + w);
+	OUT_VERTEX(dstY + h);
+	OUT_VERTEX((srcX + w) * intel->scale_units[0][0]);
+	OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
+
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY + h);
+	OUT_VERTEX(srcX * intel->scale_units[0][0]);
+	OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
+
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY);
+	OUT_VERTEX(srcX * intel->scale_units[0][0]);
+	OUT_VERTEX(srcY * intel->scale_units[0][1]);
 }
 
 static void
@@ -453,44 +439,38 @@ i915_emit_composite_primitive_affine_source(PixmapPtr dest,
 {
 	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	float x, y, src_x[3], src_y[3];
+	float src_x[3], src_y[3];
 
-	x = srcX + intel->src_coord_adjust;
-	y = srcY + intel->src_coord_adjust;
-
-	if (!i830_get_transformed_coordinates(x, y,
+	if (!i830_get_transformed_coordinates(srcX, srcY,
 					      intel->transform[0],
 					      &src_x[0],
 					      &src_y[0]))
 		return;
 
-	if (!i830_get_transformed_coordinates(x, y + h,
+	if (!i830_get_transformed_coordinates(srcX, srcY + h,
 					      intel->transform[0],
 					      &src_x[1],
 					      &src_y[1]))
 		return;
 
-	if (!i830_get_transformed_coordinates(x + w, y + h,
+	if (!i830_get_transformed_coordinates(srcX + w, srcY + h,
 					      intel->transform[0],
 					      &src_x[2],
 					      &src_y[2]))
 		return;
 
-	x = dstX + intel->dst_coord_adjust;
-	y = dstY + intel->dst_coord_adjust;
-
-	OUT_VERTEX(x + w);
-	OUT_VERTEX(y + h);
+	OUT_VERTEX(dstX + w);
+	OUT_VERTEX(dstY + h);
 	OUT_VERTEX(src_x[2] * intel->scale_units[0][0]);
 	OUT_VERTEX(src_y[2] * intel->scale_units[0][1]);
 
-	OUT_VERTEX(x);
-	OUT_VERTEX(y + h);
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY + h);
 	OUT_VERTEX(src_x[1] * intel->scale_units[0][0]);
 	OUT_VERTEX(src_y[1] * intel->scale_units[0][1]);
 
-	OUT_VERTEX(x);
-	OUT_VERTEX(y);
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY);
 	OUT_VERTEX(src_x[0] * intel->scale_units[0][0]);
 	OUT_VERTEX(src_y[0] * intel->scale_units[0][1]);
 }
@@ -504,27 +484,21 @@ i915_emit_composite_primitive_constant_identity_mask(PixmapPtr dest,
 {
 	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	float x, y, mx, my;
-
-	x = dstX + intel->dst_coord_adjust;
-	y = dstY + intel->dst_coord_adjust;
-	mx = maskX + intel->mask_coord_adjust;
-	my = maskY + intel->mask_coord_adjust;
-
-	OUT_VERTEX(x + w);
-	OUT_VERTEX(y + h);
-	OUT_VERTEX((mx + w) * intel->scale_units[0][0]);
-	OUT_VERTEX((my + h) * intel->scale_units[0][1]);
-
-	OUT_VERTEX(x);
-	OUT_VERTEX(y + h);
-	OUT_VERTEX(mx * intel->scale_units[0][0]);
-	OUT_VERTEX((my + h) * intel->scale_units[0][1]);
-
-	OUT_VERTEX(x);
-	OUT_VERTEX(y);
-	OUT_VERTEX(mx * intel->scale_units[0][0]);
-	OUT_VERTEX(my * intel->scale_units[0][1]);
+
+	OUT_VERTEX(dstX + w);
+	OUT_VERTEX(dstY + h);
+	OUT_VERTEX((maskX + w) * intel->scale_units[0][0]);
+	OUT_VERTEX((maskY + h) * intel->scale_units[0][1]);
+
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY + h);
+	OUT_VERTEX(maskX * intel->scale_units[0][0]);
+	OUT_VERTEX((maskY + h) * intel->scale_units[0][1]);
+
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY);
+	OUT_VERTEX(maskX * intel->scale_units[0][0]);
+	OUT_VERTEX(maskY * intel->scale_units[0][1]);
 }
 
 static void
@@ -536,35 +510,27 @@ i915_emit_composite_primitive_identity_source_mask(PixmapPtr dest,
 {
 	ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	float x, y, sx, sy, mx, my;
-
-	x = dstX + intel->dst_coord_adjust;
-	y = dstY + intel->dst_coord_adjust;
-	sx = srcX + intel->src_coord_adjust;
-	sy = srcY + intel->src_coord_adjust;
-	mx = maskX + intel->mask_coord_adjust;
-	my = maskY + intel->mask_coord_adjust;
-
-	OUT_VERTEX(x + w);
-	OUT_VERTEX(y + h);
-	OUT_VERTEX((sx + w) * intel->scale_units[0][0]);
-	OUT_VERTEX((sy + h) * intel->scale_units[0][1]);
-	OUT_VERTEX((mx + w) * intel->scale_units[1][0]);
-	OUT_VERTEX((my + h) * intel->scale_units[1][1]);
-
-	OUT_VERTEX(x);
-	OUT_VERTEX(y + h);
-	OUT_VERTEX(sx * intel->scale_units[0][0]);
-	OUT_VERTEX((sy + h) * intel->scale_units[0][1]);
-	OUT_VERTEX(mx * intel->scale_units[1][0]);
-	OUT_VERTEX((my + h) * intel->scale_units[1][1]);
-
-	OUT_VERTEX(x);
-	OUT_VERTEX(y);
-	OUT_VERTEX(sx * intel->scale_units[0][0]);
-	OUT_VERTEX(sy * intel->scale_units[0][1]);
-	OUT_VERTEX(mx * intel->scale_units[1][0]);
-	OUT_VERTEX(my * intel->scale_units[1][1]);
+
+	OUT_VERTEX(dstX + w);
+	OUT_VERTEX(dstY + h);
+	OUT_VERTEX((srcX + w) * intel->scale_units[0][0]);
+	OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
+	OUT_VERTEX((maskX + w) * intel->scale_units[1][0]);
+	OUT_VERTEX((maskY + h) * intel->scale_units[1][1]);
+
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY + h);
+	OUT_VERTEX(srcX * intel->scale_units[0][0]);
+	OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
+	OUT_VERTEX(maskX * intel->scale_units[1][0]);
+	OUT_VERTEX((maskY + h) * intel->scale_units[1][1]);
+
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY);
+	OUT_VERTEX(srcX * intel->scale_units[0][0]);
+	OUT_VERTEX(srcY * intel->scale_units[0][1]);
+	OUT_VERTEX(maskX * intel->scale_units[1][0]);
+	OUT_VERTEX(maskY * intel->scale_units[1][1]);
 }
 
 static void
@@ -585,28 +551,25 @@ i915_emit_composite_primitive(PixmapPtr dest,
 	per_vertex = 2;		/* dest x/y */
 
 	if (! intel->render_source_is_solid) {
-		float x = srcX + intel->src_coord_adjust;
-		float y = srcY + intel->src_coord_adjust;
-
 		src_unit = tex_unit++;
 
 		is_affine_src = i830_transform_is_affine(intel->transform[src_unit]);
 		if (is_affine_src) {
-			if (!i830_get_transformed_coordinates(x, y,
+			if (!i830_get_transformed_coordinates(srcX, srcY,
 							      intel->
 							      transform[src_unit],
 							      &src_x[0],
 							      &src_y[0]))
 				return;
 
-			if (!i830_get_transformed_coordinates(x, y + h,
+			if (!i830_get_transformed_coordinates(srcX, srcY + h,
 							      intel->
 							      transform[src_unit],
 							      &src_x[1],
 							      &src_y[1]))
 				return;
 
-			if (!i830_get_transformed_coordinates(x + w, y + h,
+			if (!i830_get_transformed_coordinates(srcX + w, srcY + h,
 							      intel->
 							      transform[src_unit],
 							      &src_x[2],
@@ -615,7 +578,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
 
 			per_vertex += 2;	/* src x/y */
 		} else {
-			if (!i830_get_transformed_coordinates_3d(x, y,
+			if (!i830_get_transformed_coordinates_3d(srcX, srcY,
 								 intel->
 								 transform[src_unit],
 								 &src_x[0],
@@ -623,7 +586,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
 								 &src_w[0]))
 				return;
 
-			if (!i830_get_transformed_coordinates_3d(x, y + h,
+			if (!i830_get_transformed_coordinates_3d(srcX, srcY + h,
 								 intel->
 								 transform[src_unit],
 								 &src_x[1],
@@ -631,7 +594,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
 								 &src_w[1]))
 				return;
 
-			if (!i830_get_transformed_coordinates_3d(x + w, y + h,
+			if (!i830_get_transformed_coordinates_3d(srcX + w, srcY + h,
 								 intel->
 								 transform[src_unit],
 								 &src_x[2],
@@ -644,28 +607,25 @@ i915_emit_composite_primitive(PixmapPtr dest,
 	}
 
 	if (intel->render_mask && ! intel->render_mask_is_solid) {
-		float x = maskX + intel->mask_coord_adjust;
-		float y = maskY + intel->mask_coord_adjust;
-
 		mask_unit = tex_unit++;
 
 		is_affine_mask = i830_transform_is_affine(intel->transform[mask_unit]);
 		if (is_affine_mask) {
-			if (!i830_get_transformed_coordinates(x, y,
+			if (!i830_get_transformed_coordinates(maskX, maskY,
 							      intel->
 							      transform[mask_unit],
 							      &mask_x[0],
 							      &mask_y[0]))
 				return;
 
-			if (!i830_get_transformed_coordinates(x, y + h,
+			if (!i830_get_transformed_coordinates(maskX, maskY + h,
 							      intel->
 							      transform[mask_unit],
 							      &mask_x[1],
 							      &mask_y[1]))
 				return;
 
-			if (!i830_get_transformed_coordinates(x + w, y + h,
+			if (!i830_get_transformed_coordinates(maskX + w, maskY + h,
 							      intel->
 							      transform[mask_unit],
 							      &mask_x[2],
@@ -674,7 +634,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
 
 			per_vertex += 2;	/* mask x/y */
 		} else {
-			if (!i830_get_transformed_coordinates_3d(x, y,
+			if (!i830_get_transformed_coordinates_3d(maskX, maskY,
 								 intel->
 								 transform[mask_unit],
 								 &mask_x[0],
@@ -682,7 +642,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
 								 &mask_w[0]))
 				return;
 
-			if (!i830_get_transformed_coordinates_3d(x, y + h,
+			if (!i830_get_transformed_coordinates_3d(maskX, maskY + h,
 								 intel->
 								 transform[mask_unit],
 								 &mask_x[1],
@@ -690,7 +650,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
 								 &mask_w[1]))
 				return;
 
-			if (!i830_get_transformed_coordinates_3d(x + w, y + h,
+			if (!i830_get_transformed_coordinates_3d(maskX + w, maskY + h,
 								 intel->
 								 transform[mask_unit],
 								 &mask_x[2],
@@ -704,8 +664,8 @@ i915_emit_composite_primitive(PixmapPtr dest,
 
 	num_floats = 3 * per_vertex;
 
-	OUT_VERTEX(intel->dst_coord_adjust + dstX + w);
-	OUT_VERTEX(intel->dst_coord_adjust + dstY + h);
+	OUT_VERTEX(dstX + w);
+	OUT_VERTEX(dstY + h);
 	if (! intel->render_source_is_solid) {
 	    OUT_VERTEX(src_x[2] * intel->scale_units[src_unit][0]);
 	    OUT_VERTEX(src_y[2] * intel->scale_units[src_unit][1]);
@@ -723,8 +683,8 @@ i915_emit_composite_primitive(PixmapPtr dest,
 		}
 	}
 
-	OUT_VERTEX(intel->dst_coord_adjust + dstX);
-	OUT_VERTEX(intel->dst_coord_adjust + dstY + h);
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY + h);
 	if (! intel->render_source_is_solid) {
 	    OUT_VERTEX(src_x[1] * intel->scale_units[src_unit][0]);
 	    OUT_VERTEX(src_y[1] * intel->scale_units[src_unit][1]);
@@ -742,8 +702,8 @@ i915_emit_composite_primitive(PixmapPtr dest,
 		}
 	}
 
-	OUT_VERTEX(intel->dst_coord_adjust + dstX);
-	OUT_VERTEX(intel->dst_coord_adjust + dstY);
+	OUT_VERTEX(dstX);
+	OUT_VERTEX(dstY);
 	if (! intel->render_source_is_solid) {
 	    OUT_VERTEX(src_x[0] * intel->scale_units[src_unit][0]);
 	    OUT_VERTEX(src_y[0] * intel->scale_units[src_unit][1]);
@@ -835,10 +795,6 @@ i915_prepare_composite(int op, PicturePtr source_picture,
 		}
 	}
 
-	intel->dst_coord_adjust = 0;
-	intel->src_coord_adjust = 0;
-	intel->mask_coord_adjust = 0;
-
 	intel->transform[0] = NULL;
 	intel->scale_units[0][0] = -1;
 	intel->scale_units[0][1] = -1;
@@ -857,14 +813,6 @@ i915_prepare_composite(int op, PicturePtr source_picture,
 			floats_per_vertex += 2;	/* src x/y */
 		else
 			floats_per_vertex += 4;	/* src x/y/z/w */
-
-		if (source_picture->filter == PictFilterNearest) {
-#if PIXEL_CENTRE_SAMPLE
-			intel->src_coord_adjust = 0.375;
-#else
-			intel->dst_coord_adjust = -0.125;
-#endif
-		}
 	}
 
 	if (mask != NULL) {
@@ -879,14 +827,6 @@ i915_prepare_composite(int op, PicturePtr source_picture,
 				floats_per_vertex += 2;	/* mask x/y */
 			else
 				floats_per_vertex += 4;	/* mask x/y/z/w */
-
-			if (mask_picture->filter == PictFilterNearest) {
-#if PIXEL_CENTRE_SAMPLE
-			    intel->mask_coord_adjust = 0.375;
-#else
-			    intel->dst_coord_adjust = -0.125;
-#endif
-			}
 		}
 	}
 
commit f74b3f82bab11463a0f4de9f614fc6aa1492ef24
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jun 1 22:31:35 2010 +0100

    i915; Avoid the implicit flush on changing BUF_INFO
    
    3DSTATE_BUF_INFO is an implicit flush of the piepline, so avoid emitting
    that and associated state unless the destination pixmap has actually
    changed. This is a win of around 3-5% for cairo-perf-trace, notably for
    firefox.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i830.h b/src/i830.h
index e410ec1..9a46af0 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -340,6 +340,7 @@ typedef struct intel_screen_private {
 	PicturePtr render_source_picture, render_mask_picture, render_dest_picture;
 	CARD32 render_source_solid;
 	CARD32 render_mask_solid;
+	PixmapPtr render_current_dest;
 	Bool render_source_is_solid;
 	Bool render_mask_is_solid;
 	Bool needs_render_state_emit;
diff --git a/src/i830_uxa.c b/src/i830_uxa.c
index 74cffc2..853899f 100644
--- a/src/i830_uxa.c
+++ b/src/i830_uxa.c
@@ -619,6 +619,9 @@ void i830_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo)
 			list_add(&priv->in_flight, &intel->in_flight);
 			priv = NULL;
 		}
+
+		if (intel->render_current_dest == pixmap)
+		    intel->render_current_dest = NULL;
 	}
 
 	if (bo != NULL) {
@@ -1088,6 +1091,7 @@ Bool i830_uxa_init(ScreenPtr screen)
 	intel->uxa_driver->uxa_major = 1;
 	intel->uxa_driver->uxa_minor = 0;
 
+	intel->render_current_dest = NULL;
 	intel->prim_offset = 0;
 	intel->vertex_count = 0;
 	intel->floats_per_vertex = 0;
diff --git a/src/i915_render.c b/src/i915_render.c
index 1c9127b..96ac09d 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -930,7 +930,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
 	PixmapPtr mask = intel->render_mask;
 	int src_reg, mask_reg;
 	Bool is_solid_src, is_solid_mask;
-	uint32_t dst_format = intel->i915_render_state.dst_format;
+	Bool dest_is_alpha = PIXMAN_FORMAT_RGB(intel->render_dest_picture->format) == 0;
 	int tex_unit, t;
 	FS_LOCALS();
 
@@ -952,7 +952,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
 	if (!mask) {
 		/* No mask, so load directly to output color */
 		if (! is_solid_src) {
-			if (dst_format == COLR_BUF_8BIT)
+			if (dest_is_alpha)
 				src_reg = FS_R0;
 			else
 				src_reg = FS_OC;
@@ -964,7 +964,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
 		}
 
 		if (src_reg != FS_OC) {
-			if (dst_format == COLR_BUF_8BIT)
+			if (dest_is_alpha)
 				i915_fs_mov(FS_OC, i915_fs_operand(src_reg, W, W, W, W));
 			else
 				i915_fs_mov(FS_OC, i915_fs_operand_reg(src_reg));
@@ -1000,7 +1000,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
 			mask_reg = FS_R1;
 		}
 
-		if (dst_format == COLR_BUF_8BIT) {
+		if (dest_is_alpha) {
 			i915_fs_mul(FS_OC,
 				    i915_fs_operand(src_reg, W, W, W, W),
 				    i915_fs_operand(mask_reg, W, W, W, W));
@@ -1045,8 +1045,6 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
 	PicturePtr dest_picture = intel->render_dest_picture;
 	PixmapPtr mask = intel->render_mask;
 	PixmapPtr dest = intel->render_dest;
-	uint32_t dst_format = intel->i915_render_state.dst_format, dst_pitch;
-	uint32_t tiling_bits;
 	Bool is_solid_src, is_solid_mask;
 	int tex_count, t;
 
@@ -1055,8 +1053,6 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
 	IntelEmitInvarientState(scrn);
 	intel->last_3d = LAST_3D_RENDER;
 
-	dst_pitch = intel_get_pixmap_pitch(dest);
-
 	is_solid_src = intel->render_source_is_solid;
 	is_solid_mask = intel->render_mask_is_solid;
 
@@ -1093,22 +1089,38 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
 	    OUT_BATCH (intel->render_mask_solid);
 	}
 
-	if (i830_pixmap_tiled(dest)) {
-		tiling_bits = BUF_3D_TILED_SURFACE;
-		if (i830_get_pixmap_intel(dest)->tiling
-				== I915_TILING_Y)
-			tiling_bits |= BUF_3D_TILE_WALK_Y;
-	} else
-		tiling_bits = 0;
+	/* BUF_INFO is an implicit flush, so avoid if the target has not changed */
+	if (dest != intel->render_current_dest) {
+		uint32_t tiling_bits;
 
-	OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
-	OUT_BATCH(BUF_3D_ID_COLOR_BACK | tiling_bits |
-		  BUF_3D_PITCH(dst_pitch));
-	OUT_RELOC_PIXMAP(dest, I915_GEM_DOMAIN_RENDER,
-			 I915_GEM_DOMAIN_RENDER, 0);
+		if (i830_pixmap_tiled(dest)) {
+			tiling_bits = BUF_3D_TILED_SURFACE;
+			if (i830_get_pixmap_intel(dest)->tiling
+			    == I915_TILING_Y)
+				tiling_bits |= BUF_3D_TILE_WALK_Y;
+		} else
+			tiling_bits = 0;
 
-	OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
-	OUT_BATCH(dst_format);
+		OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
+		OUT_BATCH(BUF_3D_ID_COLOR_BACK | tiling_bits |
+			  BUF_3D_PITCH(intel_get_pixmap_pitch(dest)));
+		OUT_RELOC_PIXMAP(dest, I915_GEM_DOMAIN_RENDER,
+				 I915_GEM_DOMAIN_RENDER, 0);
+
+		OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
+		OUT_BATCH(intel->i915_render_state.dst_format);
+
+		/* draw rect is unconditional */
+		OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
+		OUT_BATCH(0x00000000);
+		OUT_BATCH(0x00000000);	/* ymin, xmin */
+		OUT_BATCH(DRAW_YMAX(dest->drawable.height - 1) |
+			  DRAW_XMAX(dest->drawable.width - 1));
+		/* yorig, xorig (relate to color buffer?) */
+		OUT_BATCH(0x00000000);
+
+		intel->render_current_dest = dest;
+	}
 
 	{
 		uint32_t ss2;
@@ -1138,15 +1150,6 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
 			OUT_BATCH(ss2);
 			OUT_BATCH(i915_get_blend_cntl(op, mask_picture, dest_picture->format));
 		}
-
-		/* draw rect is unconditional */
-		OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
-		OUT_BATCH(0x00000000);
-		OUT_BATCH(0x00000000);	/* ymin, xmin */
-		OUT_BATCH(DRAW_YMAX(dest->drawable.height - 1) |
-			  DRAW_XMAX(dest->drawable.width - 1));
-		/* yorig, xorig (relate to color buffer?) */
-		OUT_BATCH(0x00000000);
 	}
 
 	if (! intel->needs_render_ca_pass)
@@ -1247,5 +1250,6 @@ i915_batch_flush_notify(ScrnInfoPtr scrn)
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	intel->needs_render_state_emit = TRUE;
+	intel->render_current_dest = NULL;
 	intel->last_floats_per_vertex = 0;
 }


More information about the xorg-commit mailing list