blob: ee31f2364a4425da8987e48994d881965c560259 [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,
25 const GrVkImageView* texView,
26 const GrVkImageInfo& msaaInfo,
27 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040028 const GrVkImageView* resolveAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040029 GrMipMapsStatus mipMapsStatus,
30 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000031 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040032 , GrVkImage(info, ownership)
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040033 , GrVkTexture(gpu, desc, info, texView, mipMapsStatus, ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000034 , GrVkRenderTarget(gpu, desc, info, msaaInfo, colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040035 resolveAttachmentView, GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000036 this->registerWithCache(budgeted);
37}
38
39GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
40 SkBudgeted budgeted,
41 const GrSurfaceDesc& desc,
42 const GrVkImageInfo& info,
43 const GrVkImageView* texView,
Greg Daniel1591c382017-08-17 15:37:20 -040044 const GrVkImageView* colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040045 GrMipMapsStatus mipMapsStatus,
46 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000047 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040048 , GrVkImage(info, ownership)
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040049 , GrVkTexture(gpu, desc, info, texView, mipMapsStatus, ownership)
Greg Daniel1591c382017-08-17 15:37:20 -040050 , GrVkRenderTarget(gpu, desc, info, colorAttachmentView, GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000051 this->registerWithCache(budgeted);
52}
53
54GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
55 const GrSurfaceDesc& desc,
56 const GrVkImageInfo& info,
57 const GrVkImageView* texView,
58 const GrVkImageInfo& msaaInfo,
59 const GrVkImageView* colorAttachmentView,
60 const GrVkImageView* resolveAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040061 GrMipMapsStatus mipMapsStatus,
Greg Daniel1591c382017-08-17 15:37:20 -040062 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000063 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040064 , GrVkImage(info, ownership)
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040065 , GrVkTexture(gpu, desc, info, texView, mipMapsStatus, ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000066 , GrVkRenderTarget(gpu, desc, info, msaaInfo, colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040067 resolveAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000068 this->registerWithCacheWrapped();
69}
70
71GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
72 const GrSurfaceDesc& desc,
73 const GrVkImageInfo& info,
74 const GrVkImageView* texView,
75 const GrVkImageView* colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040076 GrMipMapsStatus mipMapsStatus,
Greg Daniel1591c382017-08-17 15:37:20 -040077 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000078 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040079 , GrVkImage(info, ownership)
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040080 , GrVkTexture(gpu, desc, info, texView, mipMapsStatus, ownership)
Greg Daniel1591c382017-08-17 15:37:20 -040081 , GrVkRenderTarget(gpu, desc, info, colorAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000082 this->registerWithCacheWrapped();
83}
84
Robert Phillips67d52cf2017-06-05 13:38:13 -040085sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::Make(GrVkGpu* gpu,
86 const GrSurfaceDesc& desc,
87 const GrVkImageInfo& info,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040088 GrMipMapsStatus mipMapsStatus,
Robert Phillips67d52cf2017-06-05 13:38:13 -040089 SkBudgeted budgeted,
Greg Daniel1591c382017-08-17 15:37:20 -040090 GrBackendObjectOwnership ownership,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040091 bool isWrapped) {
egdanielb2df0c22016-05-13 11:30:37 -070092 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050093 // Create the texture ImageView
egdanielb2df0c22016-05-13 11:30:37 -070094 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, info.fFormat,
egdaniel50ead532016-07-13 14:23:26 -070095 GrVkImageView::kColor_Type,
96 info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -050097 if (!imageView) {
98 return nullptr;
99 }
100
101 VkFormat pixelFormat;
102 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
103
104 VkImage colorImage;
105
106 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700107 GrVkImageInfo msInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -0500108 const GrVkImageView* resolveAttachmentView = nullptr;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500109 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500110 GrVkImage::ImageDesc msImageDesc;
111 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
112 msImageDesc.fFormat = pixelFormat;
113 msImageDesc.fWidth = desc.fWidth;
114 msImageDesc.fHeight = desc.fHeight;
115 msImageDesc.fLevels = 1;
116 msImageDesc.fSamples = desc.fSampleCnt;
117 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700118 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
119 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
120 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500121 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
122
egdanielb2df0c22016-05-13 11:30:37 -0700123 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
egdanielce3bfb12016-08-26 11:05:13 -0700124 imageView->unref(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -0500125 return nullptr;
126 }
127
128 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700129 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500130
egdaniel50ead532016-07-13 14:23:26 -0700131 // Create resolve attachment view.
132 resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelFormat,
133 GrVkImageView::kColor_Type,
134 info.fLevelCount);
135 if (!resolveAttachmentView) {
136 GrVkImage::DestroyImageInfo(gpu, &msInfo);
137 imageView->unref(gpu);
138 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500139 }
140 } else {
141 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700142 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500143 }
144
egdaniel50ead532016-07-13 14:23:26 -0700145 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
146 GrVkImageView::kColor_Type, 1);
147 if (!colorAttachmentView) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500148 if (desc.fSampleCnt > 1) {
egdaniel50ead532016-07-13 14:23:26 -0700149 resolveAttachmentView->unref(gpu);
150 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500151 }
egdaniel50ead532016-07-13 14:23:26 -0700152 imageView->unref(gpu);
153 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500154 }
egdaniel50ead532016-07-13 14:23:26 -0700155
Robert Phillips67d52cf2017-06-05 13:38:13 -0400156 sk_sp<GrVkTextureRenderTarget> texRT;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500157 if (desc.fSampleCnt > 1) {
Greg Daniel1591c382017-08-17 15:37:20 -0400158 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400159 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
160 gpu, budgeted, desc,
161 info, imageView, msInfo,
162 colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400163 resolveAttachmentView, mipMapsStatus,
164 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700165 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400166 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
167 gpu, desc,
168 info, imageView, msInfo,
169 colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400170 resolveAttachmentView, mipMapsStatus,
171 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700172 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500173 } else {
Greg Daniel1591c382017-08-17 15:37:20 -0400174 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400175 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
176 gpu, budgeted, desc,
177 info, imageView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400178 colorAttachmentView, mipMapsStatus,
179 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700180 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400181 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
182 gpu, desc,
183 info, imageView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400184 colorAttachmentView, mipMapsStatus,
185 ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700186 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500187 }
188 return texRT;
189}
190
Robert Phillips67d52cf2017-06-05 13:38:13 -0400191sk_sp<GrVkTextureRenderTarget>
Greg Daniel164a9f02016-02-22 09:56:40 -0500192GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700193 SkBudgeted budgeted,
194 const GrSurfaceDesc& desc,
Greg Daniel834f1202017-10-09 15:06:20 -0400195 const GrVkImage::ImageDesc& imageDesc,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400196 GrMipMapsStatus mipMapsStatus) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500197 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
198 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
199
egdanielb2df0c22016-05-13 11:30:37 -0700200 GrVkImageInfo info;
201 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500202 return nullptr;
203 }
204
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400205 sk_sp<GrVkTextureRenderTarget> trt = Make(gpu, desc, info, mipMapsStatus, budgeted,
206 GrBackendObjectOwnership::kOwned, false);
egdanielb2df0c22016-05-13 11:30:37 -0700207 if (!trt) {
208 GrVkImage::DestroyImageInfo(gpu, &info);
209 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500210
211 return trt;
212}
213
bungeman6bd52842016-10-27 09:30:08 -0700214sk_sp<GrVkTextureRenderTarget>
215GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
216 const GrSurfaceDesc& desc,
Greg Daniel1591c382017-08-17 15:37:20 -0400217 GrWrapOwnership wrapOwnership,
bungeman6bd52842016-10-27 09:30:08 -0700218 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700219 SkASSERT(info);
220 // Wrapped textures require both image and allocation (because they can be mapped)
jvanverth1e305ba2016-06-01 09:39:15 -0700221 SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500222
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400223 GrMipMapsStatus mipMapsStatus = info->fLevelCount > 1 ? GrMipMapsStatus::kDirty
224 : GrMipMapsStatus::kNotAllocated;
225
Greg Daniel1591c382017-08-17 15:37:20 -0400226 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
227 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
jvanverthfd359ca2016-03-18 11:57:24 -0700228
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400229 return Make(gpu, desc, *info, mipMapsStatus, SkBudgeted::kNo, ownership, true);
Greg Daniel164a9f02016-02-22 09:56:40 -0500230}
egdaniel50ead532016-07-13 14:23:26 -0700231
232bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
233 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400234 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
Brian Salomonbdecacf2018-02-02 20:32:49 -0500235 if (this->numStencilSamples() > 1) {
egdaniel50ead532016-07-13 14:23:26 -0700236 const GrVkImageView* resolveAttachmentView =
237 GrVkImageView::Create(gpu,
238 newInfo.fImage,
239 pixelFormat,
240 GrVkImageView::kColor_Type,
241 newInfo.fLevelCount);
242 if (!resolveAttachmentView) {
243 return false;
244 }
245 fResolveAttachmentView->unref(gpu);
246 fResolveAttachmentView = resolveAttachmentView;
247 } else {
248 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
249 newInfo.fImage,
250 pixelFormat,
251 GrVkImageView::kColor_Type,
252 1);
253 if (!colorAttachmentView) {
254 return false;
255 }
256 fColorAttachmentView->unref(gpu);
257 fColorAttachmentView = colorAttachmentView;
258 }
259
260 this->createFramebuffer(gpu);
261 return true;
262}
263
Robert Phillips646e4292017-06-13 12:44:56 -0400264size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500265 int numColorSamples = this->numColorSamples();
266 if (numColorSamples > 1) {
267 // Add one to account for the resolve VkImage.
268 ++numColorSamples;
269 }
Robert Phillips646e4292017-06-13 12:44:56 -0400270 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
271 numColorSamples, // TODO: this still correct?
Greg Daniele252f082017-10-23 16:05:23 -0400272 this->texturePriv().mipMapped());
Robert Phillips646e4292017-06-13 12:44:56 -0400273}