[Mesa-dev] [PATCH 2/4] nir/lower_io: Introduce nir_store_per_vertex_output intrinsics.

Jason Ekstrand jason at jlekstrand.net
Thu Nov 12 17:05:38 PST 2015


On Tue, Nov 10, 2015 at 1:21 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> Similar to nir_load_per_vertex_input, but for outputs.  This is not
> useful in geometry shaders, but will be useful in tessellation shaders.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/glsl/nir/nir_intrinsics.h |  1 +
>  src/glsl/nir/nir_lower_io.c   | 27 ++++++++++++++++++++++-----
>  src/glsl/nir/nir_print.c      |  2 ++
>  3 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/src/glsl/nir/nir_intrinsics.h b/src/glsl/nir/nir_intrinsics.h
> index 36fb286..26ac7ce 100644
> --- a/src/glsl/nir/nir_intrinsics.h
> +++ b/src/glsl/nir/nir_intrinsics.h
> @@ -272,6 +272,7 @@ LOAD(ssbo, 1, 1, NIR_INTRINSIC_CAN_ELIMINATE)
>               false, 0, 0, 1 + extra_indices, flags)
>
>  STORE(output, 0, 0, 0, 0)
> +STORE(per_vertex_output, 1, 1, 0, 0)
>  STORE(ssbo, 1, 1, 1, 0)
>
>  LAST_INTRINSIC(store_ssbo_indirect)
> diff --git a/src/glsl/nir/nir_lower_io.c b/src/glsl/nir/nir_lower_io.c
> index f04b9b8..e460160 100644
> --- a/src/glsl/nir/nir_lower_io.c
> +++ b/src/glsl/nir/nir_lower_io.c
> @@ -76,6 +76,13 @@ stage_uses_per_vertex_inputs(struct lower_io_state *state)
>            stage == MESA_SHADER_GEOMETRY;
>  }
>
> +static bool
> +stage_uses_per_vertex_outputs(struct lower_io_state *state)
> +{
> +   gl_shader_stage stage = state->builder.shader->stage;
> +   return stage == MESA_SHADER_TESS_CTRL;
> +}
> +
>  static unsigned
>  get_io_offset(nir_deref_var *deref, nir_instr *instr,
>                nir_ssa_def **vertex_index,
> @@ -236,16 +243,23 @@ nir_lower_io_block(nir_block *block, void *void_state)
>              continue;
>
>           nir_ssa_def *indirect;
> +         nir_ssa_def *vertex_index;
> +
> +         bool per_vertex = stage_uses_per_vertex_outputs(state) &&
> +                           !intrin->variables[0]->var->data.patch;

is_per_vertex_output(state, intrin->variables[0]->var)

>
>           unsigned offset = get_io_offset(intrin->variables[0], &intrin->instr,
> -                                         NULL, &indirect, state);
> +                                         per_vertex ? &vertex_index : NULL,
> +                                         &indirect, state);
>           offset += intrin->variables[0]->var->data.driver_location;
>
>           nir_intrinsic_op store_op;
> -         if (indirect) {
> -            store_op = nir_intrinsic_store_output_indirect;
> +         if (per_vertex) {
> +            store_op = indirect ? nir_intrinsic_store_per_vertex_output_indirect
> +                                : nir_intrinsic_store_per_vertex_output;
>           } else {
> -            store_op = nir_intrinsic_store_output;
> +            store_op = indirect ? nir_intrinsic_store_output_indirect
> +                                : nir_intrinsic_store_output;
>           }
>
>           nir_intrinsic_instr *store = nir_intrinsic_instr_create(state->mem_ctx,
> @@ -255,8 +269,11 @@ nir_lower_io_block(nir_block *block, void *void_state)
>
>           nir_src_copy(&store->src[0], &intrin->src[0], store);
>
> +         if (per_vertex)
> +            store->src[1] = nir_src_for_ssa(vertex_index);
> +
>           if (indirect)
> -            store->src[1] = nir_src_for_ssa(indirect);
> +            store->src[per_vertex ? 2 : 1] = nir_src_for_ssa(indirect);
>
>           nir_instr_insert_before(&intrin->instr, &store->instr);
>           nir_instr_remove(&intrin->instr);
> diff --git a/src/glsl/nir/nir_print.c b/src/glsl/nir/nir_print.c
> index 30220c5..23fcafe 100644
> --- a/src/glsl/nir/nir_print.c
> +++ b/src/glsl/nir/nir_print.c
> @@ -450,6 +450,8 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
>        break;
>     case nir_intrinsic_store_output:
>     case nir_intrinsic_store_output_indirect:
> +   case nir_intrinsic_store_per_vertex_output:
> +   case nir_intrinsic_store_per_vertex_output_indirect:
>        var_list = &state->shader->outputs;
>        break;
>     default:
> --
> 2.6.2
>
> _______________________________________________
> 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