blob: 5570c0d3b4b6223c743bad87751661b3f17997ce [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#include "GrVkRenderTarget.h"
9
Robert Phillipsb67821d2017-12-13 15:00:45 -050010#include "GrBackendSurface.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050011#include "GrRenderTargetPriv.h"
12#include "GrVkCommandBuffer.h"
13#include "GrVkFramebuffer.h"
14#include "GrVkGpu.h"
15#include "GrVkImageView.h"
16#include "GrVkResourceProvider.h"
17#include "GrVkUtil.h"
18
jvanverthfd359ca2016-03-18 11:57:24 -070019#include "vk/GrVkTypes.h"
20
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,
kkinnunen2e6055b2016-04-22 01:48:29 -070026 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -050027 const GrSurfaceDesc& desc,
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,
egdanielb2df0c22016-05-13 11:30:37 -070033 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040034 GrBackendObjectOwnership ownership)
kkinnunen2e6055b2016-04-22 01:48:29 -070035 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040036 , GrVkImage(info, std::move(layout), ownership)
Greg Daniel164a9f02016-02-22 09:56:40 -050037 // for the moment we only support 1:1 color to stencil
Jim Van Verth6a40abc2017-11-02 16:56:09 +000038 , GrRenderTarget(gpu, desc)
Greg Daniel164a9f02016-02-22 09:56:40 -050039 , fColorAttachmentView(colorAttachmentView)
Greg Daniel52e16d92018-04-10 09:34:07 -040040 , fMSAAImage(new GrVkImage(msaaInfo, std::move(msaaLayout), GrBackendObjectOwnership::kOwned))
Greg Daniel164a9f02016-02-22 09:56:40 -050041 , fResolveAttachmentView(resolveAttachmentView)
egdaniel50ead532016-07-13 14:23:26 -070042 , fFramebuffer(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -050043 , fCachedSimpleRenderPass(nullptr) {
Brian Salomonbdecacf2018-02-02 20:32:49 -050044 SkASSERT(desc.fSampleCnt > 1);
Greg Daniel164a9f02016-02-22 09:56:40 -050045 this->createFramebuffer(gpu);
kkinnunen2e6055b2016-04-22 01:48:29 -070046 this->registerWithCache(budgeted);
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)
kkinnunen2e6055b2016-04-22 01:48:29 -070060 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040061 , GrVkImage(info, std::move(layout), ownership)
Greg Daniel164a9f02016-02-22 09:56:40 -050062 // for the moment we only support 1:1 color to stencil
Jim Van Verth6a40abc2017-11-02 16:56:09 +000063 , GrRenderTarget(gpu, desc)
Greg Daniel164a9f02016-02-22 09:56:40 -050064 , fColorAttachmentView(colorAttachmentView)
Greg Daniel52e16d92018-04-10 09:34:07 -040065 , fMSAAImage(new GrVkImage(msaaInfo, std::move(msaaLayout), GrBackendObjectOwnership::kOwned))
Greg Daniel164a9f02016-02-22 09:56:40 -050066 , fResolveAttachmentView(resolveAttachmentView)
egdaniel50ead532016-07-13 14:23:26 -070067 , fFramebuffer(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -050068 , 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,
kkinnunen2e6055b2016-04-22 01:48:29 -070076 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -050077 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070078 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040079 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070080 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040081 GrBackendObjectOwnership ownership)
kkinnunen2e6055b2016-04-22 01:48:29 -070082 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040083 , GrVkImage(info, std::move(layout), ownership)
Jim Van Verth6a40abc2017-11-02 16:56:09 +000084 , GrRenderTarget(gpu, desc)
Greg Daniel164a9f02016-02-22 09:56:40 -050085 , fColorAttachmentView(colorAttachmentView)
egdanielb2df0c22016-05-13 11:30:37 -070086 , fMSAAImage(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -050087 , fResolveAttachmentView(nullptr)
egdaniel50ead532016-07-13 14:23:26 -070088 , fFramebuffer(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -050089 , 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);
kkinnunen2e6055b2016-04-22 01:48:29 -070092 this->registerWithCache(budgeted);
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)
kkinnunen2e6055b2016-04-22 01:48:29 -0700103 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -0400104 , GrVkImage(info, std::move(layout), ownership)
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000105 , GrRenderTarget(gpu, desc)
Greg Daniel164a9f02016-02-22 09:56:40 -0500106 , fColorAttachmentView(colorAttachmentView)
egdanielb2df0c22016-05-13 11:30:37 -0700107 , fMSAAImage(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -0500108 , fResolveAttachmentView(nullptr)
egdaniel50ead532016-07-13 14:23:26 -0700109 , fFramebuffer(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -0500110 , 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
115GrVkRenderTarget*
116GrVkRenderTarget::Create(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700117 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -0500118 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -0700119 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -0400120 sk_sp<GrVkImageLayout> layout,
Greg Daniel1591c382017-08-17 15:37:20 -0400121 GrBackendObjectOwnership ownership) {
egdaniel50ead532016-07-13 14:23:26 -0700122 SkASSERT(1 == info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -0500123 VkFormat pixelFormat;
124 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
halcanary9d524f22016-03-29 09:03:52 -0700125
Greg Daniel164a9f02016-02-22 09:56:40 -0500126 VkImage colorImage;
127
128 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700129 GrVkImageInfo msInfo;
Greg Daniel52e16d92018-04-10 09:34:07 -0400130 sk_sp<GrVkImageLayout> msLayout;
Greg Daniel164a9f02016-02-22 09:56:40 -0500131 const GrVkImageView* resolveAttachmentView = nullptr;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500132 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500133 GrVkImage::ImageDesc msImageDesc;
134 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
135 msImageDesc.fFormat = pixelFormat;
136 msImageDesc.fWidth = desc.fWidth;
137 msImageDesc.fHeight = desc.fHeight;
138 msImageDesc.fLevels = 1;
139 msImageDesc.fSamples = desc.fSampleCnt;
140 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700141 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
142 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
143 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500144 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
145
egdanielb2df0c22016-05-13 11:30:37 -0700146 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500147 return nullptr;
148 }
149
150 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700151 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500152
153 // Create Resolve attachment view
egdanielb2df0c22016-05-13 11:30:37 -0700154 resolveAttachmentView = GrVkImageView::Create(gpu, info.fImage, pixelFormat,
jvanverth62340062016-04-26 08:01:44 -0700155 GrVkImageView::kColor_Type, 1);
Greg Daniel164a9f02016-02-22 09:56:40 -0500156 if (!resolveAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700157 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500158 return nullptr;
159 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400160 msLayout.reset(new GrVkImageLayout(msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500161 } else {
162 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700163 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500164 }
165
166 // Get color attachment view
167 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
jvanverth62340062016-04-26 08:01:44 -0700168 GrVkImageView::kColor_Type, 1);
Greg Daniel164a9f02016-02-22 09:56:40 -0500169 if (!colorAttachmentView) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500170 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500171 resolveAttachmentView->unref(gpu);
egdanielb2df0c22016-05-13 11:30:37 -0700172 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500173 }
egdanielb2df0c22016-05-13 11:30:37 -0700174 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500175 }
176
177 GrVkRenderTarget* texRT;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500178 if (desc.fSampleCnt > 1) {
Greg Daniel52e16d92018-04-10 09:34:07 -0400179 texRT = new GrVkRenderTarget(gpu, budgeted, desc, info, std::move(layout), msInfo,
180 std::move(msLayout), colorAttachmentView,
181 resolveAttachmentView, ownership);
Greg Daniel164a9f02016-02-22 09:56:40 -0500182 } else {
Greg Daniel52e16d92018-04-10 09:34:07 -0400183 texRT = new GrVkRenderTarget(gpu, budgeted, desc, info, std::move(layout),
184 colorAttachmentView, ownership);
Greg Daniel164a9f02016-02-22 09:56:40 -0500185 }
186
187 return texRT;
188}
189
190GrVkRenderTarget*
191GrVkRenderTarget::CreateNewRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700192 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -0500193 const GrSurfaceDesc& desc,
Greg Daniel164a9f02016-02-22 09:56:40 -0500194 const GrVkImage::ImageDesc& imageDesc) {
195 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
196
egdanielb2df0c22016-05-13 11:30:37 -0700197 GrVkImageInfo info;
198 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500199 return nullptr;
200 }
201
Greg Daniel52e16d92018-04-10 09:34:07 -0400202 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
203 GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, budgeted, desc, info, std::move(layout),
Greg Daniel1591c382017-08-17 15:37:20 -0400204 GrBackendObjectOwnership::kOwned);
egdanielb2df0c22016-05-13 11:30:37 -0700205 if (!rt) {
206 GrVkImage::DestroyImageInfo(gpu, &info);
207 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500208 return rt;
209}
210
bungeman6bd52842016-10-27 09:30:08 -0700211sk_sp<GrVkRenderTarget>
212GrVkRenderTarget::MakeWrappedRenderTarget(GrVkGpu* gpu,
213 const GrSurfaceDesc& desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400214 const GrVkImageInfo& info,
215 sk_sp<GrVkImageLayout> layout) {
216 SkASSERT(VK_NULL_HANDLE != info.fImage);
jvanverthfd359ca2016-03-18 11:57:24 -0700217
bungeman6bd52842016-10-27 09:30:08 -0700218 return sk_sp<GrVkRenderTarget>(
Greg Daniel52e16d92018-04-10 09:34:07 -0400219 GrVkRenderTarget::Create(gpu, SkBudgeted::kNo, desc, info, std::move(layout),
Greg Daniel1591c382017-08-17 15:37:20 -0400220 GrBackendObjectOwnership::kBorrowed));
Greg Daniel164a9f02016-02-22 09:56:40 -0500221}
222
223bool GrVkRenderTarget::completeStencilAttachment() {
224 this->createFramebuffer(this->getVkGpu());
225 return true;
226}
227
228void GrVkRenderTarget::createFramebuffer(GrVkGpu* gpu) {
229 if (fFramebuffer) {
230 fFramebuffer->unref(gpu);
231 }
232 if (fCachedSimpleRenderPass) {
233 fCachedSimpleRenderPass->unref(gpu);
234 }
235
236 // Vulkan requires us to create a compatible renderpass before we can create our framebuffer,
237 // so we use this to get a (cached) basic renderpass, only for creation.
egdanield62e28b2016-06-07 08:43:30 -0700238 fCachedSimpleRenderPass =
239 gpu->resourceProvider().findCompatibleRenderPass(*this, &fCompatibleRPHandle);
Greg Daniel164a9f02016-02-22 09:56:40 -0500240
241 // Stencil attachment view is stored in the base RT stencil attachment
242 const GrVkImageView* stencilView = this->stencilAttachmentView();
243 fFramebuffer = GrVkFramebuffer::Create(gpu, this->width(), this->height(),
244 fCachedSimpleRenderPass, fColorAttachmentView,
egdanielce3bfb12016-08-26 11:05:13 -0700245 stencilView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500246 SkASSERT(fFramebuffer);
247}
248
249void GrVkRenderTarget::getAttachmentsDescriptor(
250 GrVkRenderPass::AttachmentsDescriptor* desc,
251 GrVkRenderPass::AttachmentFlags* attachmentFlags) const {
Greg Daniel164a9f02016-02-22 09:56:40 -0500252 VkFormat colorFormat;
253 GrPixelConfigToVkFormat(this->config(), &colorFormat);
254 desc->fColor.fFormat = colorFormat;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500255 desc->fColor.fSamples = this->numColorSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500256 *attachmentFlags = GrVkRenderPass::kColor_AttachmentFlag;
257 uint32_t attachmentCount = 1;
Greg Daniel164a9f02016-02-22 09:56:40 -0500258
259 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
260 if (stencil) {
261 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
262 desc->fStencil.fFormat = vkStencil->vkFormat();
Brian Salomonbdecacf2018-02-02 20:32:49 -0500263 desc->fStencil.fSamples = vkStencil->numSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500264 // Currently in vulkan stencil and color attachments must all have same number of samples
265 SkASSERT(desc->fColor.fSamples == desc->fStencil.fSamples);
266 *attachmentFlags |= GrVkRenderPass::kStencil_AttachmentFlag;
267 ++attachmentCount;
268 }
269 desc->fAttachmentCount = attachmentCount;
270}
271
272GrVkRenderTarget::~GrVkRenderTarget() {
273 // either release or abandon should have been called by the owner of this object.
egdanielb2df0c22016-05-13 11:30:37 -0700274 SkASSERT(!fMSAAImage);
Greg Daniel164a9f02016-02-22 09:56:40 -0500275 SkASSERT(!fResolveAttachmentView);
276 SkASSERT(!fColorAttachmentView);
277 SkASSERT(!fFramebuffer);
278 SkASSERT(!fCachedSimpleRenderPass);
279}
280
281void GrVkRenderTarget::addResources(GrVkCommandBuffer& commandBuffer) const {
282 commandBuffer.addResource(this->framebuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500283 commandBuffer.addResource(this->colorAttachmentView());
egdanielce3bfb12016-08-26 11:05:13 -0700284 commandBuffer.addResource(this->msaaImageResource() ? this->msaaImageResource()
285 : this->resource());
Greg Daniel164a9f02016-02-22 09:56:40 -0500286 if (this->stencilImageResource()) {
287 commandBuffer.addResource(this->stencilImageResource());
288 commandBuffer.addResource(this->stencilAttachmentView());
289 }
290}
291
292void GrVkRenderTarget::releaseInternalObjects() {
293 GrVkGpu* gpu = this->getVkGpu();
294
egdanielb2df0c22016-05-13 11:30:37 -0700295 if (fMSAAImage) {
296 fMSAAImage->releaseImage(gpu);
Greg Daniel2db32322017-04-03 10:29:43 -0400297 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500298 }
299
300 if (fResolveAttachmentView) {
301 fResolveAttachmentView->unref(gpu);
302 fResolveAttachmentView = nullptr;
303 }
304 if (fColorAttachmentView) {
305 fColorAttachmentView->unref(gpu);
306 fColorAttachmentView = nullptr;
307 }
308 if (fFramebuffer) {
309 fFramebuffer->unref(gpu);
310 fFramebuffer = nullptr;
311 }
312 if (fCachedSimpleRenderPass) {
313 fCachedSimpleRenderPass->unref(gpu);
314 fCachedSimpleRenderPass = nullptr;
315 }
316}
317
318void GrVkRenderTarget::abandonInternalObjects() {
egdanielb2df0c22016-05-13 11:30:37 -0700319 if (fMSAAImage) {
320 fMSAAImage->abandonImage();
Greg Daniel2db32322017-04-03 10:29:43 -0400321 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500322 }
323
324 if (fResolveAttachmentView) {
325 fResolveAttachmentView->unrefAndAbandon();
326 fResolveAttachmentView = nullptr;
327 }
328 if (fColorAttachmentView) {
329 fColorAttachmentView->unrefAndAbandon();
330 fColorAttachmentView = nullptr;
331 }
332 if (fFramebuffer) {
333 fFramebuffer->unrefAndAbandon();
334 fFramebuffer = nullptr;
335 }
336 if (fCachedSimpleRenderPass) {
337 fCachedSimpleRenderPass->unrefAndAbandon();
338 fCachedSimpleRenderPass = nullptr;
339 }
340}
341
342void GrVkRenderTarget::onRelease() {
343 this->releaseInternalObjects();
kkinnunen2e6055b2016-04-22 01:48:29 -0700344 this->releaseImage(this->getVkGpu());
Greg Daniel164a9f02016-02-22 09:56:40 -0500345 GrRenderTarget::onRelease();
346}
347
348void GrVkRenderTarget::onAbandon() {
349 this->abandonInternalObjects();
350 this->abandonImage();
351 GrRenderTarget::onAbandon();
352}
353
354
355GrBackendObject GrVkRenderTarget::getRenderTargetHandle() const {
egdaniel580fa592016-08-31 11:03:50 -0700356 // If the render target is multisampled, we currently return the ImageInfo for the resolved
357 // image. If we only wrap the msaa target (currently not implemented) we should return a handle
358 // to that instead.
359 return (GrBackendObject)&fInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -0500360}
361
Robert Phillipsb67821d2017-12-13 15:00:45 -0500362GrBackendRenderTarget GrVkRenderTarget::getBackendRenderTarget() const {
Brian Salomon0c51eea2018-03-09 17:02:09 -0500363 int numStencilBits = 0;
364 if (GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment()) {
365 numStencilBits = stencil->bits();
366 }
Greg Daniel8a3f55c2018-03-14 17:32:12 +0000367 return GrBackendRenderTarget(this->width(), this->height(), this->numColorSamples(),
368 numStencilBits, fInfo);
Robert Phillipsb67821d2017-12-13 15:00:45 -0500369}
370
egdanielb2df0c22016-05-13 11:30:37 -0700371const GrVkResource* GrVkRenderTarget::stencilImageResource() const {
Greg Daniel164a9f02016-02-22 09:56:40 -0500372 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
373 if (stencil) {
374 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
375 return vkStencil->imageResource();
376 }
377
378 return nullptr;
379}
380
381const GrVkImageView* GrVkRenderTarget::stencilAttachmentView() const {
382 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
383 if (stencil) {
384 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
385 return vkStencil->stencilView();
386 }
387
388 return nullptr;
389}
390
391
392GrVkGpu* GrVkRenderTarget::getVkGpu() const {
393 SkASSERT(!this->wasDestroyed());
394 return static_cast<GrVkGpu*>(this->getGpu());
395}