瀏覽代碼

mesa/program_binary: add implicit UseProgram after successful ProgramBinary

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106810
Fixes: b4c37ce214 "i965: Add ARB_get_program_binary support using nir_serialization"
Ref: 3fe8d04a6d "mesa: don't always set _NEW_PROGRAM when linking"
Ref: c505d6d852 "mesa: use gl_program for CurrentProgram rather than gl_shader_program"
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Plamena Manolova <plamena.manolova@intel.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
tags/18.2-branchpoint
Jordan Justen 7 年之前
父節點
當前提交
e266b32059
沒有連結到貢獻者的電子郵件帳戶。
共有 1 個檔案被更改,包括 31 行新增0 行删除
  1. 31
    0
      src/mesa/main/program_binary.c

+ 31
- 0
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;
}

Loading…
取消
儲存