blob: 28282ddc6fc0075c8b388a4783647dd97a21e463 [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,
egdanielb2df0c22016-05-13 11:30:37 -070027 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040028 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070029 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040030 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050031 const GrVkImageView* colorAttachmentView,
Greg Daniel001c67f2018-06-26 13:51:57 -040032 const GrVkImageView* resolveAttachmentView)
Brian Salomone8a766b2019-07-19 14:24:36 -040033 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050034 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kBorrowed)
35 // for the moment we only support 1:1 color to stencil
Brian Salomone8a766b2019-07-19 14:24:36 -040036 , GrRenderTarget(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050037 , fColorAttachmentView(colorAttachmentView)
38 , fMSAAImage(new GrVkImage(msaaInfo, std::move(msaaLayout),
39 GrBackendObjectOwnership::kOwned))
40 , fResolveAttachmentView(resolveAttachmentView)
41 , fFramebuffer(nullptr)
42 , fCachedSimpleRenderPass(nullptr) {
Brian Salomone8a766b2019-07-19 14:24:36 -040043 SkASSERT(info.fProtected == msaaInfo.fProtected);
Brian Salomonbdecacf2018-02-02 20:32:49 -050044 SkASSERT(desc.fSampleCnt > 1);
Greg Daniel164a9f02016-02-22 09:56:40 -050045 this->createFramebuffer(gpu);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050046 this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Daniel164a9f02016-02-22 09:56:40 -050047}
48
49// We're virtually derived from GrSurface (via GrRenderTarget) so its
50// constructor must be explicitly called.
51GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
52 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070053 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040054 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070055 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040056 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050057 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070058 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040059 GrBackendObjectOwnership ownership)
Brian Salomone8a766b2019-07-19 14:24:36 -040060 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050061 , GrVkImage(info, std::move(layout), ownership)
62 // for the moment we only support 1:1 color to stencil
Brian Salomone8a766b2019-07-19 14:24:36 -040063 , GrRenderTarget(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050064 , fColorAttachmentView(colorAttachmentView)
65 , fMSAAImage(new GrVkImage(msaaInfo, std::move(msaaLayout),
66 GrBackendObjectOwnership::kOwned))
67 , fResolveAttachmentView(resolveAttachmentView)
68 , fFramebuffer(nullptr)
69 , fCachedSimpleRenderPass(nullptr) {
Brian Salomone8a766b2019-07-19 14:24:36 -040070 SkASSERT(info.fProtected == msaaInfo.fProtected);
Brian Salomonbdecacf2018-02-02 20:32:49 -050071 SkASSERT(desc.fSampleCnt > 1);
Greg Daniel164a9f02016-02-22 09:56:40 -050072 this->createFramebuffer(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -050073}
74
75// We're virtually derived from GrSurface (via GrRenderTarget) so its
76// constructor must be explicitly called.
77GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
78 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070079 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040080 sk_sp<GrVkImageLayout> layout,
Greg Daniel001c67f2018-06-26 13:51:57 -040081 const GrVkImageView* colorAttachmentView)
Brian Salomone8a766b2019-07-19 14:24:36 -040082 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050083 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kBorrowed)
Brian Salomone8a766b2019-07-19 14:24:36 -040084 , GrRenderTarget(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -050085 , fColorAttachmentView(colorAttachmentView)
86 , fMSAAImage(nullptr)
87 , fResolveAttachmentView(nullptr)
88 , fFramebuffer(nullptr)
89 , fCachedSimpleRenderPass(nullptr) {
Brian Salomonbdecacf2018-02-02 20:32:49 -050090 SkASSERT(1 == desc.fSampleCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -050091 this->createFramebuffer(gpu);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050092 this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Daniel164a9f02016-02-22 09:56:40 -050093}
94
95// We're virtually derived from GrSurface (via GrRenderTarget) so its
96// constructor must be explicitly called.
97GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
98 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070099 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -0400100 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -0700101 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400102 GrBackendObjectOwnership ownership)
Brian Salomone8a766b2019-07-19 14:24:36 -0400103 : GrSurface(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -0500104 , GrVkImage(info, std::move(layout), ownership)
Brian Salomone8a766b2019-07-19 14:24:36 -0400105 , GrRenderTarget(gpu, desc, info.fProtected)
Greg Danielb46add82019-01-02 14:51:29 -0500106 , fColorAttachmentView(colorAttachmentView)
107 , fMSAAImage(nullptr)
108 , fResolveAttachmentView(nullptr)
109 , fFramebuffer(nullptr)
110 , fCachedSimpleRenderPass(nullptr) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500111 SkASSERT(1 == desc.fSampleCnt);
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 Salomone8a766b2019-07-19 14:24:36 -0400123 , GrRenderTarget(gpu, desc, 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
133sk_sp<GrVkRenderTarget> GrVkRenderTarget::MakeWrappedRenderTarget(
134 GrVkGpu* gpu, const GrSurfaceDesc& desc, const GrVkImageInfo& info,
135 sk_sp<GrVkImageLayout> layout) {
Greg Daniel001c67f2018-06-26 13:51:57 -0400136 SkASSERT(VK_NULL_HANDLE != info.fImage);
137
egdaniel50ead532016-07-13 14:23:26 -0700138 SkASSERT(1 == info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -0500139 VkFormat pixelFormat;
140 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
halcanary9d524f22016-03-29 09:03:52 -0700141
Greg Daniel164a9f02016-02-22 09:56:40 -0500142 VkImage colorImage;
143
144 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700145 GrVkImageInfo msInfo;
Greg Daniel52e16d92018-04-10 09:34:07 -0400146 sk_sp<GrVkImageLayout> msLayout;
Greg Daniel164a9f02016-02-22 09:56:40 -0500147 const GrVkImageView* resolveAttachmentView = nullptr;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500148 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500149 GrVkImage::ImageDesc msImageDesc;
150 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
151 msImageDesc.fFormat = pixelFormat;
152 msImageDesc.fWidth = desc.fWidth;
153 msImageDesc.fHeight = desc.fHeight;
154 msImageDesc.fLevels = 1;
155 msImageDesc.fSamples = desc.fSampleCnt;
156 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700157 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
158 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
159 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500160 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Brian Salomone8a766b2019-07-19 14:24:36 -0400161 msImageDesc.fIsProtected = info.fProtected;
Greg Daniel164a9f02016-02-22 09:56:40 -0500162
egdanielb2df0c22016-05-13 11:30:37 -0700163 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500164 return nullptr;
165 }
166
167 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700168 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500169
170 // Create Resolve attachment view
egdanielb2df0c22016-05-13 11:30:37 -0700171 resolveAttachmentView = GrVkImageView::Create(gpu, info.fImage, pixelFormat,
Greg Daniel7e000222018-12-03 10:08:21 -0500172 GrVkImageView::kColor_Type, 1,
173 GrVkYcbcrConversionInfo());
Greg Daniel164a9f02016-02-22 09:56:40 -0500174 if (!resolveAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700175 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500176 return nullptr;
177 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400178 msLayout.reset(new GrVkImageLayout(msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500179 } else {
180 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700181 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500182 }
183
184 // Get color attachment view
185 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
Greg Daniel7e000222018-12-03 10:08:21 -0500186 GrVkImageView::kColor_Type, 1,
187 GrVkYcbcrConversionInfo());
Greg Daniel164a9f02016-02-22 09:56:40 -0500188 if (!colorAttachmentView) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500189 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500190 resolveAttachmentView->unref(gpu);
egdanielb2df0c22016-05-13 11:30:37 -0700191 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500192 }
egdanielb2df0c22016-05-13 11:30:37 -0700193 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500194 }
195
Greg Daniel001c67f2018-06-26 13:51:57 -0400196 GrVkRenderTarget* vkRT;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500197 if (desc.fSampleCnt > 1) {
Greg Daniel001c67f2018-06-26 13:51:57 -0400198 vkRT = new GrVkRenderTarget(gpu, desc, info, std::move(layout), msInfo,
199 std::move(msLayout), colorAttachmentView,
200 resolveAttachmentView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500201 } else {
Greg Daniel001c67f2018-06-26 13:51:57 -0400202 vkRT = new GrVkRenderTarget(gpu, desc, info, std::move(layout), colorAttachmentView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500203 }
204
Greg Daniel001c67f2018-06-26 13:51:57 -0400205 return sk_sp<GrVkRenderTarget>(vkRT);
Greg Daniel164a9f02016-02-22 09:56:40 -0500206}
207
Greg Danielb46add82019-01-02 14:51:29 -0500208sk_sp<GrVkRenderTarget> GrVkRenderTarget::MakeSecondaryCBRenderTarget(
209 GrVkGpu* gpu, const GrSurfaceDesc& desc, const GrVkDrawableInfo& vkInfo) {
210 // We only set the few properties of the GrVkImageInfo that we know like layout and format. The
211 // others we keep at the default "null" values.
212 GrVkImageInfo info;
213 info.fImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
214 info.fFormat = vkInfo.fFormat;
215
216 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
217
218 const GrVkRenderPass* rp =
219 gpu->resourceProvider().findCompatibleExternalRenderPass(vkInfo.fCompatibleRenderPass,
220 vkInfo.fColorAttachmentIndex);
221 if (!rp) {
222 return nullptr;
223 }
224
Greg Daniel070cbaf2019-01-03 17:35:54 -0500225 GrVkSecondaryCommandBuffer* scb =
226 GrVkSecondaryCommandBuffer::Create(vkInfo.fSecondaryCommandBuffer);
227 if (!scb) {
228 return nullptr;
229 }
230
231 GrVkRenderTarget* vkRT = new GrVkRenderTarget(gpu, desc, info, std::move(layout), rp, scb);
Greg Danielb46add82019-01-02 14:51:29 -0500232
233 return sk_sp<GrVkRenderTarget>(vkRT);
234}
235
Greg Daniel164a9f02016-02-22 09:56:40 -0500236bool GrVkRenderTarget::completeStencilAttachment() {
Greg Danielb46add82019-01-02 14:51:29 -0500237 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500238 this->createFramebuffer(this->getVkGpu());
239 return true;
240}
241
242void GrVkRenderTarget::createFramebuffer(GrVkGpu* gpu) {
Greg Danielb46add82019-01-02 14:51:29 -0500243 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500244 if (fFramebuffer) {
245 fFramebuffer->unref(gpu);
246 }
247 if (fCachedSimpleRenderPass) {
248 fCachedSimpleRenderPass->unref(gpu);
249 }
250
251 // Vulkan requires us to create a compatible renderpass before we can create our framebuffer,
252 // so we use this to get a (cached) basic renderpass, only for creation.
egdanield62e28b2016-06-07 08:43:30 -0700253 fCachedSimpleRenderPass =
254 gpu->resourceProvider().findCompatibleRenderPass(*this, &fCompatibleRPHandle);
Greg Daniel164a9f02016-02-22 09:56:40 -0500255
256 // Stencil attachment view is stored in the base RT stencil attachment
257 const GrVkImageView* stencilView = this->stencilAttachmentView();
258 fFramebuffer = GrVkFramebuffer::Create(gpu, this->width(), this->height(),
259 fCachedSimpleRenderPass, fColorAttachmentView,
egdanielce3bfb12016-08-26 11:05:13 -0700260 stencilView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500261 SkASSERT(fFramebuffer);
262}
263
264void GrVkRenderTarget::getAttachmentsDescriptor(
265 GrVkRenderPass::AttachmentsDescriptor* desc,
266 GrVkRenderPass::AttachmentFlags* attachmentFlags) const {
Greg Danielb46add82019-01-02 14:51:29 -0500267 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500268 VkFormat colorFormat;
269 GrPixelConfigToVkFormat(this->config(), &colorFormat);
270 desc->fColor.fFormat = colorFormat;
Chris Dalton6ce447a2019-06-23 18:07:38 -0600271 desc->fColor.fSamples = this->numSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500272 *attachmentFlags = GrVkRenderPass::kColor_AttachmentFlag;
273 uint32_t attachmentCount = 1;
Greg Daniel164a9f02016-02-22 09:56:40 -0500274
275 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
276 if (stencil) {
277 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
278 desc->fStencil.fFormat = vkStencil->vkFormat();
Brian Salomonbdecacf2018-02-02 20:32:49 -0500279 desc->fStencil.fSamples = vkStencil->numSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500280 // Currently in vulkan stencil and color attachments must all have same number of samples
281 SkASSERT(desc->fColor.fSamples == desc->fStencil.fSamples);
282 *attachmentFlags |= GrVkRenderPass::kStencil_AttachmentFlag;
283 ++attachmentCount;
284 }
285 desc->fAttachmentCount = attachmentCount;
286}
287
288GrVkRenderTarget::~GrVkRenderTarget() {
289 // either release or abandon should have been called by the owner of this object.
egdanielb2df0c22016-05-13 11:30:37 -0700290 SkASSERT(!fMSAAImage);
Greg Daniel164a9f02016-02-22 09:56:40 -0500291 SkASSERT(!fResolveAttachmentView);
292 SkASSERT(!fColorAttachmentView);
293 SkASSERT(!fFramebuffer);
294 SkASSERT(!fCachedSimpleRenderPass);
Greg Daniel070cbaf2019-01-03 17:35:54 -0500295 SkASSERT(!fSecondaryCommandBuffer);
Greg Daniel164a9f02016-02-22 09:56:40 -0500296}
297
298void GrVkRenderTarget::addResources(GrVkCommandBuffer& commandBuffer) const {
299 commandBuffer.addResource(this->framebuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500300 commandBuffer.addResource(this->colorAttachmentView());
egdanielce3bfb12016-08-26 11:05:13 -0700301 commandBuffer.addResource(this->msaaImageResource() ? this->msaaImageResource()
302 : this->resource());
Greg Daniel164a9f02016-02-22 09:56:40 -0500303 if (this->stencilImageResource()) {
304 commandBuffer.addResource(this->stencilImageResource());
305 commandBuffer.addResource(this->stencilAttachmentView());
306 }
307}
308
309void GrVkRenderTarget::releaseInternalObjects() {
310 GrVkGpu* gpu = this->getVkGpu();
311
egdanielb2df0c22016-05-13 11:30:37 -0700312 if (fMSAAImage) {
313 fMSAAImage->releaseImage(gpu);
Greg Daniel2db32322017-04-03 10:29:43 -0400314 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500315 }
316
317 if (fResolveAttachmentView) {
318 fResolveAttachmentView->unref(gpu);
319 fResolveAttachmentView = nullptr;
320 }
321 if (fColorAttachmentView) {
322 fColorAttachmentView->unref(gpu);
323 fColorAttachmentView = nullptr;
324 }
325 if (fFramebuffer) {
326 fFramebuffer->unref(gpu);
327 fFramebuffer = nullptr;
328 }
329 if (fCachedSimpleRenderPass) {
330 fCachedSimpleRenderPass->unref(gpu);
331 fCachedSimpleRenderPass = nullptr;
332 }
Greg Daniel070cbaf2019-01-03 17:35:54 -0500333 if (fSecondaryCommandBuffer) {
334 fSecondaryCommandBuffer->unref(gpu);
335 fSecondaryCommandBuffer = nullptr;
336 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500337}
338
339void GrVkRenderTarget::abandonInternalObjects() {
egdanielb2df0c22016-05-13 11:30:37 -0700340 if (fMSAAImage) {
341 fMSAAImage->abandonImage();
Greg Daniel2db32322017-04-03 10:29:43 -0400342 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500343 }
344
345 if (fResolveAttachmentView) {
346 fResolveAttachmentView->unrefAndAbandon();
347 fResolveAttachmentView = nullptr;
348 }
349 if (fColorAttachmentView) {
350 fColorAttachmentView->unrefAndAbandon();
351 fColorAttachmentView = nullptr;
352 }
353 if (fFramebuffer) {
354 fFramebuffer->unrefAndAbandon();
355 fFramebuffer = nullptr;
356 }
357 if (fCachedSimpleRenderPass) {
358 fCachedSimpleRenderPass->unrefAndAbandon();
359 fCachedSimpleRenderPass = nullptr;
360 }
Greg Daniel070cbaf2019-01-03 17:35:54 -0500361 if (fSecondaryCommandBuffer) {
362 fSecondaryCommandBuffer->unrefAndAbandon();
363 fSecondaryCommandBuffer = nullptr;
364 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500365}
366
367void GrVkRenderTarget::onRelease() {
368 this->releaseInternalObjects();
kkinnunen2e6055b2016-04-22 01:48:29 -0700369 this->releaseImage(this->getVkGpu());
Greg Daniel164a9f02016-02-22 09:56:40 -0500370 GrRenderTarget::onRelease();
371}
372
373void GrVkRenderTarget::onAbandon() {
374 this->abandonInternalObjects();
375 this->abandonImage();
376 GrRenderTarget::onAbandon();
377}
378
379
Robert Phillipsb67821d2017-12-13 15:00:45 -0500380GrBackendRenderTarget GrVkRenderTarget::getBackendRenderTarget() const {
Greg Danielb46add82019-01-02 14:51:29 -0500381 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Brian Salomon4456a0d2019-07-18 15:05:11 -0400382 return GrBackendRenderTarget(this->width(), this->height(), this->numSamples(), fInfo,
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400383 this->grVkImageLayout());
Robert Phillipsb67821d2017-12-13 15:00:45 -0500384}
385
egdanielb2df0c22016-05-13 11:30:37 -0700386const GrVkResource* GrVkRenderTarget::stencilImageResource() const {
Greg Danielb46add82019-01-02 14:51:29 -0500387 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500388 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
389 if (stencil) {
390 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
391 return vkStencil->imageResource();
392 }
393
394 return nullptr;
395}
396
397const GrVkImageView* GrVkRenderTarget::stencilAttachmentView() const {
Greg Danielb46add82019-01-02 14:51:29 -0500398 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500399 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
400 if (stencil) {
401 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
402 return vkStencil->stencilView();
403 }
404
405 return nullptr;
406}
407
Greg Daniel164a9f02016-02-22 09:56:40 -0500408GrVkGpu* GrVkRenderTarget::getVkGpu() const {
409 SkASSERT(!this->wasDestroyed());
410 return static_cast<GrVkGpu*>(this->getGpu());
411}