[Bf-blender-cvs] [2655f47ca35] master: Revert "LineArt: Use CAS for add_triangles."

Ray Molenkamp noreply at git.blender.org
Mon May 23 21:11:21 CEST 2022


Commit: 2655f47ca35472931fbbeb2769d06c47f236c6c6
Author: Ray Molenkamp
Date:   Mon May 23 13:09:51 2022 -0600
Branches: master
https://developer.blender.org/rB2655f47ca35472931fbbeb2769d06c47f236c6c6

Revert "LineArt: Use CAS for add_triangles."

This reverts commit 14a5a91e0e033d712134c112a4778b495bd73ba1.

This caused build errors on x64+arm mac builds and some versions
of MSVC, reverting for now till a better solution is found.

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

M	source/blender/gpencil_modifiers/CMakeLists.txt
M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h

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

diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt
index c45209661f6..69fc26c99e9 100644
--- a/source/blender/gpencil_modifiers/CMakeLists.txt
+++ b/source/blender/gpencil_modifiers/CMakeLists.txt
@@ -17,7 +17,6 @@ set(INC
   ../windowmanager
   ../../../intern/eigen
   ../../../intern/guardedalloc
-  ../../../intern/atomic
 
   # dna_type_offsets.h in BLO_read_write.h
   ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 06370cfb283..ad3e1b5d7f2 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -236,9 +236,6 @@ typedef struct LineartRenderBuffer {
   ListBase line_buffer_pointers;
   ListBase triangle_buffer_pointers;
 
-  LineartElementLinkNode *isect_scheduled_up_to;
-  int isect_scheduled_up_to_index;
-
   /** This one's memory is not from main pool and is free()ed after culling stage. */
   ListBase triangle_adjacent_pointers;
 
@@ -432,19 +429,15 @@ typedef struct LineartBoundingArea {
   /** 1,2,3,4 quadrant */
   struct LineartBoundingArea *child;
 
-  SpinLock lock;
-
   ListBase lp;
   ListBase rp;
   ListBase up;
   ListBase bp;
 
-  /* Need uint32 for the atomic cas instruction. */
-  uint32_t triangle_count;
-  uint32_t max_triangle_count;
-  uint32_t line_count;
-  uint32_t max_line_count;
-  uint32_t user_count;
+  uint16_t triangle_count;
+  uint16_t max_triangle_count;
+  uint16_t line_count;
+  uint16_t max_line_count;
 
   /* Use array for speeding up multiple accesses. */
   struct LineartTriangle **linked_triangles;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index e6fce5b799d..fe1bbc3fc23 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -52,38 +52,6 @@
 
 #include "lineart_intern.h"
 
-#include "atomic_ops.h"
-
-typedef struct LineartIsecSingle {
-  float v1[3], v2[3];
-  LineartTriangle *tri1, *tri2;
-} LineartIsecSingle;
-
-typedef struct LineartIsecThread {
-  int thread_id;
-
-  /* Scheduled work range. */
-  LineartElementLinkNode *pending_from;
-  LineartElementLinkNode *pending_to;
-  int index_from;
-  int index_to;
-
-  /* Thread intersection result data. */
-  LineartIsecSingle *array;
-  int current;
-  int max;
-  int count_test;
-
-  /* For individual thread reference.*/
-  LineartRenderBuffer *rb;
-} LineartIsecThread;
-
-typedef struct LineartIsecData {
-  LineartRenderBuffer *rb;
-  LineartIsecThread *threads;
-  int thread_count;
-} LineartIsecData;
-
 static LineartBoundingArea *lineart_edge_first_bounding_area(LineartRenderBuffer *rb,
                                                              LineartEdge *e);
 
@@ -108,6 +76,14 @@ static bool lineart_get_edge_bounding_areas(LineartRenderBuffer *rb,
                                             int *colbegin,
                                             int *colend);
 
+static void lineart_bounding_area_link_triangle(LineartRenderBuffer *rb,
+                                                LineartBoundingArea *root_ba,
+                                                LineartTriangle *tri,
+                                                double *LRUB,
+                                                int recursive,
+                                                int recursive_level,
+                                                bool do_intersection);
+
 static bool lineart_triangle_edge_image_space_occlusion(SpinLock *spl,
                                                         const LineartTriangle *tri,
                                                         const LineartEdge *e,
@@ -123,19 +99,6 @@ static bool lineart_triangle_edge_image_space_occlusion(SpinLock *spl,
 
 static void lineart_add_edge_to_array(LineartPendingEdges *pe, LineartEdge *e);
 
-static void lineart_bounding_area_link_triangle_cas(LineartRenderBuffer *rb,
-                                                    LineartBoundingArea *root_ba,
-                                                    LineartTriangle *tri,
-                                                    double *LRUB,
-                                                    int recursive,
-                                                    int recursive_level,
-                                                    bool do_intersection,
-                                                    struct LineartIsecThread *th);
-
-static void lineart_free_bounding_area_memory(LineartBoundingArea *ba, bool recursive);
-
-static void lineart_free_bounding_area_memories(LineartRenderBuffer *rb);
-
 static LineartCache *lineart_init_cache(void);
 
 static void lineart_discard_segment(LineartRenderBuffer *rb, LineartEdgeSegment *es)
@@ -349,17 +312,29 @@ BLI_INLINE bool lineart_occlusion_is_adjacent_intersection(LineartEdge *e, Linea
           (v2->base.flag && v2->intersecting_with == tri));
 }
 
-static void lineart_bounding_area_triangle_reallocate(LineartBoundingArea *ba)
-{
-  LineartTriangle **new_array = MEM_callocN(sizeof(LineartTriangle *) * ba->max_triangle_count * 2,
-                                            "new ba_triangle_array");
-  memcpy(new_array, ba->linked_triangles, sizeof(LineartTriangle *) * ba->max_triangle_count);
-  ba->max_triangle_count *= 2;
-  MEM_freeN(ba->linked_triangles);
-  ba->linked_triangles = new_array;
+static void lineart_bounding_area_triangle_add(LineartRenderBuffer *rb,
+                                               LineartBoundingArea *ba,
+                                               LineartTriangle *tri)
+{ /* In case of too many triangles concentrating in one point, do not add anymore, these triangles
+   * will be either narrower than a single pixel, or will still be added into the list of other
+   * less dense areas. */
+  if (ba->triangle_count >= 65535) {
+    return;
+  }
+  if (ba->triangle_count >= ba->max_triangle_count) {
+    LineartTriangle **new_array = lineart_mem_acquire(
+        &rb->render_data_pool, sizeof(LineartTriangle *) * ba->max_triangle_count * 2);
+    memcpy(new_array, ba->linked_triangles, sizeof(LineartTriangle *) * ba->max_triangle_count);
+    ba->max_triangle_count *= 2;
+    ba->linked_triangles = new_array;
+  }
+  ba->linked_triangles[ba->triangle_count] = tri;
+  ba->triangle_count++;
 }
 
-static void lineart_bounding_area_line_add(LineartBoundingArea *ba, LineartEdge *e)
+static void lineart_bounding_area_line_add(LineartRenderBuffer *rb,
+                                           LineartBoundingArea *ba,
+                                           LineartEdge *e)
 {
   /* In case of too many lines concentrating in one point, do not add anymore, these lines will
    * be either shorter than a single pixel, or will still be added into the list of other less
@@ -368,11 +343,10 @@ static void lineart_bounding_area_line_add(LineartBoundingArea *ba, LineartEdge
     return;
   }
   if (ba->line_count >= ba->max_line_count) {
-    LineartEdge **new_array = MEM_mallocN(sizeof(LineartEdge *) * ba->max_line_count * 2,
-                                          "new ba_line_array");
+    LineartEdge **new_array = lineart_mem_acquire(&rb->render_data_pool,
+                                                  sizeof(LineartEdge *) * ba->max_line_count * 2);
     memcpy(new_array, ba->linked_lines, sizeof(LineartEdge *) * ba->max_line_count);
     ba->max_line_count *= 2;
-    MEM_freeN(ba->linked_lines);
     ba->linked_lines = new_array;
   }
   ba->linked_lines[ba->line_count] = e;
@@ -1705,7 +1679,6 @@ static void lineart_join_loose_edge_arr(LooseEdgeData *loose_data, LooseEdgeData
          sizeof(MEdge *) * to_be_joined->loose_count);
   loose_data->loose_count += to_be_joined->loose_count;
   MEM_freeN(to_be_joined->loose_array);
-  to_be_joined->loose_array = NULL;
 }
 
 static void lineart_add_loose_edge(LooseEdgeData *loose_data, MEdge *e)
@@ -2126,7 +2099,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, LineartRend
   elem_link_node->element_count = allocate_la_e;
   elem_link_node->object_ref = orig_ob;
 
-  /* Start of the edge/seg arr */
+  // Start of the edge/seg arr
   LineartEdge *la_edge;
   LineartEdgeSegment *la_seg;
   la_edge = la_edge_arr;
@@ -3014,23 +2987,60 @@ static LineartVert *lineart_triangle_share_point(const LineartTriangle *l,
   return NULL;
 }
 
-static bool lineart_triangle_2v_intersection_math(
-    LineartVert *v1, LineartVert *v2, LineartTriangle *t2, double *last, double *rv)
+/**
+ * To save time and prevent overlapping lines when computing intersection lines.
+ */
+static bool lineart_vert_already_intersected_2v(LineartVertIntersection *vt,
+                                                LineartVertIntersection *v1,
+                                                LineartVertIntersection *v2)
+{
+  return ((vt->isec1 == v1->base.index && vt->isec2 == v2->base.index) ||
+          (vt->isec2 == v2->base.index && vt->isec1 == v1->base.index));
+}
+
+static void lineart_vert_set_intersection_2v(LineartVert *vt, LineartVert *v1, LineartVert *v2)
+{
+  LineartVertIntersection *irv = (LineartVertIntersection *)vt;
+  irv->isec1 = v1->index;
+  irv->isec2 = v2->index;
+}
+
+/**
+ * This tests a triangle against a virtual line represented by `v1---v2`.
+ * The vertices returned after repeated calls to this function
+ * is then used to create a triangle/triangle intersection line.
+ */
+static LineartVert *lineart_triangle_2v_intersection_test(LineartRenderBuffer *rb,
+                                                          LineartVert *v1,
+                                                          LineartVert *v2,
+                                                          LineartTriangle *tri,
+                                                          LineartTriangle *testing,
+                                                          LineartVert *last)
 {
   double Lv[3];
   double Rv[3];
   double dot_l, dot_r

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list