All of lore.kernel.org
 help / color / mirror / Atom feed
* Generate raw batches for unit testing the decoder
@ 2013-12-13 18:15 Damien Lespiau
  2013-12-13 18:15 ` [PATCH 1/2] tests: Add a helper to generate raw batches Damien Lespiau
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Damien Lespiau @ 2013-12-13 18:15 UTC (permalink / raw)
  To: intel-gfx

libdrm has a way to unit-test the CS decoder: test_decode can decode a raw
batch and compare it to a reference output.

However, one still needs to genarate the raw, binary, batches to feed to
test_decode. This couple of patches do exactly that.

-- 
Damien

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] tests: Add a helper to generate raw batches
  2013-12-13 18:15 Generate raw batches for unit testing the decoder Damien Lespiau
@ 2013-12-13 18:15 ` Damien Lespiau
  2013-12-13 18:15 ` [PATCH 2/2] generate_test_batches: Add a MI_LOAD_REGISTER_IMM test batch Damien Lespiau
  2013-12-16 10:53 ` Generate raw batches for unit testing the decoder Damien Lespiau
  2 siblings, 0 replies; 4+ messages in thread
From: Damien Lespiau @ 2013-12-13 18:15 UTC (permalink / raw)
  To: intel-gfx

These batches can be used to test the CS parser in libdrm. Let's start
by generating a MI_FLUSH_DW command that flushes a DWord (as opposed to
a QWord).

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
---
 tests/.gitignore              |   1 +
 tests/Makefile.sources        |   1 +
 tests/generate_test_batches.c | 109 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 111 insertions(+)
 create mode 100644 tests/generate_test_batches.c

diff --git a/tests/.gitignore b/tests/.gitignore
index 8a00364..f6e2cf8 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -97,6 +97,7 @@ gen3_render_linear_blits
 gen3_render_mixed_blits
 gen3_render_tiledx_blits
 gen3_render_tiledy_blits
+generate_test_batches
 igt_fork_helper
 igt_list_only
 igt_no_exit
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index e286a7c..493fa4e 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -1,6 +1,7 @@
 noinst_PROGRAMS = \
 	gem_stress \
 	ddi_compute_wrpll \
+	generate_test_batches \
 	$(TESTS_progs) \
 	$(TESTS_progs_M) \
 	$(HANG) \
diff --git a/tests/generate_test_batches.c b/tests/generate_test_batches.c
new file mode 100644
index 0000000..997ce37
--- /dev/null
+++ b/tests/generate_test_batches.c
@@ -0,0 +1,109 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "drmtest.h"
+#include "intel_batchbuffer.h"
+#include "gen8_render.h"
+#include "intel_reg.h"
+#include "i830_reg.h"
+
+#define ALIGN(x, y) (((x) + (y)-1) & ~((y)-1))
+
+static uint32_t
+batch_used(struct intel_batchbuffer *batch)
+{
+	return batch->ptr - batch->buffer;
+}
+
+static void dump_batch(struct intel_batchbuffer *batch,
+		       const char *filename)
+{
+	int fd;
+
+	fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC,  0666);
+	if (fd == -1) {
+		fprintf(stderr, "Couldn't open %s: %s", filename,
+			strerror(errno));
+		return;
+	}
+
+	write(fd, batch->buffer, batch_used(batch));
+	close(fd);
+}
+
+static uint32_t
+batch_align(struct intel_batchbuffer *batch, uint32_t align)
+{
+	uint32_t offset;
+
+	offset = batch_used(batch);
+	offset = ALIGN(offset, align);
+	batch->ptr = batch->buffer + offset;
+	return offset;
+}
+
+static void batch_start(struct intel_batchbuffer *batch)
+{
+	batch_align(batch, 8);
+}
+
+static void batch_finish(struct intel_batchbuffer *batch, const char *filename)
+{
+	uint32_t batch_end;
+
+	batch_end = batch_align(batch, 8);
+	assert(batch_end < 4095);
+
+	dump_batch(batch, filename);
+
+	intel_batchbuffer_reset(batch);
+}
+
+static void emit_mi_flush_dw(struct intel_batchbuffer *batch)
+{
+	batch_start(batch);
+
+	OUT_BATCH(MI_FLUSH_DW | (4-2));
+	OUT_BATCH(0xdead0000 | 1 << 2);
+	OUT_BATCH(0);
+	OUT_BATCH(0);
+
+	/*
+	 * Add a random command after MI_FLUSH_DW to make sure we continue
+	 * decoding correctly
+	 */
+
+	OUT_BATCH(MI_STORE_DWORD_IMM);
+	OUT_RELOC(batch->bo, I915_GEM_DOMAIN_INSTRUCTION,
+		  I915_GEM_DOMAIN_INSTRUCTION, 0xbeef00);
+	OUT_BATCH(0);
+	OUT_BATCH(0xf00);
+
+	batch_finish(batch, "gen8-2d-mi-flush-dw-len-4.batch");
+}
+
+static struct gen_batches {
+	int drm_fd;
+	uint32_t devid;
+	drm_intel_bufmgr *bufmgr;
+} data;
+
+int main(int argc, char **argv)
+{
+	struct intel_batchbuffer *batch = NULL;
+
+	data.drm_fd = drm_open_any_render();
+	data.devid = intel_get_drm_devid(data.drm_fd);
+	data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096);
+	igt_assert(data.bufmgr);
+
+	batch = intel_batchbuffer_alloc(data.bufmgr, data.devid);
+	igt_assert(batch);
+
+	emit_mi_flush_dw(batch);
+}
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] generate_test_batches: Add a MI_LOAD_REGISTER_IMM test batch
  2013-12-13 18:15 Generate raw batches for unit testing the decoder Damien Lespiau
  2013-12-13 18:15 ` [PATCH 1/2] tests: Add a helper to generate raw batches Damien Lespiau
@ 2013-12-13 18:15 ` Damien Lespiau
  2013-12-16 10:53 ` Generate raw batches for unit testing the decoder Damien Lespiau
  2 siblings, 0 replies; 4+ messages in thread
From: Damien Lespiau @ 2013-12-13 18:15 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
---
 tests/generate_test_batches.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/tests/generate_test_batches.c b/tests/generate_test_batches.c
index 997ce37..41f883d 100644
--- a/tests/generate_test_batches.c
+++ b/tests/generate_test_batches.c
@@ -87,6 +87,25 @@ static void emit_mi_flush_dw(struct intel_batchbuffer *batch)
 	batch_finish(batch, "gen8-2d-mi-flush-dw-len-4.batch");
 }
 
+#define MI_LOAD_REGISTER_IMM	(0x22<<23)
+
+/*
+ * Make sure we correctly print out addresses when the address field only
+ * specificies a number of bits (eg. 22:3). The value to decode is then:
+ *   val << 3
+ * and not just the raw field value.
+ */
+static void emit_mi_load_register_imm(struct intel_batchbuffer *batch)
+{
+	batch_start(batch);
+
+	OUT_BATCH(MI_LOAD_REGISTER_IMM | (3-2));
+	OUT_BATCH(0x0000227c);
+	OUT_BATCH(0);
+
+	batch_finish(batch, "gen8-3d-partial-addresses.batch");
+}
+
 static struct gen_batches {
 	int drm_fd;
 	uint32_t devid;
@@ -106,4 +125,5 @@ int main(int argc, char **argv)
 	igt_assert(batch);
 
 	emit_mi_flush_dw(batch);
+	emit_mi_load_register_imm(batch);
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: Generate raw batches for unit testing the decoder
  2013-12-13 18:15 Generate raw batches for unit testing the decoder Damien Lespiau
  2013-12-13 18:15 ` [PATCH 1/2] tests: Add a helper to generate raw batches Damien Lespiau
  2013-12-13 18:15 ` [PATCH 2/2] generate_test_batches: Add a MI_LOAD_REGISTER_IMM test batch Damien Lespiau
@ 2013-12-16 10:53 ` Damien Lespiau
  2 siblings, 0 replies; 4+ messages in thread
From: Damien Lespiau @ 2013-12-16 10:53 UTC (permalink / raw)
  To: intel-gfx

On Fri, Dec 13, 2013 at 06:15:45PM +0000, Damien Lespiau wrote:
> libdrm has a way to unit-test the CS decoder: test_decode can decode a raw
> batch and compare it to a reference output.
> 
> However, one still needs to genarate the raw, binary, batches to feed to
> test_decode. This couple of patches do exactly that.

Chris noted that it's weird to have those in igt to test code in libdrm.
While this is true, I didn't want to create yet another copy of the
command definitions we'd have to synchronize by hand (lacking a better
solution).

I don't mind keeping them in a branch, so let's just discard those.

-- 
Damien

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-12-16 10:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-13 18:15 Generate raw batches for unit testing the decoder Damien Lespiau
2013-12-13 18:15 ` [PATCH 1/2] tests: Add a helper to generate raw batches Damien Lespiau
2013-12-13 18:15 ` [PATCH 2/2] generate_test_batches: Add a MI_LOAD_REGISTER_IMM test batch Damien Lespiau
2013-12-16 10:53 ` Generate raw batches for unit testing the decoder Damien Lespiau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.