[igt-dev] [PATCH i-g-t v2 4/5] lib/gpu_fill: Further code unification in gpu_fill

Katarzyna Dec katarzyna.dec at intel.com
Fri Apr 27 10:03:41 UTC 2018


We can unify gen7_emit_vfe_state and gen8_emit_vfe_state
functions for gpgpu/media_fill and media_spin by adding
parameters. gen8_emit_media_object was renamed to gen_*
and extended with additional offset parameters - we can
have one gen7_emit_media_objects for all tests.
I have renamed gen8_emit_media_object to gen_emit_*, because
funtion belongs to all gens and it would be odd to have
all named genX_* and only one without this prefix.

Signed-off-by: Katarzyna Dec <katarzyna.dec at intel.com>
Cc: Lukasz Kalamarz <lukasz.kalamarz at intel.com>
Cc: Antonio Argenziano <antonio.argenziano at intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
---
 lib/gpgpu_fill.c      |  26 ++++++++--
 lib/gpu_fill.c        | 129 +++++++++-----------------------------------------
 lib/gpu_fill.h        |  20 ++++----
 lib/media_fill_gen7.c |  10 +++-
 lib/media_fill_gen8.c |   8 +++-
 lib/media_fill_gen9.c |   8 +++-
 lib/media_spin.c      |  25 ++++++++--
 7 files changed, 97 insertions(+), 129 deletions(-)

diff --git a/lib/gpgpu_fill.c b/lib/gpgpu_fill.c
index 52925a5c..3b89dd1b 100644
--- a/lib/gpgpu_fill.c
+++ b/lib/gpgpu_fill.c
@@ -106,6 +106,13 @@ gen7_gpgpu_fillfunc(struct intel_batchbuffer *batch,
 	uint32_t curbe_buffer, interface_descriptor;
 	uint32_t batch_end;
 
+	/* Parameters for gen7_emit_vfe_state. */
+	uint32_t threads = 1;
+	uint32_t urb_entries = 0;
+	uint32_t urb_size = 0;
+	uint32_t curbe_size = 1;
+	uint32_t mode = 1;
+
 	intel_batchbuffer_flush(batch);
 
 	/* setup states */
@@ -129,7 +136,8 @@ gen7_gpgpu_fillfunc(struct intel_batchbuffer *batch,
 	OUT_BATCH(GEN7_PIPELINE_SELECT | PIPELINE_SELECT_GPGPU);
 
 	gen7_emit_state_base_address(batch);
-	gen7_emit_vfe_state_gpgpu(batch);
+	gen7_emit_vfe_state(batch, threads, urb_entries, urb_size, curbe_size,
+			    mode);
 	gen7_emit_curbe_load(batch, curbe_buffer);
 	gen7_emit_interface_descriptor_load(batch, interface_descriptor);
 	gen7_emit_gpgpu_walk(batch, x, y, width, height);
@@ -153,6 +161,12 @@ gen8_gpgpu_fillfunc(struct intel_batchbuffer *batch,
 	uint32_t curbe_buffer, interface_descriptor;
 	uint32_t batch_end;
 
+	/* Parameters for gen8_emit_vfe_state. */
+	uint32_t threads = 1;
+	uint32_t urb_entries = 1;
+	uint32_t urb_size = 0;
+	uint32_t curbe_size = 1;
+
 	intel_batchbuffer_flush(batch);
 
 	/* setup states */
@@ -176,7 +190,7 @@ gen8_gpgpu_fillfunc(struct intel_batchbuffer *batch,
 	OUT_BATCH(GEN7_PIPELINE_SELECT | PIPELINE_SELECT_GPGPU);
 
 	gen8_emit_state_base_address(batch);
-	gen8_emit_vfe_state_gpgpu(batch);
+	gen8_emit_vfe_state(batch, threads, urb_entries, urb_size, curbe_size);
 	gen7_emit_curbe_load(batch, curbe_buffer);
 	gen7_emit_interface_descriptor_load(batch, interface_descriptor);
 	gen8_emit_gpgpu_walk(batch, x, y, width, height);
@@ -200,6 +214,12 @@ gen9_gpgpu_fillfunc(struct intel_batchbuffer *batch,
 	uint32_t curbe_buffer, interface_descriptor;
 	uint32_t batch_end;
 
+	/* Parameters for gen9_emit_vfe_state. */
+	uint32_t threads = 1;
+	uint32_t urb_entries = 1;
+	uint32_t urb_size = 0;
+	uint32_t curbe_size = 1;
+
 	intel_batchbuffer_flush(batch);
 
 	/* setup states */
@@ -224,7 +244,7 @@ gen9_gpgpu_fillfunc(struct intel_batchbuffer *batch,
 		  PIPELINE_SELECT_GPGPU);
 
 	gen9_emit_state_base_address(batch);
-	gen8_emit_vfe_state_gpgpu(batch);
+	gen8_emit_vfe_state(batch, threads, urb_entries, urb_size, curbe_size);
 	gen7_emit_curbe_load(batch, curbe_buffer);
 	gen7_emit_interface_descriptor_load(batch, interface_descriptor);
 	gen8_emit_gpgpu_walk(batch, x, y, width, height);
diff --git a/lib/gpu_fill.c b/lib/gpu_fill.c
index 25c0c810..57b95840 100644
--- a/lib/gpu_fill.c
+++ b/lib/gpu_fill.c
@@ -37,8 +37,7 @@ gen7_render_flush(struct intel_batchbuffer *batch, uint32_t batch_end)
 }
 
 uint32_t
-gen7_fill_curbe_buffer_data(struct intel_batchbuffer *batch,
-			uint8_t color)
+gen7_fill_curbe_buffer_data(struct intel_batchbuffer *batch, uint8_t color)
 {
 	uint8_t *curbe_buffer;
 	uint32_t offset;
@@ -193,7 +192,9 @@ gen7_emit_state_base_address(struct intel_batchbuffer *batch)
 }
 
 void
-gen7_emit_vfe_state(struct intel_batchbuffer *batch)
+gen7_emit_vfe_state(struct intel_batchbuffer *batch, uint32_t threads,
+		    uint32_t urb_entries, uint32_t urb_size,
+		    uint32_t curbe_size, uint32_t mode)
 {
 	OUT_BATCH(GEN7_MEDIA_VFE_STATE | (8 - 2));
 
@@ -201,39 +202,15 @@ gen7_emit_vfe_state(struct intel_batchbuffer *batch)
 	OUT_BATCH(0);
 
 	/* number of threads & urb entries */
-	OUT_BATCH(1 << 16 |
-		2 << 8);
+	OUT_BATCH(threads << 16 |
+		urb_entries << 8 |
+		mode << 2); /* GPGPU mode */
 
 	OUT_BATCH(0);
 
 	/* urb entry size & curbe size */
-	OUT_BATCH(2 << 16 |	/* in 256 bits unit */
-		  2);		/* in 256 bits unit */
-
-	/* scoreboard */
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-}
-
-void
-gen7_emit_vfe_state_gpgpu(struct intel_batchbuffer *batch)
-{
-	OUT_BATCH(GEN7_MEDIA_VFE_STATE | (8 - 2));
-
-	/* scratch buffer */
-	OUT_BATCH(0);
-
-	/* number of threads & urb entries */
-	OUT_BATCH(1 << 16 | /* max num of threads */
-		  0 << 8 | /* num of URB entry */
-		  1 << 2); /* GPGPU mode */
-
-	OUT_BATCH(0);
-
-	/* urb entry size & curbe size */
-	OUT_BATCH(0 << 16 |	/* URB entry size in 256 bits unit */
-		  1);		/* CURBE entry size in 256 bits unit */
+	OUT_BATCH(urb_size << 16 |	/* in 256 bits unit */
+		  curbe_size);		/* in 256 bits unit */
 
 	/* scoreboard */
 	OUT_BATCH(0);
@@ -271,32 +248,14 @@ gen7_emit_interface_descriptor_load(struct intel_batchbuffer *batch,
 
 void
 gen7_emit_media_objects(struct intel_batchbuffer *batch,
-			unsigned int x, unsigned int y,
+			unsigned int xoffset, unsigned int yoffset,
 			unsigned int width, unsigned int height)
 {
 	int i, j;
 
 	for (i = 0; i < width / 16; i++) {
 		for (j = 0; j < height / 16; j++) {
-			OUT_BATCH(GEN7_MEDIA_OBJECT | (8 - 2));
-
-			/* interface descriptor offset */
-			OUT_BATCH(0);
-
-			/* without indirect data */
-			OUT_BATCH(0);
-			OUT_BATCH(0);
-
-			/* scoreboard */
-			OUT_BATCH(0);
-			OUT_BATCH(0);
-
-			/* inline data (xoffset, yoffset) */
-			OUT_BATCH(x + i * 16);
-			OUT_BATCH(y + j * 16);
-			if (AT_LEAST_GEN(batch->devid, 8) &&
-			    !IS_CHERRYVIEW(batch->devid))
-				gen8_emit_media_state_flush(batch);
+			gen_emit_media_object(batch, xoffset, yoffset);
 		}
 	}
 }
@@ -503,32 +462,9 @@ gen8_emit_media_state_flush(struct intel_batchbuffer *batch)
 }
 
 void
-gen8_emit_vfe_state(struct intel_batchbuffer *batch)
-{
-	OUT_BATCH(GEN7_MEDIA_VFE_STATE | (9 - 2));
-
-	/* scratch buffer */
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-
-	/* number of threads & urb entries */
-	OUT_BATCH(1 << 16 |
-		2 << 8);
-
-	OUT_BATCH(0);
-
-	/* urb entry size & curbe size */
-	OUT_BATCH(2 << 16 |
-		2);
-
-	/* scoreboard */
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-}
-
-void
-gen8_emit_vfe_state_gpgpu(struct intel_batchbuffer *batch)
+gen8_emit_vfe_state(struct intel_batchbuffer *batch, uint32_t threads,
+		    uint32_t urb_entries, uint32_t urb_size,
+		    uint32_t curbe_size)
 {
 	OUT_BATCH(GEN7_MEDIA_VFE_STATE | (9 - 2));
 
@@ -537,36 +473,14 @@ gen8_emit_vfe_state_gpgpu(struct intel_batchbuffer *batch)
 	OUT_BATCH(0);
 
 	/* number of threads & urb entries */
-	OUT_BATCH(1 << 16 | 1 << 8);
-
-	OUT_BATCH(0);
-
-	/* urb entry size & curbe size */
-	OUT_BATCH(0 << 16 | 1);
-
-	/* scoreboard */
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-}
-
-void
-gen8_emit_vfe_state_spin(struct intel_batchbuffer *batch)
-{
-	OUT_BATCH(GEN8_MEDIA_VFE_STATE | (9 - 2));
-
-	/* scratch buffer */
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-
-	/* number of threads & urb entries */
-	OUT_BATCH(2 << 8);
+	OUT_BATCH(threads << 16 |
+		urb_entries << 8);
 
 	OUT_BATCH(0);
 
 	/* urb entry size & curbe size */
-	OUT_BATCH(2 << 16 |
-		2);
+	OUT_BATCH(urb_size << 16 |
+		curbe_size);
 
 	/* scoreboard */
 	OUT_BATCH(0);
@@ -635,7 +549,8 @@ gen8_emit_gpgpu_walk(struct intel_batchbuffer *batch,
 }
 
 void
-gen8_emit_media_objects_spin(struct intel_batchbuffer *batch)
+gen_emit_media_object(struct intel_batchbuffer *batch,
+		       unsigned int xoffset, unsigned int yoffset)
 {
 	OUT_BATCH(GEN8_MEDIA_OBJECT | (8 - 2));
 
@@ -651,8 +566,8 @@ gen8_emit_media_objects_spin(struct intel_batchbuffer *batch)
 	OUT_BATCH(0);
 
 	/* inline data (xoffset, yoffset) */
-	OUT_BATCH(0);
-	OUT_BATCH(0);
+	OUT_BATCH(xoffset);
+	OUT_BATCH(yoffset);
 	if (AT_LEAST_GEN(batch->devid, 8) && !IS_CHERRYVIEW(batch->devid))
 		gen8_emit_media_state_flush(batch);
 }
diff --git a/lib/gpu_fill.h b/lib/gpu_fill.h
index abb3b4c3..3a800198 100644
--- a/lib/gpu_fill.h
+++ b/lib/gpu_fill.h
@@ -67,10 +67,9 @@ void
 gen7_emit_state_base_address(struct intel_batchbuffer *batch);
 
 void
-gen7_emit_vfe_state(struct intel_batchbuffer *batch);
-
-void
-gen7_emit_vfe_state_gpgpu(struct intel_batchbuffer *batch);
+gen7_emit_vfe_state(struct intel_batchbuffer *batch, uint32_t threads,
+		    uint32_t urb_entries, uint32_t urb_size,
+		    uint32_t curbe_size, uint32_t mode);
 
 void
 gen7_emit_curbe_load(struct intel_batchbuffer *batch, uint32_t curbe_buffer);
@@ -111,13 +110,9 @@ void
 gen8_emit_media_state_flush(struct intel_batchbuffer *batch);
 
 void
-gen8_emit_vfe_state(struct intel_batchbuffer *batch);
-
-void
-gen8_emit_vfe_state_gpgpu(struct intel_batchbuffer *batch);
-
-void
-gen8_emit_vfe_state_spin(struct intel_batchbuffer *batch);
+gen8_emit_vfe_state(struct intel_batchbuffer *batch, uint32_t threads,
+		    uint32_t urb_entries, uint32_t urb_size,
+		    uint32_t curbe_size);
 
 void
 gen8_emit_gpgpu_walk(struct intel_batchbuffer *batch,
@@ -125,7 +120,8 @@ gen8_emit_gpgpu_walk(struct intel_batchbuffer *batch,
 		     unsigned int width, unsigned int height);
 
 void
-gen8_emit_media_objects_spin(struct intel_batchbuffer *batch);
+gen_emit_media_object(struct intel_batchbuffer *batch, unsigned int xoffset,
+		  unsigned int yoffset);
 
 void
 gen9_emit_state_base_address(struct intel_batchbuffer *batch);
diff --git a/lib/media_fill_gen7.c b/lib/media_fill_gen7.c
index 3dc5617e..02dff04b 100644
--- a/lib/media_fill_gen7.c
+++ b/lib/media_fill_gen7.c
@@ -54,6 +54,13 @@ gen7_media_fillfunc(struct intel_batchbuffer *batch,
 	uint32_t curbe_buffer, interface_descriptor;
 	uint32_t batch_end;
 
+	/* Parameters for gen7_emit_vfe_state. */
+	uint32_t threads = 1;
+	uint32_t urb_entries = 2;
+	uint32_t urb_size = 2;
+	uint32_t curbe_size = 2;
+	uint32_t mode = 0;
+
 	intel_batchbuffer_flush(batch);
 
 	/* setup states */
@@ -69,7 +76,8 @@ gen7_media_fillfunc(struct intel_batchbuffer *batch,
 	OUT_BATCH(GEN7_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
 	gen7_emit_state_base_address(batch);
 
-	gen7_emit_vfe_state(batch);
+	gen7_emit_vfe_state(batch, threads, urb_entries, urb_size, curbe_size,
+			    mode);
 
 	gen7_emit_curbe_load(batch, curbe_buffer);
 
diff --git a/lib/media_fill_gen8.c b/lib/media_fill_gen8.c
index 63fe72eb..3103b5e7 100644
--- a/lib/media_fill_gen8.c
+++ b/lib/media_fill_gen8.c
@@ -57,6 +57,12 @@ gen8_media_fillfunc(struct intel_batchbuffer *batch,
 	uint32_t curbe_buffer, interface_descriptor;
 	uint32_t batch_end;
 
+	/* Parameters for gen8_emit_vfe_state. */
+	uint32_t threads = 1;
+	uint32_t urb_entries = 2;
+	uint32_t urb_size = 2;
+	uint32_t curbe_size = 2;
+
 	intel_batchbuffer_flush(batch);
 
 	/* setup states */
@@ -72,7 +78,7 @@ gen8_media_fillfunc(struct intel_batchbuffer *batch,
 	OUT_BATCH(GEN8_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
 	gen8_emit_state_base_address(batch);
 
-	gen8_emit_vfe_state(batch);
+	gen8_emit_vfe_state(batch, threads, urb_entries, urb_size, curbe_size);
 
 	gen7_emit_curbe_load(batch, curbe_buffer);
 
diff --git a/lib/media_fill_gen9.c b/lib/media_fill_gen9.c
index 78e892f2..d783d0bd 100644
--- a/lib/media_fill_gen9.c
+++ b/lib/media_fill_gen9.c
@@ -54,6 +54,12 @@ gen9_media_fillfunc(struct intel_batchbuffer *batch,
 	uint32_t curbe_buffer, interface_descriptor;
 	uint32_t batch_end;
 
+	/* Parameters for gen9_emit_vfe_state. */
+	uint32_t threads = 1;
+	uint32_t urb_entries = 2;
+	uint32_t urb_size = 2;
+	uint32_t curbe_size = 2;
+
 	intel_batchbuffer_flush(batch);
 
 	/* setup states */
@@ -74,7 +80,7 @@ gen9_media_fillfunc(struct intel_batchbuffer *batch,
 			GEN9_FORCE_MEDIA_AWAKE_MASK);
 	gen9_emit_state_base_address(batch);
 
-	gen8_emit_vfe_state(batch);
+	gen8_emit_vfe_state(batch, threads, urb_entries, urb_size, curbe_size);
 
 	gen7_emit_curbe_load(batch, curbe_buffer);
 
diff --git a/lib/media_spin.c b/lib/media_spin.c
index b323550a..2a8a6bdb 100644
--- a/lib/media_spin.c
+++ b/lib/media_spin.c
@@ -68,6 +68,11 @@ static const uint32_t spin_kernel[][4] = {
 
 #define BATCH_STATE_SPLIT 2048
 
+/* Offsets needed in gen_emit_media_object. In media_spin library this  * values do not matter.
+ */
+#define xoffset 0
+#define yoffset 0
+
 void
 gen8_media_spinfunc(struct intel_batchbuffer *batch,
 		    struct igt_buf *dst, uint32_t spins)
@@ -75,6 +80,12 @@ gen8_media_spinfunc(struct intel_batchbuffer *batch,
 	uint32_t curbe_buffer, interface_descriptor;
 	uint32_t batch_end;
 
+	/* Parameters for gen8_emit_vfe_state. */
+	uint32_t threads = 2;
+	uint32_t urb_entries = 0;
+	uint32_t urb_size = 2;
+	uint32_t curbe_size = 2;
+
 	intel_batchbuffer_flush_with_context(batch, NULL);
 
 	/* setup states */
@@ -90,13 +101,13 @@ gen8_media_spinfunc(struct intel_batchbuffer *batch,
 	OUT_BATCH(GEN8_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
 	gen8_emit_state_base_address(batch);
 
-	gen8_emit_vfe_state_spin(batch);
+	gen8_emit_vfe_state(batch, threads, urb_entries, urb_size, curbe_size);
 
 	gen7_emit_curbe_load(batch, curbe_buffer);
 
 	gen7_emit_interface_descriptor_load(batch, interface_descriptor);
 
-	gen8_emit_media_objects_spin(batch);
+	gen_emit_media_object(batch, xoffset, yoffset);
 
 	OUT_BATCH(MI_BATCH_BUFFER_END);
 
@@ -114,6 +125,12 @@ gen9_media_spinfunc(struct intel_batchbuffer *batch,
 	uint32_t curbe_buffer, interface_descriptor;
 	uint32_t batch_end;
 
+	/* Parameters for gen9_emit_vfe_state. */
+	uint32_t threads = 1;
+	uint32_t urb_entries = 1;
+	uint32_t urb_size = 0;
+	uint32_t curbe_size = 1;
+
 	intel_batchbuffer_flush_with_context(batch, NULL);
 
 	/* setup states */
@@ -134,13 +151,13 @@ gen9_media_spinfunc(struct intel_batchbuffer *batch,
 			GEN9_FORCE_MEDIA_AWAKE_MASK);
 	gen9_emit_state_base_address(batch);
 
-	gen8_emit_vfe_state_spin(batch);
+	gen8_emit_vfe_state(batch, threads, urb_entries, urb_size, curbe_size);
 
 	gen7_emit_curbe_load(batch, curbe_buffer);
 
 	gen7_emit_interface_descriptor_load(batch, interface_descriptor);
 
-	gen8_emit_media_objects_spin(batch);
+	gen_emit_media_object(batch, xoffset, yoffset);
 
 	OUT_BATCH(GEN8_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA |
 			GEN9_FORCE_MEDIA_AWAKE_DISABLE |
-- 
2.14.3



More information about the igt-dev mailing list