blob: de73bb756522b07f4beaa15f9b710c87c22e0aed [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/gpu/vk/GrVkRenderTarget.h"
Greg Daniel164a9f02016-02-22 09:56:40 -05009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "include/gpu/GrBackendSurface.h"
11#include "src/gpu/GrRenderTargetPriv.h"
12#include "src/gpu/vk/GrVkCommandBuffer.h"
13#include "src/gpu/vk/GrVkFramebuffer.h"
14#include "src/gpu/vk/GrVkGpu.h"
15#include "src/gpu/vk/GrVkImageView.h"
16#include "src/gpu/vk/GrVkResourceProvider.h"
17#include "src/gpu/vk/GrVkUtil.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050018
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "include/gpu/vk/GrVkTypes.h"
jvanverthfd359ca2016-03-18 11:57:24 -070020
Greg Daniel164a9f02016-02-22 09:56:40 -050021#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
22
23// We're virtually derived from GrSurface (via GrRenderTarget) so its
24// constructor must be explicitly called.
25GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
26 const GrSurfaceDesc& desc,
Brian Salomon27b4d8d2019-07-22 14:23:45 -040027 int sampleCnt,
egdanielb2df0c22016-05-13 11:30:37 -070028 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040029 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070030 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040031 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050032 const GrVkImageView* colorAttachmentView,
Greg Daniel001c67f2018-06-26 13:51:57 -040033 const GrVkImageView* resolveAttachmentView)
Brian Salomone8a766b2019-07-19 14:24:36 -040034 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050035 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kBorrowed)
36 // for the moment we only support 1:1 color to stencil
Brian Salomon27b4d8d2019-07-22 14:23:45 -040037 , GrRenderTarget(gpu, desc, sampleCnt, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050038 , fColorAttachmentView(colorAttachmentView)
39 , fMSAAImage(new GrVkImage(msaaInfo, std::move(msaaLayout),
40 GrBackendObjectOwnership::kOwned))
41 , fResolveAttachmentView(resolveAttachmentView)
42 , fFramebuffer(nullptr)
43 , fCachedSimpleRenderPass(nullptr) {
Brian Salomone8a766b2019-07-19 14:24:36 -040044 SkASSERT(info.fProtected == msaaInfo.fProtected);
Brian Salomon27b4d8d2019-07-22 14:23:45 -040045 SkASSERT(sampleCnt > 1);
Greg Daniel164a9f02016-02-22 09:56:40 -050046 this->createFramebuffer(gpu);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050047 this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Daniel164a9f02016-02-22 09:56:40 -050048}
49
50// We're virtually derived from GrSurface (via GrRenderTarget) so its
51// constructor must be explicitly called.
52GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
53 const GrSurfaceDesc& desc,
Brian Salomon27b4d8d2019-07-22 14:23:45 -040054 int sampleCnt,
egdanielb2df0c22016-05-13 11:30:37 -070055 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040056 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070057 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040058 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050059 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070060 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040061 GrBackendObjectOwnership ownership)
Brian Salomone8a766b2019-07-19 14:24:36 -040062 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050063 , GrVkImage(info, std::move(layout), ownership)
64 // for the moment we only support 1:1 color to stencil
Brian Salomon27b4d8d2019-07-22 14:23:45 -040065 , GrRenderTarget(gpu, desc, sampleCnt, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050066 , fColorAttachmentView(colorAttachmentView)
67 , fMSAAImage(new GrVkImage(msaaInfo, std::move(msaaLayout),
68 GrBackendObjectOwnership::kOwned))
69 , fResolveAttachmentView(resolveAttachmentView)
70 , fFramebuffer(nullptr)
71 , fCachedSimpleRenderPass(nullptr) {
Brian Salomone8a766b2019-07-19 14:24:36 -040072 SkASSERT(info.fProtected == msaaInfo.fProtected);
Brian Salomon27b4d8d2019-07-22 14:23:45 -040073 SkASSERT(sampleCnt > 1);
Greg Daniel164a9f02016-02-22 09:56:40 -050074 this->createFramebuffer(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -050075}
76
77// We're virtually derived from GrSurface (via GrRenderTarget) so its
78// constructor must be explicitly called.
79GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
80 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070081 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040082 sk_sp<GrVkImageLayout> layout,
Greg Daniel001c67f2018-06-26 13:51:57 -040083 const GrVkImageView* colorAttachmentView)
Brian Salomone8a766b2019-07-19 14:24:36 -040084 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050085 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kBorrowed)
Brian Salomon27b4d8d2019-07-22 14:23:45 -040086 , GrRenderTarget(gpu, desc, 1, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050087 , fColorAttachmentView(colorAttachmentView)
88 , fMSAAImage(nullptr)
89 , fResolveAttachmentView(nullptr)
90 , fFramebuffer(nullptr)
91 , fCachedSimpleRenderPass(nullptr) {
Greg Daniel164a9f02016-02-22 09:56:40 -050092 this->createFramebuffer(gpu);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050093 this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Daniel164a9f02016-02-22 09:56:40 -050094}
95
96// We're virtually derived from GrSurface (via GrRenderTarget) so its
97// constructor must be explicitly called.
98GrVkRenderTarget::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 GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400103 GrBackendObjectOwnership ownership)
Brian Salomone8a766b2019-07-19 14:24:36 -0400104 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -0500105 , GrVkImage(info, std::move(layout), ownership)
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400106 , GrRenderTarget(gpu, desc, 1, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -0500107 , fColorAttachmentView(colorAttachmentView)
108 , fMSAAImage(nullptr)
109 , fResolveAttachmentView(nullptr)
110 , fFramebuffer(nullptr)
111 , fCachedSimpleRenderPass(nullptr) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500112 this->createFramebuffer(gpu);
113}
114
Greg Danielb46add82019-01-02 14:51:29 -0500115GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
116 const GrSurfaceDesc& desc,
117 const GrVkImageInfo& info,
118 sk_sp<GrVkImageLayout> layout,
119 const GrVkRenderPass* renderPass,
Greg Daniel070cbaf2019-01-03 17:35:54 -0500120 GrVkSecondaryCommandBuffer* secondaryCommandBuffer)
Brian Salomone8a766b2019-07-19 14:24:36 -0400121 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -0500122 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kBorrowed, true)
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400123 , GrRenderTarget(gpu, desc, 1, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -0500124 , fColorAttachmentView(nullptr)
125 , fMSAAImage(nullptr)
126 , fResolveAttachmentView(nullptr)
127 , fFramebuffer(nullptr)
128 , fCachedSimpleRenderPass(renderPass)
129 , fSecondaryCommandBuffer(secondaryCommandBuffer) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500130 this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Danielb46add82019-01-02 14:51:29 -0500131}
132
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400133sk_sp<GrVkRenderTarget> GrVkRenderTarget::MakeWrappedRenderTarget(GrVkGpu* gpu,
134 const GrSurfaceDesc& desc,
135 int sampleCnt,
136 const GrVkImageInfo& info,
137 sk_sp<GrVkImageLayout> layout) {
Greg Daniel001c67f2018-06-26 13:51:57 -0400138 SkASSERT(VK_NULL_HANDLE != info.fImage);
139
egdaniel50ead532016-07-13 14:23:26 -0700140 SkASSERT(1 == info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -0500141 VkFormat pixelFormat;
142 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
halcanary9d524f22016-03-29 09:03:52 -0700143
Greg Daniel164a9f02016-02-22 09:56:40 -0500144 VkImage colorImage;
145
146 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700147 GrVkImageInfo msInfo;
Greg Daniel52e16d92018-04-10 09:34:07 -0400148 sk_sp<GrVkImageLayout> msLayout;
Greg Daniel164a9f02016-02-22 09:56:40 -0500149 const GrVkImageView* resolveAttachmentView = nullptr;
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400150 if (sampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500151 GrVkImage::ImageDesc msImageDesc;
152 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
153 msImageDesc.fFormat = pixelFormat;
154 msImageDesc.fWidth = desc.fWidth;
155 msImageDesc.fHeight = desc.fHeight;
156 msImageDesc.fLevels = 1;
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400157 msImageDesc.fSamples = sampleCnt;
Greg Daniel164a9f02016-02-22 09:56:40 -0500158 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700159 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
160 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
161 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500162 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Brian Salomone8a766b2019-07-19 14:24:36 -0400163 msImageDesc.fIsProtected = info.fProtected;
Greg Daniel164a9f02016-02-22 09:56:40 -0500164
egdanielb2df0c22016-05-13 11:30:37 -0700165 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500166 return nullptr;
167 }
168
169 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700170 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500171
172 // Create Resolve attachment view
egdanielb2df0c22016-05-13 11:30:37 -0700173 resolveAttachmentView = GrVkImageView::Create(gpu, info.fImage, pixelFormat,
Greg Daniel7e000222018-12-03 10:08:21 -0500174 GrVkImageView::kColor_Type, 1,
175 GrVkYcbcrConversionInfo());
Greg Daniel164a9f02016-02-22 09:56:40 -0500176 if (!resolveAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700177 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500178 return nullptr;
179 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400180 msLayout.reset(new GrVkImageLayout(msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500181 } else {
182 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700183 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500184 }
185
186 // Get color attachment view
187 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
Greg Daniel7e000222018-12-03 10:08:21 -0500188 GrVkImageView::kColor_Type, 1,
189 GrVkYcbcrConversionInfo());
Greg Daniel164a9f02016-02-22 09:56:40 -0500190 if (!colorAttachmentView) {
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400191 if (sampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500192 resolveAttachmentView->unref(gpu);
egdanielb2df0c22016-05-13 11:30:37 -0700193 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500194 }
egdanielb2df0c22016-05-13 11:30:37 -0700195 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500196 }
197
Greg Daniel001c67f2018-06-26 13:51:57 -0400198 GrVkRenderTarget* vkRT;
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400199 if (sampleCnt > 1) {
200 vkRT = new GrVkRenderTarget(gpu, desc, sampleCnt, info, std::move(layout), msInfo,
Greg Daniel001c67f2018-06-26 13:51:57 -0400201 std::move(msLayout), colorAttachmentView,
202 resolveAttachmentView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500203 } else {
Greg Daniel001c67f2018-06-26 13:51:57 -0400204 vkRT = new GrVkRenderTarget(gpu, desc, info, std::move(layout), colorAttachmentView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500205 }
206
Greg Daniel001c67f2018-06-26 13:51:57 -0400207 return sk_sp<GrVkRenderTarget>(vkRT);
Greg Daniel164a9f02016-02-22 09:56:40 -0500208}
209
Greg Danielb46add82019-01-02 14:51:29 -0500210sk_sp<GrVkRenderTarget> GrVkRenderTarget::MakeSecondaryCBRenderTarget(
211 GrVkGpu* gpu, const GrSurfaceDesc& desc, const GrVkDrawableInfo& vkInfo) {
212 // We only set the few properties of the GrVkImageInfo that we know like layout and format. The
213 // others we keep at the default "null" values.
214 GrVkImageInfo info;
215 info.fImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
216 info.fFormat = vkInfo.fFormat;
217
218 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
219
220 const GrVkRenderPass* rp =
221 gpu->resourceProvider().findCompatibleExternalRenderPass(vkInfo.fCompatibleRenderPass,
222 vkInfo.fColorAttachmentIndex);
223 if (!rp) {
224 return nullptr;
225 }
226
Greg Daniel070cbaf2019-01-03 17:35:54 -0500227 GrVkSecondaryCommandBuffer* scb =
228 GrVkSecondaryCommandBuffer::Create(vkInfo.fSecondaryCommandBuffer);
229 if (!scb) {
230 return nullptr;
231 }
232
233 GrVkRenderTarget* vkRT = new GrVkRenderTarget(gpu, desc, info, std::move(layout), rp, scb);
Greg Danielb46add82019-01-02 14:51:29 -0500234
235 return sk_sp<GrVkRenderTarget>(vkRT);
236}
237
Greg Daniel164a9f02016-02-22 09:56:40 -0500238bool GrVkRenderTarget::completeStencilAttachment() {
Greg Danielb46add82019-01-02 14:51:29 -0500239 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500240 this->createFramebuffer(this->getVkGpu());
241 return true;
242}
243
244void GrVkRenderTarget::createFramebuffer(GrVkGpu* gpu) {
Greg Danielb46add82019-01-02 14:51:29 -0500245 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500246 if (fFramebuffer) {
247 fFramebuffer->unref(gpu);
248 }
249 if (fCachedSimpleRenderPass) {
250 fCachedSimpleRenderPass->unref(gpu);
251 }
252
253 // Vulkan requires us to create a compatible renderpass before we can create our framebuffer,
254 // so we use this to get a (cached) basic renderpass, only for creation.
egdanield62e28b2016-06-07 08:43:30 -0700255 fCachedSimpleRenderPass =
256 gpu->resourceProvider().findCompatibleRenderPass(*this, &fCompatibleRPHandle);
Greg Daniel164a9f02016-02-22 09:56:40 -0500257
258 // Stencil attachment view is stored in the base RT stencil attachment
259 const GrVkImageView* stencilView = this->stencilAttachmentView();
260 fFramebuffer = GrVkFramebuffer::Create(gpu, this->width(), this->height(),
261 fCachedSimpleRenderPass, fColorAttachmentView,
egdanielce3bfb12016-08-26 11:05:13 -0700262 stencilView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500263 SkASSERT(fFramebuffer);
264}
265
266void GrVkRenderTarget::getAttachmentsDescriptor(
267 GrVkRenderPass::AttachmentsDescriptor* desc,
268 GrVkRenderPass::AttachmentFlags* attachmentFlags) const {
Greg Danielb46add82019-01-02 14:51:29 -0500269 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500270 VkFormat colorFormat;
271 GrPixelConfigToVkFormat(this->config(), &colorFormat);
272 desc->fColor.fFormat = colorFormat;
Chris Dalton6ce447a2019-06-23 18:07:38 -0600273 desc->fColor.fSamples = this->numSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500274 *attachmentFlags = GrVkRenderPass::kColor_AttachmentFlag;
275 uint32_t attachmentCount = 1;
Greg Daniel164a9f02016-02-22 09:56:40 -0500276
277 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
278 if (stencil) {
279 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
280 desc->fStencil.fFormat = vkStencil->vkFormat();
Brian Salomonbdecacf2018-02-02 20:32:49 -0500281 desc->fStencil.fSamples = vkStencil->numSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500282 // Currently in vulkan stencil and color attachments must all have same number of samples
283 SkASSERT(desc->fColor.fSamples == desc->fStencil.fSamples);
284 *attachmentFlags |= GrVkRenderPass::kStencil_AttachmentFlag;
285 ++attachmentCount;
286 }
287 desc->fAttachmentCount = attachmentCount;
288}
289
290GrVkRenderTarget::~GrVkRenderTarget() {
291 // either release or abandon should have been called by the owner of this object.
egdanielb2df0c22016-05-13 11:30:37 -0700292 SkASSERT(!fMSAAImage);
Greg Daniel164a9f02016-02-22 09:56:40 -0500293 SkASSERT(!fResolveAttachmentView);
294 SkASSERT(!fColorAttachmentView);
295 SkASSERT(!fFramebuffer);
296 SkASSERT(!fCachedSimpleRenderPass);
Greg Daniel070cbaf2019-01-03 17:35:54 -0500297 SkASSERT(!fSecondaryCommandBuffer);
Greg Daniel164a9f02016-02-22 09:56:40 -0500298}
299
300void GrVkRenderTarget::addResources(GrVkCommandBuffer& commandBuffer) const {
301 commandBuffer.addResource(this->framebuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500302 commandBuffer.addResource(this->colorAttachmentView());
egdanielce3bfb12016-08-26 11:05:13 -0700303 commandBuffer.addResource(this->msaaImageResource() ? this->msaaImageResource()
304 : this->resource());
Greg Daniel164a9f02016-02-22 09:56:40 -0500305 if (this->stencilImageResource()) {
306 commandBuffer.addResource(this->stencilImageResource());
307 commandBuffer.addResource(this->stencilAttachmentView());
308 }
309}
310
311void GrVkRenderTarget::releaseInternalObjects() {
312 GrVkGpu* gpu = this->getVkGpu();
313
egdanielb2df0c22016-05-13 11:30:37 -0700314 if (fMSAAImage) {
315 fMSAAImage->releaseImage(gpu);
Greg Daniel2db32322017-04-03 10:29:43 -0400316 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500317 }
318
319 if (fResolveAttachmentView) {
320 fResolveAttachmentView->unref(gpu);
321 fResolveAttachmentView = nullptr;
322 }
323 if (fColorAttachmentView) {
324 fColorAttachmentView->unref(gpu);
325 fColorAttachmentView = nullptr;
326 }
327 if (fFramebuffer) {
328 fFramebuffer->unref(gpu);
329 fFramebuffer = nullptr;
330 }
331 if (fCachedSimpleRenderPass) {
332 fCachedSimpleRenderPass->unref(gpu);
333 fCachedSimpleRenderPass = nullptr;
334 }
Greg Daniel070cbaf2019-01-03 17:35:54 -0500335 if (fSecondaryCommandBuffer) {
336 fSecondaryCommandBuffer->unref(gpu);
337 fSecondaryCommandBuffer = nullptr;
338 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500339}
340
341void GrVkRenderTarget::abandonInternalObjects() {
egdanielb2df0c22016-05-13 11:30:37 -0700342 if (fMSAAImage) {
343 fMSAAImage->abandonImage();
Greg Daniel2db32322017-04-03 10:29:43 -0400344 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500345 }
346
347 if (fResolveAttachmentView) {
348 fResolveAttachmentView->unrefAndAbandon();
349 fResolveAttachmentView = nullptr;
350 }
351 if (fColorAttachmentView) {
352 fColorAttachmentView->unrefAndAbandon();
353 fColorAttachmentView = nullptr;
354 }
355 if (fFramebuffer) {
356 fFramebuffer->unrefAndAbandon();
357 fFramebuffer = nullptr;
358 }
359 if (fCachedSimpleRenderPass) {
360 fCachedSimpleRenderPass->unrefAndAbandon();
361 fCachedSimpleRenderPass = nullptr;
362 }
Greg Daniel070cbaf2019-01-03 17:35:54 -0500363 if (fSecondaryCommandBuffer) {
364 fSecondaryCommandBuffer->unrefAndAbandon();
365 fSecondaryCommandBuffer = nullptr;
366 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500367}
368
369void GrVkRenderTarget::onRelease() {
370 this->releaseInternalObjects();
kkinnunen2e6055b2016-04-22 01:48:29 -0700371 this->releaseImage(this->getVkGpu());
Greg Daniel164a9f02016-02-22 09:56:40 -0500372 GrRenderTarget::onRelease();
373}
374
375void GrVkRenderTarget::onAbandon() {
376 this->abandonInternalObjects();
377 this->abandonImage();
378 GrRenderTarget::onAbandon();
379}
380
381
Robert Phillipsb67821d2017-12-13 15:00:45 -0500382GrBackendRenderTarget GrVkRenderTarget::getBackendRenderTarget() const {
Greg Danielb46add82019-01-02 14:51:29 -0500383 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Brian Salomon4456a0d2019-07-18 15:05:11 -0400384 return GrBackendRenderTarget(this->width(), this->height(), this->numSamples(), fInfo,
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400385 this->grVkImageLayout());
Robert Phillipsb67821d2017-12-13 15:00:45 -0500386}
387
egdanielb2df0c22016-05-13 11:30:37 -0700388const GrVkResource* GrVkRenderTarget::stencilImageResource() const {
Greg Danielb46add82019-01-02 14:51:29 -0500389 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500390 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
391 if (stencil) {
392 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
393 return vkStencil->imageResource();
394 }
395
396 return nullptr;
397}
398
399const GrVkImageView* GrVkRenderTarget::stencilAttachmentView() const {
Greg Danielb46add82019-01-02 14:51:29 -0500400 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500401 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
402 if (stencil) {
403 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
404 return vkStencil->stencilView();
405 }
406
407 return nullptr;
408}
409
Greg Daniel164a9f02016-02-22 09:56:40 -0500410GrVkGpu* GrVkRenderTarget::getVkGpu() const {
411 SkASSERT(!this->wasDestroyed());
412 return static_cast<GrVkGpu*>(this->getGpu());
413}