Beispiel #1
0
// 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
}
Beispiel #2
0
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();

}