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 GrGLOpsRenderPass_DEFINED
9 #define GrGLOpsRenderPass_DEFINED
10 
11 #include "src/gpu/GrOpsRenderPass.h"
12 
13 #include "src/gpu/GrOpFlushState.h"
14 #include "src/gpu/gl/GrGLGpu.h"
15 #include "src/gpu/gl/GrGLRenderTarget.h"
16 
17 class GrGLGpu;
18 class GrGLRenderTarget;
19 
20 class GrGLOpsRenderPass : public GrOpsRenderPass {
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  */
26 public:
GrGLOpsRenderPass(GrGLGpu * gpu)27     GrGLOpsRenderPass(GrGLGpu* gpu) : fGpu(gpu) {}
28 
inlineUpload(GrOpFlushState * state,GrDeferredTextureUploadFn & upload)29     void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override {
30         state->doUpload(upload);
31     }
32 
33     void set(GrRenderTarget*, const SkIRect& contentBounds, GrSurfaceOrigin,
34              const LoadAndStoreInfo&, const StencilLoadAndStoreInfo&);
35 
reset()36     void reset() {
37         fRenderTarget = nullptr;
38     }
39 
40 private:
gpu()41     GrGpu* gpu() override { return fGpu; }
42 
43     void setupGeometry(const GrBuffer* vertexBuffer, int baseVertex, const GrBuffer* instanceBuffer,
44                        int baseInstance);
45 
offsetForBaseIndex(int baseIndex)46     const void* offsetForBaseIndex(int baseIndex) const {
47         if (!fIndexPointer) {
48             // nullptr != 0. Adding an offset to a nullptr is undefined.
49             return (void*)(baseIndex * sizeof(uint16_t));
50         }
51         return fIndexPointer + baseIndex;
52     }
53 
54     void onBegin() override;
55     void onEnd() override;
56     bool onBindPipeline(const GrProgramInfo& programInfo, const SkRect& drawBounds) override;
57     void onSetScissorRect(const SkIRect& scissor) override;
58     bool onBindTextures(const GrPrimitiveProcessor&, const GrSurfaceProxy* const primProcTextures[],
59                         const GrPipeline& pipeline) override;
60     void onBindBuffers(const GrBuffer* indexBuffer, const GrBuffer* instanceBuffer,
61                        const GrBuffer* vertexBuffer, GrPrimitiveRestart) override;
62     void onDraw(int vertexCount, int baseVertex) override;
63     void onDrawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue,
64                        uint16_t maxIndexValue, int baseVertex) override;
65     void onDrawInstanced(int instanceCount, int baseInstance, int vertexCount,
66                          int baseVertex) override;
67     void onDrawIndexedInstanced(int indexCount, int baseIndex, int instanceCount, int baseInstance,
68                                 int baseVertex) override;
69     void onClear(const GrFixedClip& clip, const SkPMColor4f& color) override;
70     void onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) override;
71 
72     GrGLGpu* fGpu;
73     SkIRect fContentBounds;
74     LoadAndStoreInfo fColorLoadAndStoreInfo;
75     StencilLoadAndStoreInfo fStencilLoadAndStoreInfo;
76 
77     // Per-pipeline state.
78     GrPrimitiveType fPrimitiveType;
79     GrGLAttribArrayState* fAttribArrayState = nullptr;
80 
81     // If using an index buffer, this gets set during onBindBuffers. It is either the CPU address of
82     // the indices, or nullptr if they reside physically in GPU memory.
83     const uint16_t* fIndexPointer;
84 
85     typedef GrOpsRenderPass INHERITED;
86 };
87 
88 #endif
89 
90