GrGLGpuCommandBuffer.h revision 2890fbfe1400b81e4d6af98d14dfe757fec93650
1066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel/*
2066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* Copyright 2016 Google Inc.
3066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel*
4066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* Use of this source code is governed by a BSD-style license that can be
5066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* found in the LICENSE file.
6066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel*/
7066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
8066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#ifndef GrGLGpuCommandBuffer_DEFINED
9066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#define GrGLGpuCommandBuffer_DEFINED
10066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
11066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#include "GrGpuCommandBuffer.h"
12066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
13466c7d65974a055ad361430e57f92584b09af0bdHal Canary#include "GrGLGpu.h"
14466c7d65974a055ad361430e57f92584b09af0bdHal Canary#include "GrGLRenderTarget.h"
15742e31de1599f3902810aecdf2e2e3eed3b40a09Brian Salomon#include "GrOpFlushState.h"
16066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
17009e9af5549301be41cfbd9f286ad90842e4096bRobert Phillipsclass GrGLGpu;
1865a09274184ffd25d446352a96d3890ea7e625faGreg Danielclass GrGLRenderTarget;
1965a09274184ffd25d446352a96d3890ea7e625faGreg Daniel
20066df7ca911b65d416783f3bec6f4f1662948ad5egdanielclass GrGLGpuCommandBuffer : public GrGpuCommandBuffer {
219cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel/**
229cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * We do not actually buffer up draws or do any work in the this class for GL. Instead commands
239cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * are immediately sent to the gpu to execute. Thus all the commands in this class are simply
249cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * pass through functions to corresponding calls in the GrGLGpu class.
259cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel */
26066df7ca911b65d416783f3bec6f4f1662948ad5egdanielpublic:
27c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon    GrGLGpuCommandBuffer(GrGLGpu* gpu) : fGpu(gpu), fRenderTarget(nullptr) {}
28066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
29d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon    ~GrGLGpuCommandBuffer() override {}
30066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
31066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel    void end() override {}
32066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
33c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon    void discard(GrRenderTarget* rt) override {
34c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
35c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        if (!fRenderTarget) {
36c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon            fRenderTarget = target;
37c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        }
38c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        SkASSERT(target == fRenderTarget);
39c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon    }
40066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
41dbd11ec106e3726b09bf5d240c9fcbf6a671a570Greg Daniel    void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload,
42dbd11ec106e3726b09bf5d240c9fcbf6a671a570Greg Daniel                      GrRenderTarget*) override {
4377b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel        state->doUpload(upload);
4477b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel    }
4577b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel
46066df7ca911b65d416783f3bec6f4f1662948ad5egdanielprivate:
479cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    GrGpu* gpu() override { return fGpu; }
4865a09274184ffd25d446352a96d3890ea7e625faGreg Daniel    GrRenderTarget* renderTarget() override { return fRenderTarget; }
499cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
5036a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel    void onSubmit() override {}
519cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
529cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    void onDraw(const GrPipeline& pipeline,
539cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel                const GrPrimitiveProcessor& primProc,
5446983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton                const GrMesh mesh[],
5546983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton                const GrPipeline::DynamicState dynamicStates[],
5636a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel                int meshCount,
5736a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel                const SkRect& bounds) override {
582890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(pipeline.renderTarget());
59c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        if (!fRenderTarget) {
60c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon            fRenderTarget = target;
61c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        }
62c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        SkASSERT(target == fRenderTarget);
6346983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount);
649cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
659cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
66c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon    void onClear(GrRenderTarget* rt, const GrFixedClip& clip, GrColor color) override {
67c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
68c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        if (!fRenderTarget) {
69c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon            fRenderTarget = target;
70c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        }
71c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        SkASSERT(target == fRenderTarget);
7265a09274184ffd25d446352a96d3890ea7e625faGreg Daniel        fGpu->clear(clip, color, fRenderTarget);
739cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
749cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
75c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon    void onClearStencilClip(GrRenderTarget* rt, const GrFixedClip& clip,
7629df76096fd30941086324902a82656df2d8becdcsmartdalton                            bool insideStencilMask) override {
77c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt);
78c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        if (!fRenderTarget) {
79c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon            fRenderTarget = target;
80c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        }
81c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        SkASSERT(target == fRenderTarget);
8265a09274184ffd25d446352a96d3890ea7e625faGreg Daniel        fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget);
839cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
849cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
859cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    GrGLGpu*                    fGpu;
8665a09274184ffd25d446352a96d3890ea7e625faGreg Daniel    GrGLRenderTarget*           fRenderTarget;
87066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
88066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel    typedef GrGpuCommandBuffer INHERITED;
89066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel};
90066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
91066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#endif
92066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
93