[PATCH i-g-t 5/5] lib/intel_compute: Allow the user to provide input and output buffers

Francois Dugast francois.dugast at intel.com
Wed Feb 5 10:17:06 UTC 2025


Allow the user to create and provide the buffers to be used as input
and as output of the compute kernel. This allows special handling as
well as read/write from outside the compute library. Support is
limited to xe2lpg.

Signed-off-by: Francois Dugast <francois.dugast at intel.com>
---
 lib/intel_compute.c | 32 ++++++++++++++++++++++++--------
 lib/intel_compute.h |  2 ++
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/lib/intel_compute.c b/lib/intel_compute.c
index db6e81c38..6dc8ffd79 100644
--- a/lib/intel_compute.c
+++ b/lib/intel_compute.c
@@ -1662,6 +1662,8 @@ static void xe2lpg_compute_exec(int fd, const unsigned char *kernel,
 
 	struct bo_execenv execenv;
 	float *input_data, *output_data;
+	uint64_t bind_input_addr = (user && user->input_addr) ? user->input_addr : ADDR_INPUT;
+	uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
 
 	bo_execenv_create(fd, &execenv, eci, user);
 
@@ -1672,16 +1674,24 @@ static void xe2lpg_compute_exec(int fd, const unsigned char *kernel,
 
 	memcpy(bo_dict[0].data, kernel, size);
 	create_dynamic_state(bo_dict[1].data, OFFSET_KERNEL);
-	xehp_create_surface_state(bo_dict[2].data, ADDR_INPUT, ADDR_OUTPUT);
-	xehp_create_indirect_data(bo_dict[3].data, ADDR_INPUT, ADDR_OUTPUT);
-	xehp_create_surface_state(bo_dict[7].data, ADDR_INPUT, ADDR_OUTPUT);
+	xehp_create_surface_state(bo_dict[2].data, bind_input_addr, bind_output_addr);
+	xehp_create_indirect_data(bo_dict[3].data, bind_input_addr, bind_output_addr);
+	xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
 
-	input_data = (float *) bo_dict[4].data;
-	output_data = (float *) bo_dict[5].data;
-	srand(time(NULL));
+	if (user && user->input_addr) {
+		input_data = (float *) user->input_addr;
+	} else {
+		input_data = (float *) bo_dict[4].data;
+		srand(time(NULL));
 
-	for (int i = 0; i < SIZE_DATA; i++)
-		input_data[i] = rand() / (float)RAND_MAX;
+		for (int i = 0; i < SIZE_DATA; i++)
+			input_data[i] = rand() / (float)RAND_MAX;
+	}
+
+	if (user && user->output_addr)
+		output_data = (float *) user->output_addr;
+	else
+		output_data = (float *) bo_dict[5].data;
 
 	xe2lpg_compute_exec_compute(bo_dict[8].data,
 				  ADDR_GENERAL_STATE_BASE,
@@ -1794,6 +1804,12 @@ static bool __run_intel_compute_kernel(int fd,
 		return false;
 	}
 
+	if (user && (user->input_addr || user->output_addr) &&
+	    intel_compute_batches[batch].compute_exec != xe2lpg_compute_exec) {
+		igt_debug("GPU version 0x%x does not support user input/output buffers\n", ip_ver);
+		return false;
+	}
+
 	/* If the user provides a kernel, use it */
 	if (user && user->kernel) {
 		kernel = user->kernel;
diff --git a/lib/intel_compute.h b/lib/intel_compute.h
index f32da2734..3e2fd7266 100644
--- a/lib/intel_compute.h
+++ b/lib/intel_compute.h
@@ -38,6 +38,8 @@ struct user_execenv {
 	const unsigned char *kernel;
 	unsigned int kernel_size;
 	bool skip_results_check;
+	uint64_t input_addr;
+	uint64_t output_addr;
 };
 
 extern const struct intel_compute_kernels intel_compute_square_kernels[];
-- 
2.43.0



More information about the igt-dev mailing list