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
17class GrGLGpu;
18class GrGLRenderTarget;
19
20class 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 */
26public:
27 GrGLOpsRenderPass(GrGLGpu* gpu) : fGpu(gpu) {}
28
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
36 void reset() {
37 fRenderTarget = nullptr;
38 }
39
40private:
41 GrGpu* gpu() override { return fGpu; }
42
43 void bindInstanceBuffer(const GrBuffer*, int baseInstance);
44 void bindVertexBuffer(const GrBuffer*, int baseVertex);
45
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(sk_sp<const GrBuffer> indexBuffer, sk_sp<const GrBuffer> instanceBuffer,
61 sk_sp<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 onDrawIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount) override;
70 void multiDrawArraysANGLE(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount);
71 void onDrawIndexedIndirect(const GrBuffer* drawIndirectBuffer, size_t offset,
72 int drawCount) override;
73 void multiDrawElementsANGLE(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount);
74 void onClear(const GrScissorState& scissor, const SkPMColor4f& color) override;
75 void onClearStencilClip(const GrScissorState& scissor, bool insideStencilMask) override;
76
77 GrGLGpu* fGpu;
78 SkIRect fContentBounds;
79 LoadAndStoreInfo fColorLoadAndStoreInfo;
80 StencilLoadAndStoreInfo fStencilLoadAndStoreInfo;
81
82 // Per-pipeline state.
83 GrPrimitiveType fPrimitiveType;
84 GrGLAttribArrayState* fAttribArrayState = nullptr;
85
86 // If using an index buffer, this gets set during onBindBuffers. It is either the CPU address of
87 // the indices, or nullptr if they reside physically in GPU memory.
88 const uint16_t* fIndexPointer;
89
90 // This tracks whether or not we bound the respective buffers during the bindBuffers call.
91 SkDEBUGCODE(bool fDidBindVertexBuffer = false;)
92 SkDEBUGCODE(bool fDidBindInstanceBuffer = false;)
93
94 typedef GrOpsRenderPass INHERITED;
95};
96
97#endif
98