Merge pull request #15517 from jherico/fix/tbb_overhead

Case 22483: Disable the use of tbb::parallel_for in Blender
This commit is contained in:
Shannon Romano 2019-05-07 11:49:15 -07:00 committed by GitHub
commit a89a65b810
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 21 deletions

View file

@ -1747,9 +1747,9 @@ void Blender::run() {
if (_model && _model->isLoaded()) { if (_model && _model->isLoaded()) {
DETAILED_PROFILE_RANGE_EX(simulation_animation, __FUNCTION__, 0xFFFF0000, 0, { { "url", _model->getURL().toString() } }); DETAILED_PROFILE_RANGE_EX(simulation_animation, __FUNCTION__, 0xFFFF0000, 0, { { "url", _model->getURL().toString() } });
int offset = 0; int offset = 0;
auto meshes = _model->getHFMModel().meshes; const auto& meshes = _model->getHFMModel().meshes;
int meshIndex = 0; int meshIndex = 0;
foreach(const HFMMesh& mesh, meshes) { for(const HFMMesh& mesh : meshes) {
auto modelMeshBlendshapeOffsets = _model->_blendshapeOffsets.find(meshIndex++); auto modelMeshBlendshapeOffsets = _model->_blendshapeOffsets.find(meshIndex++);
if (mesh.blendshapes.isEmpty() || modelMeshBlendshapeOffsets == _model->_blendshapeOffsets.end()) { if (mesh.blendshapes.isEmpty() || modelMeshBlendshapeOffsets == _model->_blendshapeOffsets.end()) {
// Not blendshaped or not initialized // Not blendshaped or not initialized
@ -1780,33 +1780,30 @@ void Blender::run() {
float normalCoefficient = vertexCoefficient * NORMAL_COEFFICIENT_SCALE; float normalCoefficient = vertexCoefficient * NORMAL_COEFFICIENT_SCALE;
const HFMBlendshape& blendshape = mesh.blendshapes.at(i); const HFMBlendshape& blendshape = mesh.blendshapes.at(i);
for (int j = 0; j < blendshape.indices.size(); ++j) {
int index = blendshape.indices.at(j);
tbb::parallel_for(tbb::blocked_range<int>(0, blendshape.indices.size()), [&](const tbb::blocked_range<int>& range) { auto& currentBlendshapeOffset = unpackedBlendshapeOffsets[index];
for (auto j = range.begin(); j < range.end(); j++) { currentBlendshapeOffset.positionOffset += blendshape.vertices.at(j) * vertexCoefficient;
int index = blendshape.indices.at(j);
auto& currentBlendshapeOffset = unpackedBlendshapeOffsets[index]; currentBlendshapeOffset.normalOffset += blendshape.normals.at(j) * normalCoefficient;
currentBlendshapeOffset.positionOffset += blendshape.vertices.at(j) * vertexCoefficient; if (j < blendshape.tangents.size()) {
currentBlendshapeOffset.tangentOffset += blendshape.tangents.at(j) * normalCoefficient;
currentBlendshapeOffset.normalOffset += blendshape.normals.at(j) * normalCoefficient;
if (j < blendshape.tangents.size()) {
currentBlendshapeOffset.tangentOffset += blendshape.tangents.at(j) * normalCoefficient;
}
} }
}); }
} }
// Blendshape offsets are generrated, now let's pack it on its way to gpu // Blendshape offsets are generrated, now let's pack it on its way to gpu
tbb::parallel_for(tbb::blocked_range<int>(0, (int) unpackedBlendshapeOffsets.size()), [&](const tbb::blocked_range<int>& range) { // FIXME it feels like we could be more effectively using SIMD here
auto unpacked = unpackedBlendshapeOffsets.data() + range.begin(); {
auto packed = meshBlendshapeOffsets + range.begin(); auto unpacked = unpackedBlendshapeOffsets.data();
for (auto j = range.begin(); j < range.end(); j++) { auto packed = meshBlendshapeOffsets;
for (int j = 0; j < (int)unpackedBlendshapeOffsets.size(); ++j) {
packBlendshapeOffsetTo_Pos_F32_3xSN10_Nor_3xSN10_Tan_3xSN10((*packed).packedPosNorTan, (*unpacked)); packBlendshapeOffsetTo_Pos_F32_3xSN10_Nor_3xSN10_Tan_3xSN10((*packed).packedPosNorTan, (*unpacked));
++unpacked;
unpacked++; ++packed;
packed++;
} }
}); }
} }
} }
// post the result to the ModelBlender, which will dispatch to the model if still alive // post the result to the ModelBlender, which will dispatch to the model if still alive

View file

@ -13,6 +13,7 @@
#include <unordered_set> #include <unordered_set>
#include <string> #include <string>
#include <vector> #include <vector>
#include <stdexcept>
#include <QtCore/QtGlobal> #include <QtCore/QtGlobal>