blob: c5a8628cc4f67a4aaee1378db174ad6bbfa7e108 [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,
29 const GrVkImageInfo& msaaInfo,
Greg Daniel164a9f02016-02-22 09:56:40 -050030 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070031 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040032 GrBackendObjectOwnership ownership)
kkinnunen2e6055b2016-04-22 01:48:29 -070033 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040034 , GrVkImage(info, ownership)
Greg Daniel164a9f02016-02-22 09:56:40 -050035 // for the moment we only support 1:1 color to stencil
Jim Van Verth6a40abc2017-11-02 16:56:09 +000036 , GrRenderTarget(gpu, desc)
Greg Daniel164a9f02016-02-22 09:56:40 -050037 , fColorAttachmentView(colorAttachmentView)
Greg Daniel1591c382017-08-17 15:37:20 -040038 , fMSAAImage(new GrVkImage(msaaInfo, GrBackendObjectOwnership::kOwned))
Greg Daniel164a9f02016-02-22 09:56:40 -050039 , fResolveAttachmentView(resolveAttachmentView)
egdaniel50ead532016-07-13 14:23:26 -070040 , fFramebuffer(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -050041 , fCachedSimpleRenderPass(nullptr) {
Brian Salomon18c52a72018-02-02 06:53:26 -050042 SkASSERT(desc.fSampleCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -050043 this->createFramebuffer(gpu);
kkinnunen2e6055b2016-04-22 01:48:29 -070044 this->registerWithCache(budgeted);
Greg Daniel164a9f02016-02-22 09:56:40 -050045}
46
47// We're virtually derived from GrSurface (via GrRenderTarget) so its
48// constructor must be explicitly called.
49GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
50 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070051 const GrVkImageInfo& info,
52 const GrVkImageInfo& msaaInfo,
Greg Daniel164a9f02016-02-22 09:56:40 -050053 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070054 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040055 GrBackendObjectOwnership ownership)
kkinnunen2e6055b2016-04-22 01:48:29 -070056 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040057 , GrVkImage(info, ownership)
Greg Daniel164a9f02016-02-22 09:56:40 -050058 // for the moment we only support 1:1 color to stencil
Jim Van Verth6a40abc2017-11-02 16:56:09 +000059 , GrRenderTarget(gpu, desc)
Greg Daniel164a9f02016-02-22 09:56:40 -050060 , fColorAttachmentView(colorAttachmentView)
Greg Daniel1591c382017-08-17 15:37:20 -040061 , fMSAAImage(new GrVkImage(msaaInfo, GrBackendObjectOwnership::kOwned))
Greg Daniel164a9f02016-02-22 09:56:40 -050062 , fResolveAttachmentView(resolveAttachmentView)
egdaniel50ead532016-07-13 14:23:26 -070063 , fFramebuffer(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -050064 , fCachedSimpleRenderPass(nullptr) {
Brian Salomon18c52a72018-02-02 06:53:26 -050065 SkASSERT(desc.fSampleCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -050066 this->createFramebuffer(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -050067}
68
69// We're virtually derived from GrSurface (via GrRenderTarget) so its
70// constructor must be explicitly called.
71GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -070072 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -050073 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070074 const GrVkImageInfo& info,
75 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040076 GrBackendObjectOwnership ownership)
kkinnunen2e6055b2016-04-22 01:48:29 -070077 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040078 , GrVkImage(info, ownership)
Jim Van Verth6a40abc2017-11-02 16:56:09 +000079 , GrRenderTarget(gpu, desc)
Greg Daniel164a9f02016-02-22 09:56:40 -050080 , fColorAttachmentView(colorAttachmentView)
egdanielb2df0c22016-05-13 11:30:37 -070081 , fMSAAImage(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -050082 , fResolveAttachmentView(nullptr)
egdaniel50ead532016-07-13 14:23:26 -070083 , fFramebuffer(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -050084 , fCachedSimpleRenderPass(nullptr) {
Brian Salomon18c52a72018-02-02 06:53:26 -050085 SkASSERT(!desc.fSampleCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -050086 this->createFramebuffer(gpu);
kkinnunen2e6055b2016-04-22 01:48:29 -070087 this->registerWithCache(budgeted);
Greg Daniel164a9f02016-02-22 09:56:40 -050088}
89
90// We're virtually derived from GrSurface (via GrRenderTarget) so its
91// constructor must be explicitly called.
92GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
93 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070094 const GrVkImageInfo& info,
95 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040096 GrBackendObjectOwnership ownership)
kkinnunen2e6055b2016-04-22 01:48:29 -070097 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040098 , GrVkImage(info, ownership)
Jim Van Verth6a40abc2017-11-02 16:56:09 +000099 , GrRenderTarget(gpu, desc)
Greg Daniel164a9f02016-02-22 09:56:40 -0500100 , fColorAttachmentView(colorAttachmentView)
egdanielb2df0c22016-05-13 11:30:37 -0700101 , fMSAAImage(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -0500102 , fResolveAttachmentView(nullptr)
egdaniel50ead532016-07-13 14:23:26 -0700103 , fFramebuffer(nullptr)
Greg Daniel164a9f02016-02-22 09:56:40 -0500104 , fCachedSimpleRenderPass(nullptr) {
Brian Salomon18c52a72018-02-02 06:53:26 -0500105 SkASSERT(!desc.fSampleCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -0500106 this->createFramebuffer(gpu);
107}
108
109GrVkRenderTarget*
110GrVkRenderTarget::Create(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700111 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -0500112 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -0700113 const GrVkImageInfo& info,
Greg Daniel1591c382017-08-17 15:37:20 -0400114 GrBackendObjectOwnership ownership) {
egdaniel50ead532016-07-13 14:23:26 -0700115 SkASSERT(1 == info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -0500116 VkFormat pixelFormat;
117 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
halcanary9d524f22016-03-29 09:03:52 -0700118
Greg Daniel164a9f02016-02-22 09:56:40 -0500119 VkImage colorImage;
120
121 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700122 GrVkImageInfo msInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -0500123 const GrVkImageView* resolveAttachmentView = nullptr;
Brian Salomon18c52a72018-02-02 06:53:26 -0500124 if (desc.fSampleCnt) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500125 GrVkImage::ImageDesc msImageDesc;
126 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
127 msImageDesc.fFormat = pixelFormat;
128 msImageDesc.fWidth = desc.fWidth;
129 msImageDesc.fHeight = desc.fHeight;
130 msImageDesc.fLevels = 1;
131 msImageDesc.fSamples = desc.fSampleCnt;
132 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700133 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
134 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
135 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500136 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
137
egdanielb2df0c22016-05-13 11:30:37 -0700138 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500139 return nullptr;
140 }
141
142 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700143 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500144
145 // Create Resolve attachment view
egdanielb2df0c22016-05-13 11:30:37 -0700146 resolveAttachmentView = GrVkImageView::Create(gpu, info.fImage, pixelFormat,
jvanverth62340062016-04-26 08:01:44 -0700147 GrVkImageView::kColor_Type, 1);
Greg Daniel164a9f02016-02-22 09:56:40 -0500148 if (!resolveAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700149 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500150 return nullptr;
151 }
152 } else {
153 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700154 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500155 }
156
157 // Get color attachment view
158 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
jvanverth62340062016-04-26 08:01:44 -0700159 GrVkImageView::kColor_Type, 1);
Greg Daniel164a9f02016-02-22 09:56:40 -0500160 if (!colorAttachmentView) {
Brian Salomon18c52a72018-02-02 06:53:26 -0500161 if (desc.fSampleCnt) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500162 resolveAttachmentView->unref(gpu);
egdanielb2df0c22016-05-13 11:30:37 -0700163 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500164 }
egdanielb2df0c22016-05-13 11:30:37 -0700165 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500166 }
167
168 GrVkRenderTarget* texRT;
Brian Salomon18c52a72018-02-02 06:53:26 -0500169 if (desc.fSampleCnt) {
egdanielb2df0c22016-05-13 11:30:37 -0700170 texRT = new GrVkRenderTarget(gpu, budgeted, desc, info, msInfo,
Greg Daniel1591c382017-08-17 15:37:20 -0400171 colorAttachmentView, resolveAttachmentView, ownership);
Greg Daniel164a9f02016-02-22 09:56:40 -0500172 } else {
Greg Daniel1591c382017-08-17 15:37:20 -0400173 texRT = new GrVkRenderTarget(gpu, budgeted, desc, info, colorAttachmentView, ownership);
Greg Daniel164a9f02016-02-22 09:56:40 -0500174 }
175
176 return texRT;
177}
178
179GrVkRenderTarget*
180GrVkRenderTarget::CreateNewRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700181 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -0500182 const GrSurfaceDesc& desc,
Greg Daniel164a9f02016-02-22 09:56:40 -0500183 const GrVkImage::ImageDesc& imageDesc) {
184 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
185
egdanielb2df0c22016-05-13 11:30:37 -0700186 GrVkImageInfo info;
187 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500188 return nullptr;
189 }
190
egdanielb2df0c22016-05-13 11:30:37 -0700191 GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, budgeted, desc, info,
Greg Daniel1591c382017-08-17 15:37:20 -0400192 GrBackendObjectOwnership::kOwned);
egdanielb2df0c22016-05-13 11:30:37 -0700193 if (!rt) {
194 GrVkImage::DestroyImageInfo(gpu, &info);
195 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500196 return rt;
197}
198
bungeman6bd52842016-10-27 09:30:08 -0700199sk_sp<GrVkRenderTarget>
200GrVkRenderTarget::MakeWrappedRenderTarget(GrVkGpu* gpu,
201 const GrSurfaceDesc& desc,
bungeman6bd52842016-10-27 09:30:08 -0700202 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700203 SkASSERT(info);
jvanverthfd359ca2016-03-18 11:57:24 -0700204 SkASSERT(VK_NULL_HANDLE != info->fImage);
jvanverthfd359ca2016-03-18 11:57:24 -0700205
bungeman6bd52842016-10-27 09:30:08 -0700206 return sk_sp<GrVkRenderTarget>(
Greg Daniel1591c382017-08-17 15:37:20 -0400207 GrVkRenderTarget::Create(gpu, SkBudgeted::kNo, desc, *info,
208 GrBackendObjectOwnership::kBorrowed));
Greg Daniel164a9f02016-02-22 09:56:40 -0500209}
210
211bool GrVkRenderTarget::completeStencilAttachment() {
212 this->createFramebuffer(this->getVkGpu());
213 return true;
214}
215
216void GrVkRenderTarget::createFramebuffer(GrVkGpu* gpu) {
217 if (fFramebuffer) {
218 fFramebuffer->unref(gpu);
219 }
220 if (fCachedSimpleRenderPass) {
221 fCachedSimpleRenderPass->unref(gpu);
222 }
223
224 // Vulkan requires us to create a compatible renderpass before we can create our framebuffer,
225 // so we use this to get a (cached) basic renderpass, only for creation.
egdanield62e28b2016-06-07 08:43:30 -0700226 fCachedSimpleRenderPass =
227 gpu->resourceProvider().findCompatibleRenderPass(*this, &fCompatibleRPHandle);
Greg Daniel164a9f02016-02-22 09:56:40 -0500228
229 // Stencil attachment view is stored in the base RT stencil attachment
230 const GrVkImageView* stencilView = this->stencilAttachmentView();
231 fFramebuffer = GrVkFramebuffer::Create(gpu, this->width(), this->height(),
232 fCachedSimpleRenderPass, fColorAttachmentView,
egdanielce3bfb12016-08-26 11:05:13 -0700233 stencilView);
Greg Daniel164a9f02016-02-22 09:56:40 -0500234 SkASSERT(fFramebuffer);
235}
236
237void GrVkRenderTarget::getAttachmentsDescriptor(
238 GrVkRenderPass::AttachmentsDescriptor* desc,
239 GrVkRenderPass::AttachmentFlags* attachmentFlags) const {
Brian Salomon18c52a72018-02-02 06:53:26 -0500240 int colorSamples = this->numColorSamples();
Greg Daniel164a9f02016-02-22 09:56:40 -0500241 VkFormat colorFormat;
242 GrPixelConfigToVkFormat(this->config(), &colorFormat);
243 desc->fColor.fFormat = colorFormat;
Brian Salomon18c52a72018-02-02 06:53:26 -0500244 desc->fColor.fSamples = colorSamples ? colorSamples : 1;
Greg Daniel164a9f02016-02-22 09:56:40 -0500245 *attachmentFlags = GrVkRenderPass::kColor_AttachmentFlag;
246 uint32_t attachmentCount = 1;
Greg Daniel164a9f02016-02-22 09:56:40 -0500247
248 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
249 if (stencil) {
250 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
251 desc->fStencil.fFormat = vkStencil->vkFormat();
Brian Salomon18c52a72018-02-02 06:53:26 -0500252 desc->fStencil.fSamples = vkStencil->numSamples() ? vkStencil->numSamples() : 1;
Greg Daniel164a9f02016-02-22 09:56:40 -0500253 // Currently in vulkan stencil and color attachments must all have same number of samples
254 SkASSERT(desc->fColor.fSamples == desc->fStencil.fSamples);
255 *attachmentFlags |= GrVkRenderPass::kStencil_AttachmentFlag;
256 ++attachmentCount;
257 }
258 desc->fAttachmentCount = attachmentCount;
259}
260
261GrVkRenderTarget::~GrVkRenderTarget() {
262 // either release or abandon should have been called by the owner of this object.
egdanielb2df0c22016-05-13 11:30:37 -0700263 SkASSERT(!fMSAAImage);
Greg Daniel164a9f02016-02-22 09:56:40 -0500264 SkASSERT(!fResolveAttachmentView);
265 SkASSERT(!fColorAttachmentView);
266 SkASSERT(!fFramebuffer);
267 SkASSERT(!fCachedSimpleRenderPass);
268}
269
270void GrVkRenderTarget::addResources(GrVkCommandBuffer& commandBuffer) const {
271 commandBuffer.addResource(this->framebuffer());
Greg Daniel164a9f02016-02-22 09:56:40 -0500272 commandBuffer.addResource(this->colorAttachmentView());
egdanielce3bfb12016-08-26 11:05:13 -0700273 commandBuffer.addResource(this->msaaImageResource() ? this->msaaImageResource()
274 : this->resource());
Greg Daniel164a9f02016-02-22 09:56:40 -0500275 if (this->stencilImageResource()) {
276 commandBuffer.addResource(this->stencilImageResource());
277 commandBuffer.addResource(this->stencilAttachmentView());
278 }
279}
280
281void GrVkRenderTarget::releaseInternalObjects() {
282 GrVkGpu* gpu = this->getVkGpu();
283
egdanielb2df0c22016-05-13 11:30:37 -0700284 if (fMSAAImage) {
285 fMSAAImage->releaseImage(gpu);
Greg Daniel2db32322017-04-03 10:29:43 -0400286 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500287 }
288
289 if (fResolveAttachmentView) {
290 fResolveAttachmentView->unref(gpu);
291 fResolveAttachmentView = nullptr;
292 }
293 if (fColorAttachmentView) {
294 fColorAttachmentView->unref(gpu);
295 fColorAttachmentView = nullptr;
296 }
297 if (fFramebuffer) {
298 fFramebuffer->unref(gpu);
299 fFramebuffer = nullptr;
300 }
301 if (fCachedSimpleRenderPass) {
302 fCachedSimpleRenderPass->unref(gpu);
303 fCachedSimpleRenderPass = nullptr;
304 }
305}
306
307void GrVkRenderTarget::abandonInternalObjects() {
egdanielb2df0c22016-05-13 11:30:37 -0700308 if (fMSAAImage) {
309 fMSAAImage->abandonImage();
Greg Daniel2db32322017-04-03 10:29:43 -0400310 fMSAAImage.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500311 }
312
313 if (fResolveAttachmentView) {
314 fResolveAttachmentView->unrefAndAbandon();
315 fResolveAttachmentView = nullptr;
316 }
317 if (fColorAttachmentView) {
318 fColorAttachmentView->unrefAndAbandon();
319 fColorAttachmentView = nullptr;
320 }
321 if (fFramebuffer) {
322 fFramebuffer->unrefAndAbandon();
323 fFramebuffer = nullptr;
324 }
325 if (fCachedSimpleRenderPass) {
326 fCachedSimpleRenderPass->unrefAndAbandon();
327 fCachedSimpleRenderPass = nullptr;
328 }
329}
330
331void GrVkRenderTarget::onRelease() {
332 this->releaseInternalObjects();
kkinnunen2e6055b2016-04-22 01:48:29 -0700333 this->releaseImage(this->getVkGpu());
Greg Daniel164a9f02016-02-22 09:56:40 -0500334 GrRenderTarget::onRelease();
335}
336
337void GrVkRenderTarget::onAbandon() {
338 this->abandonInternalObjects();
339 this->abandonImage();
340 GrRenderTarget::onAbandon();
341}
342
343
344GrBackendObject GrVkRenderTarget::getRenderTargetHandle() const {
egdaniel580fa592016-08-31 11:03:50 -0700345 // If the render target is multisampled, we currently return the ImageInfo for the resolved
346 // image. If we only wrap the msaa target (currently not implemented) we should return a handle
347 // to that instead.
348 return (GrBackendObject)&fInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -0500349}
350
Robert Phillipsb67821d2017-12-13 15:00:45 -0500351GrBackendRenderTarget GrVkRenderTarget::getBackendRenderTarget() const {
352 return GrBackendRenderTarget(this->width(), this->height(), this->numColorSamples(),
353 this->numStencilSamples(), fInfo);
354}
355
egdanielb2df0c22016-05-13 11:30:37 -0700356const GrVkResource* GrVkRenderTarget::stencilImageResource() const {
Greg Daniel164a9f02016-02-22 09:56:40 -0500357 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
358 if (stencil) {
359 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
360 return vkStencil->imageResource();
361 }
362
363 return nullptr;
364}
365
366const GrVkImageView* GrVkRenderTarget::stencilAttachmentView() const {
367 const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
368 if (stencil) {
369 const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
370 return vkStencil->stencilView();
371 }
372
373 return nullptr;
374}
375
376
377GrVkGpu* GrVkRenderTarget::getVkGpu() const {
378 SkASSERT(!this->wasDestroyed());
379 return static_cast<GrVkGpu*>(this->getGpu());
380}