[Mesa-dev] [PATCH 2/8] i965: move update_xfb_info() call out of loop

Timothy Arceri tarceri at itsqueeze.com
Tue Nov 21 03:28:05 UTC 2017


We can just call it once. Also a following patch will also introduce
link time component packing which modifies the outputs_written
bit mask, we want to avoid calling update_xfb_info() until after
packing is completed.
---
 src/mesa/drivers/dri/i965/brw_link.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp
index d18521e792..7986bdf74c 100644
--- a/src/mesa/drivers/dri/i965/brw_link.cpp
+++ b/src/mesa/drivers/dri/i965/brw_link.cpp
@@ -306,42 +306,45 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
          struct blob writer;
          blob_init(&writer);
          nir_serialize(&writer, prog->nir);
          prog->driver_cache_blob = ralloc_size(NULL, writer.size);
          memcpy(prog->driver_cache_blob, writer.data, writer.size);
          prog->driver_cache_blob_size = writer.size;
       }
 
       infos[stage] = &prog->nir->info;
 
-      update_xfb_info(prog->sh.LinkedTransformFeedback, infos[stage]);
-
       /* Make a pass over the IR to add state references for any built-in
        * uniforms that are used.  This has to be done now (during linking).
        * Code generation doesn't happen until the first time this shader is
        * used for rendering.  Waiting until then to generate the parameters is
        * too late.  At that point, the values for the built-in uniforms won't
        * get sent to the shader.
        */
       nir_foreach_variable(var, &prog->nir->uniforms) {
          if (strncmp(var->name, "gl_", 3) == 0) {
             const nir_state_slot *const slots = var->state_slots;
             assert(var->state_slots != NULL);
 
             for (unsigned int i = 0; i < var->num_state_slots; i++) {
                _mesa_add_state_reference(prog->Parameters,
                                          (gl_state_index *)slots[i].tokens);
             }
          }
       }
    }
 
+   if (shProg->last_vert_prog) {
+      update_xfb_info(shProg->last_vert_prog->sh.LinkedTransformFeedback,
+                      &shProg->last_vert_prog->nir->info);
+   }
+
    /* The linker tries to dead code eliminate unused varying components,
     * and make sure interfaces match.  But it isn't able to do so in all
     * cases.  So, explicitly make the interfaces match by OR'ing together
     * the inputs_read/outputs_written bitfields of adjacent stages.
     */
    if (!shProg->SeparateShader)
       unify_interfaces(infos);
 
    if ((ctx->_Shader->Flags & GLSL_DUMP) && shProg->Name != 0) {
       for (unsigned i = 0; i < shProg->NumShaders; i++) {
-- 
2.14.3



More information about the mesa-dev mailing list