[Bf-blender-cvs] [f8fd64052eb] temp-lineart-embree: LineArt: embree put occlusion detection inside collider

YimingWu noreply at git.blender.org
Sat Mar 26 14:29:54 CET 2022


Commit: f8fd64052eb22a4060e0939a6fd6819c5a3d55dc
Author: YimingWu
Date:   Sat Mar 26 21:28:50 2022 +0800
Branches: temp-lineart-embree
https://developer.blender.org/rBf8fd64052eb22a4060e0939a6fd6819c5a3d55dc

LineArt: embree put occlusion detection inside collider

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

M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c

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

diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 1b8684ad8c2..04687358c1a 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -135,6 +135,7 @@ typedef struct LineartEdge {
   int v1_obindex, v2_obindex;
   struct LineartTriangle *t1, *t2;
   ListBase segments;
+  char lock_id;
   char min_occ;
 
   /** Also for line type determination on chaining. */
@@ -240,6 +241,8 @@ typedef struct LineartOcclusionPair {
   LineartElementLinkNode *eln_triangle;
   LineartEdge *e;
   LineartTriangle *t;
+  double cut_l;
+  double cut_r;
 } LineartOcclusionPair;
 
 typedef struct LineartOcclusionPairRecord {
@@ -250,6 +253,9 @@ typedef struct LineartOcclusionPairRecord {
 } LineartOcclusionPairRecord;
 
 typedef struct LineartThreadOcclusionData LineartThreadOcclusionData;
+typedef struct LineartThreadOcclusionDataCombined LineartThreadOcclusionDataCombined;
+
+#define LRT_LOCK_COUNT_OCCLUSION 100
 
 typedef struct LineartRenderBuffer {
   struct LineartRenderBuffer *prev, *next;
@@ -303,6 +309,7 @@ typedef struct LineartRenderBuffer {
   RTCScene rtcscene_view;
 
   struct LineartThreadOcclusionData *thread_occlusion_data;
+  struct LineartThreadOcclusionDataCombined *thread_occlusion_data_storage;
   LineartMeshRecord mesh_record;
   LineartOcclusionPairRecord occlusion_record;
 
@@ -321,6 +328,9 @@ typedef struct LineartRenderBuffer {
   /* For managing calculation tasks for multiple threads. */
   SpinLock lock_task;
 
+  /* A series of locks to give threads more breathing room while applying occlusion results. */
+  SpinLock lock_occlusion[100];
+
   /*  settings */
 
   int max_occlusion_level;
@@ -793,9 +803,15 @@ void lineart_thread_add_occlusion_pair(LineartThreadOcclusionData *data,
                                        LineartElementLinkNode *eln_edge,
                                        LineartElementLinkNode *eln_triangle,
                                        LineartEdge *e,
-                                       LineartTriangle *t);
-LineartOcclusionPair *lineart_thread_finalize_occlusion_result(LineartThreadOcclusionData *data,
-                                                               int *result_count);
+                                       LineartTriangle *t,
+                                       double cut_l,
+                                       double cut_r);
+LineartOcclusionPair *lineart_thread_finalize_occlusion_result(
+    LineartThreadOcclusionData *data,
+    int *result_count,
+    LineartThreadOcclusionDataCombined **r_combined_storage);
+void lineart_thread_clear_occlusion_result(LineartThreadOcclusionData *data,
+                                           LineartThreadOcclusionDataCombined *combined_storage);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
index 339a8050091..71319d34143 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
@@ -14,6 +14,9 @@ using blender::threading::EnumerableThreadSpecific;
 typedef EnumerableThreadSpecific<Vector<LineartOcclusionPair>> _LineartThreadOcclusionData;
 typedef struct LineartThreadOcclusionData LineartThreadOcclusionData;
 
+typedef Vector<LineartOcclusionPair> _LineartThreadOcclusionDataCombined;
+typedef struct LineartThreadOcclusionDataCombined LineartThreadOcclusionDataCombined;
+
 LineartThreadOcclusionData *lineart_thread_init_occlusion_result()
 {
   _LineartThreadOcclusionData *result = new _LineartThreadOcclusionData;
@@ -24,24 +27,41 @@ void lineart_thread_add_occlusion_pair(LineartThreadOcclusionData *data,
                                        LineartElementLinkNode *eln_edge,
                                        LineartElementLinkNode *eln_triangle,
                                        LineartEdge *e,
-                                       LineartTriangle *t)
+                                       LineartTriangle *t,
+                                       double cut_l,
+                                       double cut_r)
 {
   LineartOcclusionPair op;
   op.e = e;
   op.t = t;
   op.eln_edge = eln_edge;
   op.eln_triangle = eln_triangle;
+  op.cut_l = cut_l;
+  op.cut_r = cut_r;
   ((_LineartThreadOcclusionData *)data)->local().append(op);
 }
 
 /* Memory returned by this needs to be freed manually. */
-LineartOcclusionPair *lineart_thread_finalize_occlusion_result(LineartThreadOcclusionData *data,
-                                                               int *result_count)
+LineartOcclusionPair *lineart_thread_finalize_occlusion_result(
+    LineartThreadOcclusionData *data,
+    int *result_count,
+    LineartThreadOcclusionDataCombined **r_combined_storage)
 {
   Vector<LineartOcclusionPair> *result = new Vector<LineartOcclusionPair>;
   for (const Vector<LineartOcclusionPair> &local : (*(_LineartThreadOcclusionData *)data)) {
     result->extend(local);
   }
   *result_count = result->size();
+  *r_combined_storage = (LineartThreadOcclusionDataCombined *)result;
   return (LineartOcclusionPair *)result->data();
 };
+
+void lineart_thread_clear_occlusion_result(LineartThreadOcclusionData *data,
+                                           LineartThreadOcclusionDataCombined *combined_storage)
+{
+  _LineartThreadOcclusionData *occlusion_data = (_LineartThreadOcclusionData *)data;
+  _LineartThreadOcclusionDataCombined *combined = (_LineartThreadOcclusionDataCombined *)
+      combined_storage;
+  delete occlusion_data;
+  delete combined;
+};
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 40b3cc5ef8b..d83e3c55788 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -497,27 +497,28 @@ static void lineart_occlusion_worker(TaskPool *__restrict UNUSED(pool), LineartR
     LineartOcclusionPairRecord *rec = &rb->occlusion_record;
     for (size_t i = rti->ocpair_index_start; i < rti->ocpair_index_end; i++) {
       LineartOcclusionPair *op = &rec->array[i];
-      if (lineart_triangle_edge_image_space_occlusion(&rb->lock_task,
-                                                      op->t,
-                                                      op->e,
-                                                      rb->camera_pos,
-                                                      rb->cam_is_persp,
-                                                      rb->allow_overlapping_edges,
-                                                      rb->view_projection,
-                                                      rb->view_vector,
-                                                      rb->shift_x,
-                                                      rb->shift_y,
-                                                      &l,
-                                                      &r)) {
-        BLI_spin_lock(&rb->lock_task);
-        lineart_edge_cut(rb, op->e, l, r, op->t->material_mask_bits, op->t->mat_occlusion);
-        BLI_spin_unlock(&rb->lock_task);
-        if (op->e->min_occ > rb->max_occlusion_level) {
-          /* No need to calculate any longer on this line because no level more than set value is
-           * going to show up in the rendered result. */
-          continue;
-        }
+      // if (lineart_triangle_edge_image_space_occlusion(&rb->lock_task,
+      //                                                op->t,
+      //                                                op->e,
+      //                                                rb->camera_pos,
+      //                                                rb->cam_is_persp,
+      //                                                rb->allow_overlapping_edges,
+      //                                                rb->view_projection,
+      //                                                rb->view_vector,
+      //                                                rb->shift_x,
+      //                                                rb->shift_y,
+      //                                                &l,
+      //                                                &r)) {
+      if (op->e->min_occ > rb->max_occlusion_level) {
+        /* No need to calculate any longer on this line because no level more than set value is
+         * going to show up in the rendered result. */
+        continue;
       }
+      BLI_spin_lock(&rb->lock_occlusion[op->e->lock_id]);
+      lineart_edge_cut(
+          rb, op->e, op->cut_l, op->cut_r, op->t->material_mask_bits, op->t->mat_occlusion);
+      BLI_spin_unlock(&rb->lock_occlusion[op->e->lock_id]);
+      // }
     }
 
 #else
@@ -2027,6 +2028,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
 
   la_e = o_la_e;
   la_s = o_la_s;
+  int lock_i = 0;
   for (i = 0; i < bm->totedge; i++) {
     e = BM_edge_at_index(bm, i);
 
@@ -2044,6 +2046,10 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
         continue;
       }
 
+      la_e->lock_id = lock_i;
+      lock_i++;
+      lock_i %= LRT_LOCK_COUNT_OCCLUSION;
+
       la_e->v1 = &orv[BM_elem_index_get(e->v1)];
       la_e->v2 = &orv[BM_elem_index_get(e->v2)];
       la_e->v1_obindex = la_e->v1->index;
@@ -2390,7 +2396,7 @@ static void lineart_embree_clear_mesh_record(LineartRenderBuffer *rb)
   rb->mesh_record.intersection_pair_max = rb->mesh_record.intersection_pair_next = 0;
 
   if (rb->occlusion_record.array) {
-    MEM_freeN(rb->occlusion_record.array);
+    // MEM_freeN(rb->occlusion_record.array);
   }
   rb->occlusion_record.array = NULL;
   rb->occlusion_record.max_length = rb->occlusion_record.next = 0;
@@ -2426,9 +2432,9 @@ static void lineart_embree_init_mesh_record(LineartRenderBuffer *rb)
                                                         rb->mesh_record.intersection_pair_max,
                          

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list