[PATCH i-g-t, v3 09/11] lib/intel_compute: Fix enqueued local size starting with xelpg
Francois Dugast
francois.dugast at intel.com
Tue Apr 15 10:13:25 UTC 2025
The metadata of the compute kernel used for xelpg shows the arguments
positions has changed. The enqueued_local_size comes at offset 52, right
after the value of the "count" argument. Create a new create_indirect_data
function matching this.
Relevant part of the kernel metadata:
- arg_type: arg_bypointer
offset: 32
size: 8
arg_index: 0
addrmode: stateless
addrspace: global
access_type: readwrite
- arg_type: arg_bypointer
offset: 40
size: 8
arg_index: 1
addrmode: stateless
addrspace: global
access_type: readwrite
- arg_type: arg_byvalue
offset: 48
size: 4
arg_index: 2
- arg_type: enqueued_local_size
offset: 52
size: 12
Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
Signed-off-by: Francois Dugast <francois.dugast at intel.com>
---
lib/intel_compute.c | 31 ++++++++++++++++++++++++++++---
1 file changed, 28 insertions(+), 3 deletions(-)
diff --git a/lib/intel_compute.c b/lib/intel_compute.c
index b29f8d9f8..6b779c340 100644
--- a/lib/intel_compute.c
+++ b/lib/intel_compute.c
@@ -1263,6 +1263,31 @@ static void xehpc_compute_exec(int fd, const unsigned char *kernel,
bo_execenv_destroy(&execenv);
}
+static void xelpg_create_indirect_data(uint32_t *addr_bo_buffer_batch,
+ uint64_t addr_input,
+ uint64_t addr_output,
+ unsigned int loop_count)
+{
+ int b = 0;
+
+ addr_bo_buffer_batch[b++] = addr_input & 0xffffffff;
+ addr_bo_buffer_batch[b++] = addr_input >> 32;
+ addr_bo_buffer_batch[b++] = addr_output & 0xffffffff;
+ addr_bo_buffer_batch[b++] = addr_output >> 32;
+ addr_bo_buffer_batch[b++] = loop_count;
+ addr_bo_buffer_batch[b++] = 0x00000400; // Enqueued local size X
+ addr_bo_buffer_batch[b++] = 0x00000001; // Enqueued local size Y
+ addr_bo_buffer_batch[b++] = 0x00000001; // Enqueued local size Z
+ addr_bo_buffer_batch[b++] = 0x00000000;
+ addr_bo_buffer_batch[b++] = 0x00000000;
+ addr_bo_buffer_batch[b++] = 0x00000000;
+ addr_bo_buffer_batch[b++] = 0x00000000;
+ addr_bo_buffer_batch[b++] = 0x00000000;
+ addr_bo_buffer_batch[b++] = 0x00000000;
+ addr_bo_buffer_batch[b++] = 0x00000000;
+ addr_bo_buffer_batch[b++] = 0x00000000;
+}
+
static void xelpg_compute_exec_compute(uint32_t *addr_bo_buffer_batch,
uint64_t addr_general_state_base,
uint64_t addr_surface_state_base,
@@ -1595,7 +1620,7 @@ static void xelpg_compute_exec(int fd, const unsigned char *kernel,
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, SIZE_DATA);
+ xelpg_create_indirect_data(bo_dict[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
xehp_create_surface_state(bo_dict[7].data, ADDR_INPUT, ADDR_OUTPUT);
input_data = (float *) bo_dict[4].data;
@@ -1688,7 +1713,7 @@ 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, SIZE_DATA);
+ xelpg_create_indirect_data(bo_dict[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
xehp_create_surface_state(bo_dict[7].data, ADDR_INPUT, ADDR_OUTPUT);
input_data = (float *) bo_dict[4].data;
@@ -2022,7 +2047,7 @@ static void xe2lpg_compute_preempt_exec(int fd, const unsigned char *long_kernel
create_dynamic_state(bo_dict_short[1].data, OFFSET_KERNEL);
xehp_create_surface_state(bo_dict_short[2].data, ADDR_INPUT, ADDR_OUTPUT);
- xehp_create_indirect_data(bo_dict_short[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
+ xelpg_create_indirect_data(bo_dict_short[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
xehp_create_surface_state(bo_dict_short[7].data, ADDR_INPUT, ADDR_OUTPUT);
input_data = (float *) bo_dict_long[4].data;
--
2.43.0
More information about the igt-dev
mailing list