[igt-dev] [PATCH i-g-t v9 15/19] tests/i915/vm_bind: Add i915_capture library routines

Niranjana Vishwanathapura niranjana.vishwanathapura at intel.com
Wed Jan 18 07:12:58 UTC 2023


On Tue, Jan 17, 2023 at 10:26:27PM -0800, Niranjana Vishwanathapura wrote:
>On Fri, Jan 13, 2023 at 10:06:14AM +0000, Matthew Auld wrote:
>>On 12/12/2022 23:12, Niranjana Vishwanathapura wrote:
>>>In preparation of i915_vm_bind_capture test, move some common
>>>capture decode routines to library for code sharing.
>>>
>>>Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>
>>>---
>>> lib/i915/i915_capture.c       | 96 +++++++++++++++++++++++++++++++++++
>>> lib/i915/i915_capture.h       | 14 +++++
>>> lib/meson.build               |  1 +
>>> tests/i915/gem_exec_capture.c | 88 +-------------------------------
>>> 4 files changed, 112 insertions(+), 87 deletions(-)
>>> create mode 100644 lib/i915/i915_capture.c
>>> create mode 100644 lib/i915/i915_capture.h
>>>
>>>diff --git a/lib/i915/i915_capture.c b/lib/i915/i915_capture.c
>>>new file mode 100644
>>>index 000000000..7430c9256
>>>--- /dev/null
>>>+++ b/lib/i915/i915_capture.c
>>>@@ -0,0 +1,96 @@
>>>+// SPDX-License-Identifier: MIT
>>>+/*
>>>+ * Copyright © 2022 Intel Corporation
>>>+ */
>>>+
>>>+#include <stdlib.h>
>>>+#include <string.h>
>>>+#include <zlib.h>
>>>+
>>>+#include "i915_capture.h"
>>>+
>>>+static unsigned long zlib_inflate(uint32_t **ptr, unsigned long len)
>>>+{
>>>+	struct z_stream_s zstream;
>>>+	void *out;
>>>+
>>>+	memset(&zstream, 0, sizeof(zstream));
>>>+
>>>+	zstream.next_in = (unsigned char *)*ptr;
>>>+	zstream.avail_in = 4*len;
>>>+
>>>+	if (inflateInit(&zstream) != Z_OK)
>>>+		return 0;
>>>+
>>>+	out = malloc(128*4096); /* approximate obj size */
>>>+	zstream.next_out = out;
>>>+	zstream.avail_out = 128*4096;
>>>+
>>>+	do {
>>>+		switch (inflate(&zstream, Z_SYNC_FLUSH)) {
>>>+		case Z_STREAM_END:
>>>+			goto end;
>>>+		case Z_OK:
>>>+			break;
>>>+		default:
>>>+			inflateEnd(&zstream);
>>>+			return 0;
>>>+		}
>>>+
>>>+		if (zstream.avail_out)
>>>+			break;
>>>+
>>>+		out = realloc(out, 2*zstream.total_out);
>>>+		if (out == NULL) {
>>>+			inflateEnd(&zstream);
>>>+			return 0;
>>>+		}
>>>+
>>>+		zstream.next_out = (unsigned char *)out + zstream.total_out;
>>>+		zstream.avail_out = zstream.total_out;
>>>+	} while (1);
>>>+end:
>>>+	inflateEnd(&zstream);
>>>+	free(*ptr);
>>>+	*ptr = out;
>>>+	return zstream.total_out / 4;
>>>+}
>>>+
>>>+unsigned long
>>>+ascii85_decode(char *in, uint32_t **out, bool inflate, char **end)
>>
>>Since this is in lib, AFAIK needs some doc.
>>
>
>Ok, will add.
>

Also, I found tools/intel_error_decode also duplicates these funcitons.
Will update to use the library routine instead.

Niranjana

>>Otherwise,
>>Reviewed-by: Matthew Auld <matthew.auld at intel.com>
>>
>
>Thanks,
>Niranjana
>
>>>+{
>>>+	unsigned long len = 0, size = 1024;
>>>+
>>>+	*out = realloc(*out, sizeof(uint32_t)*size);
>>>+	if (*out == NULL)
>>>+		return 0;
>>>+
>>>+	while (*in >= '!' && *in <= 'z') {
>>>+		uint32_t v = 0;
>>>+
>>>+		if (len == size) {
>>>+			size *= 2;
>>>+			*out = realloc(*out, sizeof(uint32_t)*size);
>>>+			if (*out == NULL)
>>>+				return 0;
>>>+		}
>>>+
>>>+		if (*in == 'z') {
>>>+			in++;
>>>+		} else {
>>>+			v += in[0] - 33; v *= 85;
>>>+			v += in[1] - 33; v *= 85;
>>>+			v += in[2] - 33; v *= 85;
>>>+			v += in[3] - 33; v *= 85;
>>>+			v += in[4] - 33;
>>>+			in += 5;
>>>+		}
>>>+		(*out)[len++] = v;
>>>+	}
>>>+	*end = in;
>>>+
>>>+	if (!inflate)
>>>+		return len;
>>>+
>>>+	return zlib_inflate(out, len);
>>>+}
>>>diff --git a/lib/i915/i915_capture.h b/lib/i915/i915_capture.h
>>>new file mode 100644
>>>index 000000000..26481b8e4
>>>--- /dev/null
>>>+++ b/lib/i915/i915_capture.h
>>>@@ -0,0 +1,14 @@
>>>+/* SPDX-License-Identifier: MIT */
>>>+/*
>>>+ * Copyright © 2022 Intel Corporation
>>>+ */
>>>+#ifndef _I915_CAPTURE_H_
>>>+#define _I915_CAPTURE_H_
>>>+
>>>+#include <stdbool.h>
>>>+#include <stdint.h>
>>>+
>>>+unsigned long
>>>+ascii85_decode(char *in, uint32_t **out, bool inflate, char **end);
>>>+
>>>+#endif /* _I915_CAPTURE_ */
>>>diff --git a/lib/meson.build b/lib/meson.build
>>>index a01482c38..9d353da16 100644
>>>--- a/lib/meson.build
>>>+++ b/lib/meson.build
>>>@@ -14,6 +14,7 @@ lib_sources = [
>>> 	'i915/intel_memory_region.c',
>>> 	'i915/intel_mocs.c',
>>> 	'i915/i915_blt.c',
>>>+	'i915/i915_capture.c',
>>> 	'i915/i915_crc.c',
>>> 	'i915/i915_vm_bind.c',
>>> 	'igt_collection.c',
>>>diff --git a/tests/i915/gem_exec_capture.c b/tests/i915/gem_exec_capture.c
>>>index 2db58266f..f8f8d1ece 100644
>>>--- a/tests/i915/gem_exec_capture.c
>>>+++ b/tests/i915/gem_exec_capture.c
>>>@@ -22,10 +22,10 @@
>>>  */
>>> #include <sys/poll.h>
>>>-#include <zlib.h>
>>> #include <sched.h>
>>> #include "i915/gem.h"
>>>+#include "i915/i915_capture.h"
>>> #include "i915/gem_create.h"
>>> #include "igt.h"
>>> #include "igt_device.h"
>>>@@ -42,92 +42,6 @@ struct offset {
>>> 	bool found;
>>> };
>>>-static unsigned long zlib_inflate(uint32_t **ptr, unsigned long len)
>>>-{
>>>-	struct z_stream_s zstream;
>>>-	void *out;
>>>-
>>>-	memset(&zstream, 0, sizeof(zstream));
>>>-
>>>-	zstream.next_in = (unsigned char *)*ptr;
>>>-	zstream.avail_in = 4*len;
>>>-
>>>-	if (inflateInit(&zstream) != Z_OK)
>>>-		return 0;
>>>-
>>>-	out = malloc(128*4096); /* approximate obj size */
>>>-	zstream.next_out = out;
>>>-	zstream.avail_out = 128*4096;
>>>-
>>>-	do {
>>>-		switch (inflate(&zstream, Z_SYNC_FLUSH)) {
>>>-		case Z_STREAM_END:
>>>-			goto end;
>>>-		case Z_OK:
>>>-			break;
>>>-		default:
>>>-			inflateEnd(&zstream);
>>>-			return 0;
>>>-		}
>>>-
>>>-		if (zstream.avail_out)
>>>-			break;
>>>-
>>>-		out = realloc(out, 2*zstream.total_out);
>>>-		if (out == NULL) {
>>>-			inflateEnd(&zstream);
>>>-			return 0;
>>>-		}
>>>-
>>>-		zstream.next_out = (unsigned char *)out + zstream.total_out;
>>>-		zstream.avail_out = zstream.total_out;
>>>-	} while (1);
>>>-end:
>>>-	inflateEnd(&zstream);
>>>-	free(*ptr);
>>>-	*ptr = out;
>>>-	return zstream.total_out / 4;
>>>-}
>>>-
>>>-static unsigned long
>>>-ascii85_decode(char *in, uint32_t **out, bool inflate, char **end)
>>>-{
>>>-	unsigned long len = 0, size = 1024;
>>>-
>>>-	*out = realloc(*out, sizeof(uint32_t)*size);
>>>-	if (*out == NULL)
>>>-		return 0;
>>>-
>>>-	while (*in >= '!' && *in <= 'z') {
>>>-		uint32_t v = 0;
>>>-
>>>-		if (len == size) {
>>>-			size *= 2;
>>>-			*out = realloc(*out, sizeof(uint32_t)*size);
>>>-			if (*out == NULL)
>>>-				return 0;
>>>-		}
>>>-
>>>-		if (*in == 'z') {
>>>-			in++;
>>>-		} else {
>>>-			v += in[0] - 33; v *= 85;
>>>-			v += in[1] - 33; v *= 85;
>>>-			v += in[2] - 33; v *= 85;
>>>-			v += in[3] - 33; v *= 85;
>>>-			v += in[4] - 33;
>>>-			in += 5;
>>>-		}
>>>-		(*out)[len++] = v;
>>>-	}
>>>-	*end = in;
>>>-
>>>-	if (!inflate)
>>>-		return len;
>>>-
>>>-	return zlib_inflate(out, len);
>>>-}
>>>-
>>> static int check_error_state(int dir, struct offset *obj_offsets, int obj_count,
>>> 			     uint64_t obj_size, bool incremental)
>>> {


More information about the igt-dev mailing list