mesa: Free old linked shaders when relinking new shaders.
This commit is contained in:
@@ -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;
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user