glsl/nir: Add and use a gl_nir_link() function
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Fri, 23 Aug 2019 13:50:11 +0000 (06:50 -0700)
committerCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Tue, 10 Sep 2019 21:36:46 +0000 (14:36 -0700)
Perform all the NIR linking steps in order.  Change iris and i965 to
use it.  Suggested by Alejandro.

v2: Add gl_nir_linker_options struct.

Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com> [v1]
src/compiler/glsl/gl_nir_linker.c
src/compiler/glsl/gl_nir_linker.h
src/mesa/drivers/dri/i965/brw_link.cpp
src/mesa/state_tracker/st_glsl_to_nir.cpp

index 4503231c6c21d708a9e9b5e708a1e1593b28fa52..8b5ff28a3996a1dcfe8b1cc011700daeb2a92358 100644 (file)
@@ -253,3 +253,19 @@ nir_build_program_resource_list(struct gl_context *ctx,
 
    _mesa_set_destroy(resource_set, NULL);
 }
+
+bool
+gl_nir_link(struct gl_context *ctx, struct gl_shader_program *prog,
+            const struct gl_nir_linker_options *options)
+{
+   if (!gl_nir_link_uniform_blocks(ctx, prog))
+      return false;
+
+   if (!gl_nir_link_uniforms(ctx, prog, options->fill_parameters))
+      return false;
+
+   gl_nir_link_assign_atomic_counter_resources(ctx, prog);
+   gl_nir_link_assign_xfb_resources(ctx, prog);
+
+   return true;
+}
index ecbc3f390905c86124767c6eaf6c1ca5e05885cb..82c5bf2ab49730f61876204720dbd73abb846d73 100644 (file)
@@ -31,6 +31,14 @@ extern "C" {
 struct gl_context;
 struct gl_shader_program;
 
+struct gl_nir_linker_options {
+   bool fill_parameters;
+};
+
+bool gl_nir_link(struct gl_context *ctx,
+                 struct gl_shader_program *prog,
+                 const struct gl_nir_linker_options *options);
+
 bool gl_nir_link_uniforms(struct gl_context *ctx,
                           struct gl_shader_program *prog,
                           bool fill_parameters);
index c726551513a3927f51866b3ebae77c93217d4b0a..512206e71e6b9ee5ec7883b8c6a253551a14ad6e 100644 (file)
@@ -269,15 +269,11 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
 
    /* SPIR-V programs use a NIR linker */
    if (shProg->data->spirv) {
-      if (!gl_nir_link_uniform_blocks(ctx, shProg)) {
+      static const gl_nir_linker_options opts = {
+         .fill_parameters = false,
+      };
+      if (!gl_nir_link(ctx, shProg, &opts))
          return GL_FALSE;
-      }
-
-      if (!gl_nir_link_uniforms(ctx, shProg, /* fill_parameters */ false))
-         return GL_FALSE;
-
-      gl_nir_link_assign_atomic_counter_resources(ctx, shProg);
-      gl_nir_link_assign_xfb_resources(ctx, shProg);
    }
 
    for (stage = 0; stage < ARRAY_SIZE(shProg->_LinkedShaders); stage++) {
index 39203435515d968d8130a6f0498fb18c06bd0aa0..280a7782170cb597fa484551edd5ef284e2373da 100644 (file)
@@ -687,15 +687,12 @@ st_link_nir(struct gl_context *ctx,
     * st_nir_preprocess.
     */
    if (shader_program->data->spirv) {
-      if (!gl_nir_link_uniform_blocks(ctx, shader_program))
+      static const gl_nir_linker_options opts = {
+         .fill_parameters = true,
+      };
+      if (!gl_nir_link(ctx, shader_program, &opts))
          return GL_FALSE;
 
-      if (!gl_nir_link_uniforms(ctx, shader_program, /* fill_parameters */ true))
-         return GL_FALSE;
-
-      gl_nir_link_assign_atomic_counter_resources(ctx, shader_program);
-      gl_nir_link_assign_xfb_resources(ctx, shader_program);
-
       nir_build_program_resource_list(ctx, shader_program);
 
       for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {