i965: keep gl_program shader info in sync after gather info
authorTimothy Arceri <timothy.arceri@collabora.com>
Thu, 1 Dec 2016 02:37:38 +0000 (13:37 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Tue, 20 Dec 2016 04:43:53 +0000 (15:43 +1100)
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
src/mesa/drivers/dri/i965/brw_program.h

index a502b8e084ffad3b0d965c57e089b2eef8a97d4c..7f69977e2044773b95da0b3a4ec11ad059728192 100644 (file)
@@ -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);
index 43bc6254345f3addacaaba244ae6dad934fd43d7..6eda165e875558c5efc14b0417967ccd1398f618 100644 (file)
@@ -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);