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