blob: 37b68af8276125f4fa537725f1abf648914cdaf5 [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
138GrVkTextureRenderTarget*
139GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(GrVkGpu* gpu,
140 const GrSurfaceDesc& desc,
kkinnunen2e6055b2016-04-22 01:48:29 -0700141 GrWrapOwnership ownership,
egdanielb2df0c22016-05-13 11:30:37 -0700142 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
egdanielb2df0c22016-05-13 11:30:37 -0700150 GrVkTextureRenderTarget* trt = Create(gpu, desc, *info, SkBudgeted::kNo, wrapped);
jvanverthfd359ca2016-03-18 11:57:24 -0700151
152 return trt;
Greg Daniel164a9f02016-02-22 09:56:40 -0500153}
egdaniel50ead532016-07-13 14:23:26 -0700154
155bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
156 VkFormat pixelFormat;
157 GrPixelConfigToVkFormat(fDesc.fConfig, &pixelFormat);
158 if (fDesc.fSampleCnt) {
159 const GrVkImageView* resolveAttachmentView =
160 GrVkImageView::Create(gpu,
161 newInfo.fImage,
162 pixelFormat,
163 GrVkImageView::kColor_Type,
164 newInfo.fLevelCount);
165 if (!resolveAttachmentView) {
166 return false;
167 }
168 fResolveAttachmentView->unref(gpu);
169 fResolveAttachmentView = resolveAttachmentView;
170 } else {
171 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
172 newInfo.fImage,
173 pixelFormat,
174 GrVkImageView::kColor_Type,
175 1);
176 if (!colorAttachmentView) {
177 return false;
178 }
179 fColorAttachmentView->unref(gpu);
180 fColorAttachmentView = colorAttachmentView;
181 }
182
183 this->createFramebuffer(gpu);
184 return true;
185}
186