[Bf-blender-cvs] [994e9f702fb] blender-v2.82-release: Fix T70121 EEVEE/GPencil: Curves cause crash when using background rendering

Clément Foucault noreply at git.blender.org
Wed Feb 5 16:28:49 CET 2020


Commit: 994e9f702fb55c309fc84a1bb89fbf3f9c4a1fea
Author: Clément Foucault
Date:   Wed Feb 5 16:05:34 2020 +0100
Branches: blender-v2.82-release
https://developer.blender.org/rB994e9f702fb55c309fc84a1bb89fbf3f9c4a1fea

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.

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

M	source/blender/draw/intern/draw_cache_impl_curve.c

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

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;
   }



More information about the Bf-blender-cvs mailing list