glsl: create gl_program at the start of linking rather than the end
This will allow us to directly store metadata we want to retain in gl_program this metadata is currently stored in gl_linked_shader and will be lost if relinking fails even though the program will remain in use and is still valid according to the spec. "If a program object that is active for any shader stage is re-linked unsuccessfully, the link status will be set to FALSE, but any existing executables and associated state will remain part of the current rendering state until a subsequent call to UseProgram, UseProgramStages, or BindProgramPipeline removes them from use." This change will also help avoid the double handing that happens in _mesa_copy_linked_program_data(). Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
parent
2b8f97d0ff
commit
9d96d3803a
|
@ -72,6 +72,7 @@
|
||||||
#include "ir.h"
|
#include "ir.h"
|
||||||
#include "program.h"
|
#include "program.h"
|
||||||
#include "program/prog_instruction.h"
|
#include "program/prog_instruction.h"
|
||||||
|
#include "program/program.h"
|
||||||
#include "util/set.h"
|
#include "util/set.h"
|
||||||
#include "util/string_to_uint_map.h"
|
#include "util/string_to_uint_map.h"
|
||||||
#include "linker.h"
|
#include "linker.h"
|
||||||
|
@ -2187,6 +2188,21 @@ link_intrastage_shaders(void *mem_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_linked_shader *linked = ctx->Driver.NewShader(shader_list[0]->Stage);
|
gl_linked_shader *linked = ctx->Driver.NewShader(shader_list[0]->Stage);
|
||||||
|
|
||||||
|
/* Create program and attach it to the linked shader */
|
||||||
|
struct gl_program *gl_prog =
|
||||||
|
ctx->Driver.NewProgram(ctx,
|
||||||
|
_mesa_shader_stage_to_program(shader_list[0]->Stage),
|
||||||
|
prog->Name);
|
||||||
|
if (!prog) {
|
||||||
|
prog->LinkStatus = false;
|
||||||
|
_mesa_delete_linked_shader(ctx, linked);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't use _mesa_reference_program() just take ownership */
|
||||||
|
linked->Program = gl_prog;
|
||||||
|
|
||||||
linked->ir = new(linked) exec_list;
|
linked->ir = new(linked) exec_list;
|
||||||
clone_ir_list(mem_ctx, linked->ir, main->ir);
|
clone_ir_list(mem_ctx, linked->ir, main->ir);
|
||||||
|
|
||||||
|
|
|
@ -221,15 +221,7 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
|
||||||
if (!shader)
|
if (!shader)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
struct gl_program *prog =
|
struct gl_program *prog = shader->Program;
|
||||||
ctx->Driver.NewProgram(ctx, _mesa_shader_stage_to_program(stage),
|
|
||||||
0);
|
|
||||||
if (!prog)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* Don't use _mesa_reference_program() just take ownership */
|
|
||||||
shader->Program = prog;
|
|
||||||
|
|
||||||
prog->Parameters = _mesa_new_parameter_list();
|
prog->Parameters = _mesa_new_parameter_list();
|
||||||
|
|
||||||
process_glsl_ir(brw, shProg, shader);
|
process_glsl_ir(brw, shProg, shader);
|
||||||
|
|
|
@ -2794,9 +2794,7 @@ get_mesa_program(struct gl_context *ctx,
|
||||||
|
|
||||||
validate_ir_tree(shader->ir);
|
validate_ir_tree(shader->ir);
|
||||||
|
|
||||||
prog = ctx->Driver.NewProgram(ctx, target, shader_program->Name);
|
prog = shader->Program;
|
||||||
if (!prog)
|
|
||||||
return NULL;
|
|
||||||
prog->Parameters = _mesa_new_parameter_list();
|
prog->Parameters = _mesa_new_parameter_list();
|
||||||
v.ctx = ctx;
|
v.ctx = ctx;
|
||||||
v.prog = prog;
|
v.prog = prog;
|
||||||
|
@ -2929,9 +2927,6 @@ get_mesa_program(struct gl_context *ctx,
|
||||||
prog->info.fs.depth_layout = shader_program->FragDepthLayout;
|
prog->info.fs.depth_layout = shader_program->FragDepthLayout;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't use _mesa_reference_program() just take ownership */
|
|
||||||
shader->Program = prog;
|
|
||||||
|
|
||||||
if ((ctx->_Shader->Flags & GLSL_NO_OPT) == 0) {
|
if ((ctx->_Shader->Flags & GLSL_NO_OPT) == 0) {
|
||||||
_mesa_optimize_program(ctx, prog, prog);
|
_mesa_optimize_program(ctx, prog, prog);
|
||||||
}
|
}
|
||||||
|
|
|
@ -367,16 +367,10 @@ st_nir_get_mesa_program(struct gl_context *ctx,
|
||||||
struct gl_linked_shader *shader)
|
struct gl_linked_shader *shader)
|
||||||
{
|
{
|
||||||
struct gl_program *prog;
|
struct gl_program *prog;
|
||||||
GLenum target = _mesa_shader_stage_to_program(shader->Stage);
|
|
||||||
|
|
||||||
validate_ir_tree(shader->ir);
|
validate_ir_tree(shader->ir);
|
||||||
|
|
||||||
prog = ctx->Driver.NewProgram(ctx, target, shader_program->Name);
|
prog = shader->Program;
|
||||||
if (!prog)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Don't use _mesa_reference_program() just take ownership */
|
|
||||||
shader->Program = prog;
|
|
||||||
|
|
||||||
prog->Parameters = _mesa_new_parameter_list();
|
prog->Parameters = _mesa_new_parameter_list();
|
||||||
|
|
||||||
|
|
|
@ -6407,7 +6407,6 @@ get_mesa_program_tgsi(struct gl_context *ctx,
|
||||||
{
|
{
|
||||||
glsl_to_tgsi_visitor* v;
|
glsl_to_tgsi_visitor* v;
|
||||||
struct gl_program *prog;
|
struct gl_program *prog;
|
||||||
GLenum target = _mesa_shader_stage_to_program(shader->Stage);
|
|
||||||
struct gl_shader_compiler_options *options =
|
struct gl_shader_compiler_options *options =
|
||||||
&ctx->Const.ShaderCompilerOptions[shader->Stage];
|
&ctx->Const.ShaderCompilerOptions[shader->Stage];
|
||||||
struct pipe_screen *pscreen = ctx->st->pipe->screen;
|
struct pipe_screen *pscreen = ctx->st->pipe->screen;
|
||||||
|
@ -6415,12 +6414,7 @@ get_mesa_program_tgsi(struct gl_context *ctx,
|
||||||
|
|
||||||
validate_ir_tree(shader->ir);
|
validate_ir_tree(shader->ir);
|
||||||
|
|
||||||
prog = ctx->Driver.NewProgram(ctx, target, shader_program->Name);
|
prog = shader->Program;
|
||||||
if (!prog)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Don't use _mesa_reference_program() just take ownership */
|
|
||||||
shader->Program = prog;
|
|
||||||
|
|
||||||
prog->Parameters = _mesa_new_parameter_list();
|
prog->Parameters = _mesa_new_parameter_list();
|
||||||
v = new glsl_to_tgsi_visitor();
|
v = new glsl_to_tgsi_visitor();
|
||||||
|
|
Loading…
Reference in New Issue