X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=30dc3e499a7c334f4d0a8e867e9ebbf2d97dd901;hp=c2402daeaef400d9ded80dcbce3378be9f94ac42;hb=0d964b485070dcc0a9b6874152204dd13112027d;hpb=e766478d4a236074000a6a17be9cba6e8b1576f3 diff --git a/effect_chain.cpp b/effect_chain.cpp index c2402da..30dc3e4 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -589,9 +589,17 @@ Phase *EffectChain::construct_phase(Node *output, map *complete // and create a GLSL program for it. assert(!phase->effects.empty()); - // Deduplicate the inputs. - sort(phase->inputs.begin(), phase->inputs.end()); - phase->inputs.erase(unique(phase->inputs.begin(), phase->inputs.end()), phase->inputs.end()); + // Deduplicate the inputs, but don't change the ordering e.g. by sorting; + // that would be nondeterministic and thus reduce cacheability. + // TODO: Make this even more deterministic. + vector dedup_inputs; + set seen_inputs; + for (size_t i = 0; i < phase->inputs.size(); ++i) { + if (seen_inputs.insert(phase->inputs[i]).second) { + dedup_inputs.push_back(phase->inputs[i]); + } + } + swap(phase->inputs, dedup_inputs); // Allocate samplers for each input. phase->input_samplers.resize(phase->inputs.size());