Commit: a987daa18dc66b726cef3e502b26e13ff002d894
Author: Clément Foucault
Date:   Fri Jul 20 20:36:14 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBa987daa18dc66b726cef3e502b26e13ff002d894

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.

===================================================================

M       source/blender/editors/render/render_preview.c

===================================================================

diff --git a/source/blender/editors/render/render_preview.c 
b/source/blender/editors/render/render_preview.c
index 7270eb03c2e..7459868d835 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to