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