Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / ocean.c
index 5a755058963fef93a48b5c4dd63cfbd5b6ca5104..2d8527f23d66ff7203810750d85651bf4e1cadbf 100644 (file)
@@ -334,10 +334,10 @@ void BKE_ocean_eval_uv(struct Ocean *oc, struct OceanResult *ocr, float u, float
        i1 = i1 % oc->_M;
        j1 = j1 % oc->_N;
 
-
 #define BILERP(m) (interpf(interpf(m[i1 * oc->_N + j1], m[i0 * oc->_N + j1], frac_x), \
                            interpf(m[i1 * oc->_N + j0], m[i0 * oc->_N + j0], frac_x), \
                            frac_z))
+
        {
                if (oc->_do_disp_y) {
                        ocr->disp[1] = BILERP(oc->_disp_y);
@@ -502,7 +502,10 @@ typedef struct OceanSimulateData {
        float chop_amount;
 } OceanSimulateData;
 
-static void ocean_compute_htilda(void *userdata, void *UNUSED(userdata_chunk), int i)
+static void ocean_compute_htilda(
+        void *__restrict userdata,
+        const int i,
+        const ParallelRangeTLS *__restrict UNUSED(tls))
 {
        OceanSimulateData *osd = userdata;
        const Ocean *o = osd->o;
@@ -531,7 +534,7 @@ static void ocean_compute_htilda(void *userdata, void *UNUSED(userdata_chunk), i
        }
 }
 
-static void ocean_compute_displacement_y(TaskPool *pool, void *UNUSED(taskdata), int UNUSED(threadid))
+static void ocean_compute_displacement_y(TaskPool * __restrict pool, void *UNUSED(taskdata), int UNUSED(threadid))
 {
        OceanSimulateData *osd = BLI_task_pool_userdata(pool);
        const Ocean *o = osd->o;
@@ -539,7 +542,7 @@ static void ocean_compute_displacement_y(TaskPool *pool, void *UNUSED(taskdata),
        fftw_execute(o->_disp_y_plan);
 }
 
-static void ocean_compute_displacement_x(TaskPool *pool, void *UNUSED(taskdata), int UNUSED(threadid))
+static void ocean_compute_displacement_x(TaskPool * __restrict pool, void *UNUSED(taskdata), int UNUSED(threadid))
 {
        OceanSimulateData *osd = BLI_task_pool_userdata(pool);
        const Ocean *o = osd->o;
@@ -567,7 +570,7 @@ static void ocean_compute_displacement_x(TaskPool *pool, void *UNUSED(taskdata),
        fftw_execute(o->_disp_x_plan);
 }
 
-static void ocean_compute_displacement_z(TaskPool *pool, void *UNUSED(taskdata), int UNUSED(threadid))
+static void ocean_compute_displacement_z(TaskPool * __restrict pool, void *UNUSED(taskdata), int UNUSED(threadid))
 {
        OceanSimulateData *osd = BLI_task_pool_userdata(pool);
        const Ocean *o = osd->o;
@@ -595,7 +598,7 @@ static void ocean_compute_displacement_z(TaskPool *pool, void *UNUSED(taskdata),
        fftw_execute(o->_disp_z_plan);
 }
 
-static void ocean_compute_jacobian_jxx(TaskPool *pool, void *UNUSED(taskdata), int UNUSED(threadid))
+static void ocean_compute_jacobian_jxx(TaskPool * __restrict pool, void *UNUSED(taskdata), int UNUSED(threadid))
 {
        OceanSimulateData *osd = BLI_task_pool_userdata(pool);
        const Ocean *o = osd->o;
@@ -627,7 +630,7 @@ static void ocean_compute_jacobian_jxx(TaskPool *pool, void *UNUSED(taskdata), i
        }
 }
 
-static void ocean_compute_jacobian_jzz(TaskPool *pool, void *UNUSED(taskdata), int UNUSED(threadid))
+static void ocean_compute_jacobian_jzz(TaskPool * __restrict pool, void *UNUSED(taskdata), int UNUSED(threadid))
 {
        OceanSimulateData *osd = BLI_task_pool_userdata(pool);
        const Ocean *o = osd->o;
@@ -659,7 +662,7 @@ static void ocean_compute_jacobian_jzz(TaskPool *pool, void *UNUSED(taskdata), i
        }
 }
 
-static void ocean_compute_jacobian_jxz(TaskPool *pool, void *UNUSED(taskdata), int UNUSED(threadid))
+static void ocean_compute_jacobian_jxz(TaskPool * __restrict pool, void *UNUSED(taskdata), int UNUSED(threadid))
 {
        OceanSimulateData *osd = BLI_task_pool_userdata(pool);
        const Ocean *o = osd->o;
@@ -685,7 +688,7 @@ static void ocean_compute_jacobian_jxz(TaskPool *pool, void *UNUSED(taskdata), i
        fftw_execute(o->_Jxz_plan);
 }
 
-static void ocean_compute_normal_x(TaskPool *pool, void *UNUSED(taskdata), int UNUSED(threadid))
+static void ocean_compute_normal_x(TaskPool * __restrict pool, void *UNUSED(taskdata), int UNUSED(threadid))
 {
        OceanSimulateData *osd = BLI_task_pool_userdata(pool);
        const Ocean *o = osd->o;
@@ -704,7 +707,7 @@ static void ocean_compute_normal_x(TaskPool *pool, void *UNUSED(taskdata), int U
        fftw_execute(o->_N_x_plan);
 }
 
-static void ocean_compute_normal_z(TaskPool *pool, void *UNUSED(taskdata), int UNUSED(threadid))
+static void ocean_compute_normal_z(TaskPool * __restrict pool, void *UNUSED(taskdata), int UNUSED(threadid))
 {
        OceanSimulateData *osd = BLI_task_pool_userdata(pool);
        const Ocean *o = osd->o;
@@ -748,7 +751,10 @@ void BKE_ocean_simulate(struct Ocean *o, float t, float scale, float chop_amount
         * This is not optimal in all cases, but remains reasonably simple and should be OK most of the time. */
 
        /* compute a new htilda */
-       BLI_task_parallel_range(0, o->_M, &osd, ocean_compute_htilda);
+       ParallelRangeSettings settings;
+       BLI_parallel_range_settings_defaults(&settings);
+       settings.use_threading = (o->_M > 16);
+       BLI_task_parallel_range(0, o->_M, &osd, ocean_compute_htilda, &settings);
 
        if (o->_do_disp_y) {
                BLI_task_pool_push(pool, ocean_compute_displacement_y, NULL, false, TASK_PRIORITY_HIGH);
@@ -911,7 +917,7 @@ void BKE_ocean_init(struct Ocean *o, int M, int N, float Lx, float Lz, float V,
        o->_fft_in = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in");
        o->_htilda = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_htilda");
 
-       BLI_lock_thread(LOCK_FFTW);
+       BLI_thread_lock(LOCK_FFTW);
 
        if (o->_do_disp_y) {
                o->_disp_y = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_disp_y");
@@ -957,7 +963,7 @@ void BKE_ocean_init(struct Ocean *o, int M, int N, float Lx, float Lz, float V,
                o->_Jxz_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jxz, o->_Jxz, FFTW_ESTIMATE);
        }
 
-       BLI_unlock_thread(LOCK_FFTW);
+       BLI_thread_unlock(LOCK_FFTW);
 
        BLI_rw_mutex_unlock(&o->oceanmutex);
 
@@ -972,7 +978,7 @@ void BKE_ocean_free_data(struct Ocean *oc)
 
        BLI_rw_mutex_lock(&oc->oceanmutex, THREAD_LOCK_WRITE);
 
-       BLI_lock_thread(LOCK_FFTW);
+       BLI_thread_lock(LOCK_FFTW);
 
        if (oc->_do_disp_y) {
                fftw_destroy_plan(oc->_disp_y_plan);
@@ -1010,7 +1016,7 @@ void BKE_ocean_free_data(struct Ocean *oc)
                MEM_freeN(oc->_Jxz);
        }
 
-       BLI_unlock_thread(LOCK_FFTW);
+       BLI_thread_unlock(LOCK_FFTW);
 
        if (oc->_fft_in)
                MEM_freeN(oc->_fft_in);