From 865a2ad0866e271adda3cd18c46f74514131da11 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Fri, 28 Aug 2020 12:52:20 -0700 Subject: [PATCH] clover/nir/spirv: Use uniform rather than shader_in for kernel inputs The semantics of inputs for CL are a closer match to the semantics of uniforms for graphics. Rather than cross-stage data, it's data that every thread sees uniformly. Reviewed-by: Jason Ekstrand Reviewed-by: Karol Herbst Part-of: --- src/compiler/nir/nir_lower_io.c | 5 +++-- src/compiler/spirv/spirv_to_nir.c | 2 +- src/gallium/frontends/clover/nir/invocation.cpp | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index 8f23f7c1391..be1cfdfef38 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -922,8 +922,9 @@ build_explicit_io_load(nir_builder *b, nir_intrinsic_instr *intrin, assert(addr_format_is_global(addr_format)); op = nir_intrinsic_load_global; break; - case nir_var_shader_in: + case nir_var_uniform: assert(addr_format_is_offset(addr_format)); + assert(b->shader->info.stage == MESA_SHADER_KERNEL); op = nir_intrinsic_load_kernel_input; break; case nir_var_mem_shared: @@ -1184,7 +1185,7 @@ nir_explicit_io_address_from_deref(nir_builder *b, nir_deref_instr *deref, assert(deref->dest.is_ssa); switch (deref->deref_type) { case nir_deref_type_var: - assert(deref->mode & (nir_var_shader_in | nir_var_mem_shared | + assert(deref->mode & (nir_var_uniform | nir_var_mem_shared | nir_var_shader_temp | nir_var_function_temp)); if (addr_format_is_global(addr_format)) { assert(nir_var_shader_temp | nir_var_function_temp); diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 604174bcaaa..6dd18075c84 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -5475,7 +5475,7 @@ vtn_emit_kernel_entry_point_wrapper(struct vtn_builder *b, /* input variable */ nir_variable *in_var = rzalloc(b->nb.shader, nir_variable); - in_var->data.mode = nir_var_shader_in; + in_var->data.mode = nir_var_uniform; in_var->data.read_only = true; in_var->data.location = i; diff --git a/src/gallium/frontends/clover/nir/invocation.cpp b/src/gallium/frontends/clover/nir/invocation.cpp index 08dc78d18d9..757ace61393 100644 --- a/src/gallium/frontends/clover/nir/invocation.cpp +++ b/src/gallium/frontends/clover/nir/invocation.cpp @@ -104,9 +104,9 @@ clover_lower_nir_instr(nir_builder *b, nir_instr *instr, void *_state) const glsl_type *type = glsl_uint_type(); for (uint32_t i = 0; i < 3; i++) { state->offset_vars[i] = - nir_variable_create(b->shader, nir_var_shader_in, type, + nir_variable_create(b->shader, nir_var_uniform, type, "global_invocation_id_offsets"); - state->offset_vars[i]->data.location = b->shader->num_inputs++; + state->offset_vars[i]->data.location = b->shader->num_uniforms++; } } @@ -221,7 +221,7 @@ module clover::nir::spirv_to_nir(const module &mod, const device &dev, // Calculate input offsets. unsigned offset = 0; - nir_foreach_shader_in_variable(var, nir) { + nir_foreach_uniform_variable(var, nir) { offset = align(offset, glsl_get_cl_alignment(var->type)); var->data.driver_location = offset; offset += glsl_get_cl_size(var->type); @@ -230,8 +230,8 @@ module clover::nir::spirv_to_nir(const module &mod, const device &dev, NIR_PASS_V(nir, nir_lower_vars_to_explicit_types, nir_var_mem_shared, glsl_get_cl_type_size_align); - /* use offsets for shader_in and shared memory */ - NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_shader_in, + /* use offsets for uniform and shared memory */ + NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_uniform, nir_address_format_32bit_offset); NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_mem_shared, -- 2.30.2