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