blob: 0fde5f981683759d0ef67476140690065cc505bf [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 "GrVkTextureRenderTarget.h"
9
Robert Phillips646e4292017-06-13 12:44:56 -040010#include "GrTexturePriv.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050011#include "GrVkGpu.h"
12#include "GrVkImageView.h"
13#include "GrVkUtil.h"
14
egdanieldd97b852016-04-28 09:30:39 -070015#include "SkMipMap.h"
jvanverth62340062016-04-26 08:01:44 -070016
jvanverthfd359ca2016-03-18 11:57:24 -070017#include "vk/GrVkTypes.h"
18
Greg Daniel164a9f02016-02-22 09:56:40 -050019#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
20
Greg Daniel6ecc9112017-06-16 16:17:03 +000021GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
22 SkBudgeted budgeted,
23 const GrSurfaceDesc& desc,
24 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040025 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000026 const GrVkImageView* texView,
27 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040028 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000029 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040030 const GrVkImageView* resolveAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040031 GrMipMapsStatus mipMapsStatus,
32 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000033 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040034 , GrVkImage(info, layout, ownership)
35 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
36 , GrVkRenderTarget(gpu, desc, info, layout, msaaInfo, std::move(msaaLayout),
37 colorAttachmentView, resolveAttachmentView,
38 GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000039 this->registerWithCache(budgeted);
40}
41
42GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
43 SkBudgeted budgeted,
44 const GrSurfaceDesc& desc,
45 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040046 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000047 const GrVkImageView* texView,
Greg Daniel1591c382017-08-17 15:37:20 -040048 const GrVkImageView* colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040049 GrMipMapsStatus mipMapsStatus,
50 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000051 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040052 , GrVkImage(info, layout, ownership)
53 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
54 , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView,
55 GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000056 this->registerWithCache(budgeted);
57}
58
59GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
60 const GrSurfaceDesc& desc,
61 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040062 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000063 const GrVkImageView* texView,
64 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040065 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000066 const GrVkImageView* colorAttachmentView,
67 const GrVkImageView* resolveAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040068 GrMipMapsStatus mipMapsStatus,
Greg Daniel1591c382017-08-17 15:37:20 -040069 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000070 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040071 , GrVkImage(info, layout, ownership)
72 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
73 , GrVkRenderTarget(gpu, desc, info, layout, msaaInfo, std::move(msaaLayout),
74 colorAttachmentView, resolveAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000075 this->registerWithCacheWrapped();
76}
77
78GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
79 const GrSurfaceDesc& desc,
80 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040081 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000082 const GrVkImageView* texView,
83 const GrVkImageView* colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040084 GrMipMapsStatus mipMapsStatus,
Greg Daniel1591c382017-08-17 15:37:20 -040085 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000086 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040087 , GrVkImage(info, layout, ownership)
88 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
89 , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000090 this->registerWithCacheWrapped();
91}
92
Robert Phillips67d52cf2017-06-05 13:38:13 -040093sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::Make(GrVkGpu* gpu,
94 const GrSurfaceDesc& desc,
95 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040096 sk_sp<GrVkImageLayout> layout,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040097 GrMipMapsStatus mipMapsStatus,
Robert Phillips67d52cf2017-06-05 13:38:13 -040098 SkBudgeted budgeted,
Greg Daniel1591c382017-08-17 15:37:20 -040099 GrBackendObjectOwnership ownership,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400100 bool isWrapped) {
egdanielb2df0c22016-05-13 11:30:37 -0700101 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500102 // Create the texture ImageView
egdanielb2df0c22016-05-13 11:30:37 -0700103 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, info.fFormat,
egdaniel50ead532016-07-13 14:23:26 -0700104 GrVkImageView::kColor_Type,
105 info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -0500106 if (!imageView) {
107 return nullptr;
108 }
109
110 VkFormat pixelFormat;
111 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
112
113 VkImage colorImage;
114
115 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700116 GrVkImageInfo msInfo;
Greg Daniel52e16d92018-04-10 09:34:07 -0400117 sk_sp<GrVkImageLayout> msLayout;
Greg Daniel164a9f02016-02-22 09:56:40 -0500118 const GrVkImageView* resolveAttachmentView = nullptr;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500119 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500120 GrVkImage::ImageDesc msImageDesc;
121 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
122 msImageDesc.fFormat = pixelFormat;
123 msImageDesc.fWidth = desc.fWidth;
124 msImageDesc.fHeight = desc.fHeight;
125 msImageDesc.fLevels = 1;
126 msImageDesc.fSamples = desc.fSampleCnt;
127 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700128 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
129 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
130 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500131 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
132
egdanielb2df0c22016-05-13 11:30:37 -0700133 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
egdanielce3bfb12016-08-26 11:05:13 -0700134 imageView->unref(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -0500135 return nullptr;
136 }
137
138 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700139 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500140
egdaniel50ead532016-07-13 14:23:26 -0700141 // Create resolve attachment view.
142 resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelFormat,
143 GrVkImageView::kColor_Type,
144 info.fLevelCount);
145 if (!resolveAttachmentView) {
146 GrVkImage::DestroyImageInfo(gpu, &msInfo);
147 imageView->unref(gpu);
148 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500149 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400150 msLayout.reset(new GrVkImageLayout(msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500151 } else {
152 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700153 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500154 }
155
egdaniel50ead532016-07-13 14:23:26 -0700156 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
157 GrVkImageView::kColor_Type, 1);
158 if (!colorAttachmentView) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500159 if (desc.fSampleCnt > 1) {
egdaniel50ead532016-07-13 14:23:26 -0700160 resolveAttachmentView->unref(gpu);
161 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500162 }
egdaniel50ead532016-07-13 14:23:26 -0700163 imageView->unref(gpu);
164 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500165 }
egdaniel50ead532016-07-13 14:23:26 -0700166
Robert Phillips67d52cf2017-06-05 13:38:13 -0400167 sk_sp<GrVkTextureRenderTarget> texRT;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500168 if (desc.fSampleCnt > 1) {
Greg Daniel1591c382017-08-17 15:37:20 -0400169 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400170 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
171 gpu, budgeted, desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400172 info, std::move(layout), imageView, msInfo,
173 std::move(msLayout), colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400174 resolveAttachmentView, mipMapsStatus,
175 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700176 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400177 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
178 gpu, desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400179 info, std::move(layout), imageView, msInfo,
180 std::move(msLayout), colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400181 resolveAttachmentView, mipMapsStatus,
182 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700183 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500184 } else {
Greg Daniel1591c382017-08-17 15:37:20 -0400185 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400186 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
187 gpu, budgeted, desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400188 info, std::move(layout), imageView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400189 colorAttachmentView, mipMapsStatus,
190 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700191 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400192 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
193 gpu, desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400194 info, std::move(layout), imageView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400195 colorAttachmentView, mipMapsStatus,
196 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700197 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500198 }
199 return texRT;
200}
201
Robert Phillips67d52cf2017-06-05 13:38:13 -0400202sk_sp<GrVkTextureRenderTarget>
Greg Daniel164a9f02016-02-22 09:56:40 -0500203GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700204 SkBudgeted budgeted,
205 const GrSurfaceDesc& desc,
Greg Daniel834f1202017-10-09 15:06:20 -0400206 const GrVkImage::ImageDesc& imageDesc,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400207 GrMipMapsStatus mipMapsStatus) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500208 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
209 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
210
egdanielb2df0c22016-05-13 11:30:37 -0700211 GrVkImageInfo info;
212 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500213 return nullptr;
214 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400215 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500216
Greg Daniel52e16d92018-04-10 09:34:07 -0400217 sk_sp<GrVkTextureRenderTarget> trt = Make(gpu, desc, info, std::move(layout), mipMapsStatus,
218 budgeted, GrBackendObjectOwnership::kOwned, false);
egdanielb2df0c22016-05-13 11:30:37 -0700219 if (!trt) {
220 GrVkImage::DestroyImageInfo(gpu, &info);
221 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500222
223 return trt;
224}
225
bungeman6bd52842016-10-27 09:30:08 -0700226sk_sp<GrVkTextureRenderTarget>
227GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
228 const GrSurfaceDesc& desc,
Greg Daniel1591c382017-08-17 15:37:20 -0400229 GrWrapOwnership wrapOwnership,
Greg Daniel52e16d92018-04-10 09:34:07 -0400230 const GrVkImageInfo& info,
231 sk_sp<GrVkImageLayout> layout) {
jvanverthfd359ca2016-03-18 11:57:24 -0700232 // Wrapped textures require both image and allocation (because they can be mapped)
Greg Daniel52e16d92018-04-10 09:34:07 -0400233 SkASSERT(VK_NULL_HANDLE != info.fImage && VK_NULL_HANDLE != info.fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500234
Greg Daniel52e16d92018-04-10 09:34:07 -0400235 GrMipMapsStatus mipMapsStatus = info.fLevelCount > 1 ? GrMipMapsStatus::kDirty
236 : GrMipMapsStatus::kNotAllocated;
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400237
Greg Daniel1591c382017-08-17 15:37:20 -0400238 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
239 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
jvanverthfd359ca2016-03-18 11:57:24 -0700240
Greg Daniel52e16d92018-04-10 09:34:07 -0400241 return Make(gpu, desc, info, std::move(layout), mipMapsStatus, SkBudgeted::kNo, ownership,
242 true);
Greg Daniel164a9f02016-02-22 09:56:40 -0500243}
egdaniel50ead532016-07-13 14:23:26 -0700244
245bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
246 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400247 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
Brian Salomonbdecacf2018-02-02 20:32:49 -0500248 if (this->numStencilSamples() > 1) {
egdaniel50ead532016-07-13 14:23:26 -0700249 const GrVkImageView* resolveAttachmentView =
250 GrVkImageView::Create(gpu,
251 newInfo.fImage,
252 pixelFormat,
253 GrVkImageView::kColor_Type,
254 newInfo.fLevelCount);
255 if (!resolveAttachmentView) {
256 return false;
257 }
258 fResolveAttachmentView->unref(gpu);
259 fResolveAttachmentView = resolveAttachmentView;
260 } else {
261 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
262 newInfo.fImage,
263 pixelFormat,
264 GrVkImageView::kColor_Type,
265 1);
266 if (!colorAttachmentView) {
267 return false;
268 }
269 fColorAttachmentView->unref(gpu);
270 fColorAttachmentView = colorAttachmentView;
271 }
272
273 this->createFramebuffer(gpu);
274 return true;
275}
276
Robert Phillips646e4292017-06-13 12:44:56 -0400277size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500278 int numColorSamples = this->numColorSamples();
279 if (numColorSamples > 1) {
280 // Add one to account for the resolve VkImage.
281 ++numColorSamples;
282 }
Robert Phillips646e4292017-06-13 12:44:56 -0400283 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
284 numColorSamples, // TODO: this still correct?
Greg Daniele252f082017-10-23 16:05:23 -0400285 this->texturePriv().mipMapped());
Robert Phillips646e4292017-06-13 12:44:56 -0400286}