xf86-video-intel: 5 commits - src/i965_render.c src/intel_video.c src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_tiling.c src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Oct 14 04:31:50 PDT 2011


 src/i965_render.c        |    1 -
 src/intel_video.c        |   13 +++++++------
 src/sna/sna_accel.c      |   15 +++++++--------
 src/sna/sna_blt.c        |   28 ++++++++++++++++++++++++++++
 src/sna/sna_tiling.c     |   19 +++++++++++++++++++
 src/sna/sna_trapezoids.c |    8 +++++---
 6 files changed, 66 insertions(+), 18 deletions(-)

New commits:
commit 33f17b996dd0fcbb8e07875770e11571380d6509
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 14 12:01:34 2011 +0100

    Remove a couple of trivial compile warnings for unused variables
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/i965_render.c b/src/i965_render.c
index bc0bd93..825fc13 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -182,7 +182,6 @@ i965_check_composite(int op,
 		     int width, int height)
 {
 	ScrnInfoPtr scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
-	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	/* Check for unsupported compositing operations. */
 	if (op >= sizeof(i965_blend_op) / sizeof(i965_blend_op[0])) {
diff --git a/src/intel_video.c b/src/intel_video.c
index a35445d..d1d6126 100644
--- a/src/intel_video.c
+++ b/src/intel_video.c
@@ -210,14 +210,13 @@ static Bool intel_has_overlay(intel_screen_private *intel)
 	gp.value = &has_overlay;
 	ret = drmCommandWriteRead(intel->drmSubFD, DRM_I915_GETPARAM, &gp, sizeof(gp));
 
-	return !! has_overlay;
+	return ret == 0 && !! has_overlay;
 }
 
-static void intel_overlay_update_attrs(intel_screen_private *intel)
+static Bool intel_overlay_update_attrs(intel_screen_private *intel)
 {
 	intel_adaptor_private *adaptor_priv = intel_get_adaptor_private(intel);
 	struct drm_intel_overlay_attrs attrs;
-	int ret;
 
 	attrs.flags = I915_OVERLAY_UPDATE_ATTRS;
 	attrs.brightness = adaptor_priv->brightness;
@@ -231,8 +230,8 @@ static void intel_overlay_update_attrs(intel_screen_private *intel)
 	attrs.gamma4 = adaptor_priv->gamma4;
 	attrs.gamma5 = adaptor_priv->gamma5;
 
-	ret = drmCommandWriteRead(intel->drmSubFD, DRM_I915_OVERLAY_ATTRS,
-				  &attrs, sizeof(attrs));
+	return drmCommandWriteRead(intel->drmSubFD, DRM_I915_OVERLAY_ATTRS,
+				   &attrs, sizeof(attrs)) == 0;
 }
 
 static void intel_overlay_off(intel_screen_private *intel)
@@ -244,6 +243,7 @@ static void intel_overlay_off(intel_screen_private *intel)
 
 	ret = drmCommandWrite(intel->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
 			      &request, sizeof(request));
+	(void) ret;
 }
 
 static Bool
@@ -713,7 +713,8 @@ I830SetPortAttributeOverlay(ScrnInfoPtr scrn,
 		OVERLAY_DEBUG("GAMMA\n");
 	}
 
-	intel_overlay_update_attrs(intel);
+	if (!intel_overlay_update_attrs(intel))
+		return BadValue;
 
 	if (attribute == xvColorKey)
 		REGION_EMPTY(scrn->pScreen, &adaptor_priv->clip);
commit e5e27528ffeb74f404823c678e04e847cf2109aa
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 14 11:51:44 2011 +0100

    sna/blt: Add a pair of operator reductions for opaque fills
    
    Extend the coverage of the BLT for a couple more composite operations,
    though they be relatively infrequent.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 1375a7a..9d84747 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -580,6 +580,20 @@ pixel_is_opaque(uint32_t pixel, uint32_t format)
 }
 
 static Bool
+pixel_is_white(uint32_t pixel, uint32_t format)
+{
+	switch (PICT_FORMAT_TYPE(format)) {
+	case PICT_TYPE_A:
+	case PICT_TYPE_ARGB:
+	case PICT_TYPE_ABGR:
+	case PICT_TYPE_BGRA:
+		return pixel == ((1 << PICT_FORMAT_BPP(format)) - 1);
+	default:
+		return FALSE;
+	}
+}
+
+static Bool
 is_opaque_solid(PicturePtr picture)
 {
 	if (picture->pSourcePict) {
@@ -589,6 +603,16 @@ is_opaque_solid(PicturePtr picture)
 		return pixel_is_opaque(get_pixel(picture), picture->format);
 }
 
+static Bool
+is_white(PicturePtr picture)
+{
+	if (picture->pSourcePict) {
+		PictSolidFill *fill = (PictSolidFill *) picture->pSourcePict;
+		return fill->color == 0xffffffff;
+	} else
+		return pixel_is_white(get_pixel(picture), picture->format);
+}
+
 fastcall
 static void blt_fill_composite(struct sna *sna,
 			       const struct sna_composite_op *op,
@@ -1096,6 +1120,10 @@ sna_blt_composite(struct sna *sna,
 	if (is_solid(src)) {
 		if (op == PictOpOver && is_opaque_solid(src))
 			op = PictOpSrc;
+		if (op == PictOpAdd && is_white(src))
+			op = PictOpSrc;
+		if (op == PictOpOutReverse && is_opaque_solid(src))
+			return prepare_blt_clear(sna, tmp);
 
 		if (op != PictOpSrc) {
 			DBG(("%s: unsuported op [%d] for blitting\n",
commit 3f5289b29962c3e5d94deb30782a156292d20053
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 14 11:31:46 2011 +0100

    sna/trapezoids: Fallback if the composite operation is not supported
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index b0331cb..1549ef5 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2641,7 +2641,7 @@ mono_trapezoids_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 	}
 
 	memset(&mono.op, 0, sizeof(mono.op));
-	if (mono.sna->render.composite(mono.sna, op, src, NULL, dst,
+	if (!mono.sna->render.composite(mono.sna, op, src, NULL, dst,
 				       src_x + mono.clip.extents.x1 - dst_x - dx,
 				       src_y + mono.clip.extents.y1 - dst_y - dy,
 				       0, 0,
@@ -2649,9 +2649,11 @@ mono_trapezoids_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 				       mono.clip.extents.x2 - mono.clip.extents.x1,
 				       mono.clip.extents.y2 - mono.clip.extents.y1,
 				       &mono.op)) {
-		mono_render(&mono);
-		mono.op.done(mono.sna, &mono.op);
+		mono_fini(&mono);
+		return false;
 	}
+	mono_render(&mono);
+	mono.op.done(mono.sna, &mono.op);
 	mono_fini(&mono);
 
 	if (!operator_is_bounded(op)) {
commit 3d79264ef8a8be225d9b13efd14f37a7478e6b1b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 14 11:31:00 2011 +0100

    sna/tiling: Hook up composite_box
    
    Now used for spans and so triggering death by NULL function pointer on
    older chipsets.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index 80989d8..295936b 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -95,6 +95,24 @@ sna_tiling_composite_blt(struct sna *sna,
 	(void)sna;
 }
 
+fastcall static void
+sna_tiling_composite_box(struct sna *sna,
+			 const struct sna_composite_op *op,
+			 const BoxRec *box)
+{
+	struct sna_composite_rectangles r;
+
+	r.dst.x = box->x1;
+	r.dst.y = box->y1;
+	r.mask = r.src = r.dst;
+
+	r.width  = box->x2 - box->x1;
+	r.height = box->y2 - box->y1;
+
+	sna_tiling_composite_add_rect(op->u.priv, &r);
+	(void)sna;
+}
+
 static void
 sna_tiling_composite_boxes(struct sna *sna,
 			   const struct sna_composite_op *op,
@@ -258,6 +276,7 @@ sna_tiling_composite(uint32_t op,
 	tile->rect_size = ARRAY_SIZE(tile->rects_embedded);
 
 	tmp->blt   = sna_tiling_composite_blt;
+	tmp->box   = sna_tiling_composite_box;
 	tmp->boxes = sna_tiling_composite_boxes;
 	tmp->done  = sna_tiling_composite_done;
 
commit f5f3135e3cc1f4740508773cfefca0954aed2fd3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 14 10:40:39 2011 +0100

    sna: Ensure that the scanout is flushed before we sleep
    
    So that we do not see any delayed rendering on i965+.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 1073757..963ff9b 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3793,7 +3793,7 @@ static Bool sna_accel_do_expire(struct sna *sna) { return sna->kgem.need_expire;
 static void _sna_accel_disarm_timer(struct sna *sna, int id) { }
 #endif
 
-static void sna_accel_flush(struct sna *sna)
+static bool sna_accel_flush(struct sna *sna)
 {
 	struct sna_pixmap *priv = sna_accel_scanout(sna);
 	bool nothing_to_do =
@@ -3802,13 +3802,12 @@ static void sna_accel_flush(struct sna *sna)
 	DBG(("%s (time=%ld), nothing_to_do=%d\n",
 	     __FUNCTION__, (long)GetTimeInMillis(), nothing_to_do));
 
-	if (nothing_to_do) {
+	if (nothing_to_do)
 		_sna_accel_disarm_timer(sna, FLUSH_TIMER);
-		return;
-	}
-
-	sna_pixmap_move_to_gpu(priv->pixmap);
+	else
+		sna_pixmap_move_to_gpu(priv->pixmap);
 	kgem_bo_flush(&sna->kgem, priv->gpu_bo);
+	return !nothing_to_do;
 }
 
 static void sna_accel_expire(struct sna *sna)
@@ -3955,8 +3954,8 @@ static void sna_accel_throttle(struct sna *sna)
 void sna_accel_block_handler(struct sna *sna)
 {
 	if (sna_accel_do_flush(sna)) {
-		sna_accel_flush(sna);
-		sna_accel_throttle(sna);
+		if (sna_accel_flush(sna))
+			sna_accel_throttle(sna);
 	}
 
 	if (sna_accel_do_expire(sna))


More information about the xorg-commit mailing list