Render Preview: Fix problem with multi size icon preview

The id was free after each size.
We now only free after the job has finished.
This commit is contained in:
Clément Foucault 2018-07-20 20:36:14 +02:00
parent 4609205a3f
commit a987daa18d
Notes: blender-bot 2023-02-14 07:18:54 +01:00
Referenced by issue #56064, Blender crashes on selecting text-object
1 changed files with 29 additions and 10 deletions

View File

@ -173,6 +173,7 @@ typedef struct ShaderPreview {
int sizex, sizey;
unsigned int *pr_rect;
int pr_method;
bool own_id_copy;
Main *bmain;
Main *pr_main;
@ -837,7 +838,7 @@ static void shader_preview_free(void *customdata)
ShaderPreview *sp = customdata;
Main *pr_main = sp->pr_main;
if (sp->id_copy) {
if (sp->id_copy && sp->own_id_copy) {
switch (GS(sp->id_copy->name)) {
case ID_MA:
BKE_material_free((Material *)sp->id_copy);
@ -866,14 +867,15 @@ static void shader_preview_free(void *customdata)
/* get rid of copied material */
BLI_remlink(&pr_main->mat, sp->matcopy);
BKE_material_free(sp->matcopy);
properties = IDP_GetProperties((ID *)sp->matcopy, false);
if (properties) {
IDP_FreeProperty(properties);
MEM_freeN(properties);
}
MEM_freeN(sp->matcopy);
if (sp->own_id_copy) {
BKE_material_free(sp->matcopy);
MEM_freeN(sp->matcopy);
}
}
if (sp->texcopy) {
struct IDProperty *properties;
@ -882,14 +884,16 @@ static void shader_preview_free(void *customdata)
/* get rid of copied texture */
BLI_remlink(&pr_main->tex, sp->texcopy);
BKE_texture_free(sp->texcopy);
properties = IDP_GetProperties((ID *)sp->texcopy, false);
if (properties) {
IDP_FreeProperty(properties);
MEM_freeN(properties);
}
MEM_freeN(sp->texcopy);
if (sp->own_id_copy) {
BKE_texture_free(sp->texcopy);
MEM_freeN(sp->texcopy);
}
}
if (sp->worldcopy) {
struct IDProperty *properties;
@ -898,14 +902,16 @@ static void shader_preview_free(void *customdata)
/* get rid of copied world */
BLI_remlink(&pr_main->world, sp->worldcopy);
BKE_world_free(sp->worldcopy);
properties = IDP_GetProperties((ID *)sp->worldcopy, false);
if (properties) {
IDP_FreeProperty(properties);
MEM_freeN(properties);
}
MEM_freeN(sp->worldcopy);
if (sp->own_id_copy) {
BKE_world_free(sp->worldcopy);
MEM_freeN(sp->worldcopy);
}
}
if (sp->lampcopy) {
struct IDProperty *properties;
@ -914,14 +920,16 @@ static void shader_preview_free(void *customdata)
/* get rid of copied lamp */
BLI_remlink(&pr_main->lamp, sp->lampcopy);
BKE_lamp_free(sp->lampcopy);
properties = IDP_GetProperties((ID *)sp->lampcopy, false);
if (properties) {
IDP_FreeProperty(properties);
MEM_freeN(properties);
}
MEM_freeN(sp->lampcopy);
if (sp->own_id_copy) {
BKE_lamp_free(sp->lampcopy);
MEM_freeN(sp->lampcopy);
}
}
MEM_freeN(sp);
@ -1139,6 +1147,7 @@ static void icon_preview_startjob_all_sizes(void *customdata, short *stop, short
sp->id = ip->id;
sp->id_copy = ip->id_copy;
sp->bmain = ip->bmain;
sp->own_id_copy = false;
if (is_render) {
BLI_assert(ip->id);
@ -1183,6 +1192,15 @@ static void icon_preview_endjob(void *customdata)
#endif
}
if (ip->id_copy) {
/* Feels a bit hacky just to reuse shader_preview_free() */
ShaderPreview *sp = MEM_callocN(sizeof(ShaderPreview), "Icon ShaderPreview");
sp->id_copy = ip->id_copy;
sp->own_id_copy = true;
shader_preview_free(sp);
ip->id_copy = NULL;
}
if (ip->owner) {
PreviewImage *prv_img = ip->owner;
prv_img->tag &= ~PRV_TAG_DEFFERED_RENDERING;
@ -1298,6 +1316,7 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M
sp->pr_method = method;
sp->id = id;
sp->id_copy = duplicate_ids(id, sp->depsgraph);
sp->own_id_copy = true;
sp->parent = parent;
sp->slot = slot;
sp->bmain = CTX_data_main(C);