nir/lower_task_shader: allow offsetting of the start of payload

We need this, because on Intel task payload starts with private header,
followed by user-accessible data.

Fixes: 37e78803d7 ("intel/compiler: use nir_lower_task_shader pass")

Reviewed-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19409>
This commit is contained in:
Marcin Ślusarz 2022-10-24 14:55:38 +02:00 committed by Marge Bot
parent 7aaafaa8ae
commit f6adfd6278
2 changed files with 9 additions and 1 deletions

View file

@ -5440,6 +5440,7 @@ bool nir_lower_gs_intrinsics(nir_shader *shader, nir_lower_gs_intrinsics_flags o
typedef struct {
bool payload_to_shared_for_atomics : 1;
bool payload_to_shared_for_small_types : 1;
uint32_t payload_offset_in_bytes;
} nir_lower_task_shader_options;
bool nir_lower_task_shader(nir_shader *shader, nir_lower_task_shader_options options);

View file

@ -38,6 +38,7 @@ typedef struct {
bool payload_in_shared;
/* Shared memory address where task_payload will be located. */
uint32_t payload_shared_addr;
uint32_t payload_offset_in_bytes;
} lower_task_state;
static bool
@ -216,7 +217,12 @@ emit_shared_to_payload_copy(nir_builder *b,
.memory_modes = nir_var_mem_shared);
for (unsigned i = 0; i < copies_per_invocation; ++i) {
unsigned const_off = bytes_per_copy * invocations * i;
/* Payload_size is a size of user-accessible payload, but on some
* hardware (e.g. Intel) payload has a private header, which we have
* to offset (payload_offset_in_bytes).
*/
unsigned const_off =
bytes_per_copy * invocations * i + s->payload_offset_in_bytes;
/* Read from shared memory. */
nir_ssa_def *copy =
@ -430,6 +436,7 @@ nir_lower_task_shader(nir_shader *shader,
lower_task_state state = {
.payload_shared_addr = ALIGN(shader->info.shared_size, 16),
.payload_in_shared = payload_in_shared,
.payload_offset_in_bytes = options.payload_offset_in_bytes,
};
if (payload_in_shared)