Index: src/gpu/vk/GrVkTexture.cpp |
diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp |
index 8278d2743748a80028aa171bf6ededb7efe47421..c61ce8fda9edc6987a2ca40756879bf039999f9f 100644 |
--- a/src/gpu/vk/GrVkTexture.cpp |
+++ b/src/gpu/vk/GrVkTexture.cpp |
@@ -19,10 +19,11 @@ |
GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
SkBudgeted budgeted, |
const GrSurfaceDesc& desc, |
- const GrVkImage::Resource* imageResource, |
- const GrVkImageView* view) |
+ const GrVkImageInfo& info, |
+ const GrVkImageView* view, |
+ bool /*isBorrowed*/) |
bsalomon
2016/05/13 13:25:48
unused constructor param?
egdaniel
2016/05/13 13:29:59
it is so this ctor and the next one can both be ca
egdaniel
2016/05/13 15:06:53
Done.
|
: GrSurface(gpu, desc) |
- , GrVkImage(imageResource) |
+ , GrVkImage(info, false) |
, INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) |
, fTextureView(view) { |
this->registerWithCache(budgeted); |
@@ -31,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, |
+ bool isBorrowed) |
: GrSurface(gpu, desc) |
- , GrVkImage(imageResource) |
+ , GrVkImage(info, isBorrowed) |
, INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) |
, fTextureView(view) { |
this->registerWithCacheWrapped(); |
@@ -43,10 +45,11 @@ 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, |
+ bool isWrapped) |
: GrSurface(gpu, desc) |
- , GrVkImage(imageResource) |
+ , GrVkImage(info, isWrapped) |
, INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) |
, fTextureView(view) {} |
@@ -55,18 +58,18 @@ template<typename ResourceType> |
GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu, |
ResourceType type, |
const GrSurfaceDesc& desc, |
- VkFormat format, |
- const GrVkImage::Resource* imageResource) { |
- VkImage image = imageResource->fImage; |
+ const GrVkImageInfo& info, |
+ bool isBorrowed) { |
+ VkImage image = info.fImage; |
- const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format, |
+ const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, info.fFormat, |
GrVkImageView::kColor_Type, |
- imageResource->fLevelCount); |
+ info.fLevelCount); |
if (!imageView) { |
return nullptr; |
} |
- return new GrVkTexture(gpu, type, desc, imageResource, imageView); |
+ return new GrVkTexture(gpu, type, desc, info, imageView, isBorrowed); |
} |
GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted, |
@@ -74,14 +77,16 @@ 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::GetImageInfo(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); |
+ GrVkTexture* texture = Create(gpu, budgeted, desc, info, false); |
+ if (!texture) { |
+ VK_CALL(gpu, DestroyImage(gpu->device(), info.fImage, nullptr)); |
+ VK_CALL(gpu, FreeMemory(gpu->device(), info.fAlloc, nullptr)); |
+ } |
return texture; |
} |
@@ -89,36 +94,13 @@ GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted, |
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) { |
- 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); |
+ GrVkTexture* texture = Create(gpu, kWrapped, desc, *info, |
+ kBorrow_GrWrapOwnership == ownership); |
return texture; |
} |
@@ -152,7 +134,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 { |
@@ -166,10 +148,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; |
} |
@@ -184,7 +166,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; |
@@ -193,26 +175,27 @@ 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::GetImageInfo(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); |
+ VK_CALL(gpu, DestroyImage(gpu->device(), info.fImage, nullptr)); |
+ VK_CALL(gpu, FreeMemory(gpu->device(), info.fAlloc, nullptr)); |
return false; |
} |
oldResource->unref(gpu); |
oldView->unref(gpu); |
- fResource = imageResource; |
+ this->setNewResource(info.fImage, info.fAlloc); |
fTextureView = textureView; |
- fCurrentLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
+ fInfo = info; |
this->texturePriv().setMaxMipMapLevel(mipLevels); |
return true; |