xf86-video-intel: 2 commits - src/sna/gen2_render.c src/sna/gen9_render.c src/sna/sna_render_inline.h

Chris Wilson ickle at kemper.freedesktop.org
Wed Oct 18 15:07:09 UTC 2017


 src/sna/gen2_render.c       |   13 +++++++++++--
 src/sna/gen9_render.c       |   26 +++++++++++++++++++-------
 src/sna/sna_render_inline.h |    9 +++++++++
 3 files changed, 39 insertions(+), 9 deletions(-)

New commits:
commit 1977e134751b98b217313b31b00d31147fe26fb6
Author: Ville Syrjälä <ville.syrjala at linux.intel.com>
Date:   Mon Sep 25 22:06:12 2017 +0300

    sna: Implement i830 3DSTATE_BUFFER_INFO w/a
    
    i830 can hang if 3DSTATE_BUFFER_INFO straddles two cachelines.
    To prevent that emit MI_NOOPs to align 3DSTATE_BUFFER_INFO to
    a cacheline boundary.
    
    Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 49ad16a3..e03c4401 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -52,6 +52,7 @@
 #define MAX_INLINE (1 << 18)
 
 #define BATCH(v) batch_emit(sna, v)
+#define BATCH_ALIGNED(v, a) batch_emit_aligned(sna, v, a)
 #define BATCH_F(v) batch_emit_float(sna, v)
 #define VERTEX(v) batch_emit_float(sna, v)
 
@@ -568,7 +569,8 @@ gen2_get_batch(struct sna *sna, const struct sna_composite_op *op)
 {
 	kgem_set_mode(&sna->kgem, KGEM_RENDER, op->dst.bo);
 
-	if (!kgem_check_batch(&sna->kgem, INVARIANT_SIZE+40)) {
+	/* +7 for i830 3DSTATE_BUFFER_INFO w/a */
+	if (!kgem_check_batch(&sna->kgem, INVARIANT_SIZE+40+7)) {
 		DBG(("%s: flushing batch: size %d > %d\n",
 		     __FUNCTION__, INVARIANT_SIZE+40,
 		     sna->kgem.surface-sna->kgem.nbatch));
@@ -614,7 +616,14 @@ static void gen2_emit_target(struct sna *sna,
 		return;
 	}
 
-	BATCH(_3DSTATE_BUF_INFO_CMD);
+	/*
+	 * i830 w/a: 3DSTATE_BUFFER_INFO
+	 * must not straddle two cachelines.
+	 */
+	if (intel_get_device_id(sna->dev) == 0x3577)
+		BATCH_ALIGNED(_3DSTATE_BUF_INFO_CMD, 8);
+	else
+		BATCH(_3DSTATE_BUF_INFO_CMD);
 	BATCH(BUF_3D_ID_COLOR_BACK |
 	      gen2_buf_tiling(bo->tiling) |
 	      BUF_3D_PITCH(bo->pitch));
diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index e162e37f..f2d9c226 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -56,6 +56,15 @@ static force_inline void batch_emit(struct sna *sna, uint32_t dword)
 	sna->kgem.batch[sna->kgem.nbatch++] = dword;
 }
 
+static force_inline void batch_emit_aligned(struct sna *sna, uint32_t dword, unsigned align)
+{
+	assert(sna->kgem.mode != KGEM_NONE);
+	assert(sna->kgem.nbatch + KGEM_BATCH_RESERVED < sna->kgem.surface);
+	while (sna->kgem.nbatch & (align-1))
+		sna->kgem.batch[sna->kgem.nbatch++] = 0;
+	sna->kgem.batch[sna->kgem.nbatch++] = dword;
+}
+
 static force_inline void batch_emit64(struct sna *sna, uint64_t qword)
 {
 	assert(sna->kgem.mode != KGEM_NONE);
commit 12d15608731fb92c79ea3777286b36fca99e3d46
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Sep 26 17:10:02 2017 +0100

    hmm

diff --git a/src/sna/gen9_render.c b/src/sna/gen9_render.c
index 68ac1438..66041163 100644
--- a/src/sna/gen9_render.c
+++ b/src/sna/gen9_render.c
@@ -919,8 +919,6 @@ gen9_emit_invariant(struct sna *sna)
 	gen9_emit_push_constants(sna);
 	gen9_emit_urb(sna);
 
-	gen9_emit_state_base_address(sna);
-
 	gen9_emit_vf_invariant(sna);
 	gen9_emit_vs_invariant(sna);
 	gen9_emit_hs_invariant(sna);
@@ -932,8 +930,6 @@ gen9_emit_invariant(struct sna *sna)
 	gen9_emit_sf_invariant(sna);
 	gen9_emit_wm_invariant(sna);
 	gen9_emit_cc_invariant(sna);
-
-	sna->render_state.gen9.needs_invariant = false;
 }
 
 static void
@@ -1670,8 +1666,10 @@ gen9_get_batch(struct sna *sna, const struct sna_composite_op *op)
 	assert(sna->kgem.mode == KGEM_RENDER);
 	assert(sna->kgem.ring == KGEM_RENDER);
 
-	if (sna->render_state.gen9.needs_invariant)
-		gen9_emit_invariant(sna);
+	if (sna->render_state.gen9.needs_invariant) {
+		gen9_emit_state_base_address(sna);
+		sna->render_state.gen9.needs_invariant = false;
+	}
 }
 
 static void gen9_emit_composite_state(struct sna *sna,
@@ -4029,6 +4027,19 @@ static void gen9_render_reset(struct sna *sna)
 	sna->render.vb_id = 0;
 }
 
+static void gen9_render_once(struct sna *sna)
+{
+	gen9_render_reset(sna);
+
+	kgem_set_mode(&sna->kgem, KGEM_RENDER,
+		      sna->render_state.gen9.general_bo);
+	gen9_emit_state_base_address(sna);
+	gen9_emit_invariant(sna);
+	sna->render_state.gen9.needs_invariant = false;
+
+	sna->render.reset = gen9_render_reset;
+}
+
 static void gen9_render_fini(struct sna *sna)
 {
 	kgem_bo_destroy(&sna->kgem, sna->render_state.gen9.general_bo);
@@ -4163,10 +4174,11 @@ const char *gen9_render_init(struct sna *sna, const char *backend)
 #endif
 
 	sna->render.flush = gen9_render_flush;
-	sna->render.reset = gen9_render_reset;
+	sna->render.reset = gen9_render_once;
 	sna->render.fini = gen9_render_fini;
 
 	sna->render.max_3d_size = GEN9_MAX_SIZE;
 	sna->render.max_3d_pitch = 1 << 18;
+
 	return sna->render_state.gen9.info->name;
 }


More information about the xorg-commit mailing list