Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonioya <blendergit@gmail.com>2018-11-20 21:26:16 +0300
committerAntonioya <blendergit@gmail.com>2018-11-20 22:05:37 +0300
commite63c9472049f64221b34c4d2dd3101086b61520e (patch)
treee75fc34d3a450f88d8805833c04e98fd4442f616 /source/blender/blenkernel
parent140d383393764f28405b34775b2e0dc22c51e5a6 (diff)
GP: Refactor drawing engine to single VBO
This is part of T57829. Reduce the number of batches used to only one by shader type. This reduces GPU overhead and increase a lot the FPS. As the number of batches is small, the time to allocate and free memory was reduced in 90% or more. Also the code has been simplified and all batch management has been removed because this is not necessary. Now, all shading groups are created after all vertex buffer data for all strokes has been created using DRW_shgroup_call_range_add(). All batch cache data has been moved to the Object runtime struct and not as before where some parts (derived data) were saved inside GPD datablock. For particles, now the code is faster and cleaner and gets better FPS. Thanks to Clément Foucault for his help and advices to improve speed.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_gpencil.h1
-rw-r--r--source/blender/blenkernel/BKE_gpencil_modifier.h5
-rw-r--r--source/blender/blenkernel/intern/gpencil.c48
3 files changed, 5 insertions, 49 deletions
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 3b8df66668a..34c61083872 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -65,7 +65,6 @@ bool BKE_gpencil_free_strokes(struct bGPDframe *gpf);
void BKE_gpencil_free_frames(struct bGPDlayer *gpl);
void BKE_gpencil_free_layers(struct ListBase *list);
bool BKE_gpencil_free_frame_runtime_data(struct bGPDframe *derived_gpf);
-void BKE_gpencil_free_derived_frames(struct bGPdata *gpd);
void BKE_gpencil_free(struct bGPdata *gpd, bool free_all);
void BKE_gpencil_batch_cache_dirty_tag(struct bGPdata *gpd);
diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index 91f368613cb..e31f61c909a 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -232,6 +232,11 @@ typedef struct GpencilModifierTypeInfo {
*/
void (*foreachTexLink)(struct GpencilModifierData *md, struct Object *ob,
GreasePencilTexWalkFunc walk, void *userData);
+
+ /* get the number of times the strokes are duplicated in this modifier.
+ * This is used to calculate the size of the GPU VBOs
+ */
+ int (*getDuplicationFactor)(struct GpencilModifierData *md);
} GpencilModifierTypeInfo;
/* Initialize modifier's global data (type info and some common global storages). */
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index f2225bca3f5..98d255df080 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -211,46 +211,6 @@ void BKE_gpencil_free_layers(ListBase *list)
}
}
-/* clear all runtime derived data */
-static void BKE_gpencil_clear_derived(bGPDlayer *gpl)
-{
- if (gpl->runtime.derived_array == NULL) {
- return;
- }
-
- for (int i = 0; i < gpl->runtime.len_derived; i++) {
- bGPDframe *derived_gpf = &gpl->runtime.derived_array[i];
- BKE_gpencil_free_frame_runtime_data(derived_gpf);
- derived_gpf = NULL;
- }
- gpl->runtime.len_derived = 0;
- MEM_SAFE_FREE(gpl->runtime.derived_array);
-}
-
-/* Free all of the gp-layers temp data*/
-static void BKE_gpencil_free_layers_temp_data(ListBase *list)
-{
- bGPDlayer *gpl_next;
-
- /* error checking */
- if (list == NULL) return;
- /* delete layers */
- for (bGPDlayer *gpl = list->first; gpl; gpl = gpl_next) {
- gpl_next = gpl->next;
- BKE_gpencil_clear_derived(gpl);
- }
-}
-
-/* Free temp gpf derived frames */
-void BKE_gpencil_free_derived_frames(bGPdata *gpd)
-{
- /* error checking */
- if (gpd == NULL) return;
- for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
- BKE_gpencil_clear_derived(gpl);
- }
-}
-
/** Free (or release) any data used by this grease pencil (does not free the gpencil itself). */
void BKE_gpencil_free(bGPdata *gpd, bool free_all)
{
@@ -258,9 +218,6 @@ void BKE_gpencil_free(bGPdata *gpd, bool free_all)
BKE_animdata_free(&gpd->id, false);
/* free layers */
- if (free_all) {
- BKE_gpencil_free_layers_temp_data(&gpd->layers);
- }
BKE_gpencil_free_layers(&gpd->layers);
/* materials */
@@ -639,8 +596,6 @@ bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src)
/* make a copy of source layer */
gpl_dst = MEM_dupallocN(gpl_src);
gpl_dst->prev = gpl_dst->next = NULL;
- gpl_dst->runtime.derived_array = NULL;
- gpl_dst->runtime.len_derived = 0;
/* copy frames */
BLI_listbase_clear(&gpl_dst->frames);
@@ -1031,9 +986,6 @@ void BKE_gpencil_layer_delete(bGPdata *gpd, bGPDlayer *gpl)
/* free icon providing preview of icon color */
BKE_icon_delete(gpl->runtime.icon_id);
- /* free derived data */
- BKE_gpencil_clear_derived(gpl);
-
BLI_freelinkN(&gpd->layers, gpl);
}