diff options
author | Hans Goudey <h.goudey@me.com> | 2022-09-28 06:28:53 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-09-28 06:28:53 +0300 |
commit | 6a1066904b85b40a7a858d4a1225d0633b62be3d (patch) | |
tree | c1dab63b46f9e1fef168b37a28a3017179bac091 | |
parent | 391462f69244be056a59fee6f0213f4a60577d30 (diff) | |
parent | 788f3d72cf89c0301721a5eb2a72da07058dfa24 (diff) |
Merge branch 'master' into temp-pbvh-seam-texturing-tweaks
34 files changed, 141 insertions, 118 deletions
diff --git a/intern/cycles/device/cuda/queue.cpp b/intern/cycles/device/cuda/queue.cpp index 5912e68a92b..84b0a1e0dd6 100644 --- a/intern/cycles/device/cuda/queue.cpp +++ b/intern/cycles/device/cuda/queue.cpp @@ -79,7 +79,7 @@ bool CUDADeviceQueue::enqueue(DeviceKernel kernel, return false; } - debug_enqueue(kernel, work_size); + debug_enqueue_begin(kernel, work_size); const CUDAContextScope scope(cuda_device_); const CUDADeviceKernel &cuda_kernel = cuda_device_->kernels.get(kernel); @@ -121,6 +121,8 @@ bool CUDADeviceQueue::enqueue(DeviceKernel kernel, 0), "enqueue"); + debug_enqueue_end(); + return !(cuda_device_->have_error()); } diff --git a/intern/cycles/device/hip/queue.cpp b/intern/cycles/device/hip/queue.cpp index 8b3d963a32f..3f8b6267100 100644 --- a/intern/cycles/device/hip/queue.cpp +++ b/intern/cycles/device/hip/queue.cpp @@ -79,7 +79,7 @@ bool HIPDeviceQueue::enqueue(DeviceKernel kernel, return false; } - debug_enqueue(kernel, work_size); + debug_enqueue_begin(kernel, work_size); const HIPContextScope scope(hip_device_); const HIPDeviceKernel &hip_kernel = hip_device_->kernels.get(kernel); @@ -120,6 +120,8 @@ bool HIPDeviceQueue::enqueue(DeviceKernel kernel, 0), "enqueue"); + debug_enqueue_end(); + return !(hip_device_->have_error()); } diff --git a/intern/cycles/device/metal/kernel.mm b/intern/cycles/device/metal/kernel.mm index 172c456f0c0..5e0cb6d18f4 100644 --- a/intern/cycles/device/metal/kernel.mm +++ b/intern/cycles/device/metal/kernel.mm @@ -328,8 +328,8 @@ bool MetalKernelPipeline::should_use_binary_archive() const return true; } - /* The remaining kernels are all fast to compile. They may get cached by the system shader cache, - * but will be quick to regenerate if not. */ + /* The remaining kernels are all fast to compile. They may get cached by the system shader + * cache, but will be quick to regenerate if not. */ } return false; } diff --git a/intern/cycles/device/oneapi/queue.cpp b/intern/cycles/device/oneapi/queue.cpp index 1e822e25f1a..f865b27f976 100644 --- a/intern/cycles/device/oneapi/queue.cpp +++ b/intern/cycles/device/oneapi/queue.cpp @@ -77,7 +77,7 @@ bool OneapiDeviceQueue::enqueue(DeviceKernel kernel, void **args = const_cast<void **>(_args.values); - debug_enqueue(kernel, signed_kernel_work_size); + debug_enqueue_begin(kernel, signed_kernel_work_size); assert(signed_kernel_work_size >= 0); size_t kernel_work_size = (size_t)signed_kernel_work_size; @@ -97,6 +97,8 @@ bool OneapiDeviceQueue::enqueue(DeviceKernel kernel, oneapi_device_->oneapi_error_message() + "\""); } + debug_enqueue_end(); + return is_finished_ok; } diff --git a/intern/cycles/device/optix/queue.cpp b/intern/cycles/device/optix/queue.cpp index f0d49ad6f6c..3bc547ed11d 100644 --- a/intern/cycles/device/optix/queue.cpp +++ b/intern/cycles/device/optix/queue.cpp @@ -46,7 +46,7 @@ bool OptiXDeviceQueue::enqueue(DeviceKernel kernel, return false; } - debug_enqueue(kernel, work_size); + debug_enqueue_begin(kernel, work_size); const CUDAContextScope scope(cuda_device_); @@ -131,6 +131,8 @@ bool OptiXDeviceQueue::enqueue(DeviceKernel kernel, 1, 1)); + debug_enqueue_end(); + return !(optix_device->have_error()); } diff --git a/intern/cycles/device/queue.cpp b/intern/cycles/device/queue.cpp index cc0cf0ccf84..8c997b184b6 100644 --- a/intern/cycles/device/queue.cpp +++ b/intern/cycles/device/queue.cpp @@ -12,9 +12,13 @@ CCL_NAMESPACE_BEGIN DeviceQueue::DeviceQueue(Device *device) - : device(device), last_kernels_enqueued_(0), last_sync_time_(0.0) + : device(device), + last_kernels_enqueued_(0), + last_sync_time_(0.0), + is_per_kernel_performance_(false) { DCHECK_NE(device, nullptr); + is_per_kernel_performance_ = getenv("CYCLES_DEBUG_PER_KERNEL_PERFORMANCE"); } DeviceQueue::~DeviceQueue() @@ -33,11 +37,17 @@ DeviceQueue::~DeviceQueue() }); VLOG_DEVICE_STATS << "GPU queue stats:"; + double total_time = 0.0; for (const auto &[mask, time] : stats_sorted) { + total_time += time; VLOG_DEVICE_STATS << " " << std::setfill(' ') << std::setw(10) << std::fixed << std::setprecision(5) << std::right << time << "s: " << device_kernel_mask_as_string(mask); } + + if (is_per_kernel_performance_) + VLOG_DEVICE_STATS << "GPU queue total time: " << std::fixed << std::setprecision(5) + << total_time; } } @@ -50,7 +60,7 @@ void DeviceQueue::debug_init_execution() last_kernels_enqueued_ = 0; } -void DeviceQueue::debug_enqueue(DeviceKernel kernel, const int work_size) +void DeviceQueue::debug_enqueue_begin(DeviceKernel kernel, const int work_size) { if (VLOG_DEVICE_STATS_IS_ON) { VLOG_DEVICE_STATS << "GPU queue launch " << device_kernel_as_string(kernel) << ", work_size " @@ -60,6 +70,13 @@ void DeviceQueue::debug_enqueue(DeviceKernel kernel, const int work_size) last_kernels_enqueued_ |= (uint64_t(1) << (uint64_t)kernel); } +void DeviceQueue::debug_enqueue_end() +{ + if (VLOG_DEVICE_STATS_IS_ON && is_per_kernel_performance_) { + synchronize(); + } +} + void DeviceQueue::debug_synchronize() { if (VLOG_DEVICE_STATS_IS_ON) { @@ -67,7 +84,11 @@ void DeviceQueue::debug_synchronize() const double elapsed_time = new_time - last_sync_time_; VLOG_DEVICE_STATS << "GPU queue synchronize, elapsed " << std::setw(10) << elapsed_time << "s"; - stats_kernel_time_[last_kernels_enqueued_] += elapsed_time; + /* There is no sense to have an entries in the performance data + * container without related kernel information. */ + if (last_kernels_enqueued_ != 0) { + stats_kernel_time_[last_kernels_enqueued_] += elapsed_time; + } last_sync_time_ = new_time; } diff --git a/intern/cycles/device/queue.h b/intern/cycles/device/queue.h index 808431af401..1d6a8d736b7 100644 --- a/intern/cycles/device/queue.h +++ b/intern/cycles/device/queue.h @@ -162,7 +162,8 @@ class DeviceQueue { /* Implementations call these from the corresponding methods to generate debugging logs. */ void debug_init_execution(); - void debug_enqueue(DeviceKernel kernel, const int work_size); + void debug_enqueue_begin(DeviceKernel kernel, const int work_size); + void debug_enqueue_end(); void debug_synchronize(); string debug_active_kernels(); @@ -172,6 +173,9 @@ class DeviceQueue { double last_sync_time_; /* Accumulated execution time for combinations of kernels launched together. */ map<DeviceKernelMask, double> stats_kernel_time_; + /* If it is true, then a performance statistics in the debugging logs will have focus on kernels + * and an explicit queue synchronization will be added after each kernel execution. */ + bool is_per_kernel_performance_; }; CCL_NAMESPACE_END diff --git a/intern/cycles/integrator/path_trace_work_cpu.h b/intern/cycles/integrator/path_trace_work_cpu.h index 7adb00b4d9d..e50ba8721d9 100644 --- a/intern/cycles/integrator/path_trace_work_cpu.h +++ b/intern/cycles/integrator/path_trace_work_cpu.h @@ -52,9 +52,9 @@ class PathTraceWorkCPU : public PathTraceWork { virtual void cryptomatte_postproces() override; #ifdef WITH_PATH_GUIDING - /* Intializes the per-thread guiding kernel data. The function sets the pointers to the + /* Initializes the per-thread guiding kernel data. The function sets the pointers to the * global guiding field and the sample data storage as well es initializes the per-thread - * guided sampling distrubtions (e.g., SurfaceSamplingDistribution and + * guided sampling distributions (e.g., SurfaceSamplingDistribution and * VolumeSamplingDistribution). */ void guiding_init_kernel_globals(void *guiding_field, void *sample_data_storage, diff --git a/intern/cycles/kernel/integrator/guiding.h b/intern/cycles/kernel/integrator/guiding.h index 5d09e5ceac4..5904b69b046 100644 --- a/intern/cycles/kernel/integrator/guiding.h +++ b/intern/cycles/kernel/integrator/guiding.h @@ -298,7 +298,7 @@ ccl_device_forceinline void guiding_record_volume_emission(KernelGlobals kg, /* Adds a pseudo path vertex/segment when intersecting a virtual light source. * (e.g., area, sphere, or disk light). This call is often followed * a call of guiding_record_surface_emission, if the intersected light source - * emits light in the direction of tha path. */ + * emits light in the direction of the path. */ ccl_device_forceinline void guiding_record_light_surface_segment( KernelGlobals kg, IntegratorState state, ccl_private const Intersection *ccl_restrict isect) { diff --git a/intern/cycles/kernel/integrator/state_template.h b/intern/cycles/kernel/integrator/state_template.h index 760c2f80521..610621f0abe 100644 --- a/intern/cycles/kernel/integrator/state_template.h +++ b/intern/cycles/kernel/integrator/state_template.h @@ -47,8 +47,8 @@ KERNEL_STRUCT_MEMBER(path, float, min_ray_pdf, KERNEL_FEATURE_PATH_TRACING) KERNEL_STRUCT_MEMBER(path, float, continuation_probability, KERNEL_FEATURE_PATH_TRACING) /* Throughput. */ KERNEL_STRUCT_MEMBER(path, PackedSpectrum, throughput, KERNEL_FEATURE_PATH_TRACING) -/* Factor to multiple with throughput to get remove any guiding pdfs. - * Such throughput without guiding pdfs is used for Russian rouletter termination. */ +/* Factor to multiple with throughput to get remove any guiding PDFS. + * Such throughput without guiding PDFS is used for Russian roulette termination. */ KERNEL_STRUCT_MEMBER(path, float, unguided_throughput, KERNEL_FEATURE_PATH_GUIDING) /* Ratio of throughput to distinguish diffuse / glossy / transmission render passes. */ KERNEL_STRUCT_MEMBER(path, PackedSpectrum, pass_diffuse_weight, KERNEL_FEATURE_LIGHT_PASSES) @@ -117,17 +117,17 @@ KERNEL_STRUCT_MEMBER(guiding, uint64_t, path_segment, KERNEL_FEATURE_PATH_GUIDIN /* If surface guiding is enabled */ KERNEL_STRUCT_MEMBER(guiding, bool, use_surface_guiding, KERNEL_FEATURE_PATH_GUIDING) /* Random number used for additional guiding decisions (e.g., cache query, selection to use guiding - * or bsdf sampling) */ + * or BSDF sampling) */ KERNEL_STRUCT_MEMBER(guiding, float, sample_surface_guiding_rand, KERNEL_FEATURE_PATH_GUIDING) /* The probability to use surface guiding (i.e., diffuse sampling prob * guiding prob)*/ KERNEL_STRUCT_MEMBER(guiding, float, surface_guiding_sampling_prob, KERNEL_FEATURE_PATH_GUIDING) -/* Probability of sampling a bssrdf closure instead of a bsdf closure*/ +/* Probability of sampling a BSSRDF closure instead of a BSDF closure*/ KERNEL_STRUCT_MEMBER(guiding, float, bssrdf_sampling_prob, KERNEL_FEATURE_PATH_GUIDING) /* If volume guiding is enabled */ KERNEL_STRUCT_MEMBER(guiding, bool, use_volume_guiding, KERNEL_FEATURE_PATH_GUIDING) /* Random number used for additional guiding decisions (e.g., cache query, selection to use guiding - * or bsdf sampling) */ + * or BSDF sampling) */ KERNEL_STRUCT_MEMBER(guiding, float, sample_volume_guiding_rand, KERNEL_FEATURE_PATH_GUIDING) -/* The probability to use surface guiding (i.e., diffuse sampling prob * guiding prob)*/ +/* The probability to use surface guiding (i.e., diffuse sampling prob * guiding prob). */ KERNEL_STRUCT_MEMBER(guiding, float, volume_guiding_sampling_prob, KERNEL_FEATURE_PATH_GUIDING) KERNEL_STRUCT_END(guiding) diff --git a/intern/cycles/kernel/integrator/volume_shader.h b/intern/cycles/kernel/integrator/volume_shader.h index d3cfa58db96..0ff968723a1 100644 --- a/intern/cycles/kernel/integrator/volume_shader.h +++ b/intern/cycles/kernel/integrator/volume_shader.h @@ -111,8 +111,8 @@ ccl_device_inline void volume_shader_prepare_guiding(KernelGlobals kg, const float volume_guiding_probability = kernel_data.integrator.volume_guiding_probability; float rand_phase_guiding = path_state_rng_1D(kg, rng_state, PRNG_VOLUME_PHASE_GUIDING); - /* If we have more than one ohase function we select one random based on its - * sample weight to caclulate the product distribution for guiding. */ + /* If we have more than one phase function we select one random based on its + * sample weight to calculate the product distribution for guiding. */ int phase_id = 0; float phase_weight = 1.0f; diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index 9da7d314052..c9d18be750d 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -741,7 +741,7 @@ extern unsigned int GHOST_GetContextDefaultOpenGLFramebuffer(GHOST_ContextHandle extern unsigned int GHOST_GetDefaultOpenGLFramebuffer(GHOST_WindowHandle windowhandle); /** - * Use multitouch gestures if supported. + * Use multi-touch gestures if supported. * \param systemhandle: The handle to the system. * \param use: Enable or disable. */ diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h index 05ed089809a..0bf540bd4b6 100644 --- a/intern/ghost/GHOST_ISystem.h +++ b/intern/ghost/GHOST_ISystem.h @@ -422,7 +422,7 @@ class GHOST_ISystem { virtual GHOST_TSuccess getButtonState(GHOST_TButton mask, bool &isDown) const = 0; /** - * Enable multitouch gestures if supported. + * Enable multi-touch gestures if supported. * \param use: Enable or disable. */ virtual void setMultitouchGestures(const bool use) = 0; diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h index 7a22e2aa259..810f828a8a1 100644 --- a/intern/ghost/intern/GHOST_System.h +++ b/intern/ghost/intern/GHOST_System.h @@ -240,7 +240,7 @@ class GHOST_System : public GHOST_ISystem { GHOST_TSuccess getButtonState(GHOST_TButton mask, bool &isDown) const; /** - * Enable multitouch gestures if supported. + * Enable multi-touch gestures if supported. * \param use: Enable or disable. */ void setMultitouchGestures(const bool use); @@ -408,7 +408,7 @@ class GHOST_System : public GHOST_ISystem { /** Settings of the display before the display went full-screen. */ GHOST_DisplaySetting m_preFullScreenSetting; - /* Use multitouch gestures? */ + /* Use multi-touch gestures? */ bool m_multitouchGestures; /** Which tablet API to use. */ diff --git a/source/blender/blenkernel/BKE_lib_override.h b/source/blender/blenkernel/BKE_lib_override.h index 8542c02fab5..963e2d09b17 100644 --- a/source/blender/blenkernel/BKE_lib_override.h +++ b/source/blender/blenkernel/BKE_lib_override.h @@ -117,7 +117,7 @@ struct ID *BKE_lib_override_library_create_from_id(struct Main *bmain, /** * Create overridden local copies of all tagged data-blocks in given Main. * - * \note Set `id->newid` of overridden libs with newly created overrides, + * \note Set `id->newid` of overridden libraries with newly created overrides, * caller is responsible to clean those pointers before/after usage as needed. * * \note By default, it will only remap newly created local overriding data-blocks between diff --git a/source/blender/blenkernel/intern/blendfile_link_append.c b/source/blender/blenkernel/intern/blendfile_link_append.c index e3b76122ff0..394469e19a4 100644 --- a/source/blender/blenkernel/intern/blendfile_link_append.c +++ b/source/blender/blenkernel/intern/blendfile_link_append.c @@ -61,7 +61,7 @@ static CLG_LogRef LOG = {"bke.blendfile_link_append"}; typedef struct BlendfileLinkAppendContextItem { /** Name of the ID (without the heading two-chars IDcode). */ char *name; - /** All libs (from BlendfileLinkAppendContext.libraries) to try to load this ID from. */ + /** All libraries (from #BlendfileLinkAppendContext.libraries) to try to load this ID from. */ BLI_bitmap *libraries; /** ID type. */ short idcode; @@ -1258,7 +1258,7 @@ void BKE_blendfile_link(BlendfileLinkAppendContext *lapp_context, ReportList *re } /* For each lib file, we try to link all items belonging to that lib, - * and tag those successful to not try to load them again with the other libs. */ + * and tag those successful to not try to load them again with the other libraries. */ for (item_idx = 0, itemlink = lapp_context->items.list; itemlink; item_idx++, itemlink = itemlink->next) { BlendfileLinkAppendContextItem *item = itemlink->link; @@ -1272,7 +1272,7 @@ void BKE_blendfile_link(BlendfileLinkAppendContext *lapp_context, ReportList *re mainl, &blo_handle, item->idcode, item->name, lapp_context->params); if (new_id) { - /* If the link is successful, clear item's libs 'todo' flags. + /* If the link is successful, clear item's libraries 'todo' flags. * This avoids trying to link same item with other libraries to come. */ BLI_bitmap_set_all(item->libraries, false, lapp_context->num_libraries); item->new_id = new_id; diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 4b91efff08d..beea3217126 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -2382,7 +2382,7 @@ void BKE_fcurve_blend_write(BlendWriter *writer, ListBase *fcurves) void BKE_fcurve_blend_read_data(BlendDataReader *reader, ListBase *fcurves) { - /* link F-Curve data to F-Curve again (non ID-libs) */ + /* Link F-Curve data to F-Curve again (non ID-libraries). */ LISTBASE_FOREACH (FCurve *, fcu, fcurves) { /* curve data */ BLO_read_data_address(reader, &fcu->bezt); diff --git a/source/blender/blenlib/BLI_convexhull_2d.h b/source/blender/blenlib/BLI_convexhull_2d.h index 0b4c3d486fb..044c1da6925 100644 --- a/source/blender/blenlib/BLI_convexhull_2d.h +++ b/source/blender/blenlib/BLI_convexhull_2d.h @@ -11,43 +11,26 @@ extern "C" { #endif /** - * A.M. Andrew's monotone chain 2D convex hull algorithm. - * - * \param points: An array of 2D points presorted by increasing x and y-coords. - * \param n: The number of points in points. - * \param r_points: An array of the convex hull vertex indices (max is n). - * \returns the number of points in r_points. - */ -int BLI_convexhull_2d_sorted(const float (*points)[2], int n, int r_points[]); -/** - * A.M. Andrew's monotone chain 2D convex hull algorithm. + * Extract 2D convex hull. * * \param points: An array of 2D points. * \param n: The number of points in points. * \param r_points: An array of the convex hull vertex indices (max is n). - * _must_ be allocated as `n * 2` because of how its used internally, - * even though the final result will be no more than \a n in size. - * \returns the number of points in r_points. - */ -int BLI_convexhull_2d(const float (*points)[2], int n, int r_points[]); - -/** - * \return The best angle for fitting the convex hull to an axis aligned bounding box. - * - * Intended to be used with #BLI_convexhull_2d + * \return The number of indices in r_points. * - * \param points_hull: Ordered hull points - * (result of #BLI_convexhull_2d mapped to a contiguous array). + * \note Performance is `O(n.log(n))`, same as `qsort`. * - * \note we could return the index of the best edge too if its needed. */ -float BLI_convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], unsigned int n); +int BLI_convexhull_2d(const float (*points)[2], int n, int r_points[/* n */]); + /** - * Wrap #BLI_convexhull_aabb_fit_hull_2d and do the convex hull calculation. + * \return The best angle for fitting the points to an axis aligned bounding box. + * + * \note We could return the index of the best edge too if its needed. * - * \param points: arbitrary 2d points. + * \param points: Arbitrary 2d points. */ -float BLI_convexhull_aabb_fit_points_2d(const float (*points)[2], unsigned int n); +float BLI_convexhull_aabb_fit_points_2d(const float (*points)[2], int n); #ifdef __cplusplus } diff --git a/source/blender/blenlib/intern/convexhull_2d.c b/source/blender/blenlib/intern/convexhull_2d.c index ee5d000b72f..9e3fb230d3c 100644 --- a/source/blender/blenlib/intern/convexhull_2d.c +++ b/source/blender/blenlib/intern/convexhull_2d.c @@ -39,8 +39,9 @@ static float is_left(const float p0[2], const float p1[2], const float p2[2]) return (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p2[0] - p0[0]) * (p1[1] - p0[1]); } -int BLI_convexhull_2d_sorted(const float (*points)[2], const int n, int r_points[]) +static int BLI_convexhull_2d_sorted(const float (*points)[2], const int n, int r_points[]) { + BLI_assert(n >= 2); /* Doesn't handle trivial cases. */ /* the output array r_points[] will be used as the stack */ int bot = 0; int top = -1; /* indices for bottom and top of the stack */ @@ -66,6 +67,7 @@ int BLI_convexhull_2d_sorted(const float (*points)[2], const int n, int r_points r_points[++top] = minmax; } r_points[++top] = minmin; /* add polygon endpoint */ + BLI_assert(top + 1 <= n); return top + 1; } @@ -122,16 +124,18 @@ int BLI_convexhull_2d_sorted(const float (*points)[2], const int n, int r_points } if (points[i][0] == points[r_points[0]][0] && points[i][1] == points[r_points[0]][1]) { + BLI_assert(top + 1 <= n); return top + 1; /* special case (mgomes) */ } r_points[++top] = i; /* push points[i] onto stack */ } - if (minmax != minmin) { + if (minmax != minmin && r_points[0] != minmin) { r_points[++top] = minmin; /* push joining endpoint onto stack */ } + BLI_assert(top + 1 <= n); return top + 1; } @@ -162,35 +166,38 @@ static int pointref_cmp_yx(const void *a_, const void *b_) int BLI_convexhull_2d(const float (*points)[2], const int n, int r_points[]) { + BLI_assert(n >= 0); + if (n < 2) { + if (n == 1) { + r_points[0] = 0; + } + return n; + } struct PointRef *points_ref = MEM_mallocN(sizeof(*points_ref) * (size_t)n, __func__); float(*points_sort)[2] = MEM_mallocN(sizeof(*points_sort) * (size_t)n, __func__); - int *points_map; - int points_hull_num, i; - for (i = 0; i < n; i++) { + for (int i = 0; i < n; i++) { points_ref[i].pt = points[i]; } - /* Sort the points by X, then by Y (required by the algorithm) */ + /* Sort the points by X, then by Y. */ qsort(points_ref, (size_t)n, sizeof(struct PointRef), pointref_cmp_yx); - for (i = 0; i < n; i++) { + for (int i = 0; i < n; i++) { memcpy(points_sort[i], points_ref[i].pt, sizeof(float[2])); } - points_hull_num = BLI_convexhull_2d_sorted(points_sort, n, r_points); + int points_hull_num = BLI_convexhull_2d_sorted(points_sort, n, r_points); - /* map back to the original index values */ - points_map = (int *)points_sort; /* abuse float array for temp storage */ - for (i = 0; i < points_hull_num; i++) { - points_map[i] = (int)((const float(*)[2])points_ref[r_points[i]].pt - points); + /* Map back to the unsorted index values. */ + for (int i = 0; i < points_hull_num; i++) { + r_points[i] = (int)((const float(*)[2])points_ref[r_points[i]].pt - points); } - memcpy(r_points, points_map, (size_t)points_hull_num * sizeof(*points_map)); - MEM_freeN(points_ref); MEM_freeN(points_sort); + BLI_assert(points_hull_num <= n); return points_hull_num; } @@ -202,14 +209,13 @@ int BLI_convexhull_2d(const float (*points)[2], const int n, int r_points[]) /** \name Utility Convex-Hull Functions * \{ */ -float BLI_convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], uint n) +static float BLI_convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], int n) { - uint i, i_prev; float area_best = FLT_MAX; float dvec_best[2]; /* best angle, delay atan2 */ - i_prev = n - 1; - for (i = 0; i < n; i++) { + int i_prev = n - 1; + for (int i = 0; i < n; i++) { const float *ev_a = points_hull[i]; const float *ev_b = points_hull[i_prev]; float dvec[2]; /* 2d rotation matrix */ @@ -218,10 +224,9 @@ float BLI_convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], uint n) if (normalize_v2(dvec) != 0.0f) { /* rotation matrix */ float min[2] = {FLT_MAX, FLT_MAX}, max[2] = {-FLT_MAX, -FLT_MAX}; - uint j; float area; - for (j = 0; j < n; j++) { + for (int j = 0; j < n; j++) { float tvec[2]; mul_v2_v2_cw(tvec, dvec, points_hull[j]); @@ -249,32 +254,24 @@ float BLI_convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], uint n) return (area_best != FLT_MAX) ? atan2f(dvec_best[0], dvec_best[1]) : 0.0f; } -float BLI_convexhull_aabb_fit_points_2d(const float (*points)[2], uint n) +float BLI_convexhull_aabb_fit_points_2d(const float (*points)[2], int n) { - int *index_map; - int points_hull_num; + BLI_assert(n >= 0); + float angle = 0.0f; - float angle; + int *index_map = MEM_mallocN(sizeof(*index_map) * (size_t)n, __func__); - index_map = MEM_mallocN(sizeof(*index_map) * n * 2, __func__); + int points_hull_num = BLI_convexhull_2d(points, n, index_map); - points_hull_num = BLI_convexhull_2d(points, (int)n, index_map); - - if (points_hull_num) { - float(*points_hull)[2]; - int j; - - points_hull = MEM_mallocN(sizeof(*points_hull) * (size_t)points_hull_num, __func__); - for (j = 0; j < points_hull_num; j++) { + if (points_hull_num > 1) { + float(*points_hull)[2] = MEM_mallocN(sizeof(*points_hull) * (size_t)points_hull_num, __func__); + for (int j = 0; j < points_hull_num; j++) { copy_v2_v2(points_hull[j], points[index_map[j]]); } - angle = BLI_convexhull_aabb_fit_hull_2d(points_hull, (uint)points_hull_num); + angle = BLI_convexhull_aabb_fit_hull_2d(points_hull, points_hull_num); MEM_freeN(points_hull); } - else { - angle = 0.0f; - } MEM_freeN(index_map); diff --git a/source/blender/blenlib/tests/BLI_string_utf8_test.cc b/source/blender/blenlib/tests/BLI_string_utf8_test.cc index f0c34350e1b..d66bade40ed 100644 --- a/source/blender/blenlib/tests/BLI_string_utf8_test.cc +++ b/source/blender/blenlib/tests/BLI_string_utf8_test.cc @@ -439,7 +439,6 @@ TEST(string, StrCursorStepNextUtf32Simple) EXPECT_FALSE(BLI_str_cursor_step_next_utf32(simple, len, &pos)); } - /* -------------------------------------------------------------------- */ /** \name Test #BLI_str_cursor_step_next_utf32_allcombining * \{ */ @@ -857,7 +856,7 @@ TEST(string, StrCursorStepPrevUtf8Invalid) const size_t len = 8; int pos = 8; EXPECT_TRUE(BLI_str_cursor_step_prev_utf8(invalid, len, &pos) && pos == 5); - pos= 7; + pos = 7; EXPECT_TRUE(BLI_str_cursor_step_prev_utf8(invalid, len, &pos) && pos == 5); pos = 6; EXPECT_TRUE(BLI_str_cursor_step_prev_utf8(invalid, len, &pos) && pos == 5); diff --git a/source/blender/blenloader/intern/readblenentry.cc b/source/blender/blenloader/intern/readblenentry.cc index e3d6864b962..55d86371efe 100644 --- a/source/blender/blenloader/intern/readblenentry.cc +++ b/source/blender/blenloader/intern/readblenentry.cc @@ -434,8 +434,8 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, * but oldmain itself shall *never* be 'transferred' to new mainlist! */ BLI_assert(old_mainlist.first == oldmain); - /* That way, libs (aka mains) we did not reuse in new undone/redone state - * will be cleared together with oldmain... */ + /* That way, libraries (aka mains) we did not reuse in new undone/redone state + * will be cleared together with `oldmain`. */ blo_join_main(&old_mainlist); blo_filedata_free(fd); diff --git a/source/blender/blenloader/intern/readfile.cc b/source/blender/blenloader/intern/readfile.cc index 46ae207db48..7c07d373999 100644 --- a/source/blender/blenloader/intern/readfile.cc +++ b/source/blender/blenloader/intern/readfile.cc @@ -2261,7 +2261,7 @@ void blo_do_versions_key_uidgen(Key *key) #ifdef USE_SETSCENE_CHECK /** - * A version of #BKE_scene_validate_setscene with special checks for linked libs. + * A version of #BKE_scene_validate_setscene with special checks for linked libraries. */ static bool scene_validate_setscene__liblink(Scene *sce, const int totscene) { @@ -2904,7 +2904,7 @@ static void fix_relpaths_library(const char *basepath, Main *main) else { LISTBASE_FOREACH (Library *, lib, &main->libraries) { /* Libraries store both relative and abs paths, recreate relative paths, - * relative to the blend file since indirectly linked libs will be + * relative to the blend file since indirectly linked libraries will be * relative to their direct linked library. */ if (BLI_path_is_rel(lib->filepath)) { /* if this is relative to begin with? */ BLI_strncpy(lib->filepath, lib->filepath_abs, sizeof(lib->filepath)); @@ -3151,7 +3151,7 @@ static bool read_libblock_is_identical(FileData *fd, BHead *bhead) /* For undo, restore matching library datablock from the old main. */ static bool read_libblock_undo_restore_library(FileData *fd, Main *main, const ID *id) { - /* In undo case, most libs and linked data should be kept as is from previous state + /* In undo case, most libraries and linked data should be kept as is from previous state * (see BLO_read_from_memfile). * However, some needed by the snapshot being read may have been removed in previous one, * and would go missing. @@ -4586,7 +4586,7 @@ static void library_link_end(Main *mainl, FileData **fd, const int flag) /* make main consistent */ BLO_expand_main(*fd, mainl); - /* do this when expand found other libs */ + /* Do this when expand found other libraries. */ read_libraries(*fd, (*fd)->mainlist); curlib = mainl->curlib; diff --git a/source/blender/draw/intern/draw_debug.cc b/source/blender/draw/intern/draw_debug.cc index 811185395fd..681ca8e36d1 100644 --- a/source/blender/draw/intern/draw_debug.cc +++ b/source/blender/draw/intern/draw_debug.cc @@ -319,8 +319,8 @@ template<> void DebugDraw::print_value<uint4>(const uint4 &value) /* -------------------------------------------------------------------- */ /** \name Internals * - * IMPORTANT: All of these are copied from the shader libs (common_debug_draw_lib.glsl & - * common_debug_print_lib.glsl). They need to be kept in sync to write the same data. + * IMPORTANT: All of these are copied from the shader libraries (`common_debug_draw_lib.glsl` & + * `common_debug_print_lib.glsl`). They need to be kept in sync to write the same data. * \{ */ void DebugDraw::draw_line(float3 v1, float3 v2, uint color) diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 4a523997473..21e56531096 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -2214,7 +2214,7 @@ static int make_local_exec(bContext *C, wmOperator *op) CTX_DATA_END; } - BKE_library_make_local(bmain, NULL, NULL, true, false); /* NULL is all libs */ + BKE_library_make_local(bmain, NULL, NULL, true, false); /* NULL is all libraries. */ WM_event_add_notifier(C, NC_WINDOW, NULL); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_file/filelist.cc b/source/blender/editors/space_file/filelist.cc index 8ad998e2124..1eb67da0347 100644 --- a/source/blender/editors/space_file/filelist.cc +++ b/source/blender/editors/space_file/filelist.cc @@ -388,7 +388,7 @@ static int compare_direntry_generic(const FileListInternEntry *entry1, if (entry1->typeflag & FILE_TYPE_DIR) { if (entry2->typeflag & FILE_TYPE_DIR) { /* If both entries are tagged as dirs, we make a 'sub filter' that shows first the real dirs, - * then libs (.blend files), then categories in libs. */ + * then libraries (.blend files), then categories in libraries. */ if (entry1->typeflag & FILE_TYPE_BLENDERLIB) { if (!(entry2->typeflag & FILE_TYPE_BLENDERLIB)) { return 1; @@ -2922,7 +2922,7 @@ static int filelist_readjob_list_dir(const char *root, if (!(entry->typeflag & FILE_TYPE_DIR)) { if (do_lib && BLO_has_bfile_extension(target)) { - /* If we are considering .blend files as libs, promote them to directory status. */ + /* If we are considering .blend files as libraries, promote them to directory status. */ entry->typeflag = FILE_TYPE_BLENDER; /* prevent current file being used as acceptable dir */ if (BLI_path_cmp(main_name, target) != 0) { diff --git a/source/blender/editors/space_view3d/view3d_draw.cc b/source/blender/editors/space_view3d/view3d_draw.cc index 792421ef4b9..9686609fa65 100644 --- a/source/blender/editors/space_view3d/view3d_draw.cc +++ b/source/blender/editors/space_view3d/view3d_draw.cc @@ -2246,7 +2246,7 @@ void view3d_depths_rect_create(ARegion *region, rcti *rect, ViewDepths *r_d) } } -/* NOTE: with nouveau drivers the glReadPixels() is very slow. T24339. */ +/* NOTE: with NOUVEAU drivers the #glReadPixels() is very slow. T24339. */ static ViewDepths *view3d_depths_create(ARegion *region) { ViewDepths *d = MEM_cnew<ViewDepths>("ViewDepths"); diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index e66629f8fb0..e45c7410b3b 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -2421,7 +2421,7 @@ static int smart_project_exec(bContext *C, wmOperator *op) .rotate = true, /* We could make this optional. */ .rotate_align_axis = 1, - .only_selected_uvs = true, + .only_selected_uvs = only_selected_uvs, .only_selected_faces = true, .correct_aspect = correct_aspect, .use_seams = true, diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpenciltime.c b/source/blender/gpencil_modifiers/intern/MOD_gpenciltime.c index e3d49ba37d5..5af8c0807b8 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpenciltime.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpenciltime.c @@ -266,7 +266,7 @@ static int remapTime(struct GpencilModifierData *md, } static void segment_list_item(struct uiList *UNUSED(ui_list), - struct bContext *UNUSED(C), + const struct bContext *UNUSED(C), struct uiLayout *layout, struct PointerRNA *UNUSED(idataptr), struct PointerRNA *itemptr, @@ -313,7 +313,7 @@ static void panel_draw(const bContext *C, Panel *panel) if (mode == GP_TIME_MODE_CHAIN) { - uiLayout *row = uiLayoutRow(layout, false); + row = uiLayoutRow(layout, false); uiLayoutSetPropSep(row, false); uiTemplateList(row, @@ -331,7 +331,7 @@ static void panel_draw(const bContext *C, Panel *panel) 1, UI_TEMPLATE_LIST_FLAG_NONE); - uiLayout *col = uiLayoutColumn(row, false); + col = uiLayoutColumn(row, false); uiLayoutSetContextPointer(col, "modifier", ptr); uiLayout *sub = uiLayoutColumn(col, true); diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h index c1b3b879c34..2e70bd77205 100644 --- a/source/blender/gpu/GPU_shader.h +++ b/source/blender/gpu/GPU_shader.h @@ -64,7 +64,8 @@ struct GPU_ShaderCreateFromArray_Params { /** * Use via #GPU_shader_create_from_arrays macro (avoids passing in param). * - * Similar to #DRW_shader_create_with_lib with the ability to include libs for each type of shader. + * Similar to #DRW_shader_create_with_lib with the ability to include libraries for each type of + * shader. * * It has the advantage that each item can be conditionally included * without having to build the string inline, then free it. diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index d64b3d361cf..edd70e0f9d7 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -471,7 +471,7 @@ typedef struct Library { */ char filepath_abs[1024]; - /** Set for indirectly linked libs, used in the outliner and while reading. */ + /** Set for indirectly linked libraries, used in the outliner and while reading. */ struct Library *parent; struct PackedFile *packedfile; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 23b76e855b2..c8ff0083b5e 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -12,8 +12,10 @@ /* XXX(@campbellbarton): temp feature. */ #define DURIAN_CAMERA_SWITCH -/* check for cyclic set-scene, - * libs can cause this case which is normally prevented, see (T#####) */ +/** + * Check for cyclic set-scene. + * Libraries can cause this case which is normally prevented, see (T42009). + */ #define USE_SETSCENE_CHECK #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index c0f92010c22..d8005b83383 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -184,7 +184,7 @@ typedef struct Sequence { /** Old animation system, deprecated for 2.5. */ struct Ipo *ipo DNA_DEPRECATED; - /** these ID vars should never be NULL but can be when linked libs fail to load, + /** these ID vars should never be NULL but can be when linked libraries fail to load, * so check on access */ struct Scene *scene; /** Override scene camera. */ diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c index 28deebcf5ac..c8f9bfb0ed7 100644 --- a/source/blender/python/mathutils/mathutils_geometry.c +++ b/source/blender/python/mathutils/mathutils_geometry.c @@ -1465,7 +1465,7 @@ static PyObject *M_Geometry_convex_hull_2d(PyObject *UNUSED(self), PyObject *poi int *index_map; Py_ssize_t len_ret, i; - index_map = MEM_mallocN(sizeof(*index_map) * len * 2, __func__); + index_map = MEM_mallocN(sizeof(*index_map) * len, __func__); /* Non Python function */ len_ret = BLI_convexhull_2d(points, len, index_map); diff --git a/tests/blender_as_python_module/CMakeLists.txt b/tests/blender_as_python_module/CMakeLists.txt index 4f6cf0adfdb..6e0ce524903 100644 --- a/tests/blender_as_python_module/CMakeLists.txt +++ b/tests/blender_as_python_module/CMakeLists.txt @@ -10,6 +10,14 @@ function(add_blender_as_python_module_test testname testscript) NAME ${testname} COMMAND ${TEST_PYTHON_EXE} ${testscript} ${ARGN} ) + + # On macOS, asan library must be loaded early. + if(APPLE AND WITH_COMPILER_ASAN) + set_tests_properties( + ${testname} + PROPERTIES ENVIRONMENT DYLD_INSERT_LIBRARIES=${COMPILER_ASAN_LIBRARY} + ) + endif() endfunction() add_blender_as_python_module_test(import_bpy ${CMAKE_CURRENT_LIST_DIR}/import_bpy.py ${CMAKE_INSTALL_PREFIX_WITH_CONFIG}) |