summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Justen <[email protected]>2018-06-06 01:57:15 -0700
committerJordan Justen <[email protected]>2018-06-10 21:12:46 -0700
commite266b320590ebbeadf7c98b0b493d89886534ccb (patch)
tree9cdb02af6a762ce2038677d5d82530128588d1d1
parent525cfe5dab069c05becaa32dc80c28c77c4fcac8 (diff)
mesa/program_binary: add implicit UseProgram after successful ProgramBinary
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106810 Fixes: b4c37ce2140 "i965: Add ARB_get_program_binary support using nir_serialization" Ref: 3fe8d04a6d6 "mesa: don't always set _NEW_PROGRAM when linking" Ref: c505d6d8522 "mesa: use gl_program for CurrentProgram rather than gl_shader_program" Signed-off-by: Jordan Justen <[email protected]> Reviewed-by: Plamena Manolova <[email protected]> Reviewed-by: Timothy Arceri <[email protected]>
-rw-r--r--src/mesa/main/program_binary.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/mesa/main/program_binary.c b/src/mesa/main/program_binary.c
index 021f6315e72..af94b79f82d 100644
--- a/src/mesa/main/program_binary.c
+++ b/src/mesa/main/program_binary.c
@@ -33,6 +33,8 @@
#include "compiler/glsl/serialize.h"
#include "main/errors.h"
#include "main/mtypes.h"
+#include "main/shaderapi.h"
+#include "util/bitscan.h"
#include "util/crc32.h"
#include "program_binary.h"
#include "program/prog_parameter.h"
@@ -282,10 +284,39 @@ _mesa_program_binary(struct gl_context *ctx, struct gl_shader_program *sh_prog,
struct blob_reader blob;
blob_reader_init(&blob, payload, length - header_size);
+ unsigned programs_in_use = 0;
+ if (ctx->_Shader)
+ for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) {
+ if (ctx->_Shader->CurrentProgram[stage] &&
+ ctx->_Shader->CurrentProgram[stage]->Id == sh_prog->Name) {
+ programs_in_use |= 1 << stage;
+ }
+ }
+
if (!read_program_payload(ctx, &blob, binary_format, sh_prog)) {
sh_prog->data->LinkStatus = LINKING_FAILURE;
return;
}
+ /* From section 7.3 (Program Objects) of the OpenGL 4.5 spec:
+ *
+ * "If LinkProgram or ProgramBinary successfully re-links a program
+ * object that is active for any shader stage, then the newly generated
+ * executable code will be installed as part of the current rendering
+ * state for all shader stages where the program is active.
+ * Additionally, the newly generated executable code is made part of
+ * the state of any program pipeline for all stages where the program
+ * is attached."
+ */
+ while (programs_in_use) {
+ const int stage = u_bit_scan(&programs_in_use);
+
+ struct gl_program *prog = NULL;
+ if (sh_prog->_LinkedShaders[stage])
+ prog = sh_prog->_LinkedShaders[stage]->Program;
+
+ _mesa_use_program(ctx, stage, sh_prog, prog, ctx->_Shader);
+ }
+
sh_prog->data->LinkStatus = LINKING_SKIPPED;
}