1/*
2* Copyright 2016 Google Inc.
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
8#ifndef GrGLGpuCommandBuffer_DEFINED
9#define GrGLGpuCommandBuffer_DEFINED
10
11#include "GrGpuCommandBuffer.h"
12
13#include "GrGLGpu.h"
14#include "GrGLRenderTarget.h"
15#include "GrOpFlushState.h"
16
17class GrGLGpu;
18class GrGLRenderTarget;
19
20class GrGLGpuCommandBuffer : public GrGpuCommandBuffer {
21/**
22 * We do not actually buffer up draws or do any work in the this class for GL. Instead commands
23 * are immediately sent to the gpu to execute. Thus all the commands in this class are simply
24 * pass through functions to corresponding calls in the GrGLGpu class.
25 */
26public:
27    GrGLGpuCommandBuffer(GrGLGpu* gpu) : fGpu(gpu), fRenderTarget(nullptr) {}
28
29    ~GrGLGpuCommandBuffer() override {}
30
31    void end() override {}
32
33    void discard(GrRenderTarget* rt) override {
34        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
35        if (!fRenderTarget) {
36            fRenderTarget = target;
37        }
38        SkASSERT(target == fRenderTarget);
39    }
40
41    void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload,
42                      GrRenderTarget*) override {
43        state->doUpload(upload);
44    }
45
46private:
47    GrGpu* gpu() override { return fGpu; }
48    GrRenderTarget* renderTarget() override { return fRenderTarget; }
49
50    void onSubmit() override {}
51
52    void onDraw(const GrPipeline& pipeline,
53                const GrPrimitiveProcessor& primProc,
54                const GrMesh mesh[],
55                const GrPipeline::DynamicState dynamicStates[],
56                int meshCount,
57                const SkRect& bounds) override {
58        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(pipeline.getRenderTarget());
59        if (!fRenderTarget) {
60            fRenderTarget = target;
61        }
62        SkASSERT(target == fRenderTarget);
63        fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount);
64    }
65
66    void onClear(GrRenderTarget* rt, const GrFixedClip& clip, GrColor color) override {
67        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
68        if (!fRenderTarget) {
69            fRenderTarget = target;
70        }
71        SkASSERT(target == fRenderTarget);
72        fGpu->clear(clip, color, fRenderTarget);
73    }
74
75    void onClearStencilClip(GrRenderTarget* rt, const GrFixedClip& clip,
76                            bool insideStencilMask) override {
77        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
78        if (!fRenderTarget) {
79            fRenderTarget = target;
80        }
81        SkASSERT(target == fRenderTarget);
82        fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget);
83    }
84
85    GrGLGpu*                    fGpu;
86    GrGLRenderTarget*           fRenderTarget;
87
88    typedef GrGpuCommandBuffer INHERITED;
89};
90
91#endif
92
93