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 GrGLGpuTextureCommandBuffer : public GrGpuTextureCommandBuffer {
21public:
22    GrGLGpuTextureCommandBuffer(GrGLGpu* gpu, GrTexture* texture, GrSurfaceOrigin origin)
23        : INHERITED(texture, origin)
24        , fGpu(gpu) {
25    }
26
27    ~GrGLGpuTextureCommandBuffer() override {}
28
29    void submit() override {}
30
31    void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
32              const SkIPoint& dstPoint) override {
33        fGpu->copySurface(fTexture, fOrigin, src, srcOrigin, srcRect, dstPoint);
34    }
35
36    void insertEventMarker(const char* msg) override {
37        fGpu->insertEventMarker(msg);
38    }
39
40private:
41    GrGLGpu* fGpu;
42
43    typedef GrGpuTextureCommandBuffer INHERITED;
44};
45
46class GrGLGpuRTCommandBuffer : public GrGpuRTCommandBuffer {
47/**
48 * We do not actually buffer up draws or do any work in the this class for GL. Instead commands
49 * are immediately sent to the gpu to execute. Thus all the commands in this class are simply
50 * pass through functions to corresponding calls in the GrGLGpu class.
51 */
52public:
53    GrGLGpuRTCommandBuffer(GrGLGpu* gpu, GrRenderTarget* rt, GrSurfaceOrigin origin,
54                           const GrGpuRTCommandBuffer::LoadAndStoreInfo& colorInfo,
55                           const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo& stencilInfo)
56            : INHERITED(rt, origin)
57            , fGpu(gpu)
58            , fColorLoadAndStoreInfo(colorInfo)
59            , fStencilLoadAndStoreInfo(stencilInfo) {
60    }
61
62    ~GrGLGpuRTCommandBuffer() override {}
63
64    void begin() override;
65    void end() override {}
66
67    void discard() override { }
68
69    void insertEventMarker(const char* msg) override {
70        fGpu->insertEventMarker(msg);
71    }
72
73    void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override {
74        state->doUpload(upload);
75    }
76
77    void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
78              const SkIPoint& dstPoint) override {
79        fGpu->copySurface(fRenderTarget, fOrigin, src, srcOrigin, srcRect, dstPoint);
80    }
81
82    void submit() override {}
83
84private:
85    GrGpu* gpu() override { return fGpu; }
86
87    void onDraw(const GrPipeline& pipeline,
88                const GrPrimitiveProcessor& primProc,
89                const GrMesh mesh[],
90                const GrPipeline::DynamicState dynamicStates[],
91                int meshCount,
92                const SkRect& bounds) override {
93        SkASSERT(pipeline.renderTarget() == fRenderTarget);
94        fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount);
95    }
96
97    void onClear(const GrFixedClip& clip, GrColor color) override {
98        fGpu->clear(clip, color, fRenderTarget, fOrigin);
99    }
100
101    void onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) override {
102        fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget, fOrigin);
103    }
104
105    GrGLGpu*                                      fGpu;
106    GrGpuRTCommandBuffer::LoadAndStoreInfo        fColorLoadAndStoreInfo;
107    GrGpuRTCommandBuffer::StencilLoadAndStoreInfo fStencilLoadAndStoreInfo;
108
109    typedef GrGpuRTCommandBuffer INHERITED;
110};
111
112#endif
113
114