blob: 6b7bc6bb023b82e4380125593e057db1bb7b5e5f [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,
29 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000030 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040031 , GrVkImage(info, ownership)
32 , GrVkTexture(gpu, desc, info, texView, ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000033 , GrVkRenderTarget(gpu, desc, info, msaaInfo, colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040034 resolveAttachmentView, GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000035 this->registerWithCache(budgeted);
36}
37
38GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
39 SkBudgeted budgeted,
40 const GrSurfaceDesc& desc,
41 const GrVkImageInfo& info,
42 const GrVkImageView* texView,
Greg Daniel1591c382017-08-17 15:37:20 -040043 const GrVkImageView* colorAttachmentView,
44 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000045 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040046 , GrVkImage(info, ownership)
47 , GrVkTexture(gpu, desc, info, texView, ownership)
48 , GrVkRenderTarget(gpu, desc, info, colorAttachmentView, GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000049 this->registerWithCache(budgeted);
50}
51
52GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
53 const GrSurfaceDesc& desc,
54 const GrVkImageInfo& info,
55 const GrVkImageView* texView,
56 const GrVkImageInfo& msaaInfo,
57 const GrVkImageView* colorAttachmentView,
58 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040059 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000060 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040061 , GrVkImage(info, ownership)
62 , GrVkTexture(gpu, desc, info, texView, ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000063 , GrVkRenderTarget(gpu, desc, info, msaaInfo, colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040064 resolveAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000065 this->registerWithCacheWrapped();
66}
67
68GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
69 const GrSurfaceDesc& desc,
70 const GrVkImageInfo& info,
71 const GrVkImageView* texView,
72 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040073 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000074 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040075 , GrVkImage(info, ownership)
76 , GrVkTexture(gpu, desc, info, texView, ownership)
77 , GrVkRenderTarget(gpu, desc, info, colorAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000078 this->registerWithCacheWrapped();
79}
80
81
Robert Phillips67d52cf2017-06-05 13:38:13 -040082sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::Make(GrVkGpu* gpu,
83 const GrSurfaceDesc& desc,
84 const GrVkImageInfo& info,
85 SkBudgeted budgeted,
Greg Daniel1591c382017-08-17 15:37:20 -040086 GrBackendObjectOwnership ownership,
87 bool isWrapped) {
egdanielb2df0c22016-05-13 11:30:37 -070088 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050089 // Create the texture ImageView
egdanielb2df0c22016-05-13 11:30:37 -070090 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, info.fFormat,
egdaniel50ead532016-07-13 14:23:26 -070091 GrVkImageView::kColor_Type,
92 info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -050093 if (!imageView) {
94 return nullptr;
95 }
96
97 VkFormat pixelFormat;
98 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
99
100 VkImage colorImage;
101
102 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -0700103 GrVkImageInfo msInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -0500104 const GrVkImageView* resolveAttachmentView = nullptr;
105 if (desc.fSampleCnt) {
106 GrVkImage::ImageDesc msImageDesc;
107 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
108 msImageDesc.fFormat = pixelFormat;
109 msImageDesc.fWidth = desc.fWidth;
110 msImageDesc.fHeight = desc.fHeight;
111 msImageDesc.fLevels = 1;
112 msImageDesc.fSamples = desc.fSampleCnt;
113 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700114 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
115 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
116 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500117 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
118
egdanielb2df0c22016-05-13 11:30:37 -0700119 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
egdanielce3bfb12016-08-26 11:05:13 -0700120 imageView->unref(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -0500121 return nullptr;
122 }
123
124 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700125 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500126
egdaniel50ead532016-07-13 14:23:26 -0700127 // Create resolve attachment view.
128 resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelFormat,
129 GrVkImageView::kColor_Type,
130 info.fLevelCount);
131 if (!resolveAttachmentView) {
132 GrVkImage::DestroyImageInfo(gpu, &msInfo);
133 imageView->unref(gpu);
134 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500135 }
136 } else {
137 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700138 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500139 }
140
egdaniel50ead532016-07-13 14:23:26 -0700141 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
142 GrVkImageView::kColor_Type, 1);
143 if (!colorAttachmentView) {
144 if (desc.fSampleCnt) {
145 resolveAttachmentView->unref(gpu);
146 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500147 }
egdaniel50ead532016-07-13 14:23:26 -0700148 imageView->unref(gpu);
149 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -0500150 }
egdaniel50ead532016-07-13 14:23:26 -0700151
Robert Phillips67d52cf2017-06-05 13:38:13 -0400152 sk_sp<GrVkTextureRenderTarget> texRT;
egdanielb2df0c22016-05-13 11:30:37 -0700153 if (desc.fSampleCnt) {
Greg Daniel1591c382017-08-17 15:37:20 -0400154 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400155 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
156 gpu, budgeted, desc,
157 info, imageView, msInfo,
158 colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400159 resolveAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700160 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400161 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
162 gpu, desc,
163 info, imageView, msInfo,
164 colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400165 resolveAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700166 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500167 } else {
Greg Daniel1591c382017-08-17 15:37:20 -0400168 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400169 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
170 gpu, budgeted, desc,
171 info, imageView,
Greg Daniel1591c382017-08-17 15:37:20 -0400172 colorAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700173 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400174 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
175 gpu, desc,
176 info, imageView,
Greg Daniel1591c382017-08-17 15:37:20 -0400177 colorAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700178 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500179 }
180 return texRT;
181}
182
Robert Phillips67d52cf2017-06-05 13:38:13 -0400183sk_sp<GrVkTextureRenderTarget>
Greg Daniel164a9f02016-02-22 09:56:40 -0500184GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700185 SkBudgeted budgeted,
186 const GrSurfaceDesc& desc,
187 const GrVkImage::ImageDesc& imageDesc) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500188 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
189 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
190
egdanielb2df0c22016-05-13 11:30:37 -0700191 GrVkImageInfo info;
192 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500193 return nullptr;
194 }
195
Greg Daniel1591c382017-08-17 15:37:20 -0400196 sk_sp<GrVkTextureRenderTarget> trt = Make(gpu, desc, info, budgeted,
197 GrBackendObjectOwnership::kOwned, false);
egdanielb2df0c22016-05-13 11:30:37 -0700198 if (!trt) {
199 GrVkImage::DestroyImageInfo(gpu, &info);
200 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500201
202 return trt;
203}
204
bungeman6bd52842016-10-27 09:30:08 -0700205sk_sp<GrVkTextureRenderTarget>
206GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
207 const GrSurfaceDesc& desc,
Greg Daniel1591c382017-08-17 15:37:20 -0400208 GrWrapOwnership wrapOwnership,
bungeman6bd52842016-10-27 09:30:08 -0700209 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700210 SkASSERT(info);
211 // Wrapped textures require both image and allocation (because they can be mapped)
jvanverth1e305ba2016-06-01 09:39:15 -0700212 SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500213
Greg Daniel1591c382017-08-17 15:37:20 -0400214 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
215 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
jvanverthfd359ca2016-03-18 11:57:24 -0700216
Greg Daniel1591c382017-08-17 15:37:20 -0400217 return Make(gpu, desc, *info, SkBudgeted::kNo, ownership, true);
Greg Daniel164a9f02016-02-22 09:56:40 -0500218}
egdaniel50ead532016-07-13 14:23:26 -0700219
220bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
221 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400222 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
223 if (this->numStencilSamples()) {
egdaniel50ead532016-07-13 14:23:26 -0700224 const GrVkImageView* resolveAttachmentView =
225 GrVkImageView::Create(gpu,
226 newInfo.fImage,
227 pixelFormat,
228 GrVkImageView::kColor_Type,
229 newInfo.fLevelCount);
230 if (!resolveAttachmentView) {
231 return false;
232 }
233 fResolveAttachmentView->unref(gpu);
234 fResolveAttachmentView = resolveAttachmentView;
235 } else {
236 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
237 newInfo.fImage,
238 pixelFormat,
239 GrVkImageView::kColor_Type,
240 1);
241 if (!colorAttachmentView) {
242 return false;
243 }
244 fColorAttachmentView->unref(gpu);
245 fColorAttachmentView = colorAttachmentView;
246 }
247
248 this->createFramebuffer(gpu);
249 return true;
250}
251
Robert Phillips646e4292017-06-13 12:44:56 -0400252size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
253 // The plus 1 is to account for the resolve texture.
254 int numColorSamples = this->numColorSamples() + 1;
255 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
256 numColorSamples, // TODO: this still correct?
257 this->texturePriv().hasMipMaps());
258}