blob: 50aae238a2c289a6aac0e8c9ad341dde23d394f3 [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,
Brian Salomon27b4d8d2019-07-22 14:23:45 -040024 int sampleCnt,
Greg Daniel6ecc9112017-06-16 16:17:03 +000025 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040026 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000027 const GrVkImageView* texView,
28 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040029 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000030 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040031 const GrVkImageView* resolveAttachmentView,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050032 GrMipMapsStatus mipMapsStatus)
Brian Salomona9c22572019-08-05 12:57:09 -040033 : GrSurface(gpu, {desc.fWidth, desc.fHeight}, desc.fConfig, info.fProtected)
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050034 , GrVkImage(info, layout, GrBackendObjectOwnership::kOwned)
35 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus,
36 GrBackendObjectOwnership::kOwned)
Brian Salomon27b4d8d2019-07-22 14:23:45 -040037 , GrVkRenderTarget(gpu, desc, sampleCnt, info, layout, msaaInfo, std::move(msaaLayout),
Greg Daniel52e16d92018-04-10 09:34:07 -040038 colorAttachmentView, resolveAttachmentView,
39 GrBackendObjectOwnership::kOwned) {
Brian Salomone8a766b2019-07-19 14:24:36 -040040 SkASSERT(info.fProtected == msaaInfo.fProtected);
Greg Daniel6ecc9112017-06-16 16:17:03 +000041 this->registerWithCache(budgeted);
42}
43
44GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
45 SkBudgeted budgeted,
46 const GrSurfaceDesc& desc,
47 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040048 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000049 const GrVkImageView* texView,
Greg Daniel1591c382017-08-17 15:37:20 -040050 const GrVkImageView* colorAttachmentView,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050051 GrMipMapsStatus mipMapsStatus)
Brian Salomona9c22572019-08-05 12:57:09 -040052 : GrSurface(gpu, {desc.fWidth, desc.fHeight}, desc.fConfig, info.fProtected)
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050053 , GrVkImage(info, layout, GrBackendObjectOwnership::kOwned)
54 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus,
55 GrBackendObjectOwnership::kOwned)
Greg Daniel52e16d92018-04-10 09:34:07 -040056 , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView,
57 GrBackendObjectOwnership::kOwned) {
Greg Daniel6ecc9112017-06-16 16:17:03 +000058 this->registerWithCache(budgeted);
59}
60
61GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
62 const GrSurfaceDesc& desc,
Brian Salomon27b4d8d2019-07-22 14:23:45 -040063 int sampleCnt,
Greg Daniel6ecc9112017-06-16 16:17:03 +000064 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040065 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000066 const GrVkImageView* texView,
67 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040068 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000069 const GrVkImageView* colorAttachmentView,
70 const GrVkImageView* resolveAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040071 GrMipMapsStatus mipMapsStatus,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050072 GrBackendObjectOwnership ownership,
73 GrWrapCacheable cacheable)
Brian Salomona9c22572019-08-05 12:57:09 -040074 : GrSurface(gpu, {desc.fWidth, desc.fHeight}, desc.fConfig, info.fProtected)
Greg Daniel52e16d92018-04-10 09:34:07 -040075 , GrVkImage(info, layout, ownership)
76 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
Brian Salomon27b4d8d2019-07-22 14:23:45 -040077 , GrVkRenderTarget(gpu, desc, sampleCnt, info, layout, msaaInfo, std::move(msaaLayout),
Greg Daniel52e16d92018-04-10 09:34:07 -040078 colorAttachmentView, resolveAttachmentView, ownership) {
Brian Salomone8a766b2019-07-19 14:24:36 -040079 SkASSERT(info.fProtected == msaaInfo.fProtected);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050080 this->registerWithCacheWrapped(cacheable);
Greg Daniel6ecc9112017-06-16 16:17:03 +000081}
82
83GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
84 const GrSurfaceDesc& desc,
85 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040086 sk_sp<GrVkImageLayout> layout,
Greg Daniel6ecc9112017-06-16 16:17:03 +000087 const GrVkImageView* texView,
88 const GrVkImageView* colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040089 GrMipMapsStatus mipMapsStatus,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050090 GrBackendObjectOwnership ownership,
91 GrWrapCacheable cacheable)
Brian Salomona9c22572019-08-05 12:57:09 -040092 : GrSurface(gpu, {desc.fWidth, desc.fHeight}, desc.fConfig, info.fProtected)
Greg Daniel52e16d92018-04-10 09:34:07 -040093 , GrVkImage(info, layout, ownership)
94 , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
95 , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView, ownership) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050096 this->registerWithCacheWrapped(cacheable);
Greg Daniel6ecc9112017-06-16 16:17:03 +000097}
98
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050099namespace {
100struct Views {
101 const GrVkImageView* imageView = nullptr;
102 const GrVkImageView* colorAttachmentView = nullptr;
103 const GrVkImageView* resolveAttachmentView = nullptr;
104 GrVkImageInfo msInfo;
105 sk_sp<GrVkImageLayout> msLayout;
106};
107} // anonymous namespace
108
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400109static Views create_views(GrVkGpu* gpu, const GrSurfaceDesc& desc, int sampleCnt,
110 const GrVkImageInfo& info) {
egdanielb2df0c22016-05-13 11:30:37 -0700111 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500112 // Create the texture ImageView
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500113 Views views;
114 views.imageView = GrVkImageView::Create(gpu, image, info.fFormat, GrVkImageView::kColor_Type,
115 info.fLevelCount, info.fYcbcrConversionInfo);
116 if (!views.imageView) {
117 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500118 }
119
Greg Daniel0fac8692019-08-16 13:13:17 -0400120 VkFormat pixelFormat = info.fFormat;
Greg Daniel164a9f02016-02-22 09:56:40 -0500121
122 VkImage colorImage;
123
124 // create msaa surface if necessary
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400125 if (sampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500126 GrVkImage::ImageDesc msImageDesc;
127 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
128 msImageDesc.fFormat = pixelFormat;
129 msImageDesc.fWidth = desc.fWidth;
130 msImageDesc.fHeight = desc.fHeight;
131 msImageDesc.fLevels = 1;
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400132 msImageDesc.fSamples = sampleCnt;
Greg Daniel164a9f02016-02-22 09:56:40 -0500133 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700134 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
135 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
136 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500137 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
138
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500139 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &views.msInfo)) {
140 views.imageView->unref(gpu);
141 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500142 }
143
144 // Set color attachment image
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500145 colorImage = views.msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500146
egdaniel50ead532016-07-13 14:23:26 -0700147 // Create resolve attachment view.
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500148 views.resolveAttachmentView =
149 GrVkImageView::Create(gpu, image, pixelFormat, GrVkImageView::kColor_Type,
150 info.fLevelCount, GrVkYcbcrConversionInfo());
151 if (!views.resolveAttachmentView) {
152 GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
153 views.imageView->unref(gpu);
154 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500155 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500156 views.msLayout.reset(new GrVkImageLayout(views.msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500157 } else {
158 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700159 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500160 }
161
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500162 views.colorAttachmentView = GrVkImageView::Create(
163 gpu, colorImage, pixelFormat, GrVkImageView::kColor_Type, 1, GrVkYcbcrConversionInfo());
164 if (!views.colorAttachmentView) {
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400165 if (sampleCnt > 1) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500166 views.resolveAttachmentView->unref(gpu);
167 GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500168 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500169 views.imageView->unref(gpu);
170 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500171 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500172 return views;
Greg Daniel164a9f02016-02-22 09:56:40 -0500173}
174
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400175sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::MakeNewTextureRenderTarget(
176 GrVkGpu* gpu,
177 SkBudgeted budgeted,
178 const GrSurfaceDesc& desc,
179 int sampleCnt,
180 const GrVkImage::ImageDesc& imageDesc,
181 GrMipMapsStatus mipMapsStatus) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500182 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
183 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
184
egdanielb2df0c22016-05-13 11:30:37 -0700185 GrVkImageInfo info;
186 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500187 return nullptr;
188 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400189 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500190
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400191 Views views = create_views(gpu, desc, sampleCnt, info);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500192 if (!views.colorAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700193 GrVkImage::DestroyImageInfo(gpu, &info);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500194 return nullptr;
egdanielb2df0c22016-05-13 11:30:37 -0700195 }
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400196 if (sampleCnt > 1) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500197 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400198 gpu, budgeted, desc, sampleCnt, info, std::move(layout), views.imageView,
199 views.msInfo, std::move(views.msLayout), views.colorAttachmentView,
200 views.resolveAttachmentView, mipMapsStatus));
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500201 } else {
202 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
203 gpu, budgeted, desc, info, std::move(layout), views.imageView,
204 views.colorAttachmentView, mipMapsStatus));
205 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500206}
207
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500208sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(
209 GrVkGpu* gpu,
210 const GrSurfaceDesc& desc,
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400211 int sampleCnt,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500212 GrWrapOwnership wrapOwnership,
213 GrWrapCacheable cacheable,
214 const GrVkImageInfo& info,
215 sk_sp<GrVkImageLayout> layout) {
Jim Van Verth658d4992019-07-11 14:07:53 -0400216 // Adopted textures require both image and allocation because we're responsible for freeing
217 SkASSERT(VK_NULL_HANDLE != info.fImage &&
218 (kBorrow_GrWrapOwnership == wrapOwnership || VK_NULL_HANDLE != info.fAlloc.fMemory));
Greg Daniel164a9f02016-02-22 09:56:40 -0500219
Greg Daniel52e16d92018-04-10 09:34:07 -0400220 GrMipMapsStatus mipMapsStatus = info.fLevelCount > 1 ? GrMipMapsStatus::kDirty
221 : GrMipMapsStatus::kNotAllocated;
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400222
Greg Daniel1591c382017-08-17 15:37:20 -0400223 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
224 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400225 Views views = create_views(gpu, desc, sampleCnt, info);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500226 if (!views.colorAttachmentView) {
227 return nullptr;
egdaniel50ead532016-07-13 14:23:26 -0700228 }
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400229 if (sampleCnt > 1) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500230 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400231 gpu, desc, sampleCnt, info, std::move(layout), views.imageView, views.msInfo,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500232 std::move(views.msLayout), views.colorAttachmentView, views.resolveAttachmentView,
233 mipMapsStatus, ownership, cacheable));
234 } else {
235 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
236 gpu, desc, info, std::move(layout), views.imageView, views.colorAttachmentView,
237 mipMapsStatus, ownership, cacheable));
238 }
egdaniel50ead532016-07-13 14:23:26 -0700239}
240
Robert Phillips646e4292017-06-13 12:44:56 -0400241size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
Chris Dalton6ce447a2019-06-23 18:07:38 -0600242 int numColorSamples = this->numSamples();
Brian Salomonbdecacf2018-02-02 20:32:49 -0500243 if (numColorSamples > 1) {
244 // Add one to account for the resolve VkImage.
245 ++numColorSamples;
246 }
Robert Phillips646e4292017-06-13 12:44:56 -0400247 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
248 numColorSamples, // TODO: this still correct?
Greg Daniele252f082017-10-23 16:05:23 -0400249 this->texturePriv().mipMapped());
Robert Phillips646e4292017-06-13 12:44:56 -0400250}