blob: e380e73095e6b25722cb6a3f0abd80f0dab40512 [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
10#include "GrRenderTargetPriv.h"
Robert Phillips646e4292017-06-13 12:44:56 -040011#include "GrTexturePriv.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050012#include "GrVkGpu.h"
13#include "GrVkImageView.h"
14#include "GrVkUtil.h"
15
egdanieldd97b852016-04-28 09:30:39 -070016#include "SkMipMap.h"
jvanverth62340062016-04-26 08:01:44 -070017
jvanverthfd359ca2016-03-18 11:57:24 -070018#include "vk/GrVkTypes.h"
19
Greg Daniel164a9f02016-02-22 09:56:40 -050020#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
21
Greg Daniel6ecc9112017-06-16 16:17:03 +000022GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
23 SkBudgeted budgeted,
24 const GrSurfaceDesc& desc,
25 const GrVkImageInfo& info,
26 const GrVkImageView* texView,
27 const GrVkImageInfo& msaaInfo,
28 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040029 const GrVkImageView* resolveAttachmentView,
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)
33 , GrVkTexture(gpu, desc, info, texView, 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,
45 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000046 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040047 , GrVkImage(info, ownership)
48 , GrVkTexture(gpu, desc, info, texView, ownership)
49 , GrVkRenderTarget(gpu, desc, info, colorAttachmentView, GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000050 this->registerWithCache(budgeted);
51}
52
53GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
54 const GrSurfaceDesc& desc,
55 const GrVkImageInfo& info,
56 const GrVkImageView* texView,
57 const GrVkImageInfo& msaaInfo,
58 const GrVkImageView* colorAttachmentView,
59 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040060 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000061 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040062 , GrVkImage(info, ownership)
63 , GrVkTexture(gpu, desc, info, texView, ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000064 , GrVkRenderTarget(gpu, desc, info, msaaInfo, colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040065 resolveAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000066 this->registerWithCacheWrapped();
67}
68
69GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
70 const GrSurfaceDesc& desc,
71 const GrVkImageInfo& info,
72 const GrVkImageView* texView,
73 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040074 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000075 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040076 , GrVkImage(info, ownership)
77 , GrVkTexture(gpu, desc, info, texView, ownership)
78 , GrVkRenderTarget(gpu, desc, info, colorAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000079 this->registerWithCacheWrapped();
80}
81
82
Robert Phillips67d52cf2017-06-05 13:38:13 -040083sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::Make(GrVkGpu* gpu,
84 const GrSurfaceDesc& desc,
85 const GrVkImageInfo& info,
86 SkBudgeted budgeted,
Greg Daniel1591c382017-08-17 15:37:20 -040087 GrBackendObjectOwnership ownership,
88 bool isWrapped) {
egdanielb2df0c22016-05-13 11:30:37 -070089 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050090 // Create the texture ImageView
egdanielb2df0c22016-05-13 11:30:37 -070091 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, info.fFormat,
egdaniel50ead532016-07-13 14:23:26 -070092 GrVkImageView::kColor_Type,
93 info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -050094 if (!imageView) {
95 return nullptr;
96 }
97
98 VkFormat pixelFormat;
99 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
100
101 VkImage colorImage;
102
103 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700104 GrVkImageInfo msInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -0500105 const GrVkImageView* resolveAttachmentView = nullptr;
106 if (desc.fSampleCnt) {
107 GrVkImage::ImageDesc msImageDesc;
108 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
109 msImageDesc.fFormat = pixelFormat;
110 msImageDesc.fWidth = desc.fWidth;
111 msImageDesc.fHeight = desc.fHeight;
112 msImageDesc.fLevels = 1;
113 msImageDesc.fSamples = desc.fSampleCnt;
114 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700115 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
116 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
117 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500118 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
119
egdanielb2df0c22016-05-13 11:30:37 -0700120 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
egdanielce3bfb12016-08-26 11:05:13 -0700121 imageView->unref(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -0500122 return nullptr;
123 }
124
125 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700126 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500127
egdaniel50ead532016-07-13 14:23:26 -0700128 // Create resolve attachment view.
129 resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelFormat,
130 GrVkImageView::kColor_Type,
131 info.fLevelCount);
132 if (!resolveAttachmentView) {
133 GrVkImage::DestroyImageInfo(gpu, &msInfo);
134 imageView->unref(gpu);
135 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500136 }
137 } else {
138 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700139 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500140 }
141
egdaniel50ead532016-07-13 14:23:26 -0700142 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
143 GrVkImageView::kColor_Type, 1);
144 if (!colorAttachmentView) {
145 if (desc.fSampleCnt) {
146 resolveAttachmentView->unref(gpu);
147 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500148 }
egdaniel50ead532016-07-13 14:23:26 -0700149 imageView->unref(gpu);
150 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500151 }
egdaniel50ead532016-07-13 14:23:26 -0700152
Robert Phillips67d52cf2017-06-05 13:38:13 -0400153 sk_sp<GrVkTextureRenderTarget> texRT;
egdanielb2df0c22016-05-13 11:30:37 -0700154 if (desc.fSampleCnt) {
Greg Daniel1591c382017-08-17 15:37:20 -0400155 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400156 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
157 gpu, budgeted, desc,
158 info, imageView, msInfo,
159 colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400160 resolveAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700161 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400162 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
163 gpu, desc,
164 info, imageView, msInfo,
165 colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400166 resolveAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700167 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500168 } else {
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,
172 info, imageView,
Greg Daniel1591c382017-08-17 15:37:20 -0400173 colorAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700174 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400175 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
176 gpu, desc,
177 info, imageView,
Greg Daniel1591c382017-08-17 15:37:20 -0400178 colorAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700179 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500180 }
181 return texRT;
182}
183
Robert Phillips67d52cf2017-06-05 13:38:13 -0400184sk_sp<GrVkTextureRenderTarget>
Greg Daniel164a9f02016-02-22 09:56:40 -0500185GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700186 SkBudgeted budgeted,
187 const GrSurfaceDesc& desc,
188 const GrVkImage::ImageDesc& imageDesc) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500189 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
190 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
191
egdanielb2df0c22016-05-13 11:30:37 -0700192 GrVkImageInfo info;
193 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500194 return nullptr;
195 }
196
Greg Daniel1591c382017-08-17 15:37:20 -0400197 sk_sp<GrVkTextureRenderTarget> trt = Make(gpu, desc, info, budgeted,
198 GrBackendObjectOwnership::kOwned, false);
egdanielb2df0c22016-05-13 11:30:37 -0700199 if (!trt) {
200 GrVkImage::DestroyImageInfo(gpu, &info);
201 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500202
203 return trt;
204}
205
bungeman6bd52842016-10-27 09:30:08 -0700206sk_sp<GrVkTextureRenderTarget>
207GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
208 const GrSurfaceDesc& desc,
Greg Daniel1591c382017-08-17 15:37:20 -0400209 GrWrapOwnership wrapOwnership,
bungeman6bd52842016-10-27 09:30:08 -0700210 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700211 SkASSERT(info);
212 // Wrapped textures require both image and allocation (because they can be mapped)
jvanverth1e305ba2016-06-01 09:39:15 -0700213 SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500214
Greg Daniel1591c382017-08-17 15:37:20 -0400215 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
216 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
jvanverthfd359ca2016-03-18 11:57:24 -0700217
Greg Daniel1591c382017-08-17 15:37:20 -0400218 return Make(gpu, desc, *info, SkBudgeted::kNo, ownership, true);
Greg Daniel164a9f02016-02-22 09:56:40 -0500219}
egdaniel50ead532016-07-13 14:23:26 -0700220
221bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
222 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400223 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
224 if (this->numStencilSamples()) {
egdaniel50ead532016-07-13 14:23:26 -0700225 const GrVkImageView* resolveAttachmentView =
226 GrVkImageView::Create(gpu,
227 newInfo.fImage,
228 pixelFormat,
229 GrVkImageView::kColor_Type,
230 newInfo.fLevelCount);
231 if (!resolveAttachmentView) {
232 return false;
233 }
234 fResolveAttachmentView->unref(gpu);
235 fResolveAttachmentView = resolveAttachmentView;
236 } else {
237 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
238 newInfo.fImage,
239 pixelFormat,
240 GrVkImageView::kColor_Type,
241 1);
242 if (!colorAttachmentView) {
243 return false;
244 }
245 fColorAttachmentView->unref(gpu);
246 fColorAttachmentView = colorAttachmentView;
247 }
248
249 this->createFramebuffer(gpu);
250 return true;
251}
252
Robert Phillips646e4292017-06-13 12:44:56 -0400253size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
254 // The plus 1 is to account for the resolve texture.
255 int numColorSamples = this->numColorSamples() + 1;
256 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
257 numColorSamples, // TODO: this still correct?
258 this->texturePriv().hasMipMaps());
259}