blob: 393d54dad7c4cce8eb69e224010be6d780dd0d17 [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
2 * Copyright 2015 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
9#ifndef GrVkRenderTarget_DEFINED
10#define GrVkRenderTarget_DEFINED
11
12#include "GrVkImage.h"
13#include "GrRenderTarget.h"
14
15#include "GrVkRenderPass.h"
egdanield62e28b2016-06-07 08:43:30 -070016#include "GrVkResourceProvider.h"
Greg Daniel487132b2018-12-20 14:09:36 -050017#include "vk/GrVkTypes.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050018
19class GrVkCommandBuffer;
20class GrVkFramebuffer;
21class GrVkGpu;
22class GrVkImageView;
Greg Daniel070cbaf2019-01-03 17:35:54 -050023class GrVkSecondaryCommandBuffer;
Greg Daniel164a9f02016-02-22 09:56:40 -050024class GrVkStencilAttachment;
25
egdanielb2df0c22016-05-13 11:30:37 -070026struct GrVkImageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -070027
Greg Daniel164a9f02016-02-22 09:56:40 -050028#ifdef SK_BUILD_FOR_WIN
29// Windows gives bogus warnings about inheriting asTexture/asRenderTarget via dominance.
30#pragma warning(push)
31#pragma warning(disable: 4250)
32#endif
33
34class GrVkRenderTarget: public GrRenderTarget, public virtual GrVkImage {
35public:
bungeman6bd52842016-10-27 09:30:08 -070036 static sk_sp<GrVkRenderTarget> MakeWrappedRenderTarget(GrVkGpu*, const GrSurfaceDesc&,
Greg Daniel52e16d92018-04-10 09:34:07 -040037 const GrVkImageInfo&,
38 sk_sp<GrVkImageLayout>);
Greg Daniel164a9f02016-02-22 09:56:40 -050039
Greg Danielb46add82019-01-02 14:51:29 -050040 static sk_sp<GrVkRenderTarget> MakeSecondaryCBRenderTarget(GrVkGpu*, const GrSurfaceDesc&,
41 const GrVkDrawableInfo& vkInfo);
42
Greg Daniel164a9f02016-02-22 09:56:40 -050043 ~GrVkRenderTarget() override;
44
Greg Daniel4065d452018-11-16 15:43:41 -050045 GrBackendFormat backendFormat() const override { return this->getBackendFormat(); }
46
Greg Daniel164a9f02016-02-22 09:56:40 -050047 const GrVkFramebuffer* framebuffer() const { return fFramebuffer; }
48 const GrVkImageView* colorAttachmentView() const { return fColorAttachmentView; }
egdanielb2df0c22016-05-13 11:30:37 -070049 const GrVkResource* msaaImageResource() const {
50 if (fMSAAImage) {
51 return fMSAAImage->fResource;
52 }
53 return nullptr;
54 }
Greg Daniel2db32322017-04-03 10:29:43 -040055 GrVkImage* msaaImage() { return fMSAAImage.get(); }
Greg Daniel164a9f02016-02-22 09:56:40 -050056 const GrVkImageView* resolveAttachmentView() const { return fResolveAttachmentView; }
egdanielb2df0c22016-05-13 11:30:37 -070057 const GrVkResource* stencilImageResource() const;
Greg Daniel164a9f02016-02-22 09:56:40 -050058 const GrVkImageView* stencilAttachmentView() const;
59
60 const GrVkRenderPass* simpleRenderPass() const { return fCachedSimpleRenderPass; }
egdaniel066df7c2016-06-08 14:02:27 -070061 GrVkResourceProvider::CompatibleRPHandle compatibleRenderPassHandle() const {
Greg Danielb46add82019-01-02 14:51:29 -050062 SkASSERT(!this->wrapsSecondaryCommandBuffer());
egdaniel066df7c2016-06-08 14:02:27 -070063 return fCompatibleRPHandle;
64 }
Greg Danielb46add82019-01-02 14:51:29 -050065 const GrVkRenderPass* externalRenderPass() const {
66 SkASSERT(this->wrapsSecondaryCommandBuffer());
67 // We use the cached simple render pass to hold the external render pass.
68 return fCachedSimpleRenderPass;
69 }
70
Greg Daniel070cbaf2019-01-03 17:35:54 -050071 bool wrapsSecondaryCommandBuffer() const { return fSecondaryCommandBuffer != nullptr; }
72 GrVkSecondaryCommandBuffer* getExternalSecondaryCommandBuffer() const {
73 return fSecondaryCommandBuffer;
74 }
Greg Daniel164a9f02016-02-22 09:56:40 -050075
76 // override of GrRenderTarget
77 ResolveType getResolveType() const override {
egdaniel66933552016-08-24 07:22:19 -070078 if (this->numColorSamples() > 1) {
79 return kCanResolve_ResolveType;
80 }
81 return kAutoResolves_ResolveType;
Greg Daniel164a9f02016-02-22 09:56:40 -050082 }
83
84 bool canAttemptStencilAttachment() const override {
Greg Danielb46add82019-01-02 14:51:29 -050085 // We don't know the status of the stencil attachment for wrapped external secondary command
86 // buffers so we just assume we don't have one.
87 return !this->wrapsSecondaryCommandBuffer();
Greg Daniel164a9f02016-02-22 09:56:40 -050088 }
89
Robert Phillipsb67821d2017-12-13 15:00:45 -050090 GrBackendRenderTarget getBackendRenderTarget() const override;
Greg Daniel164a9f02016-02-22 09:56:40 -050091
Greg Daniel164a9f02016-02-22 09:56:40 -050092 void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
93 GrVkRenderPass::AttachmentFlags* flags) const;
halcanary9d524f22016-03-29 09:03:52 -070094
Greg Daniel164a9f02016-02-22 09:56:40 -050095 void addResources(GrVkCommandBuffer& commandBuffer) const;
96
97protected:
Greg Daniel164a9f02016-02-22 09:56:40 -050098 GrVkRenderTarget(GrVkGpu* gpu,
99 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -0700100 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -0400101 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -0700102 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -0400103 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -0500104 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -0700105 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400106 GrBackendObjectOwnership);
Greg Daniel164a9f02016-02-22 09:56:40 -0500107
108 GrVkRenderTarget(GrVkGpu* gpu,
109 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -0700110 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -0400111 sk_sp<GrVkImageLayout> layout,
Greg Daniel164a9f02016-02-22 09:56:40 -0500112 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400113 GrBackendObjectOwnership);
Greg Daniel164a9f02016-02-22 09:56:40 -0500114
115 GrVkGpu* getVkGpu() const;
116
117 void onAbandon() override;
118 void onRelease() override;
119
120 // This accounts for the texture's memory and any MSAA renderbuffer's memory.
121 size_t onGpuMemorySize() const override {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500122 int numColorSamples = this->numColorSamples();
123 if (numColorSamples > 1) {
124 // Add one to account for the resolved VkImage.
125 numColorSamples += 1;
126 }
Brian Salomonbb5711a2017-05-17 13:49:59 -0400127 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
Greg Daniele252f082017-10-23 16:05:23 -0400128 numColorSamples, GrMipMapped::kNo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500129 }
130
egdaniel50ead532016-07-13 14:23:26 -0700131 void createFramebuffer(GrVkGpu* gpu);
132
133 const GrVkImageView* fColorAttachmentView;
Greg Daniel2db32322017-04-03 10:29:43 -0400134 std::unique_ptr<GrVkImage> fMSAAImage;
egdaniel50ead532016-07-13 14:23:26 -0700135 const GrVkImageView* fResolveAttachmentView;
136
Greg Daniel164a9f02016-02-22 09:56:40 -0500137private:
egdanielb2df0c22016-05-13 11:30:37 -0700138 GrVkRenderTarget(GrVkGpu* gpu,
egdanielb2df0c22016-05-13 11:30:37 -0700139 const GrSurfaceDesc& desc,
140 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -0400141 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -0700142 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -0400143 sk_sp<GrVkImageLayout> msaaLayout,
egdanielb2df0c22016-05-13 11:30:37 -0700144 const GrVkImageView* colorAttachmentView,
Greg Daniel001c67f2018-06-26 13:51:57 -0400145 const GrVkImageView* resolveAttachmentView);
egdanielb2df0c22016-05-13 11:30:37 -0700146
147 GrVkRenderTarget(GrVkGpu* gpu,
egdanielb2df0c22016-05-13 11:30:37 -0700148 const GrSurfaceDesc& desc,
149 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -0400150 sk_sp<GrVkImageLayout> layout,
Greg Daniel001c67f2018-06-26 13:51:57 -0400151 const GrVkImageView* colorAttachmentView);
egdanielb2df0c22016-05-13 11:30:37 -0700152
Greg Danielb46add82019-01-02 14:51:29 -0500153
154 GrVkRenderTarget(GrVkGpu* gpu,
155 const GrSurfaceDesc& desc,
156 const GrVkImageInfo& info,
157 sk_sp<GrVkImageLayout> layout,
158 const GrVkRenderPass* renderPass,
Greg Daniel070cbaf2019-01-03 17:35:54 -0500159 GrVkSecondaryCommandBuffer* secondaryCommandBuffer);
Greg Danielb46add82019-01-02 14:51:29 -0500160
Greg Daniel164a9f02016-02-22 09:56:40 -0500161 bool completeStencilAttachment() override;
162
Greg Daniel2d35a1c2019-02-01 14:48:10 -0500163 // In Vulkan we call the release proc after we are finished with the underlying
164 // GrVkImage::Resource object (which occurs after the GPU has finished all work on it).
165 void onSetRelease(sk_sp<GrReleaseProcHelper> releaseHelper) override {
166 // Forward the release proc on to GrVkImage
167 this->setResourceRelease(std::move(releaseHelper));
168 }
169
Greg Daniel164a9f02016-02-22 09:56:40 -0500170 void releaseInternalObjects();
171 void abandonInternalObjects();
172
173 const GrVkFramebuffer* fFramebuffer;
halcanary9d524f22016-03-29 09:03:52 -0700174
Greg Daniel164a9f02016-02-22 09:56:40 -0500175 // This is a cached pointer to a simple render pass. The render target should unref it
176 // once it is done with it.
177 const GrVkRenderPass* fCachedSimpleRenderPass;
egdanield62e28b2016-06-07 08:43:30 -0700178 // This is a handle to be used to quickly get compatible GrVkRenderPasses for this render target
179 GrVkResourceProvider::CompatibleRPHandle fCompatibleRPHandle;
Greg Danielb46add82019-01-02 14:51:29 -0500180
Greg Daniel070cbaf2019-01-03 17:35:54 -0500181 // If this render target wraps an external VkCommandBuffer, then this pointer will be non-null
182 // and will point to the GrVk object that, in turn, wraps the external VkCommandBuffer. In this
183 // case the render target will not be backed by an actual VkImage and will thus be limited in
184 // terms of what it can be used for.
185 GrVkSecondaryCommandBuffer* fSecondaryCommandBuffer = nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500186};
187
188#endif