xf86-video-intel: 4 commits - src/sna/gen4_render.c src/sna/gen5_render.c src/sna/sna_render.h

Chris Wilson ickle at kemper.freedesktop.org
Tue Dec 4 05:09:47 PST 2012


 src/sna/gen4_render.c |   69 ++++++++++++++++++++++++++++++--------------------
 src/sna/gen5_render.c |   20 +++++++++++++-
 src/sna/sna_render.h  |    1 
 3 files changed, 61 insertions(+), 29 deletions(-)

New commits:
commit 626dd1324dd2c5b14ca4aff598b5eb1e45550e69
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 4 12:52:50 2012 +0000

    sna/gen4: Workaround render corruption with multiple SF threads
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=57410
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index fb1c742..4e8ad57 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1256,7 +1256,7 @@ gen4_emit_pipelined_pointers(struct sna *sna,
 	bp = gen4_get_blend(blend, op->has_component_alpha, op->dst.format);
 
 	DBG(("%s: sp=%d, bp=%d\n", __FUNCTION__, sp, bp));
-	key = sp | (uint32_t)bp << 16;
+	key = sp | (uint32_t)bp << 16 | op->u.gen4.sf << 31;
 	if (key == sna->render_state.gen4.last_pipelined_pointers)
 		return;
 
@@ -1264,7 +1264,7 @@ gen4_emit_pipelined_pointers(struct sna *sna,
 	OUT_BATCH(sna->render_state.gen4.vs);
 	OUT_BATCH(GEN4_GS_DISABLE); /* passthrough */
 	OUT_BATCH(GEN4_CLIP_DISABLE); /* passthrough */
-	OUT_BATCH(sna->render_state.gen4.sf[1]);
+	OUT_BATCH(sna->render_state.gen4.sf[op->u.gen4.sf]);
 	OUT_BATCH(sna->render_state.gen4.wm + sp);
 	OUT_BATCH(sna->render_state.gen4.cc + bp);
 
@@ -2339,6 +2339,7 @@ gen4_render_composite(struct sna *sna,
 	tmp->is_affine = tmp->src.is_affine;
 	tmp->has_component_alpha = false;
 	tmp->need_magic_ca_pass = false;
+	tmp->u.gen4.sf = 0;
 
 	tmp->prim_emit = gen4_emit_composite_primitive;
 	if (mask) {
@@ -2391,11 +2392,13 @@ gen4_render_composite(struct sna *sna,
 
 		tmp->floats_per_vertex = 5 + 2 * !tmp->is_affine;
 	} else {
-		if (tmp->src.is_solid)
+		if (tmp->src.is_solid) {
 			tmp->prim_emit = gen4_emit_composite_primitive_solid;
-		else if (tmp->src.transform == NULL)
+		} else if (tmp->src.transform == NULL) {
 			tmp->prim_emit = gen4_emit_composite_primitive_identity_source;
-		else if (tmp->src.is_affine)
+			/* XXX using more then one thread causes corruption? */
+			tmp->u.gen4.sf = 1;
+		} else if (tmp->src.is_affine)
 			tmp->prim_emit = gen4_emit_composite_primitive_affine_source;
 
 		tmp->floats_per_vertex = 3 + !tmp->is_affine;
@@ -2715,6 +2718,7 @@ gen4_render_composite_spans(struct sna *sna,
 
 	tmp->base.u.gen4.wm_kernel = WM_KERNEL_OPACITY | !tmp->base.is_affine;
 	tmp->base.u.gen4.ve_id = 1 << 1 | tmp->base.is_affine;
+	tmp->base.u.gen4.sf = 0;
 
 	tmp->box   = gen4_render_composite_spans_box;
 	tmp->boxes = gen4_render_composite_spans_boxes;
@@ -2925,6 +2929,7 @@ fallback_blt:
 	tmp.floats_per_rect = 9;
 	tmp.u.gen4.wm_kernel = WM_KERNEL;
 	tmp.u.gen4.ve_id = 1;
+	tmp.u.gen4.sf = 0;
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) {
 		kgem_submit(&sna->kgem);
@@ -3057,6 +3062,7 @@ fallback:
 	op->base.floats_per_rect = 9;
 	op->base.u.gen4.wm_kernel = WM_KERNEL;
 	op->base.u.gen4.ve_id = 1;
+	op->base.u.gen4.sf = 0;
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) {
 		kgem_submit(&sna->kgem);
@@ -3179,6 +3185,7 @@ gen4_render_fill_boxes(struct sna *sna,
 	tmp.floats_per_rect = 9;
 	tmp.u.gen4.wm_kernel = WM_KERNEL;
 	tmp.u.gen4.ve_id = 1;
+	tmp.u.gen4.sf = 0;
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
@@ -3284,6 +3291,7 @@ gen4_render_fill(struct sna *sna, uint8_t alu,
 	op->base.floats_per_rect = 9;
 	op->base.u.gen4.wm_kernel = WM_KERNEL;
 	op->base.u.gen4.ve_id = 1;
+	op->base.u.gen4.sf = 0;
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
@@ -3363,6 +3371,7 @@ gen4_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 
 	tmp.u.gen4.wm_kernel = WM_KERNEL;
 	tmp.u.gen4.ve_id = 1;
+	tmp.u.gen4.sf = 0;
 
 	if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
 		_kgem_submit(&sna->kgem);
@@ -3461,7 +3470,8 @@ static uint32_t gen4_create_vs_unit_state(struct sna_static_stream *stream)
 }
 
 static uint32_t gen4_create_sf_state(struct sna_static_stream *stream,
-				     int gen, uint32_t kernel)
+				     int gen, uint32_t kernel,
+				     bool single_thread)
 {
 	struct gen4_sf_unit_state *sf;
 
@@ -3475,7 +3485,7 @@ static uint32_t gen4_create_sf_state(struct sna_static_stream *stream,
 	/* don't smash vertex header, read start from dw8 */
 	sf->thread3.urb_entry_read_offset = 1;
 	sf->thread3.dispatch_grf_start_reg = 3;
-	sf->thread4.max_threads = GEN4_MAX_SF_THREADS - 1;
+	sf->thread4.max_threads = single_thread ? 0 : GEN4_MAX_SF_THREADS - 1;
 	sf->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1;
 	sf->thread4.nr_urb_entries = URB_SF_ENTRIES;
 	sf->sf5.viewport_transform = false;	/* skip viewport */
@@ -3590,7 +3600,7 @@ static bool gen4_render_setup(struct sna *sna)
 	struct gen4_render_state *state = &sna->render_state.gen4;
 	struct sna_static_stream general;
 	struct gen4_wm_unit_state_padded *wm_state;
-	uint32_t sf[2], wm[KERNEL_COUNT];
+	uint32_t sf, wm[KERNEL_COUNT];
 	int i, j, k, l, m;
 
 	sna_static_stream_init(&general);
@@ -3600,8 +3610,7 @@ static bool gen4_render_setup(struct sna *sna)
 	 */
 	null_create(&general);
 
-	sf[0] = sna_static_stream_compile_sf(sna, &general, brw_sf_kernel__nomask);
-	sf[1] = sna_static_stream_compile_sf(sna, &general, brw_sf_kernel__mask);
+	sf = sna_static_stream_compile_sf(sna, &general, brw_sf_kernel__mask);
 	for (m = 0; m < KERNEL_COUNT; m++) {
 		if (wm_kernels[m].size) {
 			wm[m] = sna_static_stream_add(&general,
@@ -3616,8 +3625,8 @@ static bool gen4_render_setup(struct sna *sna)
 	}
 
 	state->vs = gen4_create_vs_unit_state(&general);
-	state->sf[0] = gen4_create_sf_state(&general, sna->kgem.gen, sf[0]);
-	state->sf[1] = gen4_create_sf_state(&general, sna->kgem.gen, sf[1]);
+	state->sf[0] = gen4_create_sf_state(&general, sna->kgem.gen, sf, false);
+	state->sf[1] = gen4_create_sf_state(&general, sna->kgem.gen, sf, true);
 
 	wm_state = sna_static_stream_map(&general,
 					  sizeof(*wm_state) * KERNEL_COUNT *
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index e056e3f..a2281f4 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -119,6 +119,7 @@ struct sna_composite_op {
 		struct {
 			int wm_kernel;
 			int ve_id;
+			int sf;
 		} gen4;
 
 		struct {
commit dbdb8fabfbade3f19fd8af3524468b5e6668bb66
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 4 12:37:23 2012 +0000

    sna/gen4: Special case solids through the general vertex emitter
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 3ec5113..fb1c742 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -840,7 +840,15 @@ gen4_emit_composite_primitive(struct sna *sna,
 	const float *mask_sf = op->mask.scale;
 	bool has_mask = op->u.gen4.ve_id & 2;
 
-	if (is_affine) {
+	if (op->src.is_solid) {
+		src_x[0] = 0;
+		src_y[0] = 0;
+		src_x[1] = 0;
+		src_y[1] = 1;
+		src_x[2] = 1;
+		src_y[2] = 1;
+		src_w[0] = src_w[1] = src_w[2] = 1;
+	} else if (is_affine) {
 		sna_get_transformed_coordinates(r->src.x + op->src.offset[0],
 						r->src.y + op->src.offset[1],
 						op->src.transform,
@@ -880,7 +888,15 @@ gen4_emit_composite_primitive(struct sna *sna,
 	}
 
 	if (has_mask) {
-		if (is_affine) {
+		if (op->mask.is_solid) {
+			mask_x[0] = 0;
+			mask_y[0] = 0;
+			mask_x[1] = 0;
+			mask_y[1] = 1;
+			mask_x[2] = 1;
+			mask_y[2] = 1;
+			mask_w[0] = mask_w[1] = mask_w[2] = 1;
+		} else if (is_affine) {
 			sna_get_transformed_coordinates(r->mask.x + op->mask.offset[0],
 							r->mask.y + op->mask.offset[1],
 							op->mask.transform,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 17c221e..49542cc 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -834,7 +834,15 @@ gen5_emit_composite_primitive(struct sna *sna,
 	const float *src_sf = op->src.scale;
 	const float *mask_sf = op->mask.scale;
 
-	if (is_affine) {
+	if (op->src.is_solid) {
+		src_x[0] = 0;
+		src_y[0] = 0;
+		src_x[1] = 0;
+		src_y[1] = 1;
+		src_x[2] = 1;
+		src_y[2] = 1;
+		src_w[0] = src_w[1] = src_w[2] = 1;
+	} else if (is_affine) {
 		sna_get_transformed_coordinates(r->src.x + op->src.offset[0],
 						r->src.y + op->src.offset[1],
 						op->src.transform,
@@ -874,7 +882,15 @@ gen5_emit_composite_primitive(struct sna *sna,
 	}
 
 	if (op->mask.bo) {
-		if (is_affine) {
+		if (op->mask.is_solid) {
+			mask_x[0] = 0;
+			mask_y[0] = 0;
+			mask_x[1] = 0;
+			mask_y[1] = 1;
+			mask_x[2] = 1;
+			mask_y[2] = 1;
+			mask_w[0] = mask_w[1] = mask_w[2] = 1;
+		} else if (is_affine) {
 			sna_get_transformed_coordinates(r->mask.x + op->mask.offset[0],
 							r->mask.y + op->mask.offset[1],
 							op->mask.transform,
commit a17354d5ce6aeeab3f6e42aba63fce06ad18c526
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 4 12:01:26 2012 +0000

    sna/gen4: Remove unused CC viewport
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 6b74202..3ec5113 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -3531,23 +3531,11 @@ static void gen4_init_wm_state(struct gen4_wm_unit_state *wm,
 	}
 }
 
-static uint32_t gen4_create_cc_viewport(struct sna_static_stream *stream)
-{
-	struct gen4_cc_viewport vp;
-
-	vp.min_depth = -1.e35;
-	vp.max_depth = 1.e35;
-
-	return sna_static_stream_add(stream, &vp, sizeof(vp), 32);
-}
-
 static uint32_t gen4_create_cc_unit_state(struct sna_static_stream *stream)
 {
 	uint8_t *ptr, *base;
-	uint32_t vp;
 	int i, j;
 
-	vp = gen4_create_cc_viewport(stream);
 	base = ptr =
 		sna_static_stream_map(stream,
 				      GEN4_BLENDFACTOR_COUNT*GEN4_BLENDFACTOR_COUNT*64,
@@ -3560,7 +3548,6 @@ static uint32_t gen4_create_cc_unit_state(struct sna_static_stream *stream)
 
 			state->cc3.blend_enable =
 				!(j == GEN4_BLENDFACTOR_ZERO && i == GEN4_BLENDFACTOR_ONE);
-			state->cc4.cc_viewport_state_offset = vp >> 5;
 
 			state->cc5.logicop_func = 0xc;	/* COPY */
 			state->cc5.ia_blend_function = GEN4_BLENDFUNCTION_ADD;
commit b9afb9cb614d2ad44330eed03b3f577a35184a88
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Dec 4 11:14:58 2012 +0000

    sna/gen4: Avoid emitting URB_FENCE across a cache-line
    
    Old erratum.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index e686cad..6b74202 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1106,6 +1106,9 @@ gen4_emit_urb(struct sna *sna)
 	urb_cs_start = urb_sf_start + urb_sf_size;
 	urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
 
+	while ((sna->kgem.nbatch & 15) > 12)
+		OUT_BATCH(MI_NOOP);
+
 	OUT_BATCH(GEN4_URB_FENCE |
 		  UF0_CS_REALLOC |
 		  UF0_SF_REALLOC |


More information about the xorg-commit mailing list