// Accumulate locations used for inputs, outputs, and uniforms, and check for collisions // as the accumulation is done. // // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value. // int TIntermediate::addUsedOffsets(int binding, int offset, int numOffsets) { TRange bindingRange(binding, binding); TRange offsetRange(offset, offset + numOffsets - 1); TOffsetRange range(bindingRange, offsetRange); // check for collisions, except for vertex inputs on desktop for (size_t r = 0; r < usedAtomics.size(); ++r) { if (range.overlap(usedAtomics[r])) { // there is a collision; pick one return std::max(offset, usedAtomics[r].offset.start); } } usedAtomics.push_back(range); return -1; // no collision }
void MgClKernel::run() { if(!environment()) return; if(!localRange()) return; if(!d_ptr->arguments.size()) return; if(!valid()) return; Q_EMIT runStarted(); cl::KernelFunctor functor = d_ptr->kernel.bind( d_ptr->environment->d_ptr->commandQueue, createRange(offsetRange()), createRange(localRange()), createRange(globalRange()) ); switch (d_ptr->arguments.size()) { case 1: functor(); break; case 2: functor(); break; case 3: functor(); break; case 4: functor(); break; case 5: functor(); break; case 6: functor(); break; case 7: functor(); break; case 8: functor(); break; case 9: functor(); break; case 10: functor(); break; case 11: functor(); break; case 12: functor(); break; case 13: functor(); break; case 14: functor(); break; case 15: functor(); break; default: break; } Q_EMIT runFinished(); }