blob: d072a88541276645a093f88de738ef0a52107d2f [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 "GrVkTexture.h"
Robert Phillipsf95b1752017-08-31 08:56:07 -04009
10#include "GrTexturePriv.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050011#include "GrVkGpu.h"
12#include "GrVkImageView.h"
egdaniel50ead532016-07-13 14:23:26 -070013#include "GrVkTextureRenderTarget.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050014#include "GrVkUtil.h"
15
jvanverthfd359ca2016-03-18 11:57:24 -070016#include "vk/GrVkTypes.h"
17
Greg Daniel164a9f02016-02-22 09:56:40 -050018#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
19
20// Because this class is virtually derived from GrSurface we must explicitly call its constructor.
21GrVkTexture::GrVkTexture(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -070022 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -050023 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070024 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040025 sk_sp<GrVkImageLayout> layout,
Greg Daniel834f1202017-10-09 15:06:20 -040026 const GrVkImageView* view,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040027 GrMipMapsStatus mipMapsStatus)
Brian Salomon60dd8c72018-07-30 10:24:13 -040028 : GrSurface(gpu, desc)
29 , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kOwned)
Brian Salomone632dfc2018-08-01 13:01:16 -040030 , INHERITED(gpu, desc, GrTextureType::k2D, mipMapsStatus)
Brian Salomon60dd8c72018-07-30 10:24:13 -040031 , fTextureView(view) {
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040032 SkASSERT((GrMipMapsStatus::kNotAllocated == mipMapsStatus) == (1 == info.fLevelCount));
kkinnunen2e6055b2016-04-22 01:48:29 -070033 this->registerWithCache(budgeted);
34}
35
36GrVkTexture::GrVkTexture(GrVkGpu* gpu,
37 Wrapped,
38 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070039 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040040 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070041 const GrVkImageView* view,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040042 GrMipMapsStatus mipMapsStatus,
Greg Daniel1591c382017-08-17 15:37:20 -040043 GrBackendObjectOwnership ownership)
Brian Salomon60dd8c72018-07-30 10:24:13 -040044 : GrSurface(gpu, desc)
45 , GrVkImage(info, std::move(layout), ownership)
Brian Salomone632dfc2018-08-01 13:01:16 -040046 , INHERITED(gpu, desc, GrTextureType::k2D, mipMapsStatus)
Brian Salomon60dd8c72018-07-30 10:24:13 -040047 , fTextureView(view) {
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040048 SkASSERT((GrMipMapsStatus::kNotAllocated == mipMapsStatus) == (1 == info.fLevelCount));
kkinnunen2e6055b2016-04-22 01:48:29 -070049 this->registerWithCacheWrapped();
Greg Daniel164a9f02016-02-22 09:56:40 -050050}
51
52// Because this class is virtually derived from GrSurface we must explicitly call its constructor.
53GrVkTexture::GrVkTexture(GrVkGpu* gpu,
54 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070055 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040056 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070057 const GrVkImageView* view,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040058 GrMipMapsStatus mipMapsStatus,
59 GrBackendObjectOwnership ownership)
Brian Salomon60dd8c72018-07-30 10:24:13 -040060 : GrSurface(gpu, desc)
61 , GrVkImage(info, layout, ownership)
Brian Salomone632dfc2018-08-01 13:01:16 -040062 , INHERITED(gpu, desc, GrTextureType::k2D, mipMapsStatus)
Brian Salomon60dd8c72018-07-30 10:24:13 -040063 , fTextureView(view) {
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040064 SkASSERT((GrMipMapsStatus::kNotAllocated == mipMapsStatus) == (1 == info.fLevelCount));
Greg Daniel164a9f02016-02-22 09:56:40 -050065}
66
Greg Daniel475eb702018-09-28 14:16:50 -040067sk_sp<GrVkTexture> GrVkTexture::MakeNewTexture(GrVkGpu* gpu, SkBudgeted budgeted,
68 const GrSurfaceDesc& desc,
69 const GrVkImage::ImageDesc& imageDesc,
70 GrMipMapsStatus mipMapsStatus) {
Greg Daniel164a9f02016-02-22 09:56:40 -050071 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
72
egdanielb2df0c22016-05-13 11:30:37 -070073 GrVkImageInfo info;
74 if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
Greg Daniel164a9f02016-02-22 09:56:40 -050075 return nullptr;
76 }
77
egdanielb2df0c22016-05-13 11:30:37 -070078 const GrVkImageView* imageView = GrVkImageView::Create(gpu, info.fImage, info.fFormat,
79 GrVkImageView::kColor_Type,
80 info.fLevelCount);
81 if (!imageView) {
82 GrVkImage::DestroyImageInfo(gpu, &info);
83 return nullptr;
84 }
Greg Daniel52e16d92018-04-10 09:34:07 -040085 sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
Greg Daniel164a9f02016-02-22 09:56:40 -050086
Greg Daniel52e16d92018-04-10 09:34:07 -040087 return sk_sp<GrVkTexture>(new GrVkTexture(gpu, budgeted, desc, info, std::move(layout),
88 imageView, mipMapsStatus));
Greg Daniel164a9f02016-02-22 09:56:40 -050089}
90
bungeman6bd52842016-10-27 09:30:08 -070091sk_sp<GrVkTexture> GrVkTexture::MakeWrappedTexture(GrVkGpu* gpu,
92 const GrSurfaceDesc& desc,
Greg Daniel1591c382017-08-17 15:37:20 -040093 GrWrapOwnership wrapOwnership,
Greg Daniel52e16d92018-04-10 09:34:07 -040094 const GrVkImageInfo& info,
95 sk_sp<GrVkImageLayout> layout) {
jvanverthfd359ca2016-03-18 11:57:24 -070096 // Wrapped textures require both image and allocation (because they can be mapped)
Greg Daniel52e16d92018-04-10 09:34:07 -040097 SkASSERT(VK_NULL_HANDLE != info.fImage && VK_NULL_HANDLE != info.fAlloc.fMemory);
Greg Daniel164a9f02016-02-22 09:56:40 -050098
Greg Daniel52e16d92018-04-10 09:34:07 -040099 const GrVkImageView* imageView = GrVkImageView::Create(gpu, info.fImage, info.fFormat,
egdanielb2df0c22016-05-13 11:30:37 -0700100 GrVkImageView::kColor_Type,
Greg Daniel52e16d92018-04-10 09:34:07 -0400101 info.fLevelCount);
egdanielb2df0c22016-05-13 11:30:37 -0700102 if (!imageView) {
jvanverthfd359ca2016-03-18 11:57:24 -0700103 return nullptr;
104 }
105
Greg Daniel52e16d92018-04-10 09:34:07 -0400106 GrMipMapsStatus mipMapsStatus = info.fLevelCount > 1 ? GrMipMapsStatus::kValid
107 : GrMipMapsStatus::kNotAllocated;
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400108
Greg Daniel1591c382017-08-17 15:37:20 -0400109 GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
110 ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
Greg Daniel52e16d92018-04-10 09:34:07 -0400111 return sk_sp<GrVkTexture>(new GrVkTexture(gpu, kWrapped, desc, info, std::move(layout),
112 imageView, mipMapsStatus, ownership));
Greg Daniel164a9f02016-02-22 09:56:40 -0500113}
114
115GrVkTexture::~GrVkTexture() {
116 // either release or abandon should have been called by the owner of this object.
117 SkASSERT(!fTextureView);
118}
119
120void GrVkTexture::onRelease() {
121 // we create this and don't hand it off, so we should always destroy it
122 if (fTextureView) {
123 fTextureView->unref(this->getVkGpu());
124 fTextureView = nullptr;
125 }
126
kkinnunen2e6055b2016-04-22 01:48:29 -0700127 this->releaseImage(this->getVkGpu());
Greg Daniel164a9f02016-02-22 09:56:40 -0500128
129 INHERITED::onRelease();
130}
131
132void GrVkTexture::onAbandon() {
133 if (fTextureView) {
134 fTextureView->unrefAndAbandon();
135 fTextureView = nullptr;
136 }
137
138 this->abandonImage();
139 INHERITED::onAbandon();
140}
141
Robert Phillipsb67821d2017-12-13 15:00:45 -0500142GrBackendTexture GrVkTexture::getBackendTexture() const {
Greg Daniel52e16d92018-04-10 09:34:07 -0400143 return GrBackendTexture(this->width(), this->height(), fInfo, this->grVkImageLayout());
Robert Phillipsb67821d2017-12-13 15:00:45 -0500144}
145
Greg Daniel164a9f02016-02-22 09:56:40 -0500146GrVkGpu* GrVkTexture::getVkGpu() const {
147 SkASSERT(!this->wasDestroyed());
148 return static_cast<GrVkGpu*>(this->getGpu());
149}
jvanverth62340062016-04-26 08:01:44 -0700150
Brian Osman2b23c4b2018-06-01 12:25:08 -0400151const GrVkImageView* GrVkTexture::textureView() {
152 return fTextureView;
brianosmanf05ab1b2016-05-12 11:01:10 -0700153}
154