glsl: avoid leaking linked gl_shader when there's a late linker error
This makes piglit mixing-clip-distance-and-clip-vertex-disallowed have 0 definitely lost blocks with valgrind. (Same non-0 number of possibly lost blocks though.) Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Tobias Klausmann <tobias.johannes.klausmann@mni.thm.de> Cc: "10.5 10.6" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -2829,8 +2829,11 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
link_intrastage_shaders(mem_ctx, ctx, prog, shader_list[stage],
|
link_intrastage_shaders(mem_ctx, ctx, prog, shader_list[stage],
|
||||||
num_shaders[stage]);
|
num_shaders[stage]);
|
||||||
|
|
||||||
if (!prog->LinkStatus)
|
if (!prog->LinkStatus) {
|
||||||
|
if (sh)
|
||||||
|
ctx->Driver.DeleteShader(ctx, sh);
|
||||||
goto done;
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
switch (stage) {
|
switch (stage) {
|
||||||
case MESA_SHADER_VERTEX:
|
case MESA_SHADER_VERTEX:
|
||||||
@@ -2843,8 +2846,11 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
validate_fragment_shader_executable(prog, sh);
|
validate_fragment_shader_executable(prog, sh);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!prog->LinkStatus)
|
if (!prog->LinkStatus) {
|
||||||
|
if (sh)
|
||||||
|
ctx->Driver.DeleteShader(ctx, sh);
|
||||||
goto done;
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
_mesa_reference_shader(ctx, &prog->_LinkedShaders[stage], sh);
|
_mesa_reference_shader(ctx, &prog->_LinkedShaders[stage], sh);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user