[Mesa-dev] [PATCH] i965: keep gl_program shader info in sync after gather info

Timothy Arceri timothy.arceri at collabora.com
Thu Dec 1 02:37:38 UTC 2016


It's possible that nir_shader was cloned and it no longer contains
a pointer to the shader_info in gl_program. So we need to copy
shader_info back to gl_program if that is the case.

Fixes a regression with NIR_TEST_CLONE=true

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98840
---
 src/mesa/drivers/dri/i965/brw_program.c | 11 ++++++++++-
 src/mesa/drivers/dri/i965/brw_program.h |  2 +-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c
index a502b8e..7f69977 100644
--- a/src/mesa/drivers/dri/i965/brw_program.c
+++ b/src/mesa/drivers/dri/i965/brw_program.c
@@ -64,7 +64,7 @@ brw_nir_lower_uniforms(nir_shader *nir, bool is_scalar)
 nir_shader *
 brw_create_nir(struct brw_context *brw,
                const struct gl_shader_program *shader_prog,
-               const struct gl_program *prog,
+               struct gl_program *prog,
                gl_shader_stage stage,
                bool is_scalar)
 {
@@ -107,6 +107,15 @@ brw_create_nir(struct brw_context *brw,
 
    nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
 
+   /* nir_shader may have been cloned so make sure shader_info is in sync */
+   if (nir->info != &prog->info) {
+      const char *name = prog->info.name;
+      const char *label = prog->info.label;
+      prog->info = *nir->info;
+      prog->info.name = name;
+      prog->info.label = label;
+   }
+
    if (shader_prog) {
       NIR_PASS_V(nir, nir_lower_samplers, shader_prog);
       NIR_PASS_V(nir, nir_lower_atomics, shader_prog);
diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h
index 43bc625..6eda165 100644
--- a/src/mesa/drivers/dri/i965/brw_program.h
+++ b/src/mesa/drivers/dri/i965/brw_program.h
@@ -34,7 +34,7 @@ struct brw_context;
 
 struct nir_shader *brw_create_nir(struct brw_context *brw,
                                   const struct gl_shader_program *shader_prog,
-                                  const struct gl_program *prog,
+                                  struct gl_program *prog,
                                   gl_shader_stage stage,
                                   bool is_scalar);
 
-- 
2.7.4



More information about the mesa-dev mailing list