Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2018-01-11 22:14:16 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-01-11 22:14:16 +0300
commit6695e390c627adbe664e499f699d66966b854007 (patch)
tree93bd0a0d08fd98f6bf0b1e07b4e2cab8fb042df6 /source/blender
parent90cd856ac34011496031eeae5a5e3a5bf2da1107 (diff)
Nuke OMP from multires.c: forgot that one in previous commit.
Gives same kind of speedup too, 8.7ms with old OMP code, 2.7ms with new one, with same level-4 multires monkey head.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/multires.c107
1 files changed, 73 insertions, 34 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 6bc4e359bbd..73270704393 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -1004,23 +1004,25 @@ static void grid_tangent_matrix(float mat[3][3], const CCGKey *key,
}
-typedef struct MultiresDispRunData {
+typedef struct MultiresThreadedData {
DispOp op;
CCGElem **gridData, **subGridData;
CCGKey *key;
+ CCGKey *sub_key;
MPoly *mpoly;
MDisps *mdisps;
GridPaintMask *grid_paint_mask;
int *gridOffset;
int gridSize, dGridSize, dSkip;
-} MultiresDispRunData;
+ float (*smat)[3];
+} MultiresThreadedData;
static void multires_disp_run_cb(
void *__restrict userdata,
const int pidx,
const ParallelRangeTLS *__restrict UNUSED(tls))
{
- MultiresDispRunData *tdata = userdata;
+ MultiresThreadedData *tdata = userdata;
DispOp op = tdata->op;
CCGElem **gridData = tdata->gridData;
@@ -1172,7 +1174,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm
BLI_parallel_range_settings_defaults(&settings);
settings.min_iter_per_thread = CCG_TASK_LIMIT;
- MultiresDispRunData data = {
+ MultiresThreadedData data = {
.op = op,
.gridData = gridData,
.subGridData = subGridData,
@@ -2220,6 +2222,56 @@ static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst)
}
}
+static void multires_apply_smat_cb(
+ void *__restrict userdata,
+ const int pidx,
+ const ParallelRangeTLS *__restrict UNUSED(tls))
+{
+ MultiresThreadedData *tdata = userdata;
+
+ CCGElem **gridData = tdata->gridData;
+ CCGElem **subGridData = tdata->subGridData;
+ CCGKey *dm_key = tdata->key;
+ CCGKey *subdm_key = tdata->sub_key;
+ MPoly *mpoly = tdata->mpoly;
+ MDisps *mdisps = tdata->mdisps;
+ int *gridOffset = tdata->gridOffset;
+ int gridSize = tdata->gridSize;
+ int dGridSize = tdata->dGridSize;
+ int dSkip = tdata->dSkip;
+ float (*smat)[3] = tdata->smat;
+
+ const int numVerts = mpoly[pidx].totloop;
+ MDisps *mdisp = &mdisps[mpoly[pidx].loopstart];
+ int S, x, y, gIndex = gridOffset[pidx];
+
+ for (S = 0; S < numVerts; ++S, ++gIndex, mdisp++) {
+ CCGElem *grid = gridData[gIndex];
+ CCGElem *subgrid = subGridData[gIndex];
+ float (*dispgrid)[3] = mdisp->disps;
+
+ for (y = 0; y < gridSize; y++) {
+ for (x = 0; x < gridSize; x++) {
+ float *co = CCG_grid_elem_co(dm_key, grid, x, y);
+ float *sco = CCG_grid_elem_co(subdm_key, subgrid, x, y);
+ float *data = dispgrid[dGridSize * y * dSkip + x * dSkip];
+ float mat[3][3], disp[3];
+
+ /* construct tangent space matrix */
+ grid_tangent_matrix(mat, dm_key, x, y, grid);
+
+ /* scale subgrid coord and calculate displacement */
+ mul_m3_v3(smat, sco);
+ sub_v3_v3v3(disp, sco, co);
+
+ /* convert difference to tangent space */
+ invert_m3(mat);
+ mul_v3_m3v3(data, mat, disp);
+ }
+ }
+ }
+}
+
static void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
{
DerivedMesh *dm = NULL, *cddm = NULL, *subdm = NULL;
@@ -2272,38 +2324,25 @@ static void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
dGridSize = multires_side_tot[high_mmd.totlvl];
dSkip = (dGridSize - 1) / (gridSize - 1);
-#pragma omp parallel for private(i) if (me->totloop * gridSize * gridSize >= CCG_OMP_LIMIT)
- for (i = 0; i < me->totpoly; ++i) {
- const int numVerts = mpoly[i].totloop;
- MDisps *mdisp = &mdisps[mpoly[i].loopstart];
- int S, x, y, gIndex = gridOffset[i];
-
- for (S = 0; S < numVerts; ++S, ++gIndex, mdisp++) {
- CCGElem *grid = gridData[gIndex];
- CCGElem *subgrid = subGridData[gIndex];
- float (*dispgrid)[3] = mdisp->disps;
-
- for (y = 0; y < gridSize; y++) {
- for (x = 0; x < gridSize; x++) {
- float *co = CCG_grid_elem_co(&dm_key, grid, x, y);
- float *sco = CCG_grid_elem_co(&subdm_key, subgrid, x, y);
- float *data = dispgrid[dGridSize * y * dSkip + x * dSkip];
- float mat[3][3], disp[3];
-
- /* construct tangent space matrix */
- grid_tangent_matrix(mat, &dm_key, x, y, grid);
+ ParallelRangeSettings settings;
+ BLI_parallel_range_settings_defaults(&settings);
+ settings.min_iter_per_thread = CCG_TASK_LIMIT;
- /* scale subgrid coord and calculate displacement */
- mul_m3_v3(smat, sco);
- sub_v3_v3v3(disp, sco, co);
+ MultiresThreadedData data = {
+ .gridData = gridData,
+ .subGridData = subGridData,
+ .key = &dm_key,
+ .sub_key = &subdm_key,
+ .mpoly = mpoly,
+ .mdisps = mdisps,
+ .gridOffset = gridOffset,
+ .gridSize = gridSize,
+ .dGridSize = dGridSize,
+ .dSkip = dSkip,
+ .smat = smat
+ };
- /* convert difference to tangent space */
- invert_m3(mat);
- mul_v3_m3v3(data, mat, disp);
- }
- }
- }
- }
+ BLI_task_parallel_range(0, me->totpoly, &data, multires_apply_smat_cb, &settings);
dm->release(dm);
subdm->release(subdm);