diff options
author | Timothy Arceri <timothy.arceri@collabora.com> | 2017-01-09 16:13:27 +1100 |
---|---|---|
committer | Timothy Arceri <timothy.arceri@collabora.com> | 2017-01-19 15:55:02 +1100 |
commit | 3fe8d04a6d69fad98228be647ba9b250ea0e3a8b (patch) | |
tree | 01c058d0d19512c1bca81ec1e9116df269d4baf8 | |
parent | aad93402c00ae90274d7abdbb64960d9ae40a0ce (diff) |
mesa: don't always set _NEW_PROGRAM when linking
We only need to set it when linking was successful and the program
being linked is currently active.
The programs_in_use mask is just used as a flag for now but in
a future change we will use it to update the CurrentProgram array.
V2: make sure to flush vertices before linking (suggested by Marek)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r-- | src/mesa/main/shaderapi.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 4ee71dcdcb..00577dc359 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -1097,10 +1097,31 @@ _mesa_link_program(struct gl_context *ctx, struct gl_shader_program *shProg) return; } - FLUSH_VERTICES(ctx, _NEW_PROGRAM); + unsigned programs_in_use = 0; + if (ctx->_Shader) + for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) { + if (ctx->_Shader->CurrentProgram[stage] == shProg) { + programs_in_use |= 1 << stage; + } + } + FLUSH_VERTICES(ctx, 0); _mesa_glsl_link_shader(ctx, shProg); + /* 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." + */ + if (shProg->data->LinkStatus && programs_in_use) { + ctx->NewState |= _NEW_PROGRAM; + } + /* Capture .shader_test files. */ const char *capture_path = _mesa_get_shader_capture_path(); if (shProg->Name != 0 && shProg->Name != ~0 && capture_path != NULL) { |