st/glsl_to_nir: use nir based program resource list builder
authorTimothy Arceri <tarceri@itsqueeze.com>
Fri, 6 Dec 2019 10:57:16 +0000 (21:57 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Fri, 13 Dec 2019 00:07:19 +0000 (00:07 +0000)
Here we use the NIR based builder to add everything to the resource
list execpt for SSO packed varyings. Since the details of those
varyings get lost during packing we leave the special handing to
the GLSL IR pass for now. In order to do this we add some bools
to the build resource list functions.

Using the NIR based resource list builder gets us a step closer to
using a native NIR based linker. It should also be faster than the
GLSL IR builder, one because the NIR optimisations should mean we
add less entries due to better optimisations, and two because nir
gives us better lists to work with and we don't need to walk the
entire IR to find the resources.

Ack-by: Alejandro PiƱeiro <apinheiro@igalia.com>
src/compiler/glsl/gl_nir_linker.c
src/compiler/glsl/gl_nir_linker.h
src/compiler/glsl/linker.cpp
src/compiler/glsl/program.h
src/mesa/drivers/dri/i965/brw_link.cpp
src/mesa/program/ir_to_mesa.cpp
src/mesa/state_tracker/st_glsl_to_ir.cpp
src/mesa/state_tracker/st_glsl_to_nir.cpp

index 2664942662a918d0aa6fbc46b7eabe71582446f1..5ad590726f126c9d76f1899cec9a413cde76264e 100644 (file)
@@ -397,10 +397,11 @@ add_interface_variables(const struct gl_context *ctx,
  */
 void
 nir_build_program_resource_list(struct gl_context *ctx,
-                                struct gl_shader_program *prog)
+                                struct gl_shader_program *prog,
+                                bool rebuild_resourse_list)
 {
    /* Rebuild resource list. */
-   if (prog->data->ProgramResourceList) {
+   if (prog->data->ProgramResourceList && rebuild_resourse_list) {
       ralloc_free(prog->data->ProgramResourceList);
       prog->data->ProgramResourceList = NULL;
       prog->data->NumProgramResourceList = 0;
index 82c5bf2ab49730f61876204720dbd73abb846d73..bc7b053119cd31cb69d937e7d4eed3e03e296aa5 100644 (file)
@@ -47,7 +47,8 @@ void gl_nir_set_uniform_initializers(struct gl_context *ctx,
                                      struct gl_shader_program *prog);
 
 void nir_build_program_resource_list(struct gl_context *ctx,
-                                     struct gl_shader_program *prog);
+                                     struct gl_shader_program *prog,
+                                     bool rebuild_resourse_list);
 
 void gl_nir_link_assign_atomic_counter_resources(struct gl_context *ctx,
                                                  struct gl_shader_program *prog);
index 1b30a59d8fbb4f73845d0af1423bc22ea038cced..81f285244295ad6219d2abd1a86ae8cfe0fed5d4 100644 (file)
@@ -4124,7 +4124,8 @@ add_fragdata_arrays(const struct gl_context *ctx,
  */
 void
 build_program_resource_list(struct gl_context *ctx,
-                            struct gl_shader_program *shProg)
+                            struct gl_shader_program *shProg,
+                            bool add_packed_varyings_only)
 {
    /* Rebuild resource list. */
    if (shProg->data->ProgramResourceList) {
@@ -4164,6 +4165,9 @@ build_program_resource_list(struct gl_context *ctx,
          return;
    }
 
+   if (add_packed_varyings_only)
+      return;
+
    if (!add_fragdata_arrays(ctx, shProg, resource_set))
       return;
 
index 9df42ddc1c4663216860f284884d7eca61845207..0106e1dd6f39ad85751e1616983fbe975939c761 100644 (file)
@@ -46,7 +46,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog);
 
 extern void
 build_program_resource_list(struct gl_context *ctx,
-                            struct gl_shader_program *shProg);
+                            struct gl_shader_program *shProg,
+                            bool add_packed_varyings_only);
 
 extern long
 parse_program_resource_name(const GLchar *name,
index 512206e71e6b9ee5ec7883b8c6a253551a14ad6e..c77b696e6a7051c6deaa55b6f366be74c56292aa 100644 (file)
@@ -384,9 +384,9 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
 
    /* SPIR-V programs build its resource list from linked NIR shaders. */
    if (!shProg->data->spirv)
-      build_program_resource_list(ctx, shProg);
+      build_program_resource_list(ctx, shProg, false);
    else
-      nir_build_program_resource_list(ctx, shProg);
+      nir_build_program_resource_list(ctx, shProg, true);
 
    for (stage = 0; stage < ARRAY_SIZE(shProg->_LinkedShaders); stage++) {
       struct gl_linked_shader *shader = shProg->_LinkedShaders[stage];
index 453dff09e453c977fb45b3b7d369605439f7af28..293c412d23d0d0b77c441e1f36a98c0ff94b6a11 100644 (file)
@@ -3127,7 +3127,7 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
       }
    }
 
-   build_program_resource_list(ctx, prog);
+   build_program_resource_list(ctx, prog, false);
    return prog->data->LinkStatus;
 }
 
index 25e16fa058cab429c54e61ce0553a15d841b7ab9..4d2a45728a9efb0fa568f354fa1616c27a47173e 100644 (file)
@@ -167,7 +167,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
       validate_ir_tree(ir);
    }
 
-   build_program_resource_list(ctx, prog);
+   build_program_resource_list(ctx, prog, use_nir);
 
    if (use_nir)
       return st_link_nir(ctx, prog);
index c252babb7115776462bf68208c6e5d075232973a..425af0cfb5d42f61d72f6f1cc437ac655b06fb62 100644 (file)
@@ -699,7 +699,7 @@ st_link_nir(struct gl_context *ctx,
       if (!gl_nir_link(ctx, shader_program, &opts))
          return GL_FALSE;
 
-      nir_build_program_resource_list(ctx, shader_program);
+      nir_build_program_resource_list(ctx, shader_program, true);
 
       for (unsigned i = 0; i < num_shaders; i++) {
          struct gl_linked_shader *shader = linked_shader[i];
@@ -721,6 +721,9 @@ st_link_nir(struct gl_context *ctx,
                           linked_shader[i + 1]->Program->nir);
    }
 
+   if (!shader_program->data->spirv)
+      nir_build_program_resource_list(ctx, shader_program, false);
+
    for (unsigned i = 0; i < num_shaders; i++) {
       struct gl_linked_shader *shader = linked_shader[i];
       nir_shader *nir = shader->Program->nir;