[PATCH i-g-t v2 4/4] lib/intel_compute: refactor to remove code duplication
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Thu May 22 07:55:15 UTC 2025
Establishing input and output data looks same in all compute functions.
Create a functions to avoid code duplication.
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
Cc: Francois Dugast <francois.dugast at intel.com>
---
lib/intel_compute.c | 110 ++++++++++++++++----------------------------
1 file changed, 40 insertions(+), 70 deletions(-)
diff --git a/lib/intel_compute.c b/lib/intel_compute.c
index d47e2b08ef..06f831f68c 100644
--- a/lib/intel_compute.c
+++ b/lib/intel_compute.c
@@ -122,6 +122,36 @@ static void bo_check_square(float *input, float *output, int size)
}
}
+static float *get_input_data(const struct bo_execenv *execenv,
+ const struct user_execenv *user,
+ void *data)
+{
+ float *input_data;
+
+ if (user && user->input_addr) {
+ input_data = from_user_pointer(user->input_addr);
+ } else {
+ input_data = (float *) data;
+ bo_randomize(input_data, execenv->array_size);
+ }
+
+ return input_data;
+}
+
+static float *get_output_data(const struct bo_execenv *execenv,
+ const struct user_execenv *user,
+ void *data)
+{
+ float *output_data;
+
+ if (user && user->output_addr)
+ output_data = from_user_pointer(user->output_addr);
+ else
+ output_data = (float *) data;
+
+ return output_data;
+}
+
static void bo_execenv_create(int fd, struct bo_execenv *execenv,
struct drm_xe_engine_class_instance *eci,
struct user_execenv *user)
@@ -809,20 +839,8 @@ static void compute_exec(int fd, const unsigned char *kernel,
create_indirect_data(bo_dict[3].data, bind_input_addr, bind_output_addr,
IS_DG1(devid) ? 0x200 : 0x40, execenv.array_size);
- if (user && user->input_addr) {
- input_data = from_user_pointer(user->input_addr);
- } else {
- input_data = (float *) bo_dict[4].data;
- srand(time(NULL));
-
- for (int i = 0; i < execenv.array_size; i++)
- input_data[i] = rand() / (float)RAND_MAX;
- }
-
- if (user && user->output_addr)
- output_data = from_user_pointer(user->output_addr);
- else
- output_data = (float *) bo_dict[5].data;
+ input_data = get_input_data(&execenv, user, bo_dict[4].data);
+ output_data = get_output_data(&execenv, user, bo_dict[5].data);
if (IS_DG1(devid))
dg1_compute_exec_compute(bo_dict[6].data,
@@ -1109,20 +1127,8 @@ static void xehp_compute_exec(int fd, const unsigned char *kernel,
execenv.array_size);
xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
- if (user && user->input_addr) {
- input_data = from_user_pointer(user->input_addr);
- } else {
- input_data = (float *) bo_dict[4].data;
- srand(time(NULL));
-
- for (int i = 0; i < execenv.array_size; i++)
- input_data[i] = rand() / (float)RAND_MAX;
- }
-
- if (user && user->output_addr)
- output_data = from_user_pointer(user->output_addr);
- else
- output_data = (float *) bo_dict[5].data;
+ input_data = get_input_data(&execenv, user, bo_dict[4].data);
+ output_data = get_output_data(&execenv, user, bo_dict[5].data);
xehp_compute_exec_compute(bo_dict[8].data,
ADDR_GENERAL_STATE_BASE,
@@ -1334,20 +1340,8 @@ static void xehpc_compute_exec(int fd, const unsigned char *kernel,
xehpc_create_indirect_data(bo_dict[1].data, bind_input_addr, bind_output_addr,
execenv.array_size);
- if (user && user->input_addr) {
- input_data = from_user_pointer(user->input_addr);
- } else {
- input_data = (float *) bo_dict[2].data;
- srand(time(NULL));
-
- for (int i = 0; i < execenv.array_size; i++)
- input_data[i] = rand() / (float)RAND_MAX;
- }
-
- if (user && user->output_addr)
- output_data = from_user_pointer(user->output_addr);
- else
- output_data = (float *) bo_dict[3].data;
+ input_data = get_input_data(&execenv, user, bo_dict[2].data);
+ output_data = get_output_data(&execenv, user, bo_dict[3].data);
xehpc_compute_exec_compute(bo_dict[5].data,
ADDR_GENERAL_STATE_BASE,
@@ -1742,20 +1736,8 @@ static void xelpg_compute_exec(int fd, const unsigned char *kernel,
execenv.array_size);
xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
- if (user && user->input_addr) {
- input_data = from_user_pointer(user->input_addr);
- } else {
- input_data = (float *) bo_dict[4].data;
- srand(time(NULL));
-
- for (int i = 0; i < execenv.array_size; i++)
- input_data[i] = rand() / (float)RAND_MAX;
- }
-
- if (user && user->output_addr)
- output_data = from_user_pointer(user->output_addr);
- else
- output_data = (float *) bo_dict[5].data;
+ input_data = get_input_data(&execenv, user, bo_dict[4].data);
+ output_data = get_output_data(&execenv, user, bo_dict[5].data);
xelpg_compute_exec_compute(bo_dict[8].data,
ADDR_GENERAL_STATE_BASE,
@@ -1849,20 +1831,8 @@ static void xe2lpg_compute_exec(int fd, const unsigned char *kernel,
execenv.array_size);
xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
- if (user && user->input_addr) {
- input_data = from_user_pointer(user->input_addr);
- } else {
- input_data = (float *) bo_dict[4].data;
- srand(time(NULL));
-
- for (int i = 0; i < execenv.array_size; i++)
- input_data[i] = rand() / (float)RAND_MAX;
- }
-
- if (user && user->output_addr)
- output_data = from_user_pointer(user->output_addr);
- else
- output_data = (float *) bo_dict[5].data;
+ input_data = get_input_data(&execenv, user, bo_dict[4].data);
+ output_data = get_output_data(&execenv, user, bo_dict[5].data);
xe2lpg_compute_exec_compute(bo_dict[8].data,
ADDR_GENERAL_STATE_BASE,
--
2.43.0
More information about the igt-dev
mailing list