/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "GrBatchTarget.h"

#include "GrBufferAllocPool.h"
#include "GrPipeline.h"

/*
void GrBatchTarget::flush() {
    FlushBuffer::Iter iter(fFlushBuffer);
    fVertexPool->unmap();
    fIndexPool->unmap();

    while (iter.next()) {
        GrProgramDesc desc;
        BufferedFlush* bf = iter.get();
        const GrPipeline* pipeline = bf->fPipeline;
        const GrPrimitiveProcessor* primProc = bf->fPrimitiveProcessor.get();
        fGpu->buildProgramDesc(&desc, *primProc, *pipeline, pipeline->descInfo(),
                               bf->fBatchTracker);

        GrGpu::DrawArgs args(primProc, pipeline, &desc, &bf->fBatchTracker);
        for (int i = 0; i < bf->fDraws.count(); i++) {
            fGpu->draw(args, bf->fDraws[i]);
        }
    }
    fFlushBuffer.reset();
}*/

void GrBatchTarget::flushNext() {
    fIter.next();
    GrProgramDesc desc;
    BufferedFlush* bf = fIter.get();
    const GrPipeline* pipeline = bf->fPipeline;
    const GrPrimitiveProcessor* primProc = bf->fPrimitiveProcessor.get();
    fGpu->buildProgramDesc(&desc, *primProc, *pipeline, pipeline->descInfo(),
                           bf->fBatchTracker);

    GrGpu::DrawArgs args(primProc, pipeline, &desc, &bf->fBatchTracker);
    for (int i = 0; i < bf->fDraws.count(); i++) {
        fGpu->draw(args, bf->fDraws[i]);
    }
}
