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(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 onDrawIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount) override;
70 void onDrawIndexedIndirect(const GrBuffer* drawIndirectBuffer, size_t offset,
71 int drawCount) override;
72 void onClear(const GrFixedClip& clip, const SkPMColor4f& color) override;
73 void onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) override;
74
75 GrGLGpu* fGpu;
76 SkIRect fContentBounds;
77 LoadAndStoreInfo fColorLoadAndStoreInfo;
78 StencilLoadAndStoreInfo fStencilLoadAndStoreInfo;
79
80 // Per-pipeline state.
81 GrPrimitiveType fPrimitiveType;
82 GrGLAttribArrayState* fAttribArrayState = nullptr;
83
84 // If using an index buffer, this gets set during onBindBuffers. It is either the CPU address of
85 // the indices, or nullptr if they reside physically in GPU memory.
86 const uint16_t* fIndexPointer;
87
88 typedef GrOpsRenderPass INHERITED;
89};
90
91#endif
92
93