GrGLGpuCommandBuffer.h revision 952144753dc31d9d935683123cae43fca483bade
1066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel/*
27294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips* Copyright 2016 Google Inc.
37294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips*
47294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips* Use of this source code is governed by a BSD-style license that can be
57294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips* found in the LICENSE file.
67294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips*/
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:
27952144753dc31d9d935683123cae43fca483badeRobert Phillips    GrGLGpuCommandBuffer(GrGLGpu* gpu, GrRenderTarget* rt,
28952144753dc31d9d935683123cae43fca483badeRobert Phillips                         const GrGpuCommandBuffer::StencilLoadAndStoreInfo& stencilInfo)
29952144753dc31d9d935683123cae43fca483badeRobert Phillips            : fGpu(gpu)
30952144753dc31d9d935683123cae43fca483badeRobert Phillips            , fRenderTarget(static_cast<GrGLRenderTarget*>(rt)) {
31952144753dc31d9d935683123cae43fca483badeRobert Phillips        fClearSB = LoadOp::kClear == stencilInfo.fLoadOp;
32952144753dc31d9d935683123cae43fca483badeRobert Phillips    }
33066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
34d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon    ~GrGLGpuCommandBuffer() override {}
35066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
36952144753dc31d9d935683123cae43fca483badeRobert Phillips    void begin() override {
37952144753dc31d9d935683123cae43fca483badeRobert Phillips        if (fClearSB) {
38952144753dc31d9d935683123cae43fca483badeRobert Phillips            fGpu->clearStencil(fRenderTarget, 0x0);
39952144753dc31d9d935683123cae43fca483badeRobert Phillips        }
40952144753dc31d9d935683123cae43fca483badeRobert Phillips    }
41066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel    void end() override {}
42066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
434f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips    void discard(GrRenderTargetProxy* proxy) override {
444f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget());
45c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        if (!fRenderTarget) {
46c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon            fRenderTarget = target;
47c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        }
48c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        SkASSERT(target == fRenderTarget);
49c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon    }
50066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
5165a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips    void insertEventMarker(GrRenderTargetProxy* proxy, const char* msg) override {
5265a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget());
5365a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips        if (!fRenderTarget) {
5465a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips            fRenderTarget = target;
5565a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips        }
5665a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips        SkASSERT(target == fRenderTarget);
5765a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips
5865a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips        fGpu->insertEventMarker(msg);
5965a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips    }
6065a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips
61dbd11ec106e3726b09bf5d240c9fcbf6a671a570Greg Daniel    void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload,
624f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips                      GrRenderTargetProxy*) override {
6377b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel        state->doUpload(upload);
6477b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel    }
6577b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel
66066df7ca911b65d416783f3bec6f4f1662948ad5egdanielprivate:
679cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    GrGpu* gpu() override { return fGpu; }
6865a09274184ffd25d446352a96d3890ea7e625faGreg Daniel    GrRenderTarget* renderTarget() override { return fRenderTarget; }
699cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
7036a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel    void onSubmit() override {}
719cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
729cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    void onDraw(const GrPipeline& pipeline,
739cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel                const GrPrimitiveProcessor& primProc,
7446983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton                const GrMesh mesh[],
7546983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton                const GrPipeline::DynamicState dynamicStates[],
7636a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel                int meshCount,
7736a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel                const SkRect& bounds) override {
782890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(pipeline.renderTarget());
79c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        if (!fRenderTarget) {
80c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon            fRenderTarget = target;
81c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        }
82c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        SkASSERT(target == fRenderTarget);
8346983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount);
849cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
859cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
864f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips    void onClear(GrRenderTargetProxy* proxy, const GrFixedClip& clip, GrColor color) override {
874f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget());
88c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        if (!fRenderTarget) {
89c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon            fRenderTarget = target;
90c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        }
91c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        SkASSERT(target == fRenderTarget);
927294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips        fGpu->clear(clip, color, fRenderTarget);
939cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
949cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
954f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips    void onClearStencilClip(GrRenderTargetProxy* proxy, const GrFixedClip& clip,
9629df76096fd30941086324902a82656df2d8becdcsmartdalton                            bool insideStencilMask) override {
974f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips        GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget());
98c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        if (!fRenderTarget) {
99c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon            fRenderTarget = target;
100c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        }
101c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon        SkASSERT(target == fRenderTarget);
1027294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips        fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget);
1039cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
1049cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
1059cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    GrGLGpu*                    fGpu;
10665a09274184ffd25d446352a96d3890ea7e625faGreg Daniel    GrGLRenderTarget*           fRenderTarget;
107952144753dc31d9d935683123cae43fca483badeRobert Phillips    bool                        fClearSB;
108066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
109066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel    typedef GrGpuCommandBuffer INHERITED;
110066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel};
111066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
112066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#endif
113066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
114