blob: 79e827fd6fefe18b67fbe4961e48a9f23ce1b042 [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)
Greg Danielb46add82019-01-02 14:51:29 -050033 : GrSurface(gpu, desc)
34 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kBorrowed)
35 // for the moment we only support 1:1 color to stencil
36 , GrRenderTarget(gpu, desc)
37 , fColorAttachmentView(colorAttachmentView)
38 , fMSAAImage(new GrVkImage(msaaInfo, std::move(msaaLayout),
39 GrBackendObjectOwnership::kOwned))
40 , fResolveAttachmentView(resolveAttachmentView)
41 , fFramebuffer(nullptr)
42 , fCachedSimpleRenderPass(nullptr) {
Brian Salomonbdecacf2018-02-02 20:32:49 -050043 SkASSERT(desc.fSampleCnt > 1);
Greg Daniel164a9f02016-02-22 09:56:40 -050044 this->createFramebuffer(gpu);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050045 this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Daniel164a9f02016-02-22 09:56:40 -050046}
47
48// We're virtually derived from GrSurface (via GrRenderTarget) so its
49// constructor must be explicitly called.
50GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
51 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070052 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040053 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070054 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040055 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050056 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070057 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040058 GrBackendObjectOwnership ownership)
Greg Danielb46add82019-01-02 14:51:29 -050059 : GrSurface(gpu, desc)
60 , GrVkImage(info, std::move(layout), ownership)
61 // for the moment we only support 1:1 color to stencil
62 , GrRenderTarget(gpu, desc)
63 , fColorAttachmentView(colorAttachmentView)
64 , fMSAAImage(new GrVkImage(msaaInfo, std::move(msaaLayout),
65 GrBackendObjectOwnership::kOwned))
66 , fResolveAttachmentView(resolveAttachmentView)
67 , fFramebuffer(nullptr)
68 , fCachedSimpleRenderPass(nullptr) {
Brian Salomonbdecacf2018-02-02 20:32:49 -050069 SkASSERT(desc.fSampleCnt > 1);
Greg Daniel164a9f02016-02-22 09:56:40 -050070 this->createFramebuffer(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -050071}
72
73// We're virtually derived from GrSurface (via GrRenderTarget) so its
74// constructor must be explicitly called.
75GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
76 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070077 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040078 sk_sp<GrVkImageLayout> layout,
Greg Daniel001c67f2018-06-26 13:51:57 -040079 const GrVkImageView* colorAttachmentView)
Greg Danielb46add82019-01-02 14:51:29 -050080 : GrSurface(gpu, desc)
81 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kBorrowed)
82 , GrRenderTarget(gpu, desc)
83 , fColorAttachmentView(colorAttachmentView)
84 , fMSAAImage(nullptr)
85 , fResolveAttachmentView(nullptr)
86 , fFramebuffer(nullptr)
87 , fCachedSimpleRenderPass(nullptr) {
Brian Salomonbdecacf2018-02-02 20:32:49 -050088 SkASSERT(1 == desc.fSampleCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -050089 this->createFramebuffer(gpu);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050090 this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Daniel164a9f02016-02-22 09:56:40 -050091}
92
93// We're virtually derived from GrSurface (via GrRenderTarget) so its
94// constructor must be explicitly called.
95GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
96 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070097 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040098 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070099 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400100 GrBackendObjectOwnership ownership)
Greg Danielb46add82019-01-02 14:51:29 -0500101 : GrSurface(gpu, desc)
102 , GrVkImage(info, std::move(layout), ownership)
103 , GrRenderTarget(gpu, desc)
104 , fColorAttachmentView(colorAttachmentView)
105 , fMSAAImage(nullptr)
106 , fResolveAttachmentView(nullptr)
107 , fFramebuffer(nullptr)
108 , fCachedSimpleRenderPass(nullptr) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500109 SkASSERT(1 == desc.fSampleCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -0500110 this->createFramebuffer(gpu);
111}
112
Greg Danielb46add82019-01-02 14:51:29 -0500113GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
114 const GrSurfaceDesc& desc,
115 const GrVkImageInfo& info,
116 sk_sp<GrVkImageLayout> layout,
117 const GrVkRenderPass* renderPass,
Greg Daniel070cbaf2019-01-03 17:35:54 -0500118 GrVkSecondaryCommandBuffer* secondaryCommandBuffer)
Greg Danielb46add82019-01-02 14:51:29 -0500119 : GrSurface(gpu, desc)
120 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kBorrowed, true)
121 , GrRenderTarget(gpu, desc)
122 , fColorAttachmentView(nullptr)
123 , fMSAAImage(nullptr)
124 , fResolveAttachmentView(nullptr)
125 , fFramebuffer(nullptr)
126 , fCachedSimpleRenderPass(renderPass)
127 , fSecondaryCommandBuffer(secondaryCommandBuffer) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500128 this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Danielb46add82019-01-02 14:51:29 -0500129}
130
131sk_sp<GrVkRenderTarget> GrVkRenderTarget::MakeWrappedRenderTarget(
132 GrVkGpu* gpu, const GrSurfaceDesc& desc, const GrVkImageInfo& info,
133 sk_sp<GrVkImageLayout> layout) {
Greg Daniel001c67f2018-06-26 13:51:57 -0400134 SkASSERT(VK_NULL_HANDLE != info.fImage);
135
egdaniel50ead532016-07-13 14:23:26 -0700136 SkASSERT(1 == info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -0500137 VkFormat pixelFormat;
138 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
halcanary9d524f22016-03-29 09:03:52 -0700139
Greg Daniel164a9f02016-02-22 09:56:40 -0500140 VkImage colorImage;
141
142 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700143 GrVkImageInfo msInfo;
Greg Daniel52e16d92018-04-10 09:34:07 -0400144 sk_sp<GrVkImageLayout> msLayout;
Greg Daniel164a9f02016-02-22 09:56:40 -0500145 const GrVkImageView* resolveAttachmentView = nullptr;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500146 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500147 GrVkImage::ImageDesc msImageDesc;
148 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
149 msImageDesc.fFormat = pixelFormat;
150 msImageDesc.fWidth = desc.fWidth;
151 msImageDesc.fHeight = desc.fHeight;
152 msImageDesc.fLevels = 1;
153 msImageDesc.fSamples = desc.fSampleCnt;
154 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700155 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
156 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
157 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500158 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400159 msImageDesc.fIsProtected = desc.fIsProtected;
Greg Daniel164a9f02016-02-22 09:56:40 -0500160
egdanielb2df0c22016-05-13 11:30:37 -0700161 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500162 return nullptr;
163 }
164
165 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700166 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500167
168 // Create Resolve attachment view
egdanielb2df0c22016-05-13 11:30:37 -0700169 resolveAttachmentView = GrVkImageView::Create(gpu, info.fImage, pixelFormat,
Greg Daniel7e000222018-12-03 10:08:21 -0500170 GrVkImageView::kColor_Type, 1,
171 GrVkYcbcrConversionInfo());
Greg Daniel164a9f02016-02-22 09:56:40 -0500172 if (!resolveAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700173 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500174 return nullptr;
175 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400176 msLayout.reset(new GrVkImageLayout(msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500177 } else {
178 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700179 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500180 }
181
182 // Get color attachment view
183 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
Greg Daniel7e000222018-12-03 10:08:21 -0500184 GrVkImageView::kColor_Type, 1,
185 GrVkYcbcrConversionInfo());
Greg Daniel164a9f02016-02-22 09:56:40 -0500186 if (!colorAttachmentView) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500187 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500188 resolveAttachmentView->unref(gpu);
egdanielb2df0c22016-05-13 11:30:37 -0700189 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500190 }
egdanielb2df0c22016-05-13 11:30:37 -0700191 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500192 }
193
Greg Daniel001c67f2018-06-26 13:51:57 -0400194 GrVkRenderTarget* vkRT;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500195 if (desc.fSampleCnt > 1) {
Greg Daniel001c67f2018-06-26 13:51:57 -0400196 vkRT = new GrVkRenderTarget(gpu, desc, info, std::move(layout), msInfo,
197 std::move(msLayout), colorAttachmentView,
198 resolveAttachmentView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500199 } else {
Greg Daniel001c67f2018-06-26 13:51:57 -0400200 vkRT = new GrVkRenderTarget(gpu, desc, info, std::move(layout), colorAttachmentView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500201 }
202
Greg Daniel001c67f2018-06-26 13:51:57 -0400203 return sk_sp<GrVkRenderTarget>(vkRT);
Greg Daniel164a9f02016-02-22 09:56:40 -0500204}
205
Greg Danielb46add82019-01-02 14:51:29 -0500206sk_sp<GrVkRenderTarget> GrVkRenderTarget::MakeSecondaryCBRenderTarget(
207 GrVkGpu* gpu, const GrSurfaceDesc& desc, const GrVkDrawableInfo& vkInfo) {
208 // We only set the few properties of the GrVkImageInfo that we know like layout and format. The
209 // others we keep at the default "null" values.
210 GrVkImageInfo info;
211 info.fImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
212 info.fFormat = vkInfo.fFormat;
213
214 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
215
216 const GrVkRenderPass* rp =
217 gpu->resourceProvider().findCompatibleExternalRenderPass(vkInfo.fCompatibleRenderPass,
218 vkInfo.fColorAttachmentIndex);
219 if (!rp) {
220 return nullptr;
221 }
222
Greg Daniel070cbaf2019-01-03 17:35:54 -0500223 GrVkSecondaryCommandBuffer* scb =
224 GrVkSecondaryCommandBuffer::Create(vkInfo.fSecondaryCommandBuffer);
225 if (!scb) {
226 return nullptr;
227 }
228
229 GrVkRenderTarget* vkRT = new GrVkRenderTarget(gpu, desc, info, std::move(layout), rp, scb);
Greg Danielb46add82019-01-02 14:51:29 -0500230
231 return sk_sp<GrVkRenderTarget>(vkRT);
232}
233
Greg Daniel164a9f02016-02-22 09:56:40 -0500234bool GrVkRenderTarget::completeStencilAttachment() {
Greg Danielb46add82019-01-02 14:51:29 -0500235 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500236 this->createFramebuffer(this->getVkGpu());
237 return true;
238}
239
240void GrVkRenderTarget::createFramebuffer(GrVkGpu* gpu) {
Greg Danielb46add82019-01-02 14:51:29 -0500241 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500242 if (fFramebuffer) {
243 fFramebuffer->unref(gpu);
244 }
245 if (fCachedSimpleRenderPass) {
246 fCachedSimpleRenderPass->unref(gpu);
247 }
248
249 // Vulkan requires us to create a compatible renderpass before we can create our framebuffer,
250 // so we use this to get a (cached) basic renderpass, only for creation.
egdanield62e28b2016-06-07 08:43:30 -0700251 fCachedSimpleRenderPass =
252 gpu->resourceProvider().findCompatibleRenderPass(*this, &fCompatibleRPHandle);
Greg Daniel164a9f02016-02-22 09:56:40 -0500253
254 // Stencil attachment view is stored in the base RT stencil attachment
255 const GrVkImageView* stencilView = this->stencilAttachmentView();
256 fFramebuffer = GrVkFramebuffer::Create(gpu, this->width(), this->height(),
257 fCachedSimpleRenderPass, fColorAttachmentView,
egdanielce3bfb12016-08-26 11:05:13 -0700258 stencilView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500259 SkASSERT(fFramebuffer);
260}
261
262void GrVkRenderTarget::getAttachmentsDescriptor(
263 GrVkRenderPass::AttachmentsDescriptor* desc,
264 GrVkRenderPass::AttachmentFlags* attachmentFlags) const {
Greg Danielb46add82019-01-02 14:51:29 -0500265 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500266 VkFormat colorFormat;
267 GrPixelConfigToVkFormat(this->config(), &colorFormat);
268 desc->fColor.fFormat = colorFormat;
Chris Dalton6ce447a2019-06-23 18:07:38 -0600269 desc->fColor.fSamples = this->numSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500270 *attachmentFlags = GrVkRenderPass::kColor_AttachmentFlag;
271 uint32_t attachmentCount = 1;
Greg Daniel164a9f02016-02-22 09:56:40 -0500272
273 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
274 if (stencil) {
275 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
276 desc->fStencil.fFormat = vkStencil->vkFormat();
Brian Salomonbdecacf2018-02-02 20:32:49 -0500277 desc->fStencil.fSamples = vkStencil->numSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500278 // Currently in vulkan stencil and color attachments must all have same number of samples
279 SkASSERT(desc->fColor.fSamples == desc->fStencil.fSamples);
280 *attachmentFlags |= GrVkRenderPass::kStencil_AttachmentFlag;
281 ++attachmentCount;
282 }
283 desc->fAttachmentCount = attachmentCount;
284}
285
286GrVkRenderTarget::~GrVkRenderTarget() {
287 // either release or abandon should have been called by the owner of this object.
egdanielb2df0c22016-05-13 11:30:37 -0700288 SkASSERT(!fMSAAImage);
Greg Daniel164a9f02016-02-22 09:56:40 -0500289 SkASSERT(!fResolveAttachmentView);
290 SkASSERT(!fColorAttachmentView);
291 SkASSERT(!fFramebuffer);
292 SkASSERT(!fCachedSimpleRenderPass);
Greg Daniel070cbaf2019-01-03 17:35:54 -0500293 SkASSERT(!fSecondaryCommandBuffer);
Greg Daniel164a9f02016-02-22 09:56:40 -0500294}
295
296void GrVkRenderTarget::addResources(GrVkCommandBuffer& commandBuffer) const {
297 commandBuffer.addResource(this->framebuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500298 commandBuffer.addResource(this->colorAttachmentView());
egdanielce3bfb12016-08-26 11:05:13 -0700299 commandBuffer.addResource(this->msaaImageResource() ? this->msaaImageResource()
300 : this->resource());
Greg Daniel164a9f02016-02-22 09:56:40 -0500301 if (this->stencilImageResource()) {
302 commandBuffer.addResource(this->stencilImageResource());
303 commandBuffer.addResource(this->stencilAttachmentView());
304 }
305}
306
307void GrVkRenderTarget::releaseInternalObjects() {
308 GrVkGpu* gpu = this->getVkGpu();
309
egdanielb2df0c22016-05-13 11:30:37 -0700310 if (fMSAAImage) {
311 fMSAAImage->releaseImage(gpu);
Greg Daniel2db32322017-04-03 10:29:43 -0400312 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500313 }
314
315 if (fResolveAttachmentView) {
316 fResolveAttachmentView->unref(gpu);
317 fResolveAttachmentView = nullptr;
318 }
319 if (fColorAttachmentView) {
320 fColorAttachmentView->unref(gpu);
321 fColorAttachmentView = nullptr;
322 }
323 if (fFramebuffer) {
324 fFramebuffer->unref(gpu);
325 fFramebuffer = nullptr;
326 }
327 if (fCachedSimpleRenderPass) {
328 fCachedSimpleRenderPass->unref(gpu);
329 fCachedSimpleRenderPass = nullptr;
330 }
Greg Daniel070cbaf2019-01-03 17:35:54 -0500331 if (fSecondaryCommandBuffer) {
332 fSecondaryCommandBuffer->unref(gpu);
333 fSecondaryCommandBuffer = nullptr;
334 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500335}
336
337void GrVkRenderTarget::abandonInternalObjects() {
egdanielb2df0c22016-05-13 11:30:37 -0700338 if (fMSAAImage) {
339 fMSAAImage->abandonImage();
Greg Daniel2db32322017-04-03 10:29:43 -0400340 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500341 }
342
343 if (fResolveAttachmentView) {
344 fResolveAttachmentView->unrefAndAbandon();
345 fResolveAttachmentView = nullptr;
346 }
347 if (fColorAttachmentView) {
348 fColorAttachmentView->unrefAndAbandon();
349 fColorAttachmentView = nullptr;
350 }
351 if (fFramebuffer) {
352 fFramebuffer->unrefAndAbandon();
353 fFramebuffer = nullptr;
354 }
355 if (fCachedSimpleRenderPass) {
356 fCachedSimpleRenderPass->unrefAndAbandon();
357 fCachedSimpleRenderPass = nullptr;
358 }
Greg Daniel070cbaf2019-01-03 17:35:54 -0500359 if (fSecondaryCommandBuffer) {
360 fSecondaryCommandBuffer->unrefAndAbandon();
361 fSecondaryCommandBuffer = nullptr;
362 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500363}
364
365void GrVkRenderTarget::onRelease() {
366 this->releaseInternalObjects();
kkinnunen2e6055b2016-04-22 01:48:29 -0700367 this->releaseImage(this->getVkGpu());
Greg Daniel164a9f02016-02-22 09:56:40 -0500368 GrRenderTarget::onRelease();
369}
370
371void GrVkRenderTarget::onAbandon() {
372 this->abandonInternalObjects();
373 this->abandonImage();
374 GrRenderTarget::onAbandon();
375}
376
377
Robert Phillipsb67821d2017-12-13 15:00:45 -0500378GrBackendRenderTarget GrVkRenderTarget::getBackendRenderTarget() const {
Greg Danielb46add82019-01-02 14:51:29 -0500379 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Brian Salomon4456a0d2019-07-18 15:05:11 -0400380 return GrBackendRenderTarget(this->width(), this->height(), this->numSamples(), fInfo,
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400381 this->grVkImageLayout());
Robert Phillipsb67821d2017-12-13 15:00:45 -0500382}
383
egdanielb2df0c22016-05-13 11:30:37 -0700384const GrVkResource* GrVkRenderTarget::stencilImageResource() const {
Greg Danielb46add82019-01-02 14:51:29 -0500385 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500386 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
387 if (stencil) {
388 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
389 return vkStencil->imageResource();
390 }
391
392 return nullptr;
393}
394
395const GrVkImageView* GrVkRenderTarget::stencilAttachmentView() const {
Greg Danielb46add82019-01-02 14:51:29 -0500396 SkASSERT(!this->wrapsSecondaryCommandBuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500397 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
398 if (stencil) {
399 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
400 return vkStencil->stencilView();
401 }
402
403 return nullptr;
404}
405
Greg Daniel164a9f02016-02-22 09:56:40 -0500406GrVkGpu* GrVkRenderTarget::getVkGpu() const {
407 SkASSERT(!this->wasDestroyed());
408 return static_cast<GrVkGpu*>(this->getGpu());
409}