[Mesa-dev] [PATCH] nir/builder: Add an init function that creates a simple shader for you

Connor Abbott cwabbott0 at gmail.com
Tue Dec 29 11:05:31 PST 2015


On Tue, Dec 29, 2015 at 12:59 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> A hugely common case when using nir_builder is to have a shader with a
> single function called main.  This adds a helper that gives you just that.
> This commit also makes us use it in the NIR control-flow unit tests as well
> as tgsi_to_nir and prog_to_nir.

Reviewed-by: Connor Abbott <cwabbott0 at gmail.com>

> ---
>  src/gallium/auxiliary/nir/tgsi_to_nir.c   | 12 ++++--------
>  src/glsl/nir/nir_builder.h                | 11 +++++++++++
>  src/glsl/nir/tests/control_flow_tests.cpp | 26 ++++++++++----------------
>  src/mesa/program/prog_to_nir.c            | 13 +++----------
>  4 files changed, 28 insertions(+), 34 deletions(-)
>
> diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.c b/src/gallium/auxiliary/nir/tgsi_to_nir.c
> index 01426e8..94d992b 100644
> --- a/src/gallium/auxiliary/nir/tgsi_to_nir.c
> +++ b/src/gallium/auxiliary/nir/tgsi_to_nir.c
> @@ -1968,14 +1968,10 @@ tgsi_to_nir(const void *tgsi_tokens,
>     tgsi_scan_shader(tgsi_tokens, &scan);
>     c->scan = &scan;
>
> -   s = nir_shader_create(NULL, tgsi_processor_to_shader_stage(scan.processor),
> -                         options);
> -
> -   nir_function *func = nir_function_create(s, "main");
> -   nir_function_impl *impl = nir_function_impl_create(func);
> -
> -   nir_builder_init(&c->build, impl);
> -   c->build.cursor = nir_after_cf_list(&impl->body);
> +   nir_builder_init_simple_shader(&c->build, NULL,
> +                                  tgsi_processor_to_shader_stage(scan.processor),
> +                                  options);
> +   s = c->build.shader;
>
>     s->num_inputs = scan.file_max[TGSI_FILE_INPUT] + 1;
>     s->num_uniforms = scan.const_file_max[0] + 1;
> diff --git a/src/glsl/nir/nir_builder.h b/src/glsl/nir/nir_builder.h
> index ee6131a..cfaaf8e 100644
> --- a/src/glsl/nir/nir_builder.h
> +++ b/src/glsl/nir/nir_builder.h
> @@ -44,6 +44,17 @@ nir_builder_init(nir_builder *build, nir_function_impl *impl)
>  }
>
>  static inline void
> +nir_builder_init_simple_shader(nir_builder *build, void *mem_ctx,
> +                               gl_shader_stage stage,
> +                               const nir_shader_compiler_options *options)
> +{
> +   build->shader = nir_shader_create(mem_ctx, stage, options);
> +   nir_function *func = nir_function_create(build->shader, "main");
> +   build->impl = nir_function_impl_create(func);
> +   build->cursor = nir_after_cf_list(&build->impl->body);
> +}
> +
> +static inline void
>  nir_builder_instr_insert(nir_builder *build, nir_instr *instr)
>  {
>     nir_instr_insert(build->cursor, instr);
> diff --git a/src/glsl/nir/tests/control_flow_tests.cpp b/src/glsl/nir/tests/control_flow_tests.cpp
> index f142e44..b9379ef 100644
> --- a/src/glsl/nir/tests/control_flow_tests.cpp
> +++ b/src/glsl/nir/tests/control_flow_tests.cpp
> @@ -30,23 +30,17 @@ protected:
>     ~nir_cf_test();
>
>     nir_builder b;
> -   nir_shader *shader;
> -   nir_function_impl *impl;
>  };
>
>  nir_cf_test::nir_cf_test()
>  {
>     static const nir_shader_compiler_options options = { };
> -   shader = nir_shader_create(NULL, MESA_SHADER_VERTEX, &options);
> -   nir_function *func = nir_function_create(shader, "main");
> -   impl = nir_function_impl_create(func);
> -
> -   nir_builder_init(&b, impl);
> +   nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_VERTEX, &options);
>  }
>
>  nir_cf_test::~nir_cf_test()
>  {
> -   ralloc_free(shader);
> +   ralloc_free(b.shader);
>  }
>
>  TEST_F(nir_cf_test, delete_break_in_loop)
> @@ -55,12 +49,12 @@ TEST_F(nir_cf_test, delete_break_in_loop)
>      *
>      * while (...) { break; }
>      */
> -   nir_loop *loop = nir_loop_create(shader);
> -   nir_cf_node_insert(nir_after_cf_list(&impl->body), &loop->cf_node);
> +   nir_loop *loop = nir_loop_create(b.shader);
> +   nir_cf_node_insert(nir_after_cf_list(&b.impl->body), &loop->cf_node);
>
>     b.cursor = nir_after_cf_list(&loop->body);
>
> -   nir_jump_instr *jump = nir_jump_instr_create(shader, nir_jump_break);
> +   nir_jump_instr *jump = nir_jump_instr_create(b.shader, nir_jump_break);
>     nir_builder_instr_insert(&b, &jump->instr);
>
>     /* At this point, we should have:
> @@ -81,10 +75,10 @@ TEST_F(nir_cf_test, delete_break_in_loop)
>      *         block block_3:
>      * }
>      */
> -   nir_block *block_0 = nir_start_block(impl);
> +   nir_block *block_0 = nir_start_block(b.impl);
>     nir_block *block_1 = nir_cf_node_as_block(nir_loop_first_cf_node(loop));
>     nir_block *block_2 = nir_cf_node_as_block(nir_cf_node_next(&loop->cf_node));
> -   nir_block *block_3 = impl->end_block;
> +   nir_block *block_3 = b.impl->end_block;
>     ASSERT_EQ(nir_cf_node_block, block_0->cf_node.type);
>     ASSERT_EQ(nir_cf_node_block, block_1->cf_node.type);
>     ASSERT_EQ(nir_cf_node_block, block_2->cf_node.type);
> @@ -107,12 +101,12 @@ TEST_F(nir_cf_test, delete_break_in_loop)
>     EXPECT_TRUE(_mesa_set_search(block_2->predecessors, block_1));
>     EXPECT_TRUE(_mesa_set_search(block_3->predecessors, block_2));
>
> -   nir_print_shader(shader, stderr);
> +   nir_print_shader(b.shader, stderr);
>
>     /* Now remove the break. */
>     nir_instr_remove(&jump->instr);
>
> -   nir_print_shader(shader, stderr);
> +   nir_print_shader(b.shader, stderr);
>
>     /* At this point, we should have:
>      *
> @@ -150,5 +144,5 @@ TEST_F(nir_cf_test, delete_break_in_loop)
>     EXPECT_TRUE(_mesa_set_search(block_2->predecessors, block_1));
>     EXPECT_TRUE(_mesa_set_search(block_3->predecessors, block_2));
>
> -   nir_metadata_require(impl, nir_metadata_dominance);
> +   nir_metadata_require(b.impl, nir_metadata_dominance);
>  }
> diff --git a/src/mesa/program/prog_to_nir.c b/src/mesa/program/prog_to_nir.c
> index c5d4f27..ce6f699 100644
> --- a/src/mesa/program/prog_to_nir.c
> +++ b/src/mesa/program/prog_to_nir.c
> @@ -1082,11 +1082,11 @@ prog_to_nir(const struct gl_program *prog,
>     c = rzalloc(NULL, struct ptn_compile);
>     if (!c)
>        return NULL;
> -   s = nir_shader_create(NULL, stage, options);
> -   if (!s)
> -      goto fail;
>     c->prog = prog;
>
> +   nir_builder_init_simple_shader(&c->build, NULL, stage, options);
> +   s = c->build.shader;
> +
>     if (prog->Parameters->NumParameters > 0) {
>        c->parameters = rzalloc(s, nir_variable);
>        c->parameters->type =
> @@ -1097,13 +1097,6 @@ prog_to_nir(const struct gl_program *prog,
>        exec_list_push_tail(&s->uniforms, &c->parameters->node);
>     }
>
> -   nir_function *func = nir_function_create(s, "main");
> -   nir_function_impl *impl = nir_function_impl_create(func);
> -
> -   c->build.shader = s;
> -   c->build.impl = impl;
> -   c->build.cursor = nir_after_cf_list(&impl->body);
> -
>     setup_registers_and_variables(c);
>     if (unlikely(c->error))
>        goto fail;
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> 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