[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