1066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel/*
2b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips * Copyright 2016 Google Inc.
3b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips *
4b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips * Use of this source code is governed by a BSD-style license that can be
5b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips * found in the LICENSE file.
6b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert 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
20500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Danielclass GrGLGpuTextureCommandBuffer : public GrGpuTextureCommandBuffer {
21500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Danielpublic:
22500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    GrGLGpuTextureCommandBuffer(GrGLGpu* gpu, GrTexture* texture, GrSurfaceOrigin origin)
23500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel        : INHERITED(texture, origin)
24500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel        , fGpu(gpu) {
25500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    }
26500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
27500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    ~GrGLGpuTextureCommandBuffer() override {}
28500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
29500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    void submit() override {}
30500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
31b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips    void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
32b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips              const SkIPoint& dstPoint) override {
33b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips        fGpu->copySurface(fTexture, fOrigin, src, srcOrigin, srcRect, dstPoint);
34500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    }
35500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
36500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    void insertEventMarker(const char* msg) override {
37500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel        fGpu->insertEventMarker(msg);
38500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    }
39500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
40500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Danielprivate:
41b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips    GrGLGpu* fGpu;
42500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
43500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    typedef GrGpuTextureCommandBuffer INHERITED;
44500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel};
45500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
46500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Danielclass GrGLGpuRTCommandBuffer : public GrGpuRTCommandBuffer {
479cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel/**
489cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * We do not actually buffer up draws or do any work in the this class for GL. Instead commands
499cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * are immediately sent to the gpu to execute. Thus all the commands in this class are simply
509cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * pass through functions to corresponding calls in the GrGLGpu class.
519cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel */
52066df7ca911b65d416783f3bec6f4f1662948ad5egdanielpublic:
53500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    GrGLGpuRTCommandBuffer(GrGLGpu* gpu, GrRenderTarget* rt, GrSurfaceOrigin origin,
546b47c7d19fcc95d2c3dbce582a8d68bb3bf6ba2aRobert Phillips                           const GrGpuRTCommandBuffer::LoadAndStoreInfo& colorInfo,
55500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel                           const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo& stencilInfo)
5619e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips            : INHERITED(rt, origin)
576b47c7d19fcc95d2c3dbce582a8d68bb3bf6ba2aRobert Phillips            , fGpu(gpu)
586b47c7d19fcc95d2c3dbce582a8d68bb3bf6ba2aRobert Phillips            , fColorLoadAndStoreInfo(colorInfo)
596b47c7d19fcc95d2c3dbce582a8d68bb3bf6ba2aRobert Phillips            , fStencilLoadAndStoreInfo(stencilInfo) {
60952144753dc31d9d935683123cae43fca483badeRobert Phillips    }
61066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
62500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    ~GrGLGpuRTCommandBuffer() override {}
63066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
64cb2e235e6fb5d9230c41ccf58b865c90ff928f67Robert Phillips    void begin() override;
65066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel    void end() override {}
66066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
6719e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips    void discard() override { }
6865a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips
6919e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips    void insertEventMarker(const char* msg) override {
7065a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips        fGpu->insertEventMarker(msg);
7165a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips    }
7265a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips
73943ed7910f938d7b4894b4e925566cf7b7053f29Brian Salomon    void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override {
7477b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel        state->doUpload(upload);
7577b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel    }
7677b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel
77b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips    void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
78b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips              const SkIPoint& dstPoint) override {
79b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips        fGpu->copySurface(fRenderTarget, fOrigin, src, srcOrigin, srcRect, dstPoint);
80500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    }
81500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
82500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    void submit() override {}
83500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel
84066df7ca911b65d416783f3bec6f4f1662948ad5egdanielprivate:
859cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    GrGpu* gpu() override { return fGpu; }
869cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
879cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    void onDraw(const GrPipeline& pipeline,
889cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel                const GrPrimitiveProcessor& primProc,
8946983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton                const GrMesh mesh[],
9046983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton                const GrPipeline::DynamicState dynamicStates[],
9136a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel                int meshCount,
9236a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel                const SkRect& bounds) override {
9319e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips        SkASSERT(pipeline.renderTarget() == fRenderTarget);
9446983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton        fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount);
959cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
969cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
9719e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips    void onClear(const GrFixedClip& clip, GrColor color) override {
9819e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips        fGpu->clear(clip, color, fRenderTarget, fOrigin);
999cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
1009cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
10119e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips    void onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) override {
10219e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042Robert Phillips        fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget, fOrigin);
1039cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel    }
1049cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel
1056b47c7d19fcc95d2c3dbce582a8d68bb3bf6ba2aRobert Phillips    GrGLGpu*                                      fGpu;
1066b47c7d19fcc95d2c3dbce582a8d68bb3bf6ba2aRobert Phillips    GrGpuRTCommandBuffer::LoadAndStoreInfo        fColorLoadAndStoreInfo;
1076b47c7d19fcc95d2c3dbce582a8d68bb3bf6ba2aRobert Phillips    GrGpuRTCommandBuffer::StencilLoadAndStoreInfo fStencilLoadAndStoreInfo;
108066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
109500d58b2a6e6fd03239622da42b67b2c9843b7beGreg Daniel    typedef GrGpuRTCommandBuffer INHERITED;
110066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel};
111066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
112066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#endif
113066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel
114