blob: 1b72c1f94bbd9e2880db8ac4e967d1f58cf9ae90 [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
Robert Phillips67d52cf2017-06-05 13:38:13 -040021sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::Make(GrVkGpu* gpu,
22 const GrSurfaceDesc& desc,
23 const GrVkImageInfo& info,
24 SkBudgeted budgeted,
25 GrVkImage::Wrapped wrapped) {
egdanielb2df0c22016-05-13 11:30:37 -070026 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
Robert Phillips67d52cf2017-06-05 13:38:13 -040090 sk_sp<GrVkTextureRenderTarget> texRT;
egdanielb2df0c22016-05-13 11:30:37 -070091 if (desc.fSampleCnt) {
92 if (GrVkImage::kNot_Wrapped == wrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -040093 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
94 gpu, budgeted, desc,
95 info, imageView, msInfo,
96 colorAttachmentView,
97 resolveAttachmentView));
egdanielb2df0c22016-05-13 11:30:37 -070098 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -040099 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
100 gpu, desc,
101 info, imageView, msInfo,
102 colorAttachmentView,
103 resolveAttachmentView, wrapped));
egdanielb2df0c22016-05-13 11:30:37 -0700104 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500105 } else {
egdanielb2df0c22016-05-13 11:30:37 -0700106 if (GrVkImage::kNot_Wrapped == wrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400107 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
108 gpu, budgeted, desc,
109 info, imageView,
110 colorAttachmentView));
egdanielb2df0c22016-05-13 11:30:37 -0700111 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400112 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
113 gpu, desc,
114 info, imageView,
115 colorAttachmentView, wrapped));
egdanielb2df0c22016-05-13 11:30:37 -0700116 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500117 }
118 return texRT;
119}
120
Robert Phillips67d52cf2017-06-05 13:38:13 -0400121sk_sp<GrVkTextureRenderTarget>
Greg Daniel164a9f02016-02-22 09:56:40 -0500122GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700123 SkBudgeted budgeted,
124 const GrSurfaceDesc& desc,
125 const GrVkImage::ImageDesc& imageDesc) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500126 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
127 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
128
egdanielb2df0c22016-05-13 11:30:37 -0700129 GrVkImageInfo info;
130 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500131 return nullptr;
132 }
133
Robert Phillips67d52cf2017-06-05 13:38:13 -0400134 sk_sp<GrVkTextureRenderTarget> trt = Make(gpu, desc, info, budgeted, GrVkImage::kNot_Wrapped);
egdanielb2df0c22016-05-13 11:30:37 -0700135 if (!trt) {
136 GrVkImage::DestroyImageInfo(gpu, &info);
137 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500138
139 return trt;
140}
141
bungeman6bd52842016-10-27 09:30:08 -0700142sk_sp<GrVkTextureRenderTarget>
143GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
144 const GrSurfaceDesc& desc,
145 GrWrapOwnership ownership,
146 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700147 SkASSERT(info);
148 // Wrapped textures require both image and allocation (because they can be mapped)
jvanverth1e305ba2016-06-01 09:39:15 -0700149 SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500150
egdanielb2df0c22016-05-13 11:30:37 -0700151 GrVkImage::Wrapped wrapped = kBorrow_GrWrapOwnership == ownership ? GrVkImage::kBorrowed_Wrapped
152 : GrVkImage::kAdopted_Wrapped;
jvanverthfd359ca2016-03-18 11:57:24 -0700153
Robert Phillips67d52cf2017-06-05 13:38:13 -0400154 return Make(gpu, desc, *info, SkBudgeted::kNo, wrapped);
Greg Daniel164a9f02016-02-22 09:56:40 -0500155}
egdaniel50ead532016-07-13 14:23:26 -0700156
157bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
158 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400159 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
160 if (this->numStencilSamples()) {
egdaniel50ead532016-07-13 14:23:26 -0700161 const GrVkImageView* resolveAttachmentView =
162 GrVkImageView::Create(gpu,
163 newInfo.fImage,
164 pixelFormat,
165 GrVkImageView::kColor_Type,
166 newInfo.fLevelCount);
167 if (!resolveAttachmentView) {
168 return false;
169 }
170 fResolveAttachmentView->unref(gpu);
171 fResolveAttachmentView = resolveAttachmentView;
172 } else {
173 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
174 newInfo.fImage,
175 pixelFormat,
176 GrVkImageView::kColor_Type,
177 1);
178 if (!colorAttachmentView) {
179 return false;
180 }
181 fColorAttachmentView->unref(gpu);
182 fColorAttachmentView = colorAttachmentView;
183 }
184
185 this->createFramebuffer(gpu);
186 return true;
187}
188