blob: 4a9859b879b8c48832e49869c09446e2c8da426a [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 Daniel834f1202017-10-09 15:06:20 -040029 GrBackendObjectOwnership ownership,
30 bool wasFullMipMapDataProvided)
Greg Daniel6ecc9112017-06-16 16:17:03 +000031 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040032 , GrVkImage(info, ownership)
Greg Daniel834f1202017-10-09 15:06:20 -040033 , GrVkTexture(gpu, desc, info, texView, ownership, wasFullMipMapDataProvided)
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 Daniel834f1202017-10-09 15:06:20 -040045 GrBackendObjectOwnership ownership,
46 bool wasFullMipMapDataProvided)
Greg Daniel6ecc9112017-06-16 16:17:03 +000047 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040048 , GrVkImage(info, ownership)
Greg Daniel834f1202017-10-09 15:06:20 -040049 , GrVkTexture(gpu, desc, info, texView, ownership, wasFullMipMapDataProvided)
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 Daniel1591c382017-08-17 15:37:20 -040061 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000062 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040063 , GrVkImage(info, ownership)
Greg Daniel834f1202017-10-09 15:06:20 -040064 , GrVkTexture(gpu, desc, info, texView, ownership, false)
Greg Daniel6ecc9112017-06-16 16:17:03 +000065 , GrVkRenderTarget(gpu, desc, info, msaaInfo, colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040066 resolveAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000067 this->registerWithCacheWrapped();
68}
69
70GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
71 const GrSurfaceDesc& desc,
72 const GrVkImageInfo& info,
73 const GrVkImageView* texView,
74 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040075 GrBackendObjectOwnership ownership)
Greg Daniel6ecc9112017-06-16 16:17:03 +000076 : GrSurface(gpu, desc)
Greg Daniel1591c382017-08-17 15:37:20 -040077 , GrVkImage(info, ownership)
Greg Daniel834f1202017-10-09 15:06:20 -040078 , GrVkTexture(gpu, desc, info, texView, ownership, false)
Greg Daniel1591c382017-08-17 15:37:20 -040079 , GrVkRenderTarget(gpu, desc, info, colorAttachmentView, ownership) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000080 this->registerWithCacheWrapped();
81}
82
83
Robert Phillips67d52cf2017-06-05 13:38:13 -040084sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::Make(GrVkGpu* gpu,
85 const GrSurfaceDesc& desc,
86 const GrVkImageInfo& info,
87 SkBudgeted budgeted,
Greg Daniel1591c382017-08-17 15:37:20 -040088 GrBackendObjectOwnership ownership,
Greg Daniel834f1202017-10-09 15:06:20 -040089 bool isWrapped,
90 bool wasFullMipMapDataProvided) {
91 SkASSERT(!wasFullMipMapDataProvided || !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;
109 if (desc.fSampleCnt) {
110 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) {
148 if (desc.fSampleCnt) {
149 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;
egdanielb2df0c22016-05-13 11:30:37 -0700157 if (desc.fSampleCnt) {
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 Daniel834f1202017-10-09 15:06:20 -0400163 resolveAttachmentView, ownership,
164 wasFullMipMapDataProvided));
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 Daniel1591c382017-08-17 15:37:20 -0400170 resolveAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700171 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500172 } else {
Greg Daniel1591c382017-08-17 15:37:20 -0400173 if (!isWrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400174 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
175 gpu, budgeted, desc,
176 info, imageView,
Greg Daniel834f1202017-10-09 15:06:20 -0400177 colorAttachmentView, ownership,
178 wasFullMipMapDataProvided));
egdanielb2df0c22016-05-13 11:30:37 -0700179 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400180 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
181 gpu, desc,
182 info, imageView,
Greg Daniel1591c382017-08-17 15:37:20 -0400183 colorAttachmentView, ownership));
egdanielb2df0c22016-05-13 11:30:37 -0700184 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500185 }
186 return texRT;
187}
188
Robert Phillips67d52cf2017-06-05 13:38:13 -0400189sk_sp<GrVkTextureRenderTarget>
Greg Daniel164a9f02016-02-22 09:56:40 -0500190GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700191 SkBudgeted budgeted,
192 const GrSurfaceDesc& desc,
Greg Daniel834f1202017-10-09 15:06:20 -0400193 const GrVkImage::ImageDesc& imageDesc,
194 bool wasFullMipMapDataProvided) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500195 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
196 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
197
egdanielb2df0c22016-05-13 11:30:37 -0700198 GrVkImageInfo info;
199 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500200 return nullptr;
201 }
202
Greg Daniel1591c382017-08-17 15:37:20 -0400203 sk_sp<GrVkTextureRenderTarget> trt = Make(gpu, desc, info, budgeted,
Greg Daniel834f1202017-10-09 15:06:20 -0400204 GrBackendObjectOwnership::kOwned, false,
205 wasFullMipMapDataProvided);
egdanielb2df0c22016-05-13 11:30:37 -0700206 if (!trt) {
207 GrVkImage::DestroyImageInfo(gpu, &info);
208 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500209
210 return trt;
211}
212
bungeman6bd52842016-10-27 09:30:08 -0700213sk_sp<GrVkTextureRenderTarget>
214GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
215 const GrSurfaceDesc& desc,
Greg Daniel1591c382017-08-17 15:37:20 -0400216 GrWrapOwnership wrapOwnership,
bungeman6bd52842016-10-27 09:30:08 -0700217 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700218 SkASSERT(info);
219 // Wrapped textures require both image and allocation (because they can be mapped)
jvanverth1e305ba2016-06-01 09:39:15 -0700220 SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500221
Greg Daniel1591c382017-08-17 15:37:20 -0400222 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
223 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
jvanverthfd359ca2016-03-18 11:57:24 -0700224
Greg Daniel834f1202017-10-09 15:06:20 -0400225 return Make(gpu, desc, *info, SkBudgeted::kNo, ownership, true, false);
Greg Daniel164a9f02016-02-22 09:56:40 -0500226}
egdaniel50ead532016-07-13 14:23:26 -0700227
228bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
229 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400230 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
231 if (this->numStencilSamples()) {
egdaniel50ead532016-07-13 14:23:26 -0700232 const GrVkImageView* resolveAttachmentView =
233 GrVkImageView::Create(gpu,
234 newInfo.fImage,
235 pixelFormat,
236 GrVkImageView::kColor_Type,
237 newInfo.fLevelCount);
238 if (!resolveAttachmentView) {
239 return false;
240 }
241 fResolveAttachmentView->unref(gpu);
242 fResolveAttachmentView = resolveAttachmentView;
243 } else {
244 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
245 newInfo.fImage,
246 pixelFormat,
247 GrVkImageView::kColor_Type,
248 1);
249 if (!colorAttachmentView) {
250 return false;
251 }
252 fColorAttachmentView->unref(gpu);
253 fColorAttachmentView = colorAttachmentView;
254 }
255
256 this->createFramebuffer(gpu);
257 return true;
258}
259
Robert Phillips646e4292017-06-13 12:44:56 -0400260size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
261 // The plus 1 is to account for the resolve texture.
262 int numColorSamples = this->numColorSamples() + 1;
263 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
264 numColorSamples, // TODO: this still correct?
265 this->texturePriv().hasMipMaps());
266}