blob: 234c4d1f3ead1c1189469d1e8f21325d0c34fe72 [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,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050031 GrMipMapsStatus mipMapsStatus)
Greg Daniel6ecc9112017-06-16 16:17:03 +000032 : GrSurface(gpu, desc)
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050033 , GrVkImage(info, layout, GrBackendObjectOwnership::kOwned)
34 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus,
35 GrBackendObjectOwnership::kOwned)
Greg Daniel52e16d92018-04-10 09:34:07 -040036 , 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,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050049 GrMipMapsStatus mipMapsStatus)
Greg Daniel6ecc9112017-06-16 16:17:03 +000050 : GrSurface(gpu, desc)
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050051 , GrVkImage(info, layout, GrBackendObjectOwnership::kOwned)
52 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus,
53 GrBackendObjectOwnership::kOwned)
Greg Daniel52e16d92018-04-10 09:34:07 -040054 , 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,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050069 GrBackendObjectOwnership ownership,
70 GrWrapCacheable cacheable)
Greg Daniel6ecc9112017-06-16 16:17:03 +000071 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040072 , GrVkImage(info, layout, ownership)
73 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
74 , GrVkRenderTarget(gpu, desc, info, layout, msaaInfo, std::move(msaaLayout),
75 colorAttachmentView, resolveAttachmentView, ownership) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050076 this->registerWithCacheWrapped(cacheable);
Greg Daniel6ecc9112017-06-16 16:17:03 +000077}
78
79GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
80 const GrSurfaceDesc& desc,
81 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040082 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000083 const GrVkImageView* texView,
84 const GrVkImageView* colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040085 GrMipMapsStatus mipMapsStatus,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050086 GrBackendObjectOwnership ownership,
87 GrWrapCacheable cacheable)
Greg Daniel6ecc9112017-06-16 16:17:03 +000088 : GrSurface(gpu, desc)
Greg Daniel52e16d92018-04-10 09:34:07 -040089 , GrVkImage(info, layout, ownership)
90 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
91 , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView, ownership) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050092 this->registerWithCacheWrapped(cacheable);
Greg Daniel6ecc9112017-06-16 16:17:03 +000093}
94
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050095namespace {
96struct Views {
97 const GrVkImageView* imageView = nullptr;
98 const GrVkImageView* colorAttachmentView = nullptr;
99 const GrVkImageView* resolveAttachmentView = nullptr;
100 GrVkImageInfo msInfo;
101 sk_sp<GrVkImageLayout> msLayout;
102};
103} // anonymous namespace
104
105static Views create_views(GrVkGpu* gpu, const GrSurfaceDesc& desc, const GrVkImageInfo& info) {
egdanielb2df0c22016-05-13 11:30:37 -0700106 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500107 // Create the texture ImageView
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500108 Views views;
109 views.imageView = GrVkImageView::Create(gpu, image, info.fFormat, GrVkImageView::kColor_Type,
110 info.fLevelCount, info.fYcbcrConversionInfo);
111 if (!views.imageView) {
112 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500113 }
114
115 VkFormat pixelFormat;
116 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
117
118 VkImage colorImage;
119
120 // create msaa surface if necessary
Brian Salomonbdecacf2018-02-02 20:32:49 -0500121 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500122 GrVkImage::ImageDesc msImageDesc;
123 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
124 msImageDesc.fFormat = pixelFormat;
125 msImageDesc.fWidth = desc.fWidth;
126 msImageDesc.fHeight = desc.fHeight;
127 msImageDesc.fLevels = 1;
128 msImageDesc.fSamples = desc.fSampleCnt;
129 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700130 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
131 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
132 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500133 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
134
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500135 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &views.msInfo)) {
136 views.imageView->unref(gpu);
137 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500138 }
139
140 // Set color attachment image
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500141 colorImage = views.msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500142
egdaniel50ead532016-07-13 14:23:26 -0700143 // Create resolve attachment view.
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500144 views.resolveAttachmentView =
145 GrVkImageView::Create(gpu, image, pixelFormat, GrVkImageView::kColor_Type,
146 info.fLevelCount, GrVkYcbcrConversionInfo());
147 if (!views.resolveAttachmentView) {
148 GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
149 views.imageView->unref(gpu);
150 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500151 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500152 views.msLayout.reset(new GrVkImageLayout(views.msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500153 } else {
154 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700155 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500156 }
157
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500158 views.colorAttachmentView = GrVkImageView::Create(
159 gpu, colorImage, pixelFormat, GrVkImageView::kColor_Type, 1, GrVkYcbcrConversionInfo());
160 if (!views.colorAttachmentView) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500161 if (desc.fSampleCnt > 1) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500162 views.resolveAttachmentView->unref(gpu);
163 GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500164 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500165 views.imageView->unref(gpu);
166 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500167 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500168 return views;
Greg Daniel164a9f02016-02-22 09:56:40 -0500169}
170
Robert Phillips67d52cf2017-06-05 13:38:13 -0400171sk_sp<GrVkTextureRenderTarget>
Greg Daniel475eb702018-09-28 14:16:50 -0400172GrVkTextureRenderTarget::MakeNewTextureRenderTarget(GrVkGpu* gpu,
173 SkBudgeted budgeted,
174 const GrSurfaceDesc& desc,
175 const GrVkImage::ImageDesc& imageDesc,
176 GrMipMapsStatus mipMapsStatus) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500177 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
178 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
179
egdanielb2df0c22016-05-13 11:30:37 -0700180 GrVkImageInfo info;
181 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500182 return nullptr;
183 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400184 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500185
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500186 Views views = create_views(gpu, desc, info);
187 if (!views.colorAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700188 GrVkImage::DestroyImageInfo(gpu, &info);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500189 return nullptr;
egdanielb2df0c22016-05-13 11:30:37 -0700190 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500191 if (desc.fSampleCnt > 1) {
192 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
193 gpu, budgeted, desc, info, std::move(layout), views.imageView, views.msInfo,
194 std::move(views.msLayout), views.colorAttachmentView, views.resolveAttachmentView,
195 mipMapsStatus));
196 } else {
197 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
198 gpu, budgeted, desc, info, std::move(layout), views.imageView,
199 views.colorAttachmentView, mipMapsStatus));
200 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500201}
202
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500203sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(
204 GrVkGpu* gpu,
205 const GrSurfaceDesc& desc,
206 GrWrapOwnership wrapOwnership,
207 GrWrapCacheable cacheable,
208 const GrVkImageInfo& info,
209 sk_sp<GrVkImageLayout> layout) {
jvanverthfd359ca2016-03-18 11:57:24 -0700210 // Wrapped textures require both image and allocation (because they can be mapped)
Greg Daniel52e16d92018-04-10 09:34:07 -0400211 SkASSERT(VK_NULL_HANDLE != info.fImage && VK_NULL_HANDLE != info.fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500212
Greg Daniel52e16d92018-04-10 09:34:07 -0400213 GrMipMapsStatus mipMapsStatus = info.fLevelCount > 1 ? GrMipMapsStatus::kDirty
214 : GrMipMapsStatus::kNotAllocated;
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400215
Greg Daniel1591c382017-08-17 15:37:20 -0400216 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
217 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500218 Views views = create_views(gpu, desc, info);
219 if (!views.colorAttachmentView) {
220 return nullptr;
egdaniel50ead532016-07-13 14:23:26 -0700221 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500222 if (desc.fSampleCnt > 1) {
223 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
224 gpu, desc, info, std::move(layout), views.imageView, views.msInfo,
225 std::move(views.msLayout), views.colorAttachmentView, views.resolveAttachmentView,
226 mipMapsStatus, ownership, cacheable));
227 } else {
228 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
229 gpu, desc, info, std::move(layout), views.imageView, views.colorAttachmentView,
230 mipMapsStatus, ownership, cacheable));
231 }
egdaniel50ead532016-07-13 14:23:26 -0700232}
233
Robert Phillips646e4292017-06-13 12:44:56 -0400234size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500235 int numColorSamples = this->numColorSamples();
236 if (numColorSamples > 1) {
237 // Add one to account for the resolve VkImage.
238 ++numColorSamples;
239 }
Robert Phillips646e4292017-06-13 12:44:56 -0400240 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
241 numColorSamples, // TODO: this still correct?
Greg Daniele252f082017-10-23 16:05:23 -0400242 this->texturePriv().mipMapped());
Robert Phillips646e4292017-06-13 12:44:56 -0400243}