xf86-video-intel: 5 commits - src/sna/brw src/sna/gen4_render.c src/sna/gen5_render.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Jan 7 07:00:24 PST 2014


 src/sna/brw/brw_eu_emit.c |    2 
 src/sna/gen4_render.c     |  126 +++++++++++++++++++++++++++++++---------------
 src/sna/gen5_render.c     |    2 
 3 files changed, 89 insertions(+), 41 deletions(-)

New commits:
commit b858c28d04dfd353a99f9d15c39599adbf5cb25f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 7 14:42:41 2014 +0000

    sna/gen4: Tidy URB_FENCE command
    
    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 d80791b..e239c21 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -79,8 +79,8 @@
 #define URB_GS_ENTRY_SIZE     0
 #define URB_GS_ENTRIES	      0
 
-#define URB_CLIP_ENTRY_SIZE   0
-#define URB_CLIP_ENTRIES      0
+#define URB_CL_ENTRY_SIZE   0
+#define URB_CL_ENTRIES      0
 
 #define URB_SF_ENTRY_SIZE     2
 #define URB_SF_ENTRIES	      64
@@ -767,25 +767,21 @@ gen4_composite_get_binding_table(struct sna *sna, uint16_t *offset)
 static void
 gen4_emit_urb(struct sna *sna)
 {
-	int urb_vs_start, urb_vs_size;
-	int urb_gs_start, urb_gs_size;
-	int urb_clip_start, urb_clip_size;
-	int urb_sf_start, urb_sf_size;
-	int urb_cs_start, urb_cs_size;
+	int urb_vs_end;
+	int urb_gs_end;
+	int urb_cl_end;
+	int urb_sf_end;
+	int urb_cs_end;
 
 	if (!sna->render_state.gen4.needs_urb)
 		return;
 
-	urb_vs_start = 0;
-	urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE;
-	urb_gs_start = urb_vs_start + urb_vs_size;
-	urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE;
-	urb_clip_start = urb_gs_start + urb_gs_size;
-	urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE;
-	urb_sf_start = urb_clip_start + urb_clip_size;
-	urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE;
-	urb_cs_start = urb_sf_start + urb_sf_size;
-	urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
+	urb_vs_end =              URB_VS_ENTRIES * URB_VS_ENTRY_SIZE;
+	urb_gs_end = urb_vs_end + URB_GS_ENTRIES * URB_GS_ENTRY_SIZE;
+	urb_cl_end = urb_gs_end + URB_CL_ENTRIES * URB_CL_ENTRY_SIZE;
+	urb_sf_end = urb_cl_end + URB_SF_ENTRIES * URB_SF_ENTRY_SIZE;
+	urb_cs_end = urb_sf_end + URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
+	assert(urb_cs_end <= 256);
 
 	while ((sna->kgem.nbatch & 15) > 12)
 		OUT_BATCH(MI_NOOP);
@@ -797,11 +793,11 @@ gen4_emit_urb(struct sna *sna)
 		  UF0_GS_REALLOC |
 		  UF0_VS_REALLOC |
 		  1);
-	OUT_BATCH(((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) |
-		  ((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) |
-		  ((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT));
-	OUT_BATCH(((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) |
-		  ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT));
+	OUT_BATCH(urb_cl_end << UF1_CLIP_FENCE_SHIFT |
+		  urb_gs_end << UF1_GS_FENCE_SHIFT |
+		  urb_vs_end << UF1_VS_FENCE_SHIFT);
+	OUT_BATCH(urb_cs_end << UF2_CS_FENCE_SHIFT |
+		  urb_sf_end << UF2_SF_FENCE_SHIFT);
 
 	/* Constant buffer state */
 	OUT_BATCH(GEN4_CS_URB_STATE | 0);
commit b7565a26401e283df94b68019e8093f8104428f4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 7 14:05:09 2014 +0000

    sna/gen4: Use PIPE_CONTROL for a smaller hammer
    
    Using MI_FLUSH to break up primitive is overkill when a top-of-pipe
    PIPE_CONTROL will suffice.
    
    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 98e56e7..d80791b 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -568,6 +568,45 @@ static void gen4_emit_vertex_buffer(struct sna *sna,
 	sna->render.vb_id |= 1 << id;
 }
 
+inline static void
+gen4_emit_pipe_flush(struct sna *sna)
+{
+#if 1
+	OUT_BATCH(GEN4_PIPE_CONTROL | (4 - 2));
+	OUT_BATCH(GEN4_PIPE_CONTROL_WC_FLUSH);
+	OUT_BATCH(0);
+	OUT_BATCH(0);
+#else
+	OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
+#endif
+}
+
+inline static void
+gen4_emit_pipe_break(struct sna *sna)
+{
+#if 1
+	OUT_BATCH(GEN4_PIPE_CONTROL | (4 - 2));
+	OUT_BATCH(0);
+	OUT_BATCH(0);
+	OUT_BATCH(0);
+#else
+	OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
+#endif
+}
+
+inline static void
+gen4_emit_pipe_invalidate(struct sna *sna)
+{
+#if 0
+	OUT_BATCH(GEN4_PIPE_CONTROL | (4 - 2));
+	OUT_BATCH(GEN4_PIPE_CONTROL_WC_FLUSH | GEN4_PIPE_CONTROL_TC_FLUSH);
+	OUT_BATCH(0);
+	OUT_BATCH(0);
+#else
+	OUT_BATCH(MI_FLUSH);
+#endif
+}
+
 static void gen4_emit_primitive(struct sna *sna)
 {
 	if (sna->kgem.nbatch == sna->render_state.gen4.last_primitive) {
@@ -604,7 +643,7 @@ static bool gen4_rectangle_begin(struct sna *sna,
 	ndwords = op->need_magic_ca_pass? 19 : 6;
 	if ((sna->render.vb_id & id) == 0)
 		ndwords += 5;
-	ndwords += 2*FORCE_FLUSH;
+	ndwords += 8*FORCE_FLUSH;
 
 	if (!kgem_check_batch(&sna->kgem, ndwords))
 		return false;
@@ -628,7 +667,7 @@ static int gen4_get_rectangles__flush(struct sna *sna,
 	}
 
 	if (!kgem_check_batch(&sna->kgem,
-			      2*FORCE_FLUSH + (op->need_magic_ca_pass ? 2*19+6 : 6)))
+			      8*FORCE_FLUSH + (op->need_magic_ca_pass ? 2*19+6 : 6)))
 		return 0;
 	if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
 		return 0;
@@ -666,7 +705,7 @@ inline static int gen4_get_rectangles(struct sna *sna,
 									     op->u.gen4.wm_kernel);
 				}
 			}
-			OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
+			gen4_emit_pipe_break(sna);
 			rem = MAX_FLUSH_VERTICES;
 		}
 	} else
@@ -1048,14 +1087,14 @@ gen4_emit_state(struct sna *sna,
 		     kgem_bo_is_dirty(op->src.bo),
 		     kgem_bo_is_dirty(op->mask.bo),
 		     flush));
-		OUT_BATCH(MI_FLUSH);
+		gen4_emit_pipe_invalidate(sna);
 		kgem_clear_dirty(&sna->kgem);
 		kgem_bo_mark_dirty(op->dst.bo);
 		flush = false;
 	}
 	flush &= gen4_emit_drawing_rectangle(sna, op);
 	if (flush && op->op > PictOpSrc)
-		OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
+		gen4_emit_pipe_flush(sna);
 
 	gen4_emit_binding_table(sna, wm_binding_table);
 	gen4_emit_pipelined_pointers(sna, op, op->op, op->u.gen4.wm_kernel);
commit 9d8473c5d9489db439aca73f470bda29a22ebab6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jan 7 13:43:35 2014 +0000

    sna/gen4: Check for available batch space before restoring state after CA pass
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73348
    References: https://bugs.freedesktop.org/show_bug.cgi?id=55500
    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 5e18fd0..98e56e7 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -601,7 +601,7 @@ static bool gen4_rectangle_begin(struct sna *sna,
 		return true;
 
 	/* 7xpipelined pointers + 6xprimitive + 1xflush */
-	ndwords = op->need_magic_ca_pass? 20 : 6;
+	ndwords = op->need_magic_ca_pass? 19 : 6;
 	if ((sna->render.vb_id & id) == 0)
 		ndwords += 5;
 	ndwords += 2*FORCE_FLUSH;
@@ -628,7 +628,7 @@ static int gen4_get_rectangles__flush(struct sna *sna,
 	}
 
 	if (!kgem_check_batch(&sna->kgem,
-			      2*FORCE_FLUSH + (op->need_magic_ca_pass ? 25 : 6)))
+			      2*FORCE_FLUSH + (op->need_magic_ca_pass ? 2*19+6 : 6)))
 		return 0;
 	if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
 		return 0;
@@ -660,9 +660,11 @@ inline static int gen4_get_rectangles(struct sna *sna,
 		if (rem <= 0) {
 			if (sna->render.vertex_offset) {
 				gen4_vertex_flush(sna);
-				if (gen4_magic_ca_pass(sna, op))
-					gen4_emit_pipelined_pointers(sna, op, op->op,
-								     op->u.gen4.wm_kernel);
+				if (gen4_magic_ca_pass(sna, op)) {
+					if (kgem_check_batch(&sna->kgem, 19+6))
+						gen4_emit_pipelined_pointers(sna, op, op->op,
+									     op->u.gen4.wm_kernel);
+				}
 			}
 			OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
 			rem = MAX_FLUSH_VERTICES;
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 9266f90..8ec2587 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -611,7 +611,7 @@ static int gen5_get_rectangles__flush(struct sna *sna,
 			return rem;
 	}
 
-	if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 20 : 6))
+	if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 40 : 6))
 		return 0;
 	if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
 		return 0;
commit 3b177a5e972a8eed63f99b0cd7b048a1229683f5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Nov 20 14:22:05 2013 +0000

    sna/gen4: Reduce flushes between primitive continuations
    
    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 637137e..5e18fd0 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1039,6 +1039,8 @@ gen4_emit_state(struct sna *sna,
 	assert(op->dst.bo->exec);
 
 	flush = wm_binding_table & 1;
+	wm_binding_table &= ~1;
+
 	if (kgem_bo_is_dirty(op->src.bo) || kgem_bo_is_dirty(op->mask.bo)) {
 		DBG(("%s: flushing dirty (%d, %d), forced? %d\n", __FUNCTION__,
 		     kgem_bo_is_dirty(op->src.bo),
@@ -1053,7 +1055,7 @@ gen4_emit_state(struct sna *sna,
 	if (flush && op->op > PictOpSrc)
 		OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
 
-	gen4_emit_binding_table(sna, wm_binding_table & ~1);
+	gen4_emit_binding_table(sna, wm_binding_table);
 	gen4_emit_pipelined_pointers(sna, op, op->op, op->u.gen4.wm_kernel);
 	gen4_emit_vertex_elements(sna, op);
 }
@@ -1062,11 +1064,11 @@ static void
 gen4_bind_surfaces(struct sna *sna,
 		   const struct sna_composite_op *op)
 {
-	bool dirty = kgem_bo_is_dirty(op->dst.bo);
 	uint32_t *binding_table;
-	uint16_t offset;
+	uint16_t offset, dirty;
 
 	gen4_get_batch(sna, op);
+	dirty = kgem_bo_is_dirty(op->dst.bo);
 
 	binding_table = gen4_composite_get_binding_table(sna, &offset);
 
@@ -1099,6 +1101,9 @@ gen4_bind_surfaces(struct sna *sna,
 		offset = sna->render_state.gen4.surface_table;
 	}
 
+	if (sna->kgem.batch[sna->render_state.gen4.surface_table] == binding_table[0])
+		dirty = 0;
+
 	gen4_emit_state(sna, op, offset | dirty);
 }
 
@@ -1273,7 +1278,6 @@ static uint32_t gen4_bind_video_source(struct sna *sna,
 static void gen4_video_bind_surfaces(struct sna *sna,
 				     const struct sna_composite_op *op)
 {
-	bool dirty = kgem_bo_is_dirty(op->dst.bo);
 	struct sna_video_frame *frame = op->priv;
 	uint32_t src_surf_format;
 	uint32_t src_surf_base[6];
@@ -1281,7 +1285,7 @@ static void gen4_video_bind_surfaces(struct sna *sna,
 	int src_height[6];
 	int src_pitch[6];
 	uint32_t *binding_table;
-	uint16_t offset;
+	uint16_t offset, dirty;
 	int n_src, n;
 
 	src_surf_base[0] = 0;
@@ -1316,6 +1320,7 @@ static void gen4_video_bind_surfaces(struct sna *sna,
 	}
 
 	gen4_get_batch(sna, op);
+	dirty = kgem_bo_is_dirty(op->dst.bo);
 
 	binding_table = gen4_composite_get_binding_table(sna, &offset);
 	binding_table[0] =
@@ -1334,6 +1339,9 @@ static void gen4_video_bind_surfaces(struct sna *sna,
 					       src_surf_format);
 	}
 
+	if (sna->kgem.batch[sna->render_state.gen4.surface_table] == binding_table[0])
+		dirty = 0;
+
 	gen4_emit_state(sna, op, offset | dirty);
 }
 
@@ -2252,11 +2260,11 @@ cleanup_dst:
 static void
 gen4_copy_bind_surfaces(struct sna *sna, const struct sna_composite_op *op)
 {
-	bool dirty = kgem_bo_is_dirty(op->dst.bo);
 	uint32_t *binding_table;
-	uint16_t offset;
+	uint16_t offset, dirty;
 
 	gen4_get_batch(sna, op);
+	dirty = kgem_bo_is_dirty(op->dst.bo);
 
 	binding_table = gen4_composite_get_binding_table(sna, &offset);
 
@@ -2277,6 +2285,9 @@ gen4_copy_bind_surfaces(struct sna *sna, const struct sna_composite_op *op)
 		offset = sna->render_state.gen4.surface_table;
 	}
 
+	if (sna->kgem.batch[sna->render_state.gen4.surface_table] == binding_table[0])
+		dirty = 0;
+
 	gen4_emit_state(sna, op, offset | dirty);
 }
 
@@ -2888,7 +2899,7 @@ static void gen4_render_reset(struct sna *sna)
 
 	sna->render_state.gen4.drawrect_offset = -1;
 	sna->render_state.gen4.drawrect_limit = -1;
-	sna->render_state.gen4.surface_table = -1;
+	sna->render_state.gen4.surface_table = 0;
 
 	if (sna->render.vbo && !kgem_bo_can_map(&sna->kgem, sna->render.vbo)) {
 		DBG(("%s: discarding unmappable vbo\n", __FUNCTION__));
commit 4966f8374a068ca2a533e30594bfd333551ffd37
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Nov 20 14:20:54 2013 +0000

    sna: Remove spurious SAMPLER writemask for gen4
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/brw/brw_eu_emit.c b/src/sna/brw/brw_eu_emit.c
index 5c0b306..81d1437 100644
--- a/src/sna/brw/brw_eu_emit.c
+++ b/src/sna/brw/brw_eu_emit.c
@@ -1802,7 +1802,7 @@ void brw_SAMPLE(struct brw_compile *p,
 {
 	assert(writemask);
 
-	if (p->gen < 050 || writemask != WRITEMASK_XYZW) {
+	if (writemask != WRITEMASK_XYZW) {
 		struct brw_reg m1 = brw_message_reg(msg_reg_nr);
 
 		writemask = ~writemask & WRITEMASK_XYZW;


More information about the xorg-commit mailing list