Index: src/gpu/vk/GrVkTexture.cpp |
diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp |
index 9c68df705affb0d495d4b4e7b1006251ddb00216..9c4a36240899f198995762732efb2c58b38baa8e 100644 |
--- a/src/gpu/vk/GrVkTexture.cpp |
+++ b/src/gpu/vk/GrVkTexture.cpp |
@@ -24,8 +24,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 +36,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 +48,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 +56,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 +80,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 +113,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; |
} |
@@ -169,6 +164,11 @@ GrVkGpu* GrVkTexture::getVkGpu() const { |
bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu) { |
const GrVkImage::Resource* oldResource = fResource; |
+ // We shouldn't realloc something that doesn't belong to us |
+ if (GrBackendObjectOwnership::kBorrowed == oldResource->fOwnership) { |
+ return false; |
+ } |
+ |
// Does this even make sense for rendertargets? |
bool renderTarget = SkToBool(fDesc.fFlags & kRenderTarget_GrSurfaceFlag); |