Index: src/gpu/vk/GrVkTexture.cpp |
diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp |
index 9c68df705affb0d495d4b4e7b1006251ddb00216..91852da0a5834aafa4b41aba494bd264f35193c3 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 @@ GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
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 @@ GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
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 @@ GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
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 @@ template<typename ResourceType> |
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 @@ GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted, |
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 @@ GrVkTexture* GrVkTexture::CreateWrappedTexture(GrVkGpu* gpu, |
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 @@ GrVkGpu* GrVkTexture::getVkGpu() const { |
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 @@ bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu) { |
} |
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; |