mesa: Free old linked shaders when relinking new shaders.

This commit is contained in:
Eric Anholt
2010-08-18 12:02:35 -07:00
parent 0b09e6410f
commit 5d0f430e8e
4 changed files with 17 additions and 8 deletions

View File

@@ -674,7 +674,8 @@ get_main_function_signature(gl_shader *sh)
* shader is returned. * shader is returned.
*/ */
static struct gl_shader * static struct gl_shader *
link_intrastage_shaders(struct gl_shader_program *prog, link_intrastage_shaders(GLcontext *ctx,
struct gl_shader_program *prog,
struct gl_shader **shader_list, struct gl_shader **shader_list,
unsigned num_shaders) unsigned num_shaders)
{ {
@@ -747,7 +748,7 @@ link_intrastage_shaders(struct gl_shader_program *prog,
return NULL; return NULL;
} }
gl_shader *const linked = _mesa_new_shader(NULL, 0, main->Type); gl_shader *const linked = ctx->Driver.NewShader(NULL, 0, main->Type);
linked->ir = new(linked) exec_list; linked->ir = new(linked) exec_list;
clone_ir_list(linked, linked->ir, main->ir); clone_ir_list(linked, linked->ir, main->ir);
@@ -1212,7 +1213,7 @@ assign_varying_locations(struct gl_shader_program *prog,
void void
link_shaders(struct gl_shader_program *prog) link_shaders(GLcontext *ctx, struct gl_shader_program *prog)
{ {
prog->LinkStatus = false; prog->LinkStatus = false;
prog->Validated = false; prog->Validated = false;
@@ -1270,12 +1271,16 @@ link_shaders(struct gl_shader_program *prog)
prog->Version = max_version; prog->Version = max_version;
for (unsigned int i = 0; i < prog->_NumLinkedShaders; i++) {
ctx->Driver.DeleteShader(ctx, prog->_LinkedShaders[i]);
}
/* Link all shaders for a particular stage and validate the result. /* Link all shaders for a particular stage and validate the result.
*/ */
prog->_NumLinkedShaders = 0; prog->_NumLinkedShaders = 0;
if (num_vert_shaders > 0) { if (num_vert_shaders > 0) {
gl_shader *const sh = gl_shader *const sh =
link_intrastage_shaders(prog, vert_shader_list, num_vert_shaders); link_intrastage_shaders(ctx, prog, vert_shader_list, num_vert_shaders);
if (sh == NULL) if (sh == NULL)
goto done; goto done;
@@ -1289,7 +1294,7 @@ link_shaders(struct gl_shader_program *prog)
if (num_frag_shaders > 0) { if (num_frag_shaders > 0) {
gl_shader *const sh = gl_shader *const sh =
link_intrastage_shaders(prog, frag_shader_list, num_frag_shaders); link_intrastage_shaders(ctx, prog, frag_shader_list, num_frag_shaders);
if (sh == NULL) if (sh == NULL)
goto done; goto done;

View File

@@ -209,6 +209,10 @@ int
main(int argc, char **argv) main(int argc, char **argv)
{ {
int status = EXIT_SUCCESS; int status = EXIT_SUCCESS;
GLcontext local_ctx;
GLcontext *ctx = &local_ctx;
ctx->Driver.NewShader = _mesa_new_shader;
int c; int c;
int idx = 0; int idx = 0;
@@ -265,7 +269,7 @@ main(int argc, char **argv)
} }
if ((status == EXIT_SUCCESS) && do_link) { if ((status == EXIT_SUCCESS) && do_link) {
link_shaders(whole_program); link_shaders(ctx, whole_program);
status = (whole_program->LinkStatus) ? EXIT_SUCCESS : EXIT_FAILURE; status = (whole_program->LinkStatus) ? EXIT_SUCCESS : EXIT_FAILURE;
if (strlen(whole_program->InfoLog) > 0) if (strlen(whole_program->InfoLog) > 0)

View File

@@ -30,4 +30,4 @@ extern "C" {
} }
extern void extern void
link_shaders(struct gl_shader_program *prog); link_shaders(GLcontext *ctx, struct gl_shader_program *prog);

View File

@@ -2740,7 +2740,7 @@ _mesa_glsl_link_shader(GLcontext *ctx, struct gl_shader_program *prog)
_mesa_reference_fragprog(ctx, &prog->FragmentProgram, NULL); _mesa_reference_fragprog(ctx, &prog->FragmentProgram, NULL);
if (prog->LinkStatus) { if (prog->LinkStatus) {
link_shaders(prog); link_shaders(ctx, prog);
/* We don't use the linker's uniforms list, and cook up our own at /* We don't use the linker's uniforms list, and cook up our own at
* generate time. * generate time.