[Mesa-dev] [PATCH 08/78] i965/nir/vec4: Add setup for system values
Jason Ekstrand
jason at jlekstrand.net
Mon Jun 29 16:34:50 PDT 2015
On Fri, Jun 26, 2015 at 1:06 AM, Eduardo Lima Mitev <elima at igalia.com> wrote:
> From: Alejandro PiƱeiro <apinheiro at 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);
I know the type isn't actually used for VX, but you know what it is so
you might as well pass it in here.
> + 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);
Same here.
> + 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);
And here.
--Jason
> + 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list