diff options
author | Jordan Justen <[email protected]> | 2018-06-06 01:57:15 -0700 |
---|---|---|
committer | Dylan Baker <[email protected]> | 2018-06-11 10:08:30 -0700 |
commit | 98dfe161b0c76d12f4276382a821be3ef1524896 (patch) | |
tree | ca2e45f8ed00224b99989950f46fcf38a0507916 /src | |
parent | bd60b6ef54ac76d398de51afb382ff9f887da05c (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]>
(cherry picked from commit e266b320590ebbeadf7c98b0b493d89886534ccb)
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/program_binary.c | 31 |
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; } |