Commit: 7edf993ba6e07ced0e6e26723a4ae64bcdf2c18c
Author: Antonio Vazquez
Date:   Thu Jun 1 10:35:24 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB7edf993ba6e07ced0e6e26723a4ae64bcdf2c18c

Try to use dynamic memory for shading groups

The reallocation of the memory produce weird things, so we keep allocation 
maximum number while we found better solution.

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

M       source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M       source/blender/draw/engines/gpencil/gpencil_engine.c
M       source/blender/draw/engines/gpencil/gpencil_engine.h

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c 
b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 294b924c587..f3a07f6bcf8 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -235,8 +235,8 @@ static DRWShadingGroup 
*DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DR
        /* e_data.gpencil_fill_sh */
        DRWShadingGroup *grp = DRW_shgroup_create(shader, pass);
        DRW_shgroup_uniform_vec4(grp, "color2", palcolor->scolor, 1);
-       stl->storage->shgroups[id].fill_style = palcolor->fill_style;
-       DRW_shgroup_uniform_int(grp, "fill_type", 
&stl->storage->shgroups[id].fill_style, 1);
+       stl->shgroups[id].fill_style = palcolor->fill_style;
+       DRW_shgroup_uniform_int(grp, "fill_type", 
&stl->shgroups[id].fill_style, 1);
        DRW_shgroup_uniform_float(grp, "mix_factor", &palcolor->mix_factor, 1);
 
        DRW_shgroup_uniform_float(grp, "g_angle", &palcolor->g_angle, 1);
@@ -250,11 +250,11 @@ static DRWShadingGroup 
*DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DR
        DRW_shgroup_uniform_vec2(grp, "t_shift", palcolor->t_shift, 1);
        DRW_shgroup_uniform_float(grp, "t_opacity", &palcolor->t_opacity, 1);
 
-       stl->storage->shgroups[id].t_mix = palcolor->flag & PAC_COLOR_TEX_MIX ? 
1 : 0;
-       DRW_shgroup_uniform_int(grp, "t_mix", 
&stl->storage->shgroups[id].t_mix, 1);
+       stl->shgroups[id].t_mix = palcolor->flag & PAC_COLOR_TEX_MIX ? 1 : 0;
+       DRW_shgroup_uniform_int(grp, "t_mix", &stl->shgroups[id].t_mix, 1);
 
-       stl->storage->shgroups[id].t_flip = palcolor->flag & 
PAC_COLOR_FLIP_FILL ? 1 : 0;
-       DRW_shgroup_uniform_int(grp, "t_flip", 
&stl->storage->shgroups[id].t_flip, 1);
+       stl->shgroups[id].t_flip = palcolor->flag & PAC_COLOR_FLIP_FILL ? 1 : 0;
+       DRW_shgroup_uniform_int(grp, "t_flip", &stl->shgroups[id].t_flip, 1);
 
        DRW_shgroup_uniform_int(grp, "xraymode", (const int *) &gpd->xray_mode, 
1);
 
@@ -276,8 +276,8 @@ static DRWShadingGroup 
*DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DR
                        GPUTexture *texture = 
GPU_texture_from_blender(palcolor->ima, &iuser, GL_TEXTURE_2D, true, 0.0, 0);
                        DRW_shgroup_uniform_texture(grp, "myTexture", texture);
 
-                       stl->storage->shgroups[id].t_clamp = palcolor->flag & 
PAC_COLOR_TEX_CLAMP ? 1 : 0;
-                       DRW_shgroup_uniform_int(grp, "t_clamp", 
&stl->storage->shgroups[id].t_clamp, 1);
+                       stl->shgroups[id].t_clamp = palcolor->flag & 
PAC_COLOR_TEX_CLAMP ? 1 : 0;
+                       DRW_shgroup_uniform_int(grp, "t_clamp", 
&stl->shgroups[id].t_clamp, 1);
 
                        BKE_image_release_ibuf(image, ibuf, NULL);
                }
@@ -452,26 +452,34 @@ static void gpencil_draw_strokes(GpencilBatchCache 
*cache, GPENCIL_e_data *e_dat
        /* get parent matrix and save as static data */
        ED_gpencil_parent_location(ob, gpd, gpl, viewmatrix);
        copy_m4_m4(gpf->viewmatrix, viewmatrix);
-       
+
        for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
                /* check if stroke can be drawn */
                if (gpencil_can_draw_stroke(rv3d, gpf, gps) == false) {
                        continue;
                }
-
                /* limit the number of shading groups */
                if (stl->storage->pal_id >= GPENCIL_MAX_SHGROUPS) {
                        continue;
                }
-
+#if 0   /* if we use the reallocate the shading group is doing weird thing, so 
disable while find a solution 
+                  and allocate the max size on cache_init */
+               /* realloc memory */
+               GPENCIL_shgroup *p = NULL;
+               int size = stl->storage->pal_id + 1;
+               p = MEM_recallocN(stl->shgroups, sizeof(struct GPENCIL_shgroup) 
* size);
+               if (p != NULL) {
+                       stl->shgroups = p;
+               }
+#endif
                if (gps->totpoints > 1) {
                        int id = stl->storage->pal_id;
-                       stl->storage->shgroups[id].shgrps_fill = 
DRW_gpencil_shgroup_fill_create(vedata, psl->stroke_pass, 
e_data->gpencil_fill_sh, gpd, gps->palcolor, id);
-                       stl->storage->shgroups[id].shgrps_stroke = 
DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, 
e_data->gpencil_stroke_sh, gpd);
+                       stl->shgroups[id].shgrps_fill = 
DRW_gpencil_shgroup_fill_create(vedata, psl->stroke_pass, 
e_data->gpencil_fill_sh, gpd, gps->palcolor, id);
+                       stl->shgroups[id].shgrps_stroke = 
DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, 
e_data->gpencil_stroke_sh, gpd);
                        ++stl->storage->pal_id;
-
-                       fillgrp = stl->storage->shgroups[id].shgrps_fill;
-                       strokegrp = stl->storage->shgroups[id].shgrps_stroke;
+                       
+                       fillgrp = stl->shgroups[id].shgrps_fill;
+                       strokegrp = stl->shgroups[id].shgrps_stroke;
                }
                /* fill */
                gpencil_add_fill_shgroup(cache, fillgrp, gpd, gpl, gpf, gps, 
tintcolor, onion, custonion);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c 
b/source/blender/draw/engines/gpencil/gpencil_engine.c
index ce979a77999..859b4165d5c 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -107,7 +107,14 @@ static void GPENCIL_cache_init(void *vedata)
                stl->g_data->scene_draw = false;
                stl->storage->xray = GP_XRAY_FRONT; /* used for drawing */
        }
-
+       if (!stl->shgroups) {
+               /* Alloc maximum size because count strokes is very slow and 
can be very complex due onion skinning
+                  Note: I tried to allocate only one and using realloc, 
increase the size when read a new strokes 
+                        in cache_finish, but the realloc produce weird things 
on screen, so we keep as is while we
+                                found a better solution
+                */
+               stl->shgroups = MEM_mallocN(sizeof(GPENCIL_shgroup) * 
GPENCIL_MAX_SHGROUPS, "GPENCIL_shgroup");
+       }
        {
                /* init gp objects cache */
                stl->g_data->gp_cache_used = 0;
@@ -118,7 +125,6 @@ static void GPENCIL_cache_init(void *vedata)
                DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | 
DRW_STATE_DEPTH_LESS;
                psl->stroke_pass = DRW_pass_create("Gpencil Stroke Pass", 
state);
                stl->storage->pal_id = 0;
-               memset(stl->storage->shgroups, 0, sizeof(GPENCIL_shgroup *) * 
GPENCIL_MAX_SHGROUPS);
                stl->g_data->shgrps_point_volumetric = 
DRW_gpencil_shgroup_point_volumetric_create(psl->stroke_pass, 
e_data.gpencil_volumetric_sh);
 
                state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND;
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h 
b/source/blender/draw/engines/gpencil/gpencil_engine.h
index c208efc3121..cd173262ff8 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -36,7 +36,7 @@
  /* *********** OBJECTS CACHE *********** */
  /* used to sort gpencil objects */
 typedef struct tGPencilObjectCache {
-       Object *ob;
+       struct Object *ob;
        float zdepth;
 } tGPencilObjectCache;
 
@@ -46,13 +46,12 @@ typedef struct GPENCIL_shgroup {
        int t_flip;
        int t_clamp;
        int fill_style;
-       DRWShadingGroup *shgrps_fill;
-       DRWShadingGroup *shgrps_stroke;
+       struct DRWShadingGroup *shgrps_fill;
+       struct DRWShadingGroup *shgrps_stroke;
 } GPENCIL_shgroup;
 
 typedef struct GPENCIL_Storage {
        int pal_id; /* total elements */
-       GPENCIL_shgroup shgroups[GPENCIL_MAX_SHGROUPS];
        float unit_matrix[4][4];
        int is_persp;   /* rv3d->is_persp (1-yes) */
        int xray;
@@ -61,6 +60,7 @@ typedef struct GPENCIL_Storage {
 typedef struct GPENCIL_StorageList {
        struct GPENCIL_Storage *storage;
        struct g_data *g_data;
+       struct GPENCIL_shgroup *shgroups;
 } GPENCIL_StorageList;
 
 typedef struct GPENCIL_PassList {
@@ -79,23 +79,23 @@ typedef struct GPENCIL_TextureList {
 
 typedef struct GPENCIL_Data {
        void *engine_type; /* Required */
-       GPENCIL_FramebufferList *fbl;
-       GPENCIL_TextureList *txl;
-       GPENCIL_PassList *psl;
-       GPENCIL_StorageList *stl;
+       struct GPENCIL_FramebufferList *fbl;
+       struct GPENCIL_TextureList *txl;
+       struct GPENCIL_PassList *psl;
+       struct GPENCIL_StorageList *stl;
 } GPENCIL_Data;
 
 /* *********** STATIC *********** */
 typedef struct g_data {
-       DRWShadingGroup *shgrps_edit_volumetric;
-       DRWShadingGroup *shgrps_point_volumetric;
-       DRWShadingGroup *shgrps_drawing_stroke;
-       DRWShadingGroup *shgrps_drawing_fill;
+       struct DRWShadingGroup *shgrps_edit_volumetric;
+       struct DRWShadingGroup *shgrps_point_volumetric;
+       struct DRWShadingGroup *shgrps_drawing_stroke;
+       struct DRWShadingGroup *shgrps_drawing_fill;
        bool scene_draw;
 
        int gp_cache_used;
        int gp_cache_size;
-       tGPencilObjectCache *gp_object_cache;
+       struct tGPencilObjectCache *gp_object_cache;
 } g_data; /* Transient data */
 
 typedef struct GPENCIL_e_data {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to