Add mipmap loading to Vulkan.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1925303002

Review-Url: https://codereview.chromium.org/1925303002
diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp
index 9c68df7..91852da 100644
--- a/src/gpu/vk/GrVkTexture.cpp
+++ b/src/gpu/vk/GrVkTexture.cpp
@@ -10,7 +10,6 @@
 #include "GrVkImageView.h"
 #include "GrTexturePriv.h"
 #include "GrVkUtil.h"
-#include "SkMipMap.h"
 
 #include "vk/GrVkTypes.h"
 
@@ -24,8 +23,7 @@
                          const GrVkImageView* view)
     : GrSurface(gpu, desc)
     , GrVkImage(imageResource)
-    , INHERITED(gpu, desc, kSampler2D_GrSLType,
-                false) // false because we don't upload MIP data in Vk yet
+    , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) 
     , fTextureView(view) {
     this->registerWithCache(budgeted);
 }
@@ -37,8 +35,7 @@
                          const GrVkImageView* view)
     : GrSurface(gpu, desc)
     , GrVkImage(imageResource)
-    , INHERITED(gpu, desc, kSampler2D_GrSLType,
-                false) // false because we don't upload MIP data in Vk yet
+    , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped)
     , fTextureView(view) {
     this->registerWithCacheWrapped();
 }
@@ -50,8 +47,7 @@
                          const GrVkImageView* view)
     : GrSurface(gpu, desc)
     , GrVkImage(imageResource)
-    , INHERITED(gpu, desc, kSampler2D_GrSLType,
-                false) // false because we don't upload MIP data in Vk yet
+    , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped)
     , fTextureView(view) {}
 
 
@@ -59,17 +55,13 @@
 GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu,
                                  ResourceType type,
                                  const GrSurfaceDesc& desc,
-                                 VkFormat format,
+                                 VkFormat format, uint32_t levels, 
                                  const GrVkImage::Resource* imageResource) {
     VkImage image = imageResource->fImage;
 
-    uint32_t mipLevels = 1;
-    // TODO: enable when mipLevel loading is implemented in GrVkGpu
-    //if (desc.fIsMipMapped) {
-    //    mipLevels = SkMipMap::ComputeLevelCount(this->width(), this->height());
-    //}
     const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format,
-                                                           GrVkImageView::kColor_Type, mipLevels);
+                                                           GrVkImageView::kColor_Type, 
+                                                           levels);
     if (!imageView) {
         return nullptr;
     }
@@ -87,7 +79,8 @@
         return nullptr;
     }
 
-    GrVkTexture* texture = Create(gpu, budgeted, desc, imageDesc.fFormat, imageResource);
+    GrVkTexture* texture = Create(gpu, budgeted, desc, imageDesc.fFormat, imageDesc.fLevels,
+                                  imageResource);
     // Create() will increment the refCount of the image resource if it succeeds
     imageResource->unref(gpu);
 
@@ -119,7 +112,8 @@
         return nullptr;
     }
 
-    GrVkTexture* texture = Create(gpu, kWrapped, desc, format, imageResource);
+    // We have no other information so we have to assume that wrapped textures have only one level
+    GrVkTexture* texture = Create(gpu, kWrapped, desc, format, 1, imageResource);
     if (texture) {
         texture->fCurrentLayout = info->fImageLayout;
     }
@@ -166,9 +160,19 @@
     return static_cast<GrVkGpu*>(this->getGpu());
 }
 
-bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu) {
+bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu, uint32_t mipLevels) {
+    if (mipLevels == 1) {
+        // don't need to do anything for a 1x1 texture
+        return false;
+    }
+
     const GrVkImage::Resource* oldResource = fResource;
 
+    // We shouldn't realloc something that doesn't belong to us
+    if (GrVkImage::Resource::kBorrowed_Flag & oldResource->fFlags) {
+        return false;
+    }
+
     // Does this even make sense for rendertargets?
     bool renderTarget = SkToBool(fDesc.fFlags & kRenderTarget_GrSurfaceFlag);
 
@@ -178,12 +182,6 @@
     }
     usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
 
-    uint32_t mipLevels = SkMipMap::ComputeLevelCount(this->width(), this->height());
-    if (mipLevels == 1) {
-        // don't need to do anything for a 1x1 texture
-        return false;
-    }
-
     GrVkImage::ImageDesc imageDesc;
     imageDesc.fImageType = VK_IMAGE_TYPE_2D;
     imageDesc.fFormat = oldResource->fFormat;