<div dir="ltr">This looks good to me :)<div><br></div><div>Reviewed-by: Plamena Manolova <<a href="mailto:plamena.manolova@intel.com">plamena.manolova@intel.com</a>></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, 6 Jun 2018 at 18:51, Jordan Justen <<a href="mailto:jordan.l.justen@intel.com">jordan.l.justen@intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=106810" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=106810</a><br>
Fixes: b4c37ce2140 "i965: Add ARB_get_program_binary support using nir_serialization"<br>
Ref: 3fe8d04a6d6 "mesa: don't always set _NEW_PROGRAM when linking"<br>
Ref: c505d6d8522 "mesa: use gl_program for CurrentProgram rather than gl_shader_program"<br>
Cc: Timothy Arceri <<a href="mailto:tarceri@itsqueeze.com" target="_blank">tarceri@itsqueeze.com</a>><br>
Cc: <<a href="mailto:xinghua.cao@intel.com" target="_blank">xinghua.cao@intel.com</a>><br>
Signed-off-by: Jordan Justen <<a href="mailto:jordan.l.justen@intel.com" target="_blank">jordan.l.justen@intel.com</a>><br>
---<br>
 src/mesa/main/program_binary.c | 33 +++++++++++++++++++++++++++++++++<br>
 1 file changed, 33 insertions(+)<br>
<br>
diff --git a/src/mesa/main/program_binary.c b/src/mesa/main/program_binary.c<br>
index 021f6315e72..f4aa57821c8 100644<br>
--- a/src/mesa/main/program_binary.c<br>
+++ b/src/mesa/main/program_binary.c<br>
@@ -33,6 +33,8 @@<br>
 #include "compiler/glsl/serialize.h"<br>
 #include "main/errors.h"<br>
 #include "main/mtypes.h"<br>
+#include "main/shaderapi.h"<br>
+#include "util/bitscan.h"<br>
 #include "util/crc32.h"<br>
 #include "program_binary.h"<br>
 #include "program/prog_parameter.h"<br>
@@ -282,10 +284,41 @@ _mesa_program_binary(struct gl_context *ctx, struct gl_shader_program *sh_prog,<br>
    struct blob_reader blob;<br>
    blob_reader_init(&blob, payload, length - header_size);<br>
<br>
+   unsigned programs_in_use = 0;<br>
+   if (ctx->_Shader)<br>
+      for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) {<br>
+         if (ctx->_Shader->CurrentProgram[stage] &&<br>
+             ctx->_Shader->CurrentProgram[stage]->Id == sh_prog->Name) {<br>
+            programs_in_use |= 1 << stage;<br>
+         }<br>
+   }<br>
+<br>
    if (!read_program_payload(ctx, &blob, binary_format, sh_prog)) {<br>
       sh_prog->data->LinkStatus = LINKING_FAILURE;<br>
       return;<br>
    }<br>
<br>
+   /* From section 7.3 (Program Objects) of the OpenGL 4.5 spec:<br>
+    *<br>
+    *    "If LinkProgram or ProgramBinary successfully re-links a program<br>
+    *     object that is active for any shader stage, then the newly generated<br>
+    *     executable code will be installed as part of the current rendering<br>
+    *     state for all shader stages where the program is active.<br>
+    *     Additionally, the newly generated executable code is made part of<br>
+    *     the state of any program pipeline for all stages where the program<br>
+    *     is attached."<br>
+    */<br>
+   if (programs_in_use) {<br>
+      while (programs_in_use) {<br>
+         const int stage = u_bit_scan(&programs_in_use);<br>
+<br>
+         struct gl_program *prog = NULL;<br>
+         if (sh_prog->_LinkedShaders[stage])<br>
+            prog = sh_prog->_LinkedShaders[stage]->Program;<br>
+<br>
+         _mesa_use_program(ctx, stage, sh_prog, prog, ctx->_Shader);<br>
+      }<br>
+   }<br>
+<br>
    sh_prog->data->LinkStatus = LINKING_SKIPPED;<br>
 }<br>
-- <br>
2.17.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>