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*, bool useMSAASurface, 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 bindInstanceBuffer(const GrBuffer*, int baseInstance); 44 void bindVertexBuffer(const GrBuffer*, int baseVertex); 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 // Ideally we load and store DMSAA only within the content bounds of our render pass, but if 55 // the caps don't allow for partial framebuffer blits, we resolve the full target. 56 // We resolve the same bounds during load and store both because if we have to do a full size 57 // resolve at the end, the full DMSAA attachment needs to have valid content. 58 GrNativeRect dmsaaLoadStoreBounds() const; 59 60 void onBegin() override; 61 void onEnd() override; 62 bool onBindPipeline(const GrProgramInfo& programInfo, const SkRect& drawBounds) override; 63 void onSetScissorRect(const SkIRect& scissor) override; 64 bool onBindTextures(const GrGeometryProcessor&, 65 const GrSurfaceProxy* const geomProcTextures[], 66 const GrPipeline&) override; 67 void onBindBuffers(sk_sp<const GrBuffer> indexBuffer, sk_sp<const GrBuffer> instanceBuffer, 68 sk_sp<const GrBuffer> vertexBuffer, GrPrimitiveRestart) override; 69 void onDraw(int vertexCount, int baseVertex) override; 70 void onDrawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue, 71 uint16_t maxIndexValue, int baseVertex) override; 72 void onDrawInstanced(int instanceCount, int baseInstance, int vertexCount, 73 int baseVertex) override; 74 void onDrawIndexedInstanced(int indexCount, int baseIndex, int instanceCount, int baseInstance, 75 int baseVertex) override; 76 void onDrawIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount) override; 77 void multiDrawArraysANGLEOrWebGL(const GrBuffer* drawIndirectBuffer, size_t offset, 78 int drawCount); 79 void onDrawIndexedIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, 80 int drawCount) override; 81 void multiDrawElementsANGLEOrWebGL(const GrBuffer* drawIndirectBuffer, size_t offset, 82 int drawCount); 83 void onClear(const GrScissorState& scissor, std::array<float, 4> color) override; 84 void onClearStencilClip(const GrScissorState& scissor, bool insideStencilMask) override; 85 86 GrGLGpu* const fGpu; 87 88 bool fUseMultisampleFBO; 89 SkIRect fContentBounds; 90 LoadAndStoreInfo fColorLoadAndStoreInfo; 91 StencilLoadAndStoreInfo fStencilLoadAndStoreInfo; 92 93 // Per-pipeline state. 94 GrPrimitiveType fPrimitiveType; 95 GrGLAttribArrayState* fAttribArrayState = nullptr; 96 97 // If using an index buffer, this gets set during onBindBuffers. It is either the CPU address of 98 // the indices, or nullptr if they reside physically in GPU memory. 99 const uint16_t* fIndexPointer; 100 101 // This tracks whether or not we bound the respective buffers during the bindBuffers call. 102 SkDEBUGCODE(bool fDidBindVertexBuffer = false;) 103 SkDEBUGCODE(bool fDidBindInstanceBuffer = false;) 104 105 using INHERITED = GrOpsRenderPass; 106 }; 107 108 #endif 109