| Index: src/gpu/vk/GrVkTexture.cpp | 
| diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp | 
| index c2a30a27f4184bb00317c963bcb776a51a85bd7c..fef6b7292847045ce69267a085021a54d4df8536 100644 | 
| --- a/src/gpu/vk/GrVkTexture.cpp | 
| +++ b/src/gpu/vk/GrVkTexture.cpp | 
| @@ -19,10 +19,10 @@ | 
| GrVkTexture::GrVkTexture(GrVkGpu* gpu, | 
| SkBudgeted budgeted, | 
| const GrSurfaceDesc& desc, | 
| -                         const GrVkImage::Resource* imageResource, | 
| +                         const GrVkImageInfo& info, | 
| const GrVkImageView* view) | 
| : GrSurface(gpu, desc) | 
| -    , GrVkImage(imageResource) | 
| +    , GrVkImage(info, GrVkImage::kNot_Wrapped) | 
| , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) | 
| , fTextureView(view) | 
| , fLinearTextureView(nullptr) { | 
| @@ -32,10 +32,11 @@ GrVkTexture::GrVkTexture(GrVkGpu* gpu, | 
| GrVkTexture::GrVkTexture(GrVkGpu* gpu, | 
| Wrapped, | 
| const GrSurfaceDesc& desc, | 
| -                         const GrVkImage::Resource* imageResource, | 
| -                         const GrVkImageView* view) | 
| +                         const GrVkImageInfo& info, | 
| +                         const GrVkImageView* view, | 
| +                         GrVkImage::Wrapped wrapped) | 
| : GrSurface(gpu, desc) | 
| -    , GrVkImage(imageResource) | 
| +    , GrVkImage(info, wrapped) | 
| , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) | 
| , fTextureView(view) | 
| , fLinearTextureView(nullptr) { | 
| @@ -45,31 +46,14 @@ GrVkTexture::GrVkTexture(GrVkGpu* gpu, | 
| // Because this class is virtually derived from GrSurface we must explicitly call its constructor. | 
| GrVkTexture::GrVkTexture(GrVkGpu* gpu, | 
| const GrSurfaceDesc& desc, | 
| -                         const GrVkImage::Resource* imageResource, | 
| -                         const GrVkImageView* view) | 
| +                         const GrVkImageInfo& info, | 
| +                         const GrVkImageView* view, | 
| +                         GrVkImage::Wrapped wrapped) | 
| : GrSurface(gpu, desc) | 
| -    , GrVkImage(imageResource) | 
| +    , GrVkImage(info, wrapped) | 
| , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) | 
| , fTextureView(view) | 
| -    , fLinearTextureView(nullptr) {} | 
| - | 
| - | 
| -template<typename ResourceType> | 
| -GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu, | 
| -                                 ResourceType type, | 
| -                                 const GrSurfaceDesc& desc, | 
| -                                 VkFormat format, | 
| -                                 const GrVkImage::Resource* imageResource) { | 
| -    VkImage image = imageResource->fImage; | 
| - | 
| -    const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format, | 
| -                                                           GrVkImageView::kColor_Type, | 
| -                                                           imageResource->fLevelCount); | 
| -    if (!imageView) { | 
| -        return nullptr; | 
| -    } | 
| - | 
| -    return new GrVkTexture(gpu, type, desc, imageResource, imageView); | 
| +    , fLinearTextureView(nullptr) { | 
| } | 
|  | 
| GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted, | 
| @@ -77,53 +61,41 @@ GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted, | 
| const GrVkImage::ImageDesc& imageDesc) { | 
| SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT); | 
|  | 
| -    const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, imageDesc); | 
| -    if (!imageResource) { | 
| +    GrVkImageInfo info; | 
| +    if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) { | 
| return nullptr; | 
| } | 
|  | 
| -    GrVkTexture* texture = Create(gpu, budgeted, desc, imageDesc.fFormat, imageResource); | 
| -    // Create() will increment the refCount of the image resource if it succeeds | 
| -    imageResource->unref(gpu); | 
| +    const GrVkImageView* imageView = GrVkImageView::Create(gpu, info.fImage, info.fFormat, | 
| +                                                           GrVkImageView::kColor_Type, | 
| +                                                           info.fLevelCount); | 
| +    if (!imageView) { | 
| +        GrVkImage::DestroyImageInfo(gpu, &info); | 
| +        return nullptr; | 
| +    } | 
|  | 
| -    return texture; | 
| +    return new GrVkTexture(gpu, budgeted, desc, info, imageView); | 
| } | 
|  | 
| GrVkTexture* GrVkTexture::CreateWrappedTexture(GrVkGpu* gpu, | 
| const GrSurfaceDesc& desc, | 
| GrWrapOwnership ownership, | 
| -                                               VkFormat format, | 
| -                                               const GrVkTextureInfo* info) { | 
| +                                               const GrVkImageInfo* info) { | 
| SkASSERT(info); | 
| // Wrapped textures require both image and allocation (because they can be mapped) | 
| SkASSERT(VK_NULL_HANDLE != info->fImage && VK_NULL_HANDLE != info->fAlloc); | 
|  | 
| -    GrVkImage::Resource::Flags flags = (VK_IMAGE_TILING_LINEAR == info->fImageTiling) | 
| -                                     ? Resource::kLinearTiling_Flag : Resource::kNo_Flags; | 
| - | 
| -    const GrVkImage::Resource* imageResource; | 
| -    if (kBorrow_GrWrapOwnership == ownership) { | 
| -        imageResource = new GrVkImage::BorrowedResource(info->fImage, | 
| -                                                        info->fAlloc, | 
| -                                                        info->fFormat, | 
| -                                                        info->fLevelCount, | 
| -                                                        flags); | 
| -    } else { | 
| -        imageResource = new GrVkImage::Resource(info->fImage, info->fAlloc, info->fFormat, | 
| -                                                info->fLevelCount, flags); | 
| -    } | 
| -    if (!imageResource) { | 
| +    const GrVkImageView* imageView = GrVkImageView::Create(gpu, info->fImage, info->fFormat, | 
| +                                                           GrVkImageView::kColor_Type, | 
| +                                                           info->fLevelCount); | 
| +    if (!imageView) { | 
| return nullptr; | 
| } | 
|  | 
| -    GrVkTexture* texture = Create(gpu, kWrapped, desc, format, imageResource); | 
| -    if (texture) { | 
| -        texture->fCurrentLayout = info->fImageLayout; | 
| -    } | 
| -    // Create() will increment the refCount of the image resource if it succeeds | 
| -    imageResource->unref(gpu); | 
| +    GrVkImage::Wrapped wrapped = kBorrow_GrWrapOwnership == ownership ? GrVkImage::kBorrowed_Wrapped | 
| +                                                                      : GrVkImage::kAdopted_Wrapped; | 
|  | 
| -    return texture; | 
| +    return new GrVkTexture(gpu, kWrapped, desc, *info, imageView, wrapped); | 
| } | 
|  | 
| GrVkTexture::~GrVkTexture() { | 
| @@ -165,8 +137,7 @@ void GrVkTexture::onAbandon() { | 
| } | 
|  | 
| GrBackendObject GrVkTexture::getTextureHandle() const { | 
| -    // Currently just passing back the pointer to the Resource as the handle | 
| -    return (GrBackendObject)&fResource; | 
| +    return (GrBackendObject)&fInfo; | 
| } | 
|  | 
| GrVkGpu* GrVkTexture::getVkGpu() const { | 
| @@ -176,14 +147,14 @@ GrVkGpu* GrVkTexture::getVkGpu() const { | 
|  | 
| const GrVkImageView* GrVkTexture::textureView(bool allowSRGB) { | 
| VkFormat linearFormat; | 
| -    if (allowSRGB || !GrVkFormatIsSRGB(fResource->fFormat, &linearFormat)) { | 
| +    if (allowSRGB || !GrVkFormatIsSRGB(fInfo.fFormat, &linearFormat)) { | 
| return fTextureView; | 
| } | 
|  | 
| if (!fLinearTextureView) { | 
| -        fLinearTextureView = GrVkImageView::Create(this->getVkGpu(), fResource->fImage, | 
| +        fLinearTextureView = GrVkImageView::Create(this->getVkGpu(), fInfo.fImage, | 
| linearFormat, GrVkImageView::kColor_Type, | 
| -                                                   fResource->fLevelCount); | 
| +                                                   fInfo.fLevelCount); | 
| SkASSERT(fLinearTextureView); | 
| } | 
|  | 
| @@ -196,10 +167,10 @@ bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu, uint32_t mipLevels) { | 
| return false; | 
| } | 
|  | 
| -    const GrVkImage::Resource* oldResource = fResource; | 
| +    const GrVkResource* oldResource = this->resource(); | 
|  | 
| // We shouldn't realloc something that doesn't belong to us | 
| -    if (GrVkImage::Resource::kBorrowed_Flag & oldResource->fFlags) { | 
| +    if (fIsBorrowed) { | 
| return false; | 
| } | 
|  | 
| @@ -214,7 +185,7 @@ bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu, uint32_t mipLevels) { | 
|  | 
| GrVkImage::ImageDesc imageDesc; | 
| imageDesc.fImageType = VK_IMAGE_TYPE_2D; | 
| -    imageDesc.fFormat = oldResource->fFormat; | 
| +    imageDesc.fFormat = fInfo.fFormat; | 
| imageDesc.fWidth = fDesc.fWidth; | 
| imageDesc.fHeight = fDesc.fHeight; | 
| imageDesc.fLevels = mipLevels; | 
| @@ -223,18 +194,18 @@ bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu, uint32_t mipLevels) { | 
| imageDesc.fUsageFlags = usageFlags; | 
| imageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; | 
|  | 
| -    const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, imageDesc); | 
| -    if (!imageResource) { | 
| -        return false; | 
| +    GrVkImageInfo info; | 
| +    if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) { | 
| +        return nullptr; | 
| } | 
|  | 
| // have to create a new image view for new resource | 
| const GrVkImageView* oldView = fTextureView; | 
| -    VkImage image = imageResource->fImage; | 
| -    const GrVkImageView* textureView = GrVkImageView::Create(gpu, image, imageResource->fFormat, | 
| +    VkImage image = info.fImage; | 
| +    const GrVkImageView* textureView = GrVkImageView::Create(gpu, image, info.fFormat, | 
| GrVkImageView::kColor_Type, mipLevels); | 
| if (!textureView) { | 
| -        imageResource->unref(gpu); | 
| +        GrVkImage::DestroyImageInfo(gpu, &info); | 
| return false; | 
| } | 
|  | 
| @@ -244,9 +215,10 @@ bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu, uint32_t mipLevels) { | 
| fLinearTextureView->unref(gpu); | 
| fLinearTextureView = nullptr; | 
| } | 
| -    fResource = imageResource; | 
| + | 
| +    this->setNewResource(info.fImage, info.fAlloc); | 
| fTextureView = textureView; | 
| -    fCurrentLayout = VK_IMAGE_LAYOUT_UNDEFINED; | 
| +    fInfo = info; | 
| this->texturePriv().setMaxMipMapLevel(mipLevels); | 
|  | 
| return true; | 
|  |