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:
authorClément Foucault <foucault.clem@gmail.com>2020-02-05 18:05:34 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-02-05 18:28:34 +0300
commit994e9f702fb55c309fc84a1bb89fbf3f9c4a1fea (patch)
tree492b5b6b5ea0a3fed681011a08f1a1f61097e5b9
parent6d10c2406297cf93238129b5e704a7ba7e8ce3bc (diff)
Fix T70121 EEVEE/GPencil: Curves cause crash when using background rendering
This was caused by a faulty initialization of cache->surf_per_mat which should have been empty.
-rw-r--r--source/blender/draw/intern/draw_cache_impl_curve.c22
1 files changed, 7 insertions, 15 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c
index 25699cd7653..1c3996e2290 100644
--- a/source/blender/draw/intern/draw_cache_impl_curve.c
+++ b/source/blender/draw/intern/draw_cache_impl_curve.c
@@ -458,16 +458,10 @@ static void curve_batch_cache_init(Curve *cu)
#endif
cache->cd_used = 0;
- cache->mat_len = max_ii(1, cu->totcol);
- cache->surf_per_mat_tris = MEM_mallocN(sizeof(*cache->surf_per_mat_tris) * cache->mat_len,
+ cache->mat_len = DRW_curve_material_count_get(cu);
+ cache->surf_per_mat_tris = MEM_callocN(sizeof(*cache->surf_per_mat_tris) * cache->mat_len,
__func__);
- cache->surf_per_mat = MEM_mallocN(sizeof(*cache->surf_per_mat) * cache->mat_len, __func__);
-
- /* TODO Might be wiser to alloc in one chunk. */
- for (int i = 0; i < cache->mat_len; i++) {
- cache->surf_per_mat_tris[i] = MEM_callocN(sizeof(GPUIndexBuf), "GPUIndexBuf");
- cache->surf_per_mat[i] = MEM_callocN(sizeof(GPUBatch), "GPUBatch");
- }
+ cache->surf_per_mat = MEM_callocN(sizeof(*cache->surf_per_mat) * cache->mat_len, __func__);
cache->is_editmode = (cu->editnurb != NULL) || (cu->editfont != NULL);
@@ -934,15 +928,13 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
/* Verify that all surface batches have needed attribute layers. */
/* TODO(fclem): We could be a bit smarter here and only do it per material. */
- for (int i = 0; i < cache->mat_len; i++) {
- if ((cache->cd_used & cache->cd_needed) != cache->cd_needed) {
+ if ((cache->cd_used & cache->cd_needed) != cache->cd_needed) {
+ for (int i = 0; i < cache->mat_len; i++) {
/* We can't discard batches at this point as they have been
* referenced for drawing. Just clear them in place. */
- GPU_batch_clear(cache->surf_per_mat[i]);
- memset(cache->surf_per_mat[i], 0, sizeof(*cache->surf_per_mat[i]));
+ GPU_BATCH_CLEAR_SAFE(cache->surf_per_mat[i]);
}
- }
- if ((cache->cd_used & cache->cd_needed) != cache->cd_needed) {
+
cache->cd_used |= cache->cd_needed;
cache->cd_needed = 0;
}