Chromium Code Reviews| 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; |