blob: 3656c82d118d37cac7ab2bfcef83e749934979ab [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
Greg Daniel7e000222018-12-03 10:08:21 -0500103 const GrVkImageView* imageView = GrVkImageView::Create(
104 gpu, image, info.fFormat, GrVkImageView::kColor_Type, info.fLevelCount,
105 info.fYcbcrConversionInfo);
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,
Greg Daniel7e000222018-12-03 10:08:21 -0500144 info.fLevelCount, GrVkYcbcrConversionInfo());
egdaniel50ead532016-07-13 14:23:26 -0700145 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,
Greg Daniel7e000222018-12-03 10:08:21 -0500157 GrVkImageView::kColor_Type, 1,
158 GrVkYcbcrConversionInfo());
egdaniel50ead532016-07-13 14:23:26 -0700159 if (!colorAttachmentView) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500160 if (desc.fSampleCnt > 1) {
egdaniel50ead532016-07-13 14:23:26 -0700161 resolveAttachmentView->unref(gpu);
162 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500163 }
egdaniel50ead532016-07-13 14:23:26 -0700164 imageView->unref(gpu);
165 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500166 }
egdaniel50ead532016-07-13 14:23:26 -0700167
Robert Phillips67d52cf2017-06-05 13:38:13 -0400168 sk_sp<GrVkTextureRenderTarget> texRT;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500169 if (desc.fSampleCnt > 1) {
Greg Daniel1591c382017-08-17 15:37:20 -0400170 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400171 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
172 gpu, budgeted, desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400173 info, std::move(layout), imageView, msInfo,
174 std::move(msLayout), colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400175 resolveAttachmentView, mipMapsStatus,
176 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700177 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400178 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
179 gpu, desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400180 info, std::move(layout), imageView, msInfo,
181 std::move(msLayout), colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400182 resolveAttachmentView, mipMapsStatus,
183 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700184 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500185 } else {
Greg Daniel1591c382017-08-17 15:37:20 -0400186 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400187 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
188 gpu, budgeted, desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400189 info, std::move(layout), imageView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400190 colorAttachmentView, mipMapsStatus,
191 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700192 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400193 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
194 gpu, desc,
Greg Daniel52e16d92018-04-10 09:34:07 -0400195 info, std::move(layout), imageView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400196 colorAttachmentView, mipMapsStatus,
197 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700198 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500199 }
200 return texRT;
201}
202
Robert Phillips67d52cf2017-06-05 13:38:13 -0400203sk_sp<GrVkTextureRenderTarget>
Greg Daniel475eb702018-09-28 14:16:50 -0400204GrVkTextureRenderTarget::MakeNewTextureRenderTarget(GrVkGpu* gpu,
205 SkBudgeted budgeted,
206 const GrSurfaceDesc& desc,
207 const GrVkImage::ImageDesc& imageDesc,
208 GrMipMapsStatus mipMapsStatus) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500209 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
210 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
211
egdanielb2df0c22016-05-13 11:30:37 -0700212 GrVkImageInfo info;
213 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500214 return nullptr;
215 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400216 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500217
Greg Daniel52e16d92018-04-10 09:34:07 -0400218 sk_sp<GrVkTextureRenderTarget> trt = Make(gpu, desc, info, std::move(layout), mipMapsStatus,
219 budgeted, GrBackendObjectOwnership::kOwned, false);
egdanielb2df0c22016-05-13 11:30:37 -0700220 if (!trt) {
221 GrVkImage::DestroyImageInfo(gpu, &info);
222 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500223
224 return trt;
225}
226
bungeman6bd52842016-10-27 09:30:08 -0700227sk_sp<GrVkTextureRenderTarget>
228GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
229 const GrSurfaceDesc& desc,
Greg Daniel1591c382017-08-17 15:37:20 -0400230 GrWrapOwnership wrapOwnership,
Greg Daniel52e16d92018-04-10 09:34:07 -0400231 const GrVkImageInfo& info,
232 sk_sp<GrVkImageLayout> layout) {
jvanverthfd359ca2016-03-18 11:57:24 -0700233 // Wrapped textures require both image and allocation (because they can be mapped)
Greg Daniel52e16d92018-04-10 09:34:07 -0400234 SkASSERT(VK_NULL_HANDLE != info.fImage && VK_NULL_HANDLE != info.fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500235
Greg Daniel52e16d92018-04-10 09:34:07 -0400236 GrMipMapsStatus mipMapsStatus = info.fLevelCount > 1 ? GrMipMapsStatus::kDirty
237 : GrMipMapsStatus::kNotAllocated;
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400238
Greg Daniel1591c382017-08-17 15:37:20 -0400239 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
240 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
jvanverthfd359ca2016-03-18 11:57:24 -0700241
Greg Daniel52e16d92018-04-10 09:34:07 -0400242 return Make(gpu, desc, info, std::move(layout), mipMapsStatus, SkBudgeted::kNo, ownership,
243 true);
Greg Daniel164a9f02016-02-22 09:56:40 -0500244}
egdaniel50ead532016-07-13 14:23:26 -0700245
246bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
247 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400248 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
Brian Salomonbdecacf2018-02-02 20:32:49 -0500249 if (this->numStencilSamples() > 1) {
egdaniel50ead532016-07-13 14:23:26 -0700250 const GrVkImageView* resolveAttachmentView =
251 GrVkImageView::Create(gpu,
252 newInfo.fImage,
253 pixelFormat,
254 GrVkImageView::kColor_Type,
Greg Daniel7e000222018-12-03 10:08:21 -0500255 newInfo.fLevelCount,
256 GrVkYcbcrConversionInfo());
egdaniel50ead532016-07-13 14:23:26 -0700257 if (!resolveAttachmentView) {
258 return false;
259 }
260 fResolveAttachmentView->unref(gpu);
261 fResolveAttachmentView = resolveAttachmentView;
262 } else {
263 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
264 newInfo.fImage,
265 pixelFormat,
266 GrVkImageView::kColor_Type,
Greg Daniel7e000222018-12-03 10:08:21 -0500267 1,
268 GrVkYcbcrConversionInfo());
egdaniel50ead532016-07-13 14:23:26 -0700269 if (!colorAttachmentView) {
270 return false;
271 }
272 fColorAttachmentView->unref(gpu);
273 fColorAttachmentView = colorAttachmentView;
274 }
275
276 this->createFramebuffer(gpu);
277 return true;
278}
279
Robert Phillips646e4292017-06-13 12:44:56 -0400280size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500281 int numColorSamples = this->numColorSamples();
282 if (numColorSamples > 1) {
283 // Add one to account for the resolve VkImage.
284 ++numColorSamples;
285 }
Robert Phillips646e4292017-06-13 12:44:56 -0400286 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
287 numColorSamples, // TODO: this still correct?
Greg Daniele252f082017-10-23 16:05:23 -0400288 this->texturePriv().mipMapped());
Robert Phillips646e4292017-06-13 12:44:56 -0400289}