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