blob: 2a6810d209a09a172682cf7f20ba2ac5d32dce28 [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
10#include "GrRenderTargetPriv.h"
11#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
kkinnunen2e6055b2016-04-22 01:48:29 -070021GrVkTextureRenderTarget* GrVkTextureRenderTarget::Create(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -070022 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070023 const GrVkImageInfo& info,
24 SkBudgeted budgeted,
25 GrVkImage::Wrapped wrapped) {
26 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050027 // Create the texture ImageView
egdanielb2df0c22016-05-13 11:30:37 -070028 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, info.fFormat,
egdaniel50ead532016-07-13 14:23:26 -070029 GrVkImageView::kColor_Type,
30 info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -050031 if (!imageView) {
32 return nullptr;
33 }
34
35 VkFormat pixelFormat;
36 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
37
38 VkImage colorImage;
39
40 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -070041 GrVkImageInfo msInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -050042 const GrVkImageView* resolveAttachmentView = nullptr;
43 if (desc.fSampleCnt) {
44 GrVkImage::ImageDesc msImageDesc;
45 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
46 msImageDesc.fFormat = pixelFormat;
47 msImageDesc.fWidth = desc.fWidth;
48 msImageDesc.fHeight = desc.fHeight;
49 msImageDesc.fLevels = 1;
50 msImageDesc.fSamples = desc.fSampleCnt;
51 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -070052 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
53 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
54 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -050055 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
56
egdanielb2df0c22016-05-13 11:30:37 -070057 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
egdanielce3bfb12016-08-26 11:05:13 -070058 imageView->unref(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -050059 return nullptr;
60 }
61
62 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -070063 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050064
egdaniel50ead532016-07-13 14:23:26 -070065 // Create resolve attachment view.
66 resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelFormat,
67 GrVkImageView::kColor_Type,
68 info.fLevelCount);
69 if (!resolveAttachmentView) {
70 GrVkImage::DestroyImageInfo(gpu, &msInfo);
71 imageView->unref(gpu);
72 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -050073 }
74 } else {
75 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -070076 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050077 }
78
egdaniel50ead532016-07-13 14:23:26 -070079 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
80 GrVkImageView::kColor_Type, 1);
81 if (!colorAttachmentView) {
82 if (desc.fSampleCnt) {
83 resolveAttachmentView->unref(gpu);
84 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -050085 }
egdaniel50ead532016-07-13 14:23:26 -070086 imageView->unref(gpu);
87 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -050088 }
egdaniel50ead532016-07-13 14:23:26 -070089
Greg Daniel164a9f02016-02-22 09:56:40 -050090 GrVkTextureRenderTarget* texRT;
egdanielb2df0c22016-05-13 11:30:37 -070091 if (desc.fSampleCnt) {
92 if (GrVkImage::kNot_Wrapped == wrapped) {
93 texRT = new GrVkTextureRenderTarget(gpu, budgeted, desc,
94 info, imageView, msInfo,
95 colorAttachmentView,
96 resolveAttachmentView);
97 } else {
98 texRT = new GrVkTextureRenderTarget(gpu, desc,
99 info, imageView, msInfo,
100 colorAttachmentView,
101 resolveAttachmentView, wrapped);
102 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500103 } else {
egdanielb2df0c22016-05-13 11:30:37 -0700104 if (GrVkImage::kNot_Wrapped == wrapped) {
105 texRT = new GrVkTextureRenderTarget(gpu, budgeted, desc,
106 info, imageView,
107 colorAttachmentView);
108 } else {
109 texRT = new GrVkTextureRenderTarget(gpu, desc,
110 info, imageView,
111 colorAttachmentView, wrapped);
112 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500113 }
114 return texRT;
115}
116
117GrVkTextureRenderTarget*
118GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700119 SkBudgeted budgeted,
120 const GrSurfaceDesc& desc,
121 const GrVkImage::ImageDesc& imageDesc) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500122 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
123 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
124
egdanielb2df0c22016-05-13 11:30:37 -0700125 GrVkImageInfo info;
126 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500127 return nullptr;
128 }
129
egdanielb2df0c22016-05-13 11:30:37 -0700130 GrVkTextureRenderTarget* trt = Create(gpu, desc, info, budgeted, GrVkImage::kNot_Wrapped);
131 if (!trt) {
132 GrVkImage::DestroyImageInfo(gpu, &info);
133 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500134
135 return trt;
136}
137
bungeman6bd52842016-10-27 09:30:08 -0700138sk_sp<GrVkTextureRenderTarget>
139GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
140 const GrSurfaceDesc& desc,
141 GrWrapOwnership ownership,
142 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700143 SkASSERT(info);
144 // Wrapped textures require both image and allocation (because they can be mapped)
jvanverth1e305ba2016-06-01 09:39:15 -0700145 SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500146
egdanielb2df0c22016-05-13 11:30:37 -0700147 GrVkImage::Wrapped wrapped = kBorrow_GrWrapOwnership == ownership ? GrVkImage::kBorrowed_Wrapped
148 : GrVkImage::kAdopted_Wrapped;
jvanverthfd359ca2016-03-18 11:57:24 -0700149
bungeman6bd52842016-10-27 09:30:08 -0700150 return sk_sp<GrVkTextureRenderTarget>(Create(gpu, desc, *info, SkBudgeted::kNo, wrapped));
Greg Daniel164a9f02016-02-22 09:56:40 -0500151}
egdaniel50ead532016-07-13 14:23:26 -0700152
153bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
154 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400155 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
156 if (this->numStencilSamples()) {
egdaniel50ead532016-07-13 14:23:26 -0700157 const GrVkImageView* resolveAttachmentView =
158 GrVkImageView::Create(gpu,
159 newInfo.fImage,
160 pixelFormat,
161 GrVkImageView::kColor_Type,
162 newInfo.fLevelCount);
163 if (!resolveAttachmentView) {
164 return false;
165 }
166 fResolveAttachmentView->unref(gpu);
167 fResolveAttachmentView = resolveAttachmentView;
168 } else {
169 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
170 newInfo.fImage,
171 pixelFormat,
172 GrVkImageView::kColor_Type,
173 1);
174 if (!colorAttachmentView) {
175 return false;
176 }
177 fColorAttachmentView->unref(gpu);
178 fColorAttachmentView = colorAttachmentView;
179 }
180
181 this->createFramebuffer(gpu);
182 return true;
183}
184