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

#ifndef GrGLGpuCommandBuffer_DEFINED
#define GrGLGpuCommandBuffer_DEFINED

#include "GrGpuCommandBuffer.h"

#include "GrGLGpu.h"
#include "GrOpFlushState.h"

class GrGLRenderTarget;

class GrGLGpuCommandBuffer : public GrGpuCommandBuffer {
/**
 * We do not actually buffer up draws or do any work in the this class for GL. Instead commands
 * are immediately sent to the gpu to execute. Thus all the commands in this class are simply
 * pass through functions to corresponding calls in the GrGLGpu class.
 */
public:
    GrGLGpuCommandBuffer(GrGLGpu* gpu) : fGpu(gpu), fRenderTarget(nullptr) {}

    virtual ~GrGLGpuCommandBuffer() {}

    void end() override {}

    void discard(GrRenderTarget* rt) override {
        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
        if (!fRenderTarget) {
            fRenderTarget = target;
        }
        SkASSERT(target == fRenderTarget);
    }

    void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload) override {
        state->doUpload(upload);
    }

private:
    GrGpu* gpu() override { return fGpu; }
    GrRenderTarget* renderTarget() override { return fRenderTarget; }

    void onSubmit() override {}

    void onDraw(const GrPipeline& pipeline,
                const GrPrimitiveProcessor& primProc,
                const GrMesh* mesh,
                int meshCount,
                const SkRect& bounds) override {
        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(pipeline.getRenderTarget());
        if (!fRenderTarget) {
            fRenderTarget = target;
        }
        SkASSERT(target == fRenderTarget);
        fGpu->draw(pipeline, primProc, mesh, meshCount);
    }

    void onClear(GrRenderTarget* rt, const GrFixedClip& clip, GrColor color) override {
        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
        if (!fRenderTarget) {
            fRenderTarget = target;
        }
        SkASSERT(target == fRenderTarget);
        fGpu->clear(clip, color, fRenderTarget);
    }

    void onClearStencilClip(GrRenderTarget* rt, const GrFixedClip& clip,
                            bool insideStencilMask) override {
        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
        if (!fRenderTarget) {
            fRenderTarget = target;
        }
        SkASSERT(target == fRenderTarget);
        fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget);
    }

    GrGLGpu*                    fGpu;
    GrGLRenderTarget*           fRenderTarget;

    typedef GrGpuCommandBuffer INHERITED;
};

#endif

