1164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel/*
2164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel * Copyright 2015 Google Inc.
3164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel *
4164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel * Use of this source code is governed by a BSD-style license that can be
5164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel * found in the LICENSE file.
6164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel */
7164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
8164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel#include "GrVkTexture.h"
9164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel#include "GrVkGpu.h"
10164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel#include "GrVkImageView.h"
1162340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth#include "GrTexturePriv.h"
1250ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel#include "GrVkTextureRenderTarget.h"
13164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel#include "GrVkUtil.h"
14164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
15fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth#include "vk/GrVkTypes.h"
16fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
17164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
18164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
19164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel// Because this class is virtually derived from GrSurface we must explicitly call its constructor.
20164a9f061c5186ae931cc23a3c73f32472e80ff5Greg DanielGrVkTexture::GrVkTexture(GrVkGpu* gpu,
212e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen                         SkBudgeted budgeted,
22164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel                         const GrSurfaceDesc& desc,
23b2df0c2702329be6380a943d548e7377a51d8565egdaniel                         const GrVkImageInfo& info,
24164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel                         const GrVkImageView* view)
252e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen    : GrSurface(gpu, desc)
26b2df0c2702329be6380a943d548e7377a51d8565egdaniel    , GrVkImage(info, GrVkImage::kNot_Wrapped)
27514baff8be7f71111aa7bfb9b099a096b31e16ecBrian Salomon    , INHERITED(gpu, desc, kTexture2DSampler_GrSLType, GrSamplerParams::kMipMap_FilterMode,
28739c5bf111baf977fe418a24fa00ce260989ee9aBrian Salomon                desc.fIsMipMapped)
29f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    , fTextureView(view)
30f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    , fLinearTextureView(nullptr) {
312e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen    this->registerWithCache(budgeted);
322e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen}
332e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen
342e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunenGrVkTexture::GrVkTexture(GrVkGpu* gpu,
352e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen                         Wrapped,
362e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen                         const GrSurfaceDesc& desc,
37b2df0c2702329be6380a943d548e7377a51d8565egdaniel                         const GrVkImageInfo& info,
38b2df0c2702329be6380a943d548e7377a51d8565egdaniel                         const GrVkImageView* view,
39b2df0c2702329be6380a943d548e7377a51d8565egdaniel                         GrVkImage::Wrapped wrapped)
402e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen    : GrSurface(gpu, desc)
41b2df0c2702329be6380a943d548e7377a51d8565egdaniel    , GrVkImage(info, wrapped)
42514baff8be7f71111aa7bfb9b099a096b31e16ecBrian Salomon    , INHERITED(gpu, desc, kTexture2DSampler_GrSLType, GrSamplerParams::kMipMap_FilterMode,
43739c5bf111baf977fe418a24fa00ce260989ee9aBrian Salomon                desc.fIsMipMapped)
44f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    , fTextureView(view)
45f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    , fLinearTextureView(nullptr) {
462e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen    this->registerWithCacheWrapped();
47164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
48164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
49164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel// Because this class is virtually derived from GrSurface we must explicitly call its constructor.
50164a9f061c5186ae931cc23a3c73f32472e80ff5Greg DanielGrVkTexture::GrVkTexture(GrVkGpu* gpu,
51164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel                         const GrSurfaceDesc& desc,
52b2df0c2702329be6380a943d548e7377a51d8565egdaniel                         const GrVkImageInfo& info,
53b2df0c2702329be6380a943d548e7377a51d8565egdaniel                         const GrVkImageView* view,
54b2df0c2702329be6380a943d548e7377a51d8565egdaniel                         GrVkImage::Wrapped wrapped)
552e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen    : GrSurface(gpu, desc)
56b2df0c2702329be6380a943d548e7377a51d8565egdaniel    , GrVkImage(info, wrapped)
57514baff8be7f71111aa7bfb9b099a096b31e16ecBrian Salomon    , INHERITED(gpu, desc, kTexture2DSampler_GrSLType, GrSamplerParams::kMipMap_FilterMode,
58739c5bf111baf977fe418a24fa00ce260989ee9aBrian Salomon                desc.fIsMipMapped)
59f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    , fTextureView(view)
60b2df0c2702329be6380a943d548e7377a51d8565egdaniel    , fLinearTextureView(nullptr) {
61164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
62164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
632e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunenGrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted,
642e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen                                           const GrSurfaceDesc& desc,
65164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel                                           const GrVkImage::ImageDesc& imageDesc) {
66164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
67164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
68b2df0c2702329be6380a943d548e7377a51d8565egdaniel    GrVkImageInfo info;
69b2df0c2702329be6380a943d548e7377a51d8565egdaniel    if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
70164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel        return nullptr;
71164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    }
72164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
73b2df0c2702329be6380a943d548e7377a51d8565egdaniel    const GrVkImageView* imageView = GrVkImageView::Create(gpu, info.fImage, info.fFormat,
74b2df0c2702329be6380a943d548e7377a51d8565egdaniel                                                           GrVkImageView::kColor_Type,
75b2df0c2702329be6380a943d548e7377a51d8565egdaniel                                                           info.fLevelCount);
76b2df0c2702329be6380a943d548e7377a51d8565egdaniel    if (!imageView) {
77b2df0c2702329be6380a943d548e7377a51d8565egdaniel        GrVkImage::DestroyImageInfo(gpu, &info);
78b2df0c2702329be6380a943d548e7377a51d8565egdaniel        return nullptr;
79b2df0c2702329be6380a943d548e7377a51d8565egdaniel    }
80164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
81b2df0c2702329be6380a943d548e7377a51d8565egdaniel    return new GrVkTexture(gpu, budgeted, desc, info, imageView);
82164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
83164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
846bd5284415bd983b0628c4941dff5def40018f5abungemansk_sp<GrVkTexture> GrVkTexture::MakeWrappedTexture(GrVkGpu* gpu,
856bd5284415bd983b0628c4941dff5def40018f5abungeman                                                   const GrSurfaceDesc& desc,
866bd5284415bd983b0628c4941dff5def40018f5abungeman                                                   GrWrapOwnership ownership,
876bd5284415bd983b0628c4941dff5def40018f5abungeman                                                   const GrVkImageInfo* info) {
88fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth    SkASSERT(info);
89fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth    // Wrapped textures require both image and allocation (because they can be mapped)
901e305ba0d6a4237020d36234e9e286d3b0489401jvanverth    SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc.fMemory);
91fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
92b2df0c2702329be6380a943d548e7377a51d8565egdaniel    const GrVkImageView* imageView = GrVkImageView::Create(gpu, info->fImage, info->fFormat,
93b2df0c2702329be6380a943d548e7377a51d8565egdaniel                                                           GrVkImageView::kColor_Type,
94b2df0c2702329be6380a943d548e7377a51d8565egdaniel                                                           info->fLevelCount);
95b2df0c2702329be6380a943d548e7377a51d8565egdaniel    if (!imageView) {
96fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth        return nullptr;
97fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth    }
98164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
99766fcbb01cece88ad88808581b4ecc5a5cb60e01Brian Osman    if (kAdoptAndCache_GrWrapOwnership == ownership) {
100766fcbb01cece88ad88808581b4ecc5a5cb60e01Brian Osman        return sk_sp<GrVkTexture>(new GrVkTexture(gpu, SkBudgeted::kYes, desc, *info, imageView));
101766fcbb01cece88ad88808581b4ecc5a5cb60e01Brian Osman    } else {
102766fcbb01cece88ad88808581b4ecc5a5cb60e01Brian Osman        GrVkImage::Wrapped wrapped = kBorrow_GrWrapOwnership == ownership
103766fcbb01cece88ad88808581b4ecc5a5cb60e01Brian Osman                ? GrVkImage::kBorrowed_Wrapped : GrVkImage::kAdopted_Wrapped;
104766fcbb01cece88ad88808581b4ecc5a5cb60e01Brian Osman        return sk_sp<GrVkTexture>(new GrVkTexture(gpu, kWrapped, desc, *info, imageView, wrapped));
105766fcbb01cece88ad88808581b4ecc5a5cb60e01Brian Osman    }
106164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
107164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
108164a9f061c5186ae931cc23a3c73f32472e80ff5Greg DanielGrVkTexture::~GrVkTexture() {
109164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    // either release or abandon should have been called by the owner of this object.
110164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    SkASSERT(!fTextureView);
111f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    SkASSERT(!fLinearTextureView);
112164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
113164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
114164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Danielvoid GrVkTexture::onRelease() {
115164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    // we create this and don't hand it off, so we should always destroy it
116164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    if (fTextureView) {
117164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel        fTextureView->unref(this->getVkGpu());
118164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel        fTextureView = nullptr;
119164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    }
120164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
121f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    if (fLinearTextureView) {
122f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman        fLinearTextureView->unref(this->getVkGpu());
123f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman        fLinearTextureView = nullptr;
124f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    }
125f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman
1262e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen    this->releaseImage(this->getVkGpu());
127164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
128164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    INHERITED::onRelease();
129164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
130164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
131164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Danielvoid GrVkTexture::onAbandon() {
132164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    if (fTextureView) {
133164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel        fTextureView->unrefAndAbandon();
134164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel        fTextureView = nullptr;
135164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    }
136164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
137f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    if (fLinearTextureView) {
138f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman        fLinearTextureView->unrefAndAbandon();
139f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman        fLinearTextureView = nullptr;
140f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    }
141f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman
142164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    this->abandonImage();
143164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    INHERITED::onAbandon();
144164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
145164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
146164a9f061c5186ae931cc23a3c73f32472e80ff5Greg DanielGrBackendObject GrVkTexture::getTextureHandle() const {
147b2df0c2702329be6380a943d548e7377a51d8565egdaniel    return (GrBackendObject)&fInfo;
148164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
149164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel
1502c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osmanstd::unique_ptr<GrExternalTextureData> GrVkTexture::detachBackendTexture() {
1512c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman    // Not supported on Vulkan yet
1522c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman    // TODO: Add thread-safe memory pools, and implement this.
1532c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman    return nullptr;
1542c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman}
1552c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman
156164a9f061c5186ae931cc23a3c73f32472e80ff5Greg DanielGrVkGpu* GrVkTexture::getVkGpu() const {
157164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    SkASSERT(!this->wasDestroyed());
158164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel    return static_cast<GrVkGpu*>(this->getGpu());
159164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel}
16062340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth
161f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosmanconst GrVkImageView* GrVkTexture::textureView(bool allowSRGB) {
162f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    VkFormat linearFormat;
163b2df0c2702329be6380a943d548e7377a51d8565egdaniel    if (allowSRGB || !GrVkFormatIsSRGB(fInfo.fFormat, &linearFormat)) {
164f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman        return fTextureView;
165f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    }
166f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman
167f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    if (!fLinearTextureView) {
168b2df0c2702329be6380a943d548e7377a51d8565egdaniel        fLinearTextureView = GrVkImageView::Create(this->getVkGpu(), fInfo.fImage,
169f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman                                                   linearFormat, GrVkImageView::kColor_Type,
170b2df0c2702329be6380a943d548e7377a51d8565egdaniel                                                   fInfo.fLevelCount);
171f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman        SkASSERT(fLinearTextureView);
172f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    }
173f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman
174f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    return fLinearTextureView;
175f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman}
176f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman
17750ead53ac97deb23310916e3736c3f5e2d8f7f4begdanielbool GrVkTexture::reallocForMipmap(GrVkGpu* gpu, uint32_t mipLevels) {
178900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth    if (mipLevels == 1) {
179900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth        // don't need to do anything for a 1x1 texture
180900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth        return false;
181900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth    }
182900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth
183b2df0c2702329be6380a943d548e7377a51d8565egdaniel    const GrVkResource* oldResource = this->resource();
18462340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth
185900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth    // We shouldn't realloc something that doesn't belong to us
186b2df0c2702329be6380a943d548e7377a51d8565egdaniel    if (fIsBorrowed) {
187900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth        return false;
188900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth    }
189900bd4a0463bc6471ef07a77120b413bd8f472b2jvanverth
19062340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    bool renderTarget = SkToBool(fDesc.fFlags & kRenderTarget_GrSurfaceFlag);
19162340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth
19262340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_SAMPLED_BIT;
19362340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    if (renderTarget) {
19462340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth        usageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
19562340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    }
19662340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
19762340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth
19862340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    GrVkImage::ImageDesc imageDesc;
19962340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    imageDesc.fImageType = VK_IMAGE_TYPE_2D;
200b2df0c2702329be6380a943d548e7377a51d8565egdaniel    imageDesc.fFormat = fInfo.fFormat;
20162340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    imageDesc.fWidth = fDesc.fWidth;
20262340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    imageDesc.fHeight = fDesc.fHeight;
20362340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    imageDesc.fLevels = mipLevels;
20462340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    imageDesc.fSamples = 1;
20562340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    imageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
20662340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    imageDesc.fUsageFlags = usageFlags;
20762340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    imageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
20862340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth
209b2df0c2702329be6380a943d548e7377a51d8565egdaniel    GrVkImageInfo info;
210b2df0c2702329be6380a943d548e7377a51d8565egdaniel    if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
211c902164c3fcbcaefc966c30639da251084a0a321bsalomon        return false;
21262340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    }
21362340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth
21462340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    // have to create a new image view for new resource
21562340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    const GrVkImageView* oldView = fTextureView;
216b2df0c2702329be6380a943d548e7377a51d8565egdaniel    VkImage image = info.fImage;
217b2df0c2702329be6380a943d548e7377a51d8565egdaniel    const GrVkImageView* textureView = GrVkImageView::Create(gpu, image, info.fFormat,
21862340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth                                                             GrVkImageView::kColor_Type, mipLevels);
21962340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    if (!textureView) {
220b2df0c2702329be6380a943d548e7377a51d8565egdaniel        GrVkImage::DestroyImageInfo(gpu, &info);
22162340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth        return false;
22262340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    }
22362340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth
22450ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel    if (renderTarget) {
22550ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel        GrVkTextureRenderTarget* texRT = static_cast<GrVkTextureRenderTarget*>(this);
22650ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel        if (!texRT->updateForMipmap(gpu, info)) {
22750ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel            GrVkImage::DestroyImageInfo(gpu, &info);
22850ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel            return false;
22950ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel        }
23050ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel    }
23150ead53ac97deb23310916e3736c3f5e2d8f7f4begdaniel
23262340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    oldResource->unref(gpu);
23362340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    oldView->unref(gpu);
234f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    if (fLinearTextureView) {
235f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman        fLinearTextureView->unref(gpu);
236f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman        fLinearTextureView = nullptr;
237f05ab1b820b482fa633544579ab4d4c6bfcdb433brianosman    }
238b2df0c2702329be6380a943d548e7377a51d8565egdaniel
2396b6ffc4ab6ecee9f46425a5467ef0fbebbb8c9cdjvanverth    this->setNewResource(info.fImage, info.fAlloc, info.fImageTiling);
24062340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    fTextureView = textureView;
241b2df0c2702329be6380a943d548e7377a51d8565egdaniel    fInfo = info;
24262340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    this->texturePriv().setMaxMipMapLevel(mipLevels);
24362340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth
24462340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth    return true;
24562340067270c5c3365afa6b40b8e995ae6a6c1ecjvanverth}
246