1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrVkOpsRenderPass_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrVkOpsRenderPass_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkDrawable.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/vk/SkiaVulkan.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDeferredUpload.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGeometryProcessor.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOpsRenderPass.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkRenderPass.h" 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker #include <array> 23*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 24*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 25*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker class GrBuffer; 28*c8dee2aaSAndroid Build Coastguard Worker class GrGpu; 29*c8dee2aaSAndroid Build Coastguard Worker class GrOpFlushState; 30*c8dee2aaSAndroid Build Coastguard Worker class GrPipeline; 31*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo; 32*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget; 33*c8dee2aaSAndroid Build Coastguard Worker class GrScissorState; 34*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy; 35*c8dee2aaSAndroid Build Coastguard Worker class GrVkCommandBuffer; 36*c8dee2aaSAndroid Build Coastguard Worker class GrVkFramebuffer; 37*c8dee2aaSAndroid Build Coastguard Worker class GrVkGpu; 38*c8dee2aaSAndroid Build Coastguard Worker class GrVkPipelineState; 39*c8dee2aaSAndroid Build Coastguard Worker class GrVkSecondaryCommandBuffer; 40*c8dee2aaSAndroid Build Coastguard Worker enum GrSurfaceOrigin : int; 41*c8dee2aaSAndroid Build Coastguard Worker enum class GrPrimitiveRestart : bool; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker class GrVkOpsRenderPass : public GrOpsRenderPass { 44*c8dee2aaSAndroid Build Coastguard Worker public: 45*c8dee2aaSAndroid Build Coastguard Worker GrVkOpsRenderPass(GrVkGpu*); 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker ~GrVkOpsRenderPass() override; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override; 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker void onExecuteDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>) override; 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker bool set(GrRenderTarget*, 54*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkFramebuffer>, 55*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 56*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& bounds, 57*c8dee2aaSAndroid Build Coastguard Worker const GrOpsRenderPass::LoadAndStoreInfo&, 58*c8dee2aaSAndroid Build Coastguard Worker const GrOpsRenderPass::StencilLoadAndStoreInfo&, 59*c8dee2aaSAndroid Build Coastguard Worker const GrOpsRenderPass::LoadAndStoreInfo& resolveInfo, 60*c8dee2aaSAndroid Build Coastguard Worker GrVkRenderPass::SelfDependencyFlags selfDepFlags, 61*c8dee2aaSAndroid Build Coastguard Worker GrVkRenderPass::LoadFromResolve loadFromResolve, 62*c8dee2aaSAndroid Build Coastguard Worker const skia_private::TArray<GrSurfaceProxy*, true>& sampledProxies); 63*c8dee2aaSAndroid Build Coastguard Worker void reset(); 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker void submit(); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG isActive()68*c8dee2aaSAndroid Build Coastguard Worker bool isActive() const { return fIsActive; } 69*c8dee2aaSAndroid Build Coastguard Worker #endif 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker private: 72*c8dee2aaSAndroid Build Coastguard Worker bool init(const GrOpsRenderPass::LoadAndStoreInfo& colorInfo, 73*c8dee2aaSAndroid Build Coastguard Worker const GrOpsRenderPass::LoadAndStoreInfo& resolveInfo, 74*c8dee2aaSAndroid Build Coastguard Worker const GrOpsRenderPass::StencilLoadAndStoreInfo&); 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker // Called instead of init when we are drawing to a render target that already wraps a secondary 77*c8dee2aaSAndroid Build Coastguard Worker // command buffer. 78*c8dee2aaSAndroid Build Coastguard Worker bool initWrapped(); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker bool wrapsSecondaryCommandBuffer() const; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker GrGpu* gpu() override; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker GrVkCommandBuffer* currentCommandBuffer(); 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker void onEnd() override; 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker bool onBindPipeline(const GrProgramInfo&, const SkRect& drawBounds) override; 89*c8dee2aaSAndroid Build Coastguard Worker void onSetScissorRect(const SkIRect&) override; 90*c8dee2aaSAndroid Build Coastguard Worker bool onBindTextures(const GrGeometryProcessor&, 91*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* const geomProcTextures[], 92*c8dee2aaSAndroid Build Coastguard Worker const GrPipeline&) override; 93*c8dee2aaSAndroid Build Coastguard Worker void onBindBuffers(sk_sp<const GrBuffer> indexBuffer, sk_sp<const GrBuffer> instanceBuffer, 94*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer> vertexBuffer, GrPrimitiveRestart) override; onDraw(int vertexCount,int baseVertex)95*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int vertexCount, int baseVertex) override { 96*c8dee2aaSAndroid Build Coastguard Worker this->onDrawInstanced(1, 0, vertexCount, baseVertex); 97*c8dee2aaSAndroid Build Coastguard Worker } onDrawIndexed(int indexCount,int baseIndex,uint16_t minIndexValue,uint16_t maxIndexValue,int baseVertex)98*c8dee2aaSAndroid Build Coastguard Worker void onDrawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue, 99*c8dee2aaSAndroid Build Coastguard Worker uint16_t maxIndexValue, int baseVertex) override { 100*c8dee2aaSAndroid Build Coastguard Worker this->onDrawIndexedInstanced(indexCount, baseIndex, 1, 0, baseVertex); 101*c8dee2aaSAndroid Build Coastguard Worker } 102*c8dee2aaSAndroid Build Coastguard Worker void onDrawInstanced(int instanceCount, int baseInstance, int vertexCount, 103*c8dee2aaSAndroid Build Coastguard Worker int baseVertex) override; 104*c8dee2aaSAndroid Build Coastguard Worker void onDrawIndexedInstanced(int indexCount, int baseIndex, int instanceCount, int baseInstance, 105*c8dee2aaSAndroid Build Coastguard Worker int baseVertex) override; 106*c8dee2aaSAndroid Build Coastguard Worker void onDrawIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount) override; 107*c8dee2aaSAndroid Build Coastguard Worker void onDrawIndexedIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, 108*c8dee2aaSAndroid Build Coastguard Worker int drawCount) override; 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker void onClear(const GrScissorState& scissor, std::array<float, 4> color) override; 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker void onClearStencilClip(const GrScissorState& scissor, bool insideStencilMask) override; 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker using LoadFromResolve = GrVkRenderPass::LoadFromResolve; 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker bool beginRenderPass(const VkClearValue& clearColor, LoadFromResolve loadFromResolve); 117*c8dee2aaSAndroid Build Coastguard Worker 118*c8dee2aaSAndroid Build Coastguard Worker void addAdditionalRenderPass(bool mustUseSecondaryCommandBuffer); 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker void setAttachmentLayouts(LoadFromResolve loadFromResolve); 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker void loadResolveIntoMSAA(const SkIRect& nativeBounds); 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker using SelfDependencyFlags = GrVkRenderPass::SelfDependencyFlags; 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkFramebuffer> fFramebuffer; 127*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrVkSecondaryCommandBuffer> fCurrentSecondaryCommandBuffer; 128*c8dee2aaSAndroid Build Coastguard Worker const GrVkRenderPass* fCurrentRenderPass; 129*c8dee2aaSAndroid Build Coastguard Worker SkIRect fCurrentPipelineBounds; 130*c8dee2aaSAndroid Build Coastguard Worker GrVkPipelineState* fCurrentPipelineState = nullptr; 131*c8dee2aaSAndroid Build Coastguard Worker bool fCurrentCBIsEmpty = true; 132*c8dee2aaSAndroid Build Coastguard Worker SkIRect fBounds; 133*c8dee2aaSAndroid Build Coastguard Worker SelfDependencyFlags fSelfDependencyFlags = SelfDependencyFlags::kNone; 134*c8dee2aaSAndroid Build Coastguard Worker LoadFromResolve fLoadFromResolve = LoadFromResolve::kNo; 135*c8dee2aaSAndroid Build Coastguard Worker bool fOverridePipelinesForResolveLoad = false; 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker GrVkGpu* fGpu; 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 140*c8dee2aaSAndroid Build Coastguard Worker // When we are actively recording into the GrVkOpsRenderPass we set this flag to true. This 141*c8dee2aaSAndroid Build Coastguard Worker // then allows us to assert that we never submit a primary command buffer to the queue while in 142*c8dee2aaSAndroid Build Coastguard Worker // a recording state. This is needed since when we submit to the queue we change command pools 143*c8dee2aaSAndroid Build Coastguard Worker // and may trigger the old one to be reset, but a recording GrVkOpsRenderPass may still have 144*c8dee2aaSAndroid Build Coastguard Worker // a outstanding secondary command buffer allocated from that pool that we'll try to access 145*c8dee2aaSAndroid Build Coastguard Worker // after the pool as been reset. 146*c8dee2aaSAndroid Build Coastguard Worker bool fIsActive = false; 147*c8dee2aaSAndroid Build Coastguard Worker #endif 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrOpsRenderPass; 150*c8dee2aaSAndroid Build Coastguard Worker }; 151*c8dee2aaSAndroid Build Coastguard Worker 152*c8dee2aaSAndroid Build Coastguard Worker #endif 153