xf86-video-intel: 2 commits - src/i915_render.c src/sna/gen2_render.c src/sna/sna_blt.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Feb 27 08:33:27 PST 2012


 src/i915_render.c     |  366 ++++++++++++++++----------------------------------
 src/sna/gen2_render.c |   12 -
 src/sna/sna_blt.c     |    2 
 3 files changed, 127 insertions(+), 253 deletions(-)

New commits:
commit 3c4f29820bca336af2c997bafc7ef288b455813c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Feb 27 16:29:38 2012 +0000

    uxa/gen3: Remove special casing of solid pictures
    
    Fixes use of alpha-groups and opacity masks in cairo.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i915_render.c b/src/i915_render.c
index 87d2336..6210035 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -257,11 +257,8 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
 		return FALSE;
 	}
 
-	if (picture->pSourcePict) {
-		SourcePict *source = picture->pSourcePict;
-		if (source->type == SourcePictTypeSolidFill)
-			return TRUE;
-	}
+	if (picture->pSourcePict)
+		return FALSE;
 
 	if (picture->pDrawable) {
 		int w, h, i;
@@ -387,23 +384,6 @@ static Bool i915_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
 }
 
 static void
-i915_emit_composite_primitive_constant(intel_screen_private *intel,
-				       int srcX, int srcY,
-				       int maskX, int maskY,
-				       int dstX, int dstY,
-				       int w, int h)
-{
-	OUT_VERTEX(dstX + w);
-	OUT_VERTEX(dstY + h);
-
-	OUT_VERTEX(dstX);
-	OUT_VERTEX(dstY + h);
-
-	OUT_VERTEX(dstX);
-	OUT_VERTEX(dstY);
-}
-
-static void
 i915_emit_composite_primitive_identity_source(intel_screen_private *intel,
 					      int srcX, int srcY,
 					      int maskX, int maskY,
@@ -470,29 +450,6 @@ i915_emit_composite_primitive_affine_source(intel_screen_private *intel,
 }
 
 static void
-i915_emit_composite_primitive_constant_identity_mask(intel_screen_private *intel,
-						     int srcX, int srcY,
-						     int maskX, int maskY,
-						     int dstX, int dstY,
-						     int w, int h)
-{
-	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
 i915_emit_composite_primitive_identity_source_mask(intel_screen_private *intel,
 						   int srcX, int srcY,
 						   int maskX, int maskY,
@@ -536,63 +493,61 @@ i915_emit_composite_primitive(intel_screen_private *intel,
 
 	per_vertex = 2;		/* dest x/y */
 
-	if (! intel->render_source_is_solid) {
-		src_unit = tex_unit++;
-
-		is_affine_src = intel_transform_is_affine(intel->transform[src_unit]);
-		if (is_affine_src) {
-			if (!intel_get_transformed_coordinates(srcX, srcY,
-							      intel->
-							      transform[src_unit],
-							      &src_x[0],
-							      &src_y[0]))
-				return;
-
-			if (!intel_get_transformed_coordinates(srcX, srcY + h,
-							      intel->
-							      transform[src_unit],
-							      &src_x[1],
-							      &src_y[1]))
-				return;
-
-			if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
-							      intel->
-							      transform[src_unit],
-							      &src_x[2],
-							      &src_y[2]))
-				return;
-
-			per_vertex += 2;	/* src x/y */
-		} else {
-			if (!intel_get_transformed_coordinates_3d(srcX, srcY,
-								 intel->
-								 transform[src_unit],
-								 &src_x[0],
-								 &src_y[0],
-								 &src_w[0]))
-				return;
-
-			if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
-								 intel->
-								 transform[src_unit],
-								 &src_x[1],
-								 &src_y[1],
-								 &src_w[1]))
-				return;
-
-			if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
-								 intel->
-								 transform[src_unit],
-								 &src_x[2],
-								 &src_y[2],
-								 &src_w[2]))
-				return;
-
-			per_vertex += 4;	/* src x/y/z/w */
-		}
+	src_unit = tex_unit++;
+
+	is_affine_src = intel_transform_is_affine(intel->transform[src_unit]);
+	if (is_affine_src) {
+		if (!intel_get_transformed_coordinates(srcX, srcY,
+						      intel->
+						      transform[src_unit],
+						      &src_x[0],
+						      &src_y[0]))
+			return;
+
+		if (!intel_get_transformed_coordinates(srcX, srcY + h,
+						      intel->
+						      transform[src_unit],
+						      &src_x[1],
+						      &src_y[1]))
+			return;
+
+		if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
+						      intel->
+						      transform[src_unit],
+						      &src_x[2],
+						      &src_y[2]))
+			return;
+
+		per_vertex += 2;	/* src x/y */
+	} else {
+		if (!intel_get_transformed_coordinates_3d(srcX, srcY,
+							 intel->
+							 transform[src_unit],
+							 &src_x[0],
+							 &src_y[0],
+							 &src_w[0]))
+			return;
+
+		if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
+							 intel->
+							 transform[src_unit],
+							 &src_x[1],
+							 &src_y[1],
+							 &src_w[1]))
+			return;
+
+		if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
+							 intel->
+							 transform[src_unit],
+							 &src_x[2],
+							 &src_y[2],
+							 &src_w[2]))
+			return;
+
+		per_vertex += 4;	/* src x/y/z/w */
 	}
 
-	if (intel->render_mask && ! intel->render_mask_is_solid) {
+	if (intel->render_mask) {
 		mask_unit = tex_unit++;
 
 		is_affine_mask = intel_transform_is_affine(intel->transform[mask_unit]);
@@ -650,15 +605,13 @@ i915_emit_composite_primitive(intel_screen_private *intel,
 
 	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]);
-	    if (!is_affine_src) {
+	OUT_VERTEX(src_x[2] * intel->scale_units[src_unit][0]);
+	OUT_VERTEX(src_y[2] * intel->scale_units[src_unit][1]);
+	if (!is_affine_src) {
 		OUT_VERTEX(0.0);
 		OUT_VERTEX(src_w[2]);
-	    }
 	}
-	if (intel->render_mask && ! intel->render_mask_is_solid) {
+	if (intel->render_mask) {
 		OUT_VERTEX(mask_x[2] * intel->scale_units[mask_unit][0]);
 		OUT_VERTEX(mask_y[2] * intel->scale_units[mask_unit][1]);
 		if (!is_affine_mask) {
@@ -669,15 +622,13 @@ i915_emit_composite_primitive(intel_screen_private *intel,
 
 	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]);
-	    if (!is_affine_src) {
+	OUT_VERTEX(src_x[1] * intel->scale_units[src_unit][0]);
+	OUT_VERTEX(src_y[1] * intel->scale_units[src_unit][1]);
+	if (!is_affine_src) {
 		OUT_VERTEX(0.0);
 		OUT_VERTEX(src_w[1]);
-	    }
 	}
-	if (intel->render_mask && ! intel->render_mask_is_solid) {
+	if (intel->render_mask) {
 		OUT_VERTEX(mask_x[1] * intel->scale_units[mask_unit][0]);
 		OUT_VERTEX(mask_y[1] * intel->scale_units[mask_unit][1]);
 		if (!is_affine_mask) {
@@ -688,15 +639,13 @@ i915_emit_composite_primitive(intel_screen_private *intel,
 
 	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]);
-	    if (!is_affine_src) {
+	OUT_VERTEX(src_x[0] * intel->scale_units[src_unit][0]);
+	OUT_VERTEX(src_y[0] * intel->scale_units[src_unit][1]);
+	if (!is_affine_src) {
 		OUT_VERTEX(0.0);
 		OUT_VERTEX(src_w[0]);
-	    }
 	}
-	if (intel->render_mask && ! intel->render_mask_is_solid) {
+	if (intel->render_mask) {
 		OUT_VERTEX(mask_x[0] * intel->scale_units[mask_unit][0]);
 		OUT_VERTEX(mask_y[0] * intel->scale_units[mask_unit][1]);
 		if (!is_affine_mask) {
@@ -729,29 +678,11 @@ i915_prepare_composite(int op, PicturePtr source_picture,
 	intel->render_dest_picture = dest_picture;
 	intel->render_dest = dest;
 
-	intel->render_source_is_solid = FALSE;
-	if (source_picture->pSourcePict) {
-		SourcePict *source = source_picture->pSourcePict;
-		if (source->type == SourcePictTypeSolidFill) {
-			intel->render_source_is_solid = TRUE;
-			intel->render_source_solid = source->solidFill.color;
-		}
-	}
-	if (!intel->render_source_is_solid && !intel_check_pitch_3d(source))
+	if (!intel_check_pitch_3d(source))
 		return FALSE;
 
-	intel->render_mask_is_solid = FALSE;
-	if (mask) {
-		if (mask_picture->pSourcePict) {
-			SourcePict *source = mask_picture->pSourcePict;
-			if (source->type == SourcePictTypeSolidFill) {
-				intel->render_mask_is_solid = TRUE;
-				intel->render_mask_solid = source->solidFill.color;
-			}
-		}
-		if (!intel->render_mask_is_solid && !intel_check_pitch_3d(mask))
-			return FALSE;
-	}
+	if (mask && !intel_check_pitch_3d(mask))
+		return FALSE;
 
 	if (!intel_check_pitch_3d(dest))
 		return FALSE;
@@ -787,31 +718,27 @@ i915_prepare_composite(int op, PicturePtr source_picture,
 	intel->scale_units[1][1] = -1;
 
 	floats_per_vertex = 2;		/* dest x/y */
-	if (! intel->render_source_is_solid) {
-		if (!i915_texture_setup(source_picture, source, tex_unit++)) {
-			intel_debug_fallback(scrn, "fail to setup src texture\n");
-			return FALSE;
-		}
-
-		if (intel_transform_is_affine(source_picture->transform))
-			floats_per_vertex += 2;	/* src x/y */
-		else
-			floats_per_vertex += 4;	/* src x/y/z/w */
+	if (!i915_texture_setup(source_picture, source, tex_unit++)) {
+		intel_debug_fallback(scrn, "fail to setup src texture\n");
+		return FALSE;
 	}
 
-	if (mask != NULL) {
-		if (! intel->render_mask_is_solid) {
-			if (!i915_texture_setup(mask_picture, mask, tex_unit++)) {
-				intel_debug_fallback(scrn,
-						"fail to setup mask texture\n");
-				return FALSE;
-			}
+	if (intel_transform_is_affine(source_picture->transform))
+		floats_per_vertex += 2;	/* src x/y */
+	else
+		floats_per_vertex += 4;	/* src x/y/z/w */
 
-			if (intel_transform_is_affine(mask_picture->transform))
-				floats_per_vertex += 2;	/* mask x/y */
-			else
-				floats_per_vertex += 4;	/* mask x/y/z/w */
+	if (mask != NULL) {
+		if (!i915_texture_setup(mask_picture, mask, tex_unit++)) {
+			intel_debug_fallback(scrn,
+					     "fail to setup mask texture\n");
+			return FALSE;
 		}
+
+		if (intel_transform_is_affine(mask_picture->transform))
+			floats_per_vertex += 2;	/* mask x/y */
+		else
+			floats_per_vertex += 4;	/* mask x/y/z/w */
 	}
 
 	intel->i915_render_state.op = op;
@@ -827,17 +754,13 @@ i915_prepare_composite(int op, PicturePtr source_picture,
 
 	intel->prim_emit = i915_emit_composite_primitive;
 	if (!mask) {
-		if (intel->render_source_is_solid)
-			intel->prim_emit = i915_emit_composite_primitive_constant;
-		else if (intel->transform[0] == NULL)
+		if (intel->transform[0] == NULL)
 			intel->prim_emit = i915_emit_composite_primitive_identity_source;
 		else if (intel_transform_is_affine(intel->transform[0]))
 			intel->prim_emit = i915_emit_composite_primitive_affine_source;
 	} else {
 		if (intel->transform[0] == NULL) {
-			if (intel->render_source_is_solid)
-				intel->prim_emit = i915_emit_composite_primitive_constant_identity_mask;
-			else if (intel->transform[1] == NULL)
+			if (intel->transform[1] == NULL)
 				intel->prim_emit = i915_emit_composite_primitive_identity_source_mask;
 		}
 	}
@@ -856,39 +779,25 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
 	PicturePtr mask_picture = intel->render_mask_picture;
 	PixmapPtr mask = intel->render_mask;
 	int src_reg, mask_reg;
-	Bool is_solid_src, is_solid_mask;
 	Bool dest_is_alpha = PIXMAN_FORMAT_RGB(intel->render_dest_picture->format) == 0;
-	int tex_unit, t;
 	FS_LOCALS();
 
-	is_solid_src = intel->render_source_is_solid;
-	is_solid_mask = intel->render_mask_is_solid;
-
 	FS_BEGIN();
 
 	/* Declare the registers necessary for our program.  */
-	t = 0;
-	if (is_solid_src) {
-		i915_fs_dcl(FS_T8);
-		src_reg = FS_T8;
-	} else {
-		i915_fs_dcl(FS_T0);
-		i915_fs_dcl(FS_S0);
-		t++;
-	}
+	i915_fs_dcl(FS_T0);
+	i915_fs_dcl(FS_S0);
 	if (!mask) {
 		/* No mask, so load directly to output color */
-		if (! is_solid_src) {
-			if (dest_is_alpha)
-				src_reg = FS_R0;
-			else
-				src_reg = FS_OC;
+		if (dest_is_alpha)
+			src_reg = FS_R0;
+		else
+			src_reg = FS_OC;
 
-			if (intel_transform_is_affine(intel->transform[0]))
-				i915_fs_texld(src_reg, FS_S0, FS_T0);
-			else
-				i915_fs_texldp(src_reg, FS_S0, FS_T0);
-		}
+		if (intel_transform_is_affine(intel->transform[0]))
+			i915_fs_texld(src_reg, FS_S0, FS_T0);
+		else
+			i915_fs_texldp(src_reg, FS_S0, FS_T0);
 
 		if (src_reg != FS_OC) {
 			if (dest_is_alpha)
@@ -897,35 +806,24 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
 				i915_fs_mov(FS_OC, i915_fs_operand_reg(src_reg));
 		}
 	} else {
-		if (is_solid_mask) {
-			i915_fs_dcl(FS_T9);
-			mask_reg = FS_T9;
-		} else {
-			i915_fs_dcl(FS_T0 + t);
-			i915_fs_dcl(FS_S0 + t);
-		}
+		i915_fs_dcl(FS_T1);
+		i915_fs_dcl(FS_S1);
 
-		tex_unit = 0;
-		if (! is_solid_src) {
-			/* Load the source_picture texel */
-			if (intel_transform_is_affine(intel->transform[tex_unit]))
-				i915_fs_texld(FS_R0, FS_S0, FS_T0);
-			else
-				i915_fs_texldp(FS_R0, FS_S0, FS_T0);
+		/* Load the source_picture texel */
+		if (intel_transform_is_affine(intel->transform[0]))
+			i915_fs_texld(FS_R0, FS_S0, FS_T0);
+		else
+			i915_fs_texldp(FS_R0, FS_S0, FS_T0);
 
-			src_reg = FS_R0;
-			tex_unit++;
-		}
+		src_reg = FS_R0;
 
-		if (! is_solid_mask) {
-			/* Load the mask_picture texel */
-			if (intel_transform_is_affine(intel->transform[tex_unit]))
-				i915_fs_texld(FS_R1, FS_S0 + t, FS_T0 + t);
-			else
-				i915_fs_texldp(FS_R1, FS_S0 + t, FS_T0 + t);
+		/* Load the mask_picture texel */
+		if (intel_transform_is_affine(intel->transform[1]))
+			i915_fs_texld(FS_R1, FS_S1, FS_T1);
+		else
+			i915_fs_texldp(FS_R1, FS_S1, FS_T1);
 
-			mask_reg = FS_R1;
-		}
+		mask_reg = FS_R1;
 
 		if (dest_is_alpha) {
 			i915_fs_mul(FS_OC,
@@ -972,7 +870,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;
-	Bool is_solid_src, is_solid_mask;
 	int tex_count, t;
 
 	intel->needs_render_state_emit = FALSE;
@@ -980,12 +877,7 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
 	IntelEmitInvarientState(scrn);
 	intel->last_3d = LAST_3D_RENDER;
 
-	is_solid_src = intel->render_source_is_solid;
-	is_solid_mask = intel->render_mask_is_solid;
-
-	tex_count = 0;
-	tex_count += ! is_solid_src;
-	tex_count += mask && ! is_solid_mask;
+	tex_count = 1 + (mask != NULL);
 
 	assert(intel->in_batch_atomic);
 
@@ -1007,15 +899,6 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
 	    }
 	}
 
-	if (is_solid_src) {
-	    OUT_BATCH (_3DSTATE_DFLT_DIFFUSE_CMD);
-	    OUT_BATCH (intel->render_source_solid);
-	}
-	if (mask && is_solid_mask) {
-	    OUT_BATCH (_3DSTATE_DFLT_SPEC_CMD);
-	    OUT_BATCH (intel->render_mask_solid);
-	}
-
 	/* BUF_INFO is an implicit flush, so avoid if the target has not changed.
 	 * XXX However for reasons unfathomed, correct rendering in KDE requires
 	 * at least a MI_FLUSH | INHIBIT_RENDER_CACHE_FLUSH here.
@@ -1058,20 +941,15 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
 		uint32_t ss2;
 
 		ss2 = ~0;
-		t = 0;
-		if (! is_solid_src) {
-		    ss2 &= ~S2_TEXCOORD_FMT(t, TEXCOORDFMT_NOT_PRESENT);
-		    ss2 |= S2_TEXCOORD_FMT(t,
-					   intel_transform_is_affine(intel->transform[t]) ?
-					   TEXCOORDFMT_2D : TEXCOORDFMT_4D);
-		    t++;
-		}
-		if (mask && ! is_solid_mask) {
-		    ss2 &= ~S2_TEXCOORD_FMT(t, TEXCOORDFMT_NOT_PRESENT);
-		    ss2 |= S2_TEXCOORD_FMT(t,
-					   intel_transform_is_affine(intel->transform[t]) ?
+		ss2 &= ~S2_TEXCOORD_FMT(0, TEXCOORDFMT_NOT_PRESENT);
+		ss2 |= S2_TEXCOORD_FMT(0,
+				       intel_transform_is_affine(intel->transform[0]) ?
+				       TEXCOORDFMT_2D : TEXCOORDFMT_4D);
+		if (mask) {
+		    ss2 &= ~S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT);
+		    ss2 |= S2_TEXCOORD_FMT(1,
+					   intel_transform_is_affine(intel->transform[1]) ?
 					   TEXCOORDFMT_2D : TEXCOORDFMT_4D);
-		    t++;
 		}
 
 		if (intel->needs_render_ca_pass) {
commit 8f3066f0c70654f04f4acadf140e3c5c8dda051d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Feb 27 13:58:58 2012 +0000

    sna/gen2; Initialise channel.is-opaque for fills
    
    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 64b4e7c..c3a16cb 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1116,10 +1116,7 @@ gen2_composite_solid_init(struct sna *sna,
 {
 	channel->filter = PictFilterNearest;
 	channel->repeat = RepeatNormal;
-	channel->is_affine = TRUE;
 	channel->is_solid  = TRUE;
-	channel->is_linear = FALSE;
-	channel->transform = NULL;
 	channel->width  = 1;
 	channel->height = 1;
 	channel->pict_format = PICT_a8r8g8b8;
@@ -1169,11 +1166,7 @@ gen2_composite_linear_init(struct sna *sna,
 
 	channel->filter = PictFilterNearest;
 	channel->repeat = picture->repeat ? picture->repeatType : RepeatNone;
-	channel->is_affine = TRUE;
-	channel->is_opaque = FALSE;
-	channel->is_solid  = FALSE;
 	channel->is_linear = TRUE;
-	channel->transform = NULL;
 	channel->width  = channel->bo->pitch / 4;
 	channel->height = 1;
 	channel->pict_format = PICT_a8r8g8b8;
@@ -1331,6 +1324,9 @@ gen2_composite_picture(struct sna *sna,
 
 	channel->is_solid = FALSE;
 	channel->is_linear = FALSE;
+	channel->is_opaque = FALSE;
+	channel->is_affine = TRUE;
+	channel->transform = NULL;
 
 	if (sna_picture_is_solid(picture, &color))
 		return gen2_composite_solid_init(sna, channel, color);
@@ -1726,7 +1722,7 @@ gen2_render_composite(struct sna *sna,
 		return FALSE;
 	}
 
-	if (mask == NULL && sna->kgem.mode == KGEM_BLT  &&
+	if (mask == NULL && sna->kgem.mode == KGEM_BLT &&
 	    sna_blt_composite(sna, op,
 			      src, dst,
 			      src_x, src_y,
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index a672c46..a9ec899 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -667,7 +667,7 @@ is_solid(PicturePtr picture)
 	}
 
 	if (picture->pDrawable) {
-		if (picture->pDrawable->width == 1 &&
+		if (picture->pDrawable->width  == 1 &&
 		    picture->pDrawable->height == 1 &&
 		    picture->repeat)
 			return TRUE;


More information about the xorg-commit mailing list