/** * Free all the data that hangs off a shader program object, but not the * object itself. */ void _mesa_free_shader_program_data(struct gl_context *ctx, struct gl_shader_program *shProg) { GLuint i; gl_shader_stage sh; assert(shProg->Type == GL_SHADER_PROGRAM_MESA); _mesa_clear_shader_program_data(shProg); if (shProg->AttributeBindings) { string_to_uint_map_dtor(shProg->AttributeBindings); shProg->AttributeBindings = NULL; } if (shProg->FragDataBindings) { string_to_uint_map_dtor(shProg->FragDataBindings); shProg->FragDataBindings = NULL; } if (shProg->FragDataIndexBindings) { string_to_uint_map_dtor(shProg->FragDataIndexBindings); shProg->FragDataIndexBindings = NULL; } /* detach shaders */ for (i = 0; i < shProg->NumShaders; i++) { _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL); } shProg->NumShaders = 0; free(shProg->Shaders); shProg->Shaders = NULL; /* Transform feedback varying vars */ for (i = 0; i < shProg->TransformFeedback.NumVarying; i++) { free(shProg->TransformFeedback.VaryingNames[i]); } free(shProg->TransformFeedback.VaryingNames); shProg->TransformFeedback.VaryingNames = NULL; shProg->TransformFeedback.NumVarying = 0; for (sh = 0; sh < MESA_SHADER_STAGES; sh++) { if (shProg->_LinkedShaders[sh] != NULL) { _mesa_delete_shader(ctx, shProg->_LinkedShaders[sh]); shProg->_LinkedShaders[sh] = NULL; } } free(shProg->Label); shProg->Label = NULL; }
/** * Clear (free) the shader program state that gets produced by linking. */ void _mesa_clear_shader_program_data(struct gl_context *ctx, struct gl_shader_program *shProg) { if (shProg->UniformStorage) { unsigned i; for (i = 0; i < shProg->NumUserUniformStorage; ++i) _mesa_uniform_detach_all_driver_storage(&shProg->UniformStorage[i]); ralloc_free(shProg->UniformStorage); shProg->NumUserUniformStorage = 0; shProg->UniformStorage = NULL; } if (shProg->UniformRemapTable) { ralloc_free(shProg->UniformRemapTable); shProg->NumUniformRemapTable = 0; shProg->UniformRemapTable = NULL; } if (shProg->UniformHash) { string_to_uint_map_dtor(shProg->UniformHash); shProg->UniformHash = NULL; } assert(shProg->InfoLog != NULL); ralloc_free(shProg->InfoLog); shProg->InfoLog = ralloc_strdup(shProg, ""); }
/** * Clear (free) the shader program state that gets produced by linking. */ void _mesa_clear_shader_program_data(struct gl_context *ctx, struct gl_shader_program *shProg) { for (gl_shader_stage sh = 0; sh < MESA_SHADER_STAGES; sh++) { if (shProg->_LinkedShaders[sh] != NULL) { _mesa_delete_linked_shader(ctx, shProg->_LinkedShaders[sh]); shProg->_LinkedShaders[sh] = NULL; } } shProg->data->linked_stages = 0; if (shProg->data->UniformStorage) { for (unsigned i = 0; i < shProg->data->NumUniformStorage; ++i) _mesa_uniform_detach_all_driver_storage(&shProg->data-> UniformStorage[i]); ralloc_free(shProg->data->UniformStorage); shProg->data->NumUniformStorage = 0; shProg->data->UniformStorage = NULL; } if (shProg->UniformRemapTable) { ralloc_free(shProg->UniformRemapTable); shProg->NumUniformRemapTable = 0; shProg->UniformRemapTable = NULL; } if (shProg->UniformHash) { string_to_uint_map_dtor(shProg->UniformHash); shProg->UniformHash = NULL; } assert(shProg->data->InfoLog != NULL); ralloc_free(shProg->data->InfoLog); shProg->data->InfoLog = ralloc_strdup(shProg->data, ""); ralloc_free(shProg->data->UniformBlocks); shProg->data->UniformBlocks = NULL; shProg->data->NumUniformBlocks = 0; ralloc_free(shProg->data->ShaderStorageBlocks); shProg->data->ShaderStorageBlocks = NULL; shProg->data->NumShaderStorageBlocks = 0; ralloc_free(shProg->data->AtomicBuffers); shProg->data->AtomicBuffers = NULL; shProg->data->NumAtomicBuffers = 0; if (shProg->ProgramResourceList) { ralloc_free(shProg->ProgramResourceList); shProg->ProgramResourceList = NULL; shProg->NumProgramResourceList = 0; } }
/** * Clear (free) the shader program state that gets produced by linking. */ void _mesa_clear_shader_program_data(struct gl_shader_program *shProg) { unsigned i; if (shProg->UniformStorage) { for (i = 0; i < shProg->NumUniformStorage; ++i) _mesa_uniform_detach_all_driver_storage(&shProg->UniformStorage[i]); ralloc_free(shProg->UniformStorage); shProg->NumUniformStorage = 0; shProg->UniformStorage = NULL; } if (shProg->UniformRemapTable) { ralloc_free(shProg->UniformRemapTable); shProg->NumUniformRemapTable = 0; shProg->UniformRemapTable = NULL; } if (shProg->UniformHash) { string_to_uint_map_dtor(shProg->UniformHash); shProg->UniformHash = NULL; } assert(shProg->InfoLog != NULL); ralloc_free(shProg->InfoLog); shProg->InfoLog = ralloc_strdup(shProg, ""); ralloc_free(shProg->UniformBlocks); shProg->UniformBlocks = NULL; shProg->NumUniformBlocks = 0; ralloc_free(shProg->ShaderStorageBlocks); shProg->ShaderStorageBlocks = NULL; shProg->NumShaderStorageBlocks = 0; ralloc_free(shProg->AtomicBuffers); shProg->AtomicBuffers = NULL; shProg->NumAtomicBuffers = 0; if (shProg->ProgramResourceList) { ralloc_free(shProg->ProgramResourceList); shProg->ProgramResourceList = NULL; shProg->NumProgramResourceList = 0; } }
/** * Clear (free) the shader program state that gets produced by linking. */ void _mesa_clear_shader_program_data(struct gl_shader_program *shProg) { unsigned i; if (shProg->UniformStorage) { for (i = 0; i < shProg->NumUserUniformStorage; ++i) _mesa_uniform_detach_all_driver_storage(&shProg->UniformStorage[i]); ralloc_free(shProg->UniformStorage); shProg->NumUserUniformStorage = 0; shProg->UniformStorage = NULL; } if (shProg->UniformRemapTable) { ralloc_free(shProg->UniformRemapTable); shProg->NumUniformRemapTable = 0; shProg->UniformRemapTable = NULL; } if (shProg->UniformHash) { string_to_uint_map_dtor(shProg->UniformHash); shProg->UniformHash = NULL; } assert(shProg->InfoLog != NULL); ralloc_free(shProg->InfoLog); shProg->InfoLog = ralloc_strdup(shProg, ""); ralloc_free(shProg->UniformBlocks); shProg->UniformBlocks = NULL; shProg->NumUniformBlocks = 0; for (i = 0; i < MESA_SHADER_STAGES; i++) { ralloc_free(shProg->UniformBlockStageIndex[i]); shProg->UniformBlockStageIndex[i] = NULL; } ralloc_free(shProg->AtomicBuffers); shProg->AtomicBuffers = NULL; shProg->NumAtomicBuffers = 0; }