blob: a77722832d459736fc4ac42f5ab82b63d8e7724e [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"
Robert Phillips646e4292017-06-13 12:44:56 -040011#include "GrTexturePriv.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050012#include "GrVkGpu.h"
13#include "GrVkImageView.h"
14#include "GrVkUtil.h"
15
egdanieldd97b852016-04-28 09:30:39 -070016#include "SkMipMap.h"
jvanverth62340062016-04-26 08:01:44 -070017
jvanverthfd359ca2016-03-18 11:57:24 -070018#include "vk/GrVkTypes.h"
19
Greg Daniel164a9f02016-02-22 09:56:40 -050020#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
21
Robert Phillips67d52cf2017-06-05 13:38:13 -040022sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::Make(GrVkGpu* gpu,
23 const GrSurfaceDesc& desc,
24 const GrVkImageInfo& info,
25 SkBudgeted budgeted,
26 GrVkImage::Wrapped wrapped) {
egdanielb2df0c22016-05-13 11:30:37 -070027 VkImage image = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050028 // Create the texture ImageView
egdanielb2df0c22016-05-13 11:30:37 -070029 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, info.fFormat,
egdaniel50ead532016-07-13 14:23:26 -070030 GrVkImageView::kColor_Type,
31 info.fLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -050032 if (!imageView) {
33 return nullptr;
34 }
35
36 VkFormat pixelFormat;
37 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
38
39 VkImage colorImage;
40
41 // create msaa surface if necessary
egdanielb2df0c22016-05-13 11:30:37 -070042 GrVkImageInfo msInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -050043 const GrVkImageView* resolveAttachmentView = nullptr;
44 if (desc.fSampleCnt) {
45 GrVkImage::ImageDesc msImageDesc;
46 msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
47 msImageDesc.fFormat = pixelFormat;
48 msImageDesc.fWidth = desc.fWidth;
49 msImageDesc.fHeight = desc.fHeight;
50 msImageDesc.fLevels = 1;
51 msImageDesc.fSamples = desc.fSampleCnt;
52 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
egdaniel4bcd62e2016-08-31 07:37:31 -070053 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
54 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
55 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -050056 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
57
egdanielb2df0c22016-05-13 11:30:37 -070058 if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
egdanielce3bfb12016-08-26 11:05:13 -070059 imageView->unref(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -050060 return nullptr;
61 }
62
63 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -070064 colorImage = msInfo.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050065
egdaniel50ead532016-07-13 14:23:26 -070066 // Create resolve attachment view.
67 resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelFormat,
68 GrVkImageView::kColor_Type,
69 info.fLevelCount);
70 if (!resolveAttachmentView) {
71 GrVkImage::DestroyImageInfo(gpu, &msInfo);
72 imageView->unref(gpu);
73 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -050074 }
75 } else {
76 // Set color attachment image
egdanielb2df0c22016-05-13 11:30:37 -070077 colorImage = info.fImage;
Greg Daniel164a9f02016-02-22 09:56:40 -050078 }
79
egdaniel50ead532016-07-13 14:23:26 -070080 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
81 GrVkImageView::kColor_Type, 1);
82 if (!colorAttachmentView) {
83 if (desc.fSampleCnt) {
84 resolveAttachmentView->unref(gpu);
85 GrVkImage::DestroyImageInfo(gpu, &msInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -050086 }
egdaniel50ead532016-07-13 14:23:26 -070087 imageView->unref(gpu);
88 return nullptr;
Greg Daniel164a9f02016-02-22 09:56:40 -050089 }
egdaniel50ead532016-07-13 14:23:26 -070090
Robert Phillips67d52cf2017-06-05 13:38:13 -040091 sk_sp<GrVkTextureRenderTarget> texRT;
egdanielb2df0c22016-05-13 11:30:37 -070092 if (desc.fSampleCnt) {
93 if (GrVkImage::kNot_Wrapped == wrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -040094 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
95 gpu, budgeted, desc,
96 info, imageView, msInfo,
97 colorAttachmentView,
98 resolveAttachmentView));
egdanielb2df0c22016-05-13 11:30:37 -070099 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400100 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
101 gpu, desc,
102 info, imageView, msInfo,
103 colorAttachmentView,
104 resolveAttachmentView, wrapped));
egdanielb2df0c22016-05-13 11:30:37 -0700105 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500106 } else {
egdanielb2df0c22016-05-13 11:30:37 -0700107 if (GrVkImage::kNot_Wrapped == wrapped) {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400108 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
109 gpu, budgeted, desc,
110 info, imageView,
111 colorAttachmentView));
egdanielb2df0c22016-05-13 11:30:37 -0700112 } else {
Robert Phillips67d52cf2017-06-05 13:38:13 -0400113 texRT = sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
114 gpu, desc,
115 info, imageView,
116 colorAttachmentView, wrapped));
egdanielb2df0c22016-05-13 11:30:37 -0700117 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500118 }
119 return texRT;
120}
121
Robert Phillips67d52cf2017-06-05 13:38:13 -0400122sk_sp<GrVkTextureRenderTarget>
Greg Daniel164a9f02016-02-22 09:56:40 -0500123GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -0700124 SkBudgeted budgeted,
125 const GrSurfaceDesc& desc,
126 const GrVkImage::ImageDesc& imageDesc) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500127 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
128 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
129
egdanielb2df0c22016-05-13 11:30:37 -0700130 GrVkImageInfo info;
131 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500132 return nullptr;
133 }
134
Robert Phillips67d52cf2017-06-05 13:38:13 -0400135 sk_sp<GrVkTextureRenderTarget> trt = Make(gpu, desc, info, budgeted, GrVkImage::kNot_Wrapped);
egdanielb2df0c22016-05-13 11:30:37 -0700136 if (!trt) {
137 GrVkImage::DestroyImageInfo(gpu, &info);
138 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500139
140 return trt;
141}
142
bungeman6bd52842016-10-27 09:30:08 -0700143sk_sp<GrVkTextureRenderTarget>
144GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu,
145 const GrSurfaceDesc& desc,
146 GrWrapOwnership ownership,
147 const GrVkImageInfo* info) {
jvanverthfd359ca2016-03-18 11:57:24 -0700148 SkASSERT(info);
149 // Wrapped textures require both image and allocation (because they can be mapped)
jvanverth1e305ba2016-06-01 09:39:15 -0700150 SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -0500151
egdanielb2df0c22016-05-13 11:30:37 -0700152 GrVkImage::Wrapped wrapped = kBorrow_GrWrapOwnership == ownership ? GrVkImage::kBorrowed_Wrapped
153 : GrVkImage::kAdopted_Wrapped;
jvanverthfd359ca2016-03-18 11:57:24 -0700154
Robert Phillips67d52cf2017-06-05 13:38:13 -0400155 return Make(gpu, desc, *info, SkBudgeted::kNo, wrapped);
Greg Daniel164a9f02016-02-22 09:56:40 -0500156}
egdaniel50ead532016-07-13 14:23:26 -0700157
158bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) {
159 VkFormat pixelFormat;
Brian Salomond34edf32017-05-19 15:45:48 -0400160 GrPixelConfigToVkFormat(this->config(), &pixelFormat);
161 if (this->numStencilSamples()) {
egdaniel50ead532016-07-13 14:23:26 -0700162 const GrVkImageView* resolveAttachmentView =
163 GrVkImageView::Create(gpu,
164 newInfo.fImage,
165 pixelFormat,
166 GrVkImageView::kColor_Type,
167 newInfo.fLevelCount);
168 if (!resolveAttachmentView) {
169 return false;
170 }
171 fResolveAttachmentView->unref(gpu);
172 fResolveAttachmentView = resolveAttachmentView;
173 } else {
174 const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu,
175 newInfo.fImage,
176 pixelFormat,
177 GrVkImageView::kColor_Type,
178 1);
179 if (!colorAttachmentView) {
180 return false;
181 }
182 fColorAttachmentView->unref(gpu);
183 fColorAttachmentView = colorAttachmentView;
184 }
185
186 this->createFramebuffer(gpu);
187 return true;
188}
189
Robert Phillips646e4292017-06-13 12:44:56 -0400190size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
191 // The plus 1 is to account for the resolve texture.
192 int numColorSamples = this->numColorSamples() + 1;
193 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
194 numColorSamples, // TODO: this still correct?
195 this->texturePriv().hasMipMaps());
196}