blob: 2288db29f1ff9e518bcb2e5551638bfa72ae91f2 [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
120 VkFormat pixelFormat;
121 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
122
123 VkImage colorImage;
124
125 // create msaa surface if necessary
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400126 if (sampleCnt > 1) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500127 GrVkImage::ImageDesc msImageDesc;
128 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
129 msImageDesc.fFormat = pixelFormat;
130 msImageDesc.fWidth = desc.fWidth;
131 msImageDesc.fHeight = desc.fHeight;
132 msImageDesc.fLevels = 1;
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400133 msImageDesc.fSamples = sampleCnt;
Greg Daniel164a9f02016-02-22 09:56:40 -0500134 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -0700135 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
136 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
137 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500138 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
139
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500140 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &views.msInfo)) {
141 views.imageView->unref(gpu);
142 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500143 }
144
145 // Set color attachment image
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500146 colorImage = views.msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500147
egdaniel50ead532016-07-13 14:23:26 -0700148 // Create resolve attachment view.
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500149 views.resolveAttachmentView =
150 GrVkImageView::Create(gpu, image, pixelFormat, GrVkImageView::kColor_Type,
151 info.fLevelCount, GrVkYcbcrConversionInfo());
152 if (!views.resolveAttachmentView) {
153 GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
154 views.imageView->unref(gpu);
155 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500156 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500157 views.msLayout.reset(new GrVkImageLayout(views.msInfo.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500158 } else {
159 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -0700160 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -0500161 }
162
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500163 views.colorAttachmentView = GrVkImageView::Create(
164 gpu, colorImage, pixelFormat, GrVkImageView::kColor_Type, 1, GrVkYcbcrConversionInfo());
165 if (!views.colorAttachmentView) {
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400166 if (sampleCnt > 1) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500167 views.resolveAttachmentView->unref(gpu);
168 GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500169 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500170 views.imageView->unref(gpu);
171 return {};
Greg Daniel164a9f02016-02-22 09:56:40 -0500172 }
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500173 return views;
Greg Daniel164a9f02016-02-22 09:56:40 -0500174}
175
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400176sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::MakeNewTextureRenderTarget(
177 GrVkGpu* gpu,
178 SkBudgeted budgeted,
179 const GrSurfaceDesc& desc,
180 int sampleCnt,
181 const GrVkImage::ImageDesc& imageDesc,
182 GrMipMapsStatus mipMapsStatus) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500183 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
184 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
185
egdanielb2df0c22016-05-13 11:30:37 -0700186 GrVkImageInfo info;
187 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500188 return nullptr;
189 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400190 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500191
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400192 Views views = create_views(gpu, desc, sampleCnt, info);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500193 if (!views.colorAttachmentView) {
egdanielb2df0c22016-05-13 11:30:37 -0700194 GrVkImage::DestroyImageInfo(gpu, &info);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500195 return nullptr;
egdanielb2df0c22016-05-13 11:30:37 -0700196 }
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400197 if (sampleCnt > 1) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500198 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400199 gpu, budgeted, desc, sampleCnt, info, std::move(layout), views.imageView,
200 views.msInfo, std::move(views.msLayout), views.colorAttachmentView,
201 views.resolveAttachmentView, mipMapsStatus));
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500202 } else {
203 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
204 gpu, budgeted, desc, info, std::move(layout), views.imageView,
205 views.colorAttachmentView, mipMapsStatus));
206 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500207}
208
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500209sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(
210 GrVkGpu* gpu,
211 const GrSurfaceDesc& desc,
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400212 int sampleCnt,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500213 GrWrapOwnership wrapOwnership,
214 GrWrapCacheable cacheable,
215 const GrVkImageInfo& info,
216 sk_sp<GrVkImageLayout> layout) {
Jim Van Verth658d4992019-07-11 14:07:53 -0400217 // Adopted textures require both image and allocation because we're responsible for freeing
218 SkASSERT(VK_NULL_HANDLE != info.fImage &&
219 (kBorrow_GrWrapOwnership == wrapOwnership || VK_NULL_HANDLE != info.fAlloc.fMemory));
Greg Daniel164a9f02016-02-22 09:56:40 -0500220
Greg Daniel52e16d92018-04-10 09:34:07 -0400221 GrMipMapsStatus mipMapsStatus = info.fLevelCount > 1 ? GrMipMapsStatus::kDirty
222 : GrMipMapsStatus::kNotAllocated;
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400223
Greg Daniel1591c382017-08-17 15:37:20 -0400224 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
225 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400226 Views views = create_views(gpu, desc, sampleCnt, info);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500227 if (!views.colorAttachmentView) {
228 return nullptr;
egdaniel50ead532016-07-13 14:23:26 -0700229 }
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400230 if (sampleCnt > 1) {
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500231 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
Brian Salomon27b4d8d2019-07-22 14:23:45 -0400232 gpu, desc, sampleCnt, info, std::move(layout), views.imageView, views.msInfo,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500233 std::move(views.msLayout), views.colorAttachmentView, views.resolveAttachmentView,
234 mipMapsStatus, ownership, cacheable));
235 } else {
236 return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
237 gpu, desc, info, std::move(layout), views.imageView, views.colorAttachmentView,
238 mipMapsStatus, ownership, cacheable));
239 }
egdaniel50ead532016-07-13 14:23:26 -0700240}
241
Robert Phillips646e4292017-06-13 12:44:56 -0400242size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
Chris Dalton6ce447a2019-06-23 18:07:38 -0600243 int numColorSamples = this->numSamples();
Brian Salomonbdecacf2018-02-02 20:32:49 -0500244 if (numColorSamples > 1) {
245 // Add one to account for the resolve VkImage.
246 ++numColorSamples;
247 }
Robert Phillips646e4292017-06-13 12:44:56 -0400248 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
249 numColorSamples, // TODO: this still correct?
Greg Daniele252f082017-10-23 16:05:23 -0400250 this->texturePriv().mipMapped());
Robert Phillips646e4292017-06-13 12:44:56 -0400251}