[Mesa-dev] [PATCH 41/56] i965: don't recreate program struct on cache fallback

Timothy Arceri timothy.arceri at collabora.com
Tue Nov 29 03:58:40 UTC 2016


We already have the struct and paramlist we don't want to recreate
them as this is unnecessary and would mean we would need to remap
anything using the old paramlist to the addresses of the new one.
---
 src/compiler/glsl/linker.cpp           | 14 +++++++-----
 src/mesa/drivers/dri/i965/brw_link.cpp | 41 +++++++++++++++++-----------------
 src/mesa/main/mtypes.h                 |  2 ++
 3 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index b73bb6c..8a2a8fe 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -2179,11 +2179,15 @@ link_intrastage_shaders(void *mem_ctx,
    linked->Stage = shader_list[0]->Stage;
 
    /* Create program and attach it to the linked shader */
-   struct gl_program *gl_prog =
-      ctx->Driver.NewProgram(ctx,
-                             _mesa_shader_stage_to_program(shader_list[0]->Stage),
-                             prog->Name, false);
-   gl_prog->info.stage = shader_list[0]->Stage;
+   struct gl_program *gl_prog;
+   if (!prog->data->cache_fallback) {
+      gl_prog = ctx->Driver.NewProgram(ctx,
+         _mesa_shader_stage_to_program(shader_list[0]->Stage), prog->Name,
+         false);
+      gl_prog->info.stage = shader_list[0]->Stage;
+   } else {
+      gl_prog = prog->cache_progs[shader_list[0]->Stage];
+   }
 
    if (!gl_prog) {
       prog->data->LinkStatus = false;
diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp
index be7c3d9..a9ef7c1 100644
--- a/src/mesa/drivers/dri/i965/brw_link.cpp
+++ b/src/mesa/drivers/dri/i965/brw_link.cpp
@@ -212,16 +212,16 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
 
       process_glsl_ir(brw, shProg, shader);
 
-      _mesa_copy_linked_program_data(shProg, shader);
-
-      /* 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.
-       */
       if (!shProg->data->cache_fallback) {
+         _mesa_copy_linked_program_data(shProg, shader);
+
+         /* 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.
+          */
          prog->Parameters = _mesa_new_parameter_list();
          foreach_in_list(ir_instruction, node, shader->ir) {
             ir_variable *var = node->as_variable();
@@ -238,21 +238,22 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
                                          (gl_state_index *) slots[i].tokens);
             }
          }
-      }
 
-      prog->ShadowSamplers = shader->shadow_samplers;
-      _mesa_update_shader_textures_used(shProg, prog);
+         prog->ShadowSamplers = shader->shadow_samplers;
+         _mesa_update_shader_textures_used(shProg, prog);
 
-      brw_add_texrect_params(prog);
+         brw_add_texrect_params(prog);
 
-      bool debug_enabled =
-         (INTEL_DEBUG & intel_debug_flag_for_shader_stage(shader->Stage));
+         bool debug_enabled =
+            (INTEL_DEBUG & intel_debug_flag_for_shader_stage(shader->Stage));
 
-      if (debug_enabled && shader->ir) {
-         fprintf(stderr, "GLSL IR for native %s shader %d:\n",
-                 _mesa_shader_stage_to_string(shader->Stage), shProg->Name);
-         _mesa_print_ir(stderr, shader->ir, NULL);
-         fprintf(stderr, "\n\n");
+         if (debug_enabled && shader->ir) {
+            fprintf(stderr, "GLSL IR for native %s shader %d:\n",
+                    _mesa_shader_stage_to_string(shader->Stage),
+                    shProg->Name);
+            _mesa_print_ir(stderr, shader->ir, NULL);
+            fprintf(stderr, "\n\n");
+         }
       }
 
       prog->nir = brw_create_nir(brw, shProg, prog, (gl_shader_stage) stage,
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index cf48305..e966107 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2815,6 +2815,8 @@ struct gl_shader_program
     * #extension ARB_fragment_coord_conventions: enable
     */
    GLboolean ARB_fragment_coord_conventions_enable;
+
+   struct gl_program *cache_progs[MESA_SHADER_STAGES];
 };   
 
 
-- 
2.7.4



More information about the mesa-dev mailing list