/* Even though we only place one scalar argument, clover will bind up to
* three 32 bit values
*/
+ unsigned location = state->args.size();
state->args.emplace_back(module::argument::scalar, 4, 4, 4,
module::argument::zero_ext,
module::argument::grid_offset);
state->offset_vars[i] =
nir_variable_create(b->shader, nir_var_uniform, type,
"global_invocation_id_offsets");
- state->offset_vars[i]->data.location = b->shader->num_uniforms++;
+ state->offset_vars[i]->data.location = location + i;
}
}
auto args = sym.args;
NIR_PASS_V(nir, clover_lower_nir, args, dev.max_block_size().size());
- // Calculate input offsets.
- unsigned offset = 0;
- 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);
- }
-
+ NIR_PASS_V(nir, nir_lower_mem_constant_vars,
+ glsl_get_cl_type_size_align);
NIR_PASS_V(nir, nir_lower_vars_to_explicit_types,
- nir_var_mem_shared | nir_var_function_temp,
+ nir_var_uniform | nir_var_mem_shared |
+ nir_var_mem_global | nir_var_function_temp,
glsl_get_cl_type_size_align);
- /* use offsets for uniform and shared memory */
+ /* use offsets for kernel inputs (uniform) */
NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_uniform,
+ nir->info.cs.ptr_size == 64 ?
+ nir_address_format_32bit_offset_as_64bit :
nir_address_format_32bit_offset);
NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_mem_constant,