blob: dff23015588cc25723aea1a35b1b7c0c64a9a37b [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/gpu/vk/GrVkTextureRenderTarget.h"
Greg Daniel164a9f02016-02-22 09:56:40 -05009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "src/gpu/GrTexturePriv.h"
11#include "src/gpu/vk/GrVkGpu.h"
12#include "src/gpu/vk/GrVkImageView.h"
13#include "src/gpu/vk/GrVkUtil.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050014
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "src/core/SkMipMap.h"
jvanverth62340062016-04-26 08:01:44 -070016
Mike Kleinc0bd9f92019-04-23 12:05:21 -050017#include "include/gpu/vk/GrVkTypes.h"
jvanverthfd359ca2016-03-18 11:57:24 -070018
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)
Brian Salomone8a766b2019-07-19 14:24:36 -040032 : GrSurface(gpu, desc, info.fProtected)
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) {
Brian Salomone8a766b2019-07-19 14:24:36 -040039 SkASSERT(info.fProtected == msaaInfo.fProtected);
Greg Daniel6ecc9112017-06-16 16:17:03 +000040 this->registerWithCache(budgeted);
41}
42
43GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
44 SkBudgeted budgeted,
45 const GrSurfaceDesc& desc,
46 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040047 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000048 const GrVkImageView* texView,
Greg Daniel1591c382017-08-17 15:37:20 -040049 const GrVkImageView* colorAttachmentView,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050050 GrMipMapsStatus mipMapsStatus)
Brian Salomone8a766b2019-07-19 14:24:36 -040051 : GrSurface(gpu, desc, info.fProtected)
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050052 , GrVkImage(info, layout, GrBackendObjectOwnership::kOwned)
53 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus,
54 GrBackendObjectOwnership::kOwned)
Greg Daniel52e16d92018-04-10 09:34:07 -040055 , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView,
56 GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000057 this->registerWithCache(budgeted);
58}
59
60GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
61 const GrSurfaceDesc& desc,
62 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040063 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000064 const GrVkImageView* texView,
65 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040066 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000067 const GrVkImageView* colorAttachmentView,
68 const GrVkImageView* resolveAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040069 GrMipMapsStatus mipMapsStatus,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050070 GrBackendObjectOwnership ownership,
71 GrWrapCacheable cacheable)
Brian Salomone8a766b2019-07-19 14:24:36 -040072 : GrSurface(gpu, desc, info.fProtected)
Greg Daniel52e16d92018-04-10 09:34:07 -040073 , GrVkImage(info, layout, ownership)
74 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
75 , GrVkRenderTarget(gpu, desc, info, layout, msaaInfo, std::move(msaaLayout),
76 colorAttachmentView, resolveAttachmentView, ownership) {
Brian Salomone8a766b2019-07-19 14:24:36 -040077 SkASSERT(info.fProtected == msaaInfo.fProtected);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050078 this->registerWithCacheWrapped(cacheable);
Greg Daniel6ecc9112017-06-16 16:17:03 +000079}
80
81GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
82 const GrSurfaceDesc& desc,
83 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040084 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000085 const GrVkImageView* texView,
86 const GrVkImageView* colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040087 GrMipMapsStatus mipMapsStatus,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050088 GrBackendObjectOwnership ownership,
89 GrWrapCacheable cacheable)
Brian Salomone8a766b2019-07-19 14:24:36 -040090 : GrSurface(gpu, desc, info.fProtected)
Greg Daniel52e16d92018-04-10 09:34:07 -040091 , GrVkImage(info, layout, ownership)
92 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
93 , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView, ownership) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050094 this->registerWithCacheWrapped(cacheable);
Greg Daniel6ecc9112017-06-16 16:17:03 +000095}
96
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050097namespace {
98struct Views {
99 const GrVkImageView* imageView = nullptr;
100 const GrVkImageView* colorAttachmentView = nullptr;
101 const GrVkImageView* resolveAttachmentView = nullptr;
102 GrVkImageInfo msInfo;
103 sk_sp<GrVkImageLayout> msLayout;
104};
105} // anonymous namespace
106
107static Views create_views(GrVkGpu* gpu, const GrSurfaceDesc& desc, const GrVkImageInfo& info) {
egdanielb2df0c22016-05-13 11:30:37 -0700108 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500109 // Create the texture ImageView
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500110 Views views;
111 views.imageView = GrVkImageView::Create(gpu, image, info.fFormat, GrVkImageView::kColor_Type,
112 info.fLevelCount, info.fYcbcrConversionInfo);
113 if (!views.imageView) {
114 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500115 }
116
117 VkFormat pixelFormat;
118 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
119
120 VkImage colorImage;
121
122 // create msaa surface if necessary
Brian Salomonbdecacf2018-02-02 20:32:49 -0500123 if (desc.fSampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500124 GrVkImage::ImageDesc msImageDesc;
125 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
126 msImageDesc.fFormat = pixelFormat;
127 msImageDesc.fWidth = desc.fWidth;
128 msImageDesc.fHeight = desc.fHeight;
129 msImageDesc.fLevels = 1;
130 msImageDesc.fSamples = desc.fSampleCnt;
131 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700132 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
133 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
134 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500135 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
136
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500137 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &views.msInfo)) {
138 views.imageView->unref(gpu);
139 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500140 }
141
142 // Set color attachment image
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500143 colorImage = views.msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500144
egdaniel50ead532016-07-13 14:23:26 -0700145 // Create resolve attachment view.
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500146 views.resolveAttachmentView =
147 GrVkImageView::Create(gpu, image, pixelFormat, GrVkImageView::kColor_Type,
148 info.fLevelCount, GrVkYcbcrConversionInfo());
149 if (!views.resolveAttachmentView) {
150 GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
151 views.imageView->unref(gpu);
152 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500153 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500154 views.msLayout.reset(new GrVkImageLayout(views.msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500155 } else {
156 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700157 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500158 }
159
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500160 views.colorAttachmentView = GrVkImageView::Create(
161 gpu, colorImage, pixelFormat, GrVkImageView::kColor_Type, 1, GrVkYcbcrConversionInfo());
162 if (!views.colorAttachmentView) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500163 if (desc.fSampleCnt > 1) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500164 views.resolveAttachmentView->unref(gpu);
165 GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500166 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500167 views.imageView->unref(gpu);
168 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500169 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500170 return views;
Greg Daniel164a9f02016-02-22 09:56:40 -0500171}
172
Robert Phillips67d52cf2017-06-05 13:38:13 -0400173sk_sp<GrVkTextureRenderTarget>
Greg Daniel475eb702018-09-28 14:16:50 -0400174GrVkTextureRenderTarget::MakeNewTextureRenderTarget(GrVkGpu* gpu,
175 SkBudgeted budgeted,
176 const GrSurfaceDesc& desc,
177 const GrVkImage::ImageDesc& imageDesc,
178 GrMipMapsStatus mipMapsStatus) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500179 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
180 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
181
egdanielb2df0c22016-05-13 11:30:37 -0700182 GrVkImageInfo info;
183 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500184 return nullptr;
185 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400186 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500187
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500188 Views views = create_views(gpu, desc, info);
189 if (!views.colorAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700190 GrVkImage::DestroyImageInfo(gpu, &info);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500191 return nullptr;
egdanielb2df0c22016-05-13 11:30:37 -0700192 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500193 if (desc.fSampleCnt > 1) {
194 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
195 gpu, budgeted, desc, info, std::move(layout), views.imageView, views.msInfo,
196 std::move(views.msLayout), views.colorAttachmentView, views.resolveAttachmentView,
197 mipMapsStatus));
198 } else {
199 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
200 gpu, budgeted, desc, info, std::move(layout), views.imageView,
201 views.colorAttachmentView, mipMapsStatus));
202 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500203}
204
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500205sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(
206 GrVkGpu* gpu,
207 const GrSurfaceDesc& desc,
208 GrWrapOwnership wrapOwnership,
209 GrWrapCacheable cacheable,
210 const GrVkImageInfo& info,
211 sk_sp<GrVkImageLayout> layout) {
Jim Van Verth658d4992019-07-11 14:07:53 -0400212 // Adopted textures require both image and allocation because we're responsible for freeing
213 SkASSERT(VK_NULL_HANDLE != info.fImage &&
214 (kBorrow_GrWrapOwnership == wrapOwnership || VK_NULL_HANDLE != info.fAlloc.fMemory));
Greg Daniel164a9f02016-02-22 09:56:40 -0500215
Greg Daniel52e16d92018-04-10 09:34:07 -0400216 GrMipMapsStatus mipMapsStatus = info.fLevelCount > 1 ? GrMipMapsStatus::kDirty
217 : GrMipMapsStatus::kNotAllocated;
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400218
Greg Daniel1591c382017-08-17 15:37:20 -0400219 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
220 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500221 Views views = create_views(gpu, desc, info);
222 if (!views.colorAttachmentView) {
223 return nullptr;
egdaniel50ead532016-07-13 14:23:26 -0700224 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500225 if (desc.fSampleCnt > 1) {
226 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
227 gpu, desc, info, std::move(layout), views.imageView, views.msInfo,
228 std::move(views.msLayout), views.colorAttachmentView, views.resolveAttachmentView,
229 mipMapsStatus, ownership, cacheable));
230 } else {
231 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
232 gpu, desc, info, std::move(layout), views.imageView, views.colorAttachmentView,
233 mipMapsStatus, ownership, cacheable));
234 }
egdaniel50ead532016-07-13 14:23:26 -0700235}
236
Robert Phillips646e4292017-06-13 12:44:56 -0400237size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
Chris Dalton6ce447a2019-06-23 18:07:38 -0600238 int numColorSamples = this->numSamples();
Brian Salomonbdecacf2018-02-02 20:32:49 -0500239 if (numColorSamples > 1) {
240 // Add one to account for the resolve VkImage.
241 ++numColorSamples;
242 }
Robert Phillips646e4292017-06-13 12:44:56 -0400243 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
244 numColorSamples, // TODO: this still correct?
Greg Daniele252f082017-10-23 16:05:23 -0400245 this->texturePriv().mipMapped());
Robert Phillips646e4292017-06-13 12:44:56 -0400246}