blob: 532d0a256326b6b8b01aeac919f45e36772efd95 [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;
52 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
53 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
54
egdanielb2df0c22016-05-13 11:30:37 -070055 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
egdanielce3bfb12016-08-26 11:05:13 -070056 imageView->unref(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -050057 return nullptr;
58 }
59
60 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -070061 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050062
egdaniel50ead532016-07-13 14:23:26 -070063 // Create resolve attachment view.
64 resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelFormat,
65 GrVkImageView::kColor_Type,
66 info.fLevelCount);
67 if (!resolveAttachmentView) {
68 GrVkImage::DestroyImageInfo(gpu, &msInfo);
69 imageView->unref(gpu);
70 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -050071 }
72 } else {
73 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -070074 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050075 }
76
egdaniel50ead532016-07-13 14:23:26 -070077 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
78 GrVkImageView::kColor_Type, 1);
79 if (!colorAttachmentView) {
80 if (desc.fSampleCnt) {
81 resolveAttachmentView->unref(gpu);
82 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -050083 }
egdaniel50ead532016-07-13 14:23:26 -070084 imageView->unref(gpu);
85 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -050086 }
egdaniel50ead532016-07-13 14:23:26 -070087
Greg Daniel164a9f02016-02-22 09:56:40 -050088 GrVkTextureRenderTarget* texRT;
egdanielb2df0c22016-05-13 11:30:37 -070089 if (desc.fSampleCnt) {
90 if (GrVkImage::kNot_Wrapped == wrapped) {
91 texRT = new GrVkTextureRenderTarget(gpu, budgeted, desc,
92 info, imageView, msInfo,
93 colorAttachmentView,
94 resolveAttachmentView);
95 } else {
96 texRT = new GrVkTextureRenderTarget(gpu, desc,
97 info, imageView, msInfo,
98 colorAttachmentView,
99 resolveAttachmentView, wrapped);
100 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500101 } else {
egdanielb2df0c22016-05-13 11:30:37 -0700102 if (GrVkImage::kNot_Wrapped == wrapped) {
103 texRT = new GrVkTextureRenderTarget(gpu, budgeted, desc,
104 info, imageView,
105 colorAttachmentView);
106 } else {
107 texRT = new GrVkTextureRenderTarget(gpu, desc,
108 info, imageView,
109 colorAttachmentView, wrapped);
110 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500111 }
112 return texRT;
113}
114
115GrVkTextureRenderTarget*
116GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700117 SkBudgeted budgeted,
118 const GrSurfaceDesc& desc,
119 const GrVkImage::ImageDesc& imageDesc) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500120 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
121 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
122
egdanielb2df0c22016-05-13 11:30:37 -0700123 GrVkImageInfo info;
124 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500125 return nullptr;
126 }
127
egdanielb2df0c22016-05-13 11:30:37 -0700128 GrVkTextureRenderTarget* trt = Create(gpu, desc, info, budgeted, GrVkImage::kNot_Wrapped);
129 if (!trt) {
130 GrVkImage::DestroyImageInfo(gpu, &info);
131 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500132
133 return trt;
134}
135
136GrVkTextureRenderTarget*
137GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(GrVkGpu* gpu,
138 const GrSurfaceDesc& desc,
kkinnunen2e6055b2016-04-22 01:48:29 -0700139 GrWrapOwnership ownership,
egdanielb2df0c22016-05-13 11:30:37 -0700140 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700141 SkASSERT(info);
142 // Wrapped textures require both image and allocation (because they can be mapped)
jvanverth1e305ba2016-06-01 09:39:15 -0700143 SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500144
egdanielb2df0c22016-05-13 11:30:37 -0700145 GrVkImage::Wrapped wrapped = kBorrow_GrWrapOwnership == ownership ? GrVkImage::kBorrowed_Wrapped
146 : GrVkImage::kAdopted_Wrapped;
jvanverthfd359ca2016-03-18 11:57:24 -0700147
egdanielb2df0c22016-05-13 11:30:37 -0700148 GrVkTextureRenderTarget* trt = Create(gpu, desc, *info, SkBudgeted::kNo, wrapped);
jvanverthfd359ca2016-03-18 11:57:24 -0700149
150 return trt;
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;
155 GrPixelConfigToVkFormat(fDesc.fConfig, &pixelFormat);
156 if (fDesc.fSampleCnt) {
157 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