| Index: src/gpu/vk/GrVkTexture.cpp
|
| diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp
|
| index c2a30a27f4184bb00317c963bcb776a51a85bd7c..fef6b7292847045ce69267a085021a54d4df8536 100644
|
| --- a/src/gpu/vk/GrVkTexture.cpp
|
| +++ b/src/gpu/vk/GrVkTexture.cpp
|
| @@ -19,10 +19,10 @@
|
| GrVkTexture::GrVkTexture(GrVkGpu* gpu,
|
| SkBudgeted budgeted,
|
| const GrSurfaceDesc& desc,
|
| - const GrVkImage::Resource* imageResource,
|
| + const GrVkImageInfo& info,
|
| const GrVkImageView* view)
|
| : GrSurface(gpu, desc)
|
| - , GrVkImage(imageResource)
|
| + , GrVkImage(info, GrVkImage::kNot_Wrapped)
|
| , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped)
|
| , fTextureView(view)
|
| , fLinearTextureView(nullptr) {
|
| @@ -32,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,
|
| + GrVkImage::Wrapped wrapped)
|
| : GrSurface(gpu, desc)
|
| - , GrVkImage(imageResource)
|
| + , GrVkImage(info, wrapped)
|
| , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped)
|
| , fTextureView(view)
|
| , fLinearTextureView(nullptr) {
|
| @@ -45,31 +46,14 @@ 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,
|
| + GrVkImage::Wrapped wrapped)
|
| : GrSurface(gpu, desc)
|
| - , GrVkImage(imageResource)
|
| + , GrVkImage(info, wrapped)
|
| , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped)
|
| , fTextureView(view)
|
| - , fLinearTextureView(nullptr) {}
|
| -
|
| -
|
| -template<typename ResourceType>
|
| -GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu,
|
| - ResourceType type,
|
| - const GrSurfaceDesc& desc,
|
| - VkFormat format,
|
| - const GrVkImage::Resource* imageResource) {
|
| - VkImage image = imageResource->fImage;
|
| -
|
| - const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format,
|
| - GrVkImageView::kColor_Type,
|
| - imageResource->fLevelCount);
|
| - if (!imageView) {
|
| - return nullptr;
|
| - }
|
| -
|
| - return new GrVkTexture(gpu, type, desc, imageResource, imageView);
|
| + , fLinearTextureView(nullptr) {
|
| }
|
|
|
| GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted,
|
| @@ -77,53 +61,41 @@ 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::InitImageInfo(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);
|
| + const GrVkImageView* imageView = GrVkImageView::Create(gpu, info.fImage, info.fFormat,
|
| + GrVkImageView::kColor_Type,
|
| + info.fLevelCount);
|
| + if (!imageView) {
|
| + GrVkImage::DestroyImageInfo(gpu, &info);
|
| + return nullptr;
|
| + }
|
|
|
| - return texture;
|
| + return new GrVkTexture(gpu, budgeted, desc, info, imageView);
|
| }
|
|
|
| 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) {
|
| + const GrVkImageView* imageView = GrVkImageView::Create(gpu, info->fImage, info->fFormat,
|
| + GrVkImageView::kColor_Type,
|
| + info->fLevelCount);
|
| + if (!imageView) {
|
| 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);
|
| + GrVkImage::Wrapped wrapped = kBorrow_GrWrapOwnership == ownership ? GrVkImage::kBorrowed_Wrapped
|
| + : GrVkImage::kAdopted_Wrapped;
|
|
|
| - return texture;
|
| + return new GrVkTexture(gpu, kWrapped, desc, *info, imageView, wrapped);
|
| }
|
|
|
| GrVkTexture::~GrVkTexture() {
|
| @@ -165,8 +137,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 {
|
| @@ -176,14 +147,14 @@ GrVkGpu* GrVkTexture::getVkGpu() const {
|
|
|
| const GrVkImageView* GrVkTexture::textureView(bool allowSRGB) {
|
| VkFormat linearFormat;
|
| - if (allowSRGB || !GrVkFormatIsSRGB(fResource->fFormat, &linearFormat)) {
|
| + if (allowSRGB || !GrVkFormatIsSRGB(fInfo.fFormat, &linearFormat)) {
|
| return fTextureView;
|
| }
|
|
|
| if (!fLinearTextureView) {
|
| - fLinearTextureView = GrVkImageView::Create(this->getVkGpu(), fResource->fImage,
|
| + fLinearTextureView = GrVkImageView::Create(this->getVkGpu(), fInfo.fImage,
|
| linearFormat, GrVkImageView::kColor_Type,
|
| - fResource->fLevelCount);
|
| + fInfo.fLevelCount);
|
| SkASSERT(fLinearTextureView);
|
| }
|
|
|
| @@ -196,10 +167,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;
|
| }
|
|
|
| @@ -214,7 +185,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;
|
| @@ -223,18 +194,18 @@ 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::InitImageInfo(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);
|
| + GrVkImage::DestroyImageInfo(gpu, &info);
|
| return false;
|
| }
|
|
|
| @@ -244,9 +215,10 @@ bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu, uint32_t mipLevels) {
|
| fLinearTextureView->unref(gpu);
|
| fLinearTextureView = nullptr;
|
| }
|
| - fResource = imageResource;
|
| +
|
| + this->setNewResource(info.fImage, info.fAlloc);
|
| fTextureView = textureView;
|
| - fCurrentLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
| + fInfo = info;
|
| this->texturePriv().setMaxMipMapLevel(mipLevels);
|
|
|
| return true;
|
|
|