1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrVkRenderTarget_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrVkRenderTarget_DEFINED
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkImage.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrRenderTarget.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkRenderPass.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkResourceProvider.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrVkCommandBuffer;
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrVkFramebuffer;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrVkGpu;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrVkImageView;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrVkStencilAttachment;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct GrVkImageInfo;
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifdef SK_BUILD_FOR_WIN
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Windows gives bogus warnings about inheriting asTexture/asRenderTarget via dominance.
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#pragma warning(push)
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#pragma warning(disable: 4250)
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrVkRenderTarget: public GrRenderTarget, public virtual GrVkImage {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static GrVkRenderTarget* CreateNewRenderTarget(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&,
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   const GrVkImage::ImageDesc&);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<GrVkRenderTarget> MakeWrappedRenderTarget(GrVkGpu*, const GrSurfaceDesc&,
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           const GrVkImageInfo*);
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~GrVkRenderTarget() override;
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkFramebuffer* framebuffer() const { return fFramebuffer; }
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkImageView* colorAttachmentView() const { return fColorAttachmentView; }
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkResource* msaaImageResource() const {
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fMSAAImage) {
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return fMSAAImage->fResource;
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkImage* msaaImage() { return fMSAAImage.get(); }
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkImageView* resolveAttachmentView() const { return fResolveAttachmentView; }
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkResource* stencilImageResource() const;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkImageView* stencilAttachmentView() const;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkRenderPass* simpleRenderPass() const { return fCachedSimpleRenderPass; }
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkResourceProvider::CompatibleRPHandle compatibleRenderPassHandle() const {
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fCompatibleRPHandle;
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // override of GrRenderTarget
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ResolveType getResolveType() const override {
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (this->numColorSamples() > 1) {
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return kCanResolve_ResolveType;
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return kAutoResolves_ResolveType;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool canAttemptStencilAttachment() const override {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return true;
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrBackendObject getRenderTargetHandle() const override;
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrBackendRenderTarget getBackendRenderTarget() const override;
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                  GrVkRenderPass::AttachmentFlags* flags) const;
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addResources(GrVkCommandBuffer& commandBuffer) const;
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget(GrVkGpu* gpu,
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrSurfaceDesc& desc,
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageInfo& info,
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageInfo& msaaInfo,
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageView* colorAttachmentView,
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageView* resolveAttachmentView,
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     GrBackendObjectOwnership);
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget(GrVkGpu* gpu,
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrSurfaceDesc& desc,
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageInfo& info,
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageView* colorAttachmentView,
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     GrBackendObjectOwnership);
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkGpu* getVkGpu() const;
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onAbandon() override;
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onRelease() override;
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // This accounts for the texture's memory and any MSAA renderbuffer's memory.
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t onGpuMemorySize() const override {
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int numColorSamples = this->numColorSamples();
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (numColorSamples > 1) {
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Add one to account for the resolved  VkImage.
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            numColorSamples += 1;
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      numColorSamples, GrMipMapped::kNo);
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void createFramebuffer(GrVkGpu* gpu);
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkImageView*       fColorAttachmentView;
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<GrVkImage> fMSAAImage;
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkImageView*       fResolveAttachmentView;
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget(GrVkGpu* gpu,
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     SkBudgeted,
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrSurfaceDesc& desc,
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageInfo& info,
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageInfo& msaaInfo,
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageView* colorAttachmentView,
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageView* resolveAttachmentView,
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     GrBackendObjectOwnership);
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget(GrVkGpu* gpu,
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     SkBudgeted,
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrSurfaceDesc& desc,
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageInfo& info,
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const GrVkImageView* colorAttachmentView,
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     GrBackendObjectOwnership);
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static GrVkRenderTarget* Create(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&,
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    const GrVkImageInfo&, GrBackendObjectOwnership);
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool completeStencilAttachment() override;
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void releaseInternalObjects();
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void abandonInternalObjects();
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkFramebuffer*     fFramebuffer;
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // This is a cached pointer to a simple render pass. The render target should unref it
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // once it is done with it.
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkRenderPass*      fCachedSimpleRenderPass;
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // This is a handle to be used to quickly get compatible GrVkRenderPasses for this render target
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkResourceProvider::CompatibleRPHandle fCompatibleRPHandle;
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
152