From: Alejandro Piñeiro <apinhe...@igalia.com> Similar to other variable setups, system values will initialize the corresponding register inside a 'nir_system_values' map, which will then be queried later when processing the different system value intrinsics for the appropriate register.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89580 --- src/mesa/drivers/dri/i965/brw_vec4.h | 1 + src/mesa/drivers/dri/i965/brw_vec4_nir.cpp | 43 +++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h index 2a53d9a..e531d60 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.h +++ b/src/mesa/drivers/dri/i965/brw_vec4.h @@ -419,6 +419,7 @@ public: brw_reg_type *nir_output_types; unsigned *nir_uniform_offset; unsigned *nir_uniform_driver_location; + dst_reg *nir_system_values; protected: void emit_vertex(); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp index 40ec66f..6c2a046 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp @@ -54,13 +54,54 @@ vec4_visitor::emit_nir_code() static bool setup_system_values_block(nir_block *block, void *void_visitor) { - /* @TODO: Not yet implemented */ + vec4_visitor *v = (vec4_visitor *)void_visitor; + dst_reg *reg; + + nir_foreach_instr(block, instr) { + if (instr->type != nir_instr_type_intrinsic) + continue; + + nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); + + switch (intrin->intrinsic) { + case nir_intrinsic_load_vertex_id: + unreachable("should be lowered by lower_vertex_id()."); + + case nir_intrinsic_load_vertex_id_zero_base: + reg = &v->nir_system_values[SYSTEM_VALUE_VERTEX_ID_ZERO_BASE]; + if (reg->file == BAD_FILE) + *reg = + *v->make_reg_for_system_value(SYSTEM_VALUE_VERTEX_ID_ZERO_BASE, + NULL); + break; + + case nir_intrinsic_load_base_vertex: + reg = &v->nir_system_values[SYSTEM_VALUE_BASE_VERTEX]; + if (reg->file == BAD_FILE) + *reg = *v->make_reg_for_system_value(SYSTEM_VALUE_BASE_VERTEX, + NULL); + break; + + case nir_intrinsic_load_instance_id: + reg = &v->nir_system_values[SYSTEM_VALUE_INSTANCE_ID]; + if (reg->file == BAD_FILE) + *reg = *v->make_reg_for_system_value(SYSTEM_VALUE_INSTANCE_ID, + NULL); + break; + + default: + break; + } + } + return true; } void vec4_visitor::nir_setup_system_values(nir_shader *shader) { + nir_system_values = ralloc_array(mem_ctx, dst_reg, SYSTEM_VALUE_MAX); + nir_foreach_overload(shader, overload) { assert(strcmp(overload->function->name, "main") == 0); assert(overload->impl); -- 2.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev