| Index: src/gpu/vk/GrVkTextureRenderTarget.cpp
|
| diff --git a/src/gpu/vk/GrVkTextureRenderTarget.cpp b/src/gpu/vk/GrVkTextureRenderTarget.cpp
|
| index c33a6800b837a2647c0c282273ead8b35eb3f351..b92ea661fb3de5ec490919b1224d5dcd4b7dcee1 100644
|
| --- a/src/gpu/vk/GrVkTextureRenderTarget.cpp
|
| +++ b/src/gpu/vk/GrVkTextureRenderTarget.cpp
|
| @@ -18,20 +18,19 @@
|
|
|
| #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
|
|
|
| -template<typename ResourceType>
|
| GrVkTextureRenderTarget* GrVkTextureRenderTarget::Create(GrVkGpu* gpu,
|
| - ResourceType resourceType,
|
| const GrSurfaceDesc& desc,
|
| - VkFormat format,
|
| - const GrVkImage::Resource* imageResource) {
|
| - VkImage image = imageResource->fImage;
|
| + const GrVkImageInfo& info,
|
| + SkBudgeted budgeted,
|
| + GrVkImage::Wrapped wrapped) {
|
| + VkImage image = info.fImage;
|
| // Create the texture ImageView
|
| uint32_t mipLevels = 1;
|
| //TODO: does a mipmapped textureRenderTarget make sense?
|
| //if (desc.fIsMipMapped) {
|
| // mipLevels = SkMipMap::ComputeLevelCount(this->width(), this->height()) + 1;
|
| //}
|
| - const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format,
|
| + const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, info.fFormat,
|
| GrVkImageView::kColor_Type, mipLevels);
|
| if (!imageView) {
|
| return nullptr;
|
| @@ -43,7 +42,7 @@ GrVkTextureRenderTarget* GrVkTextureRenderTarget::Create(GrVkGpu* gpu,
|
| VkImage colorImage;
|
|
|
| // create msaa surface if necessary
|
| - const GrVkImage::Resource* msaaImageResource = nullptr;
|
| + GrVkImageInfo msInfo;
|
| const GrVkImageView* resolveAttachmentView = nullptr;
|
| if (desc.fSampleCnt) {
|
| GrVkImage::ImageDesc msImageDesc;
|
| @@ -57,65 +56,74 @@ GrVkTextureRenderTarget* GrVkTextureRenderTarget::Create(GrVkGpu* gpu,
|
| msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
| msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
|
|
| - msaaImageResource = GrVkImage::CreateResource(gpu, msImageDesc);
|
| -
|
| - if (!msaaImageResource) {
|
| - imageView->unref(gpu);
|
| + if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &msInfo)) {
|
| return nullptr;
|
| }
|
|
|
| // Set color attachment image
|
| - colorImage = msaaImageResource->fImage;
|
| + colorImage = msInfo.fImage;
|
|
|
| // Create resolve attachment view if necessary.
|
| // If the format matches, this is the same as the texture imageView.
|
| - if (pixelFormat == format) {
|
| + if (pixelFormat == info.fFormat) {
|
| resolveAttachmentView = imageView;
|
| resolveAttachmentView->ref();
|
| } else {
|
| resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelFormat,
|
| GrVkImageView::kColor_Type, 1);
|
| if (!resolveAttachmentView) {
|
| - msaaImageResource->unref(gpu);
|
| + GrVkImage::DestroyImageInfo(gpu, &msInfo);
|
| imageView->unref(gpu);
|
| return nullptr;
|
| }
|
| }
|
| } else {
|
| // Set color attachment image
|
| - colorImage = imageResource->fImage;
|
| + colorImage = info.fImage;
|
| }
|
|
|
| const GrVkImageView* colorAttachmentView;
|
| // Get color attachment view.
|
| // If the format matches and there's no multisampling,
|
| // this is the same as the texture imageView
|
| - if (pixelFormat == format && !resolveAttachmentView) {
|
| + if (pixelFormat == info.fFormat && !resolveAttachmentView) {
|
| colorAttachmentView = imageView;
|
| colorAttachmentView->ref();
|
| } else {
|
| colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
|
| GrVkImageView::kColor_Type, 1);
|
| if (!colorAttachmentView) {
|
| - if (msaaImageResource) {
|
| + if (desc.fSampleCnt) {
|
| resolveAttachmentView->unref(gpu);
|
| - msaaImageResource->unref(gpu);
|
| + GrVkImage::DestroyImageInfo(gpu, &msInfo);
|
| }
|
| imageView->unref(gpu);
|
| return nullptr;
|
| }
|
| }
|
| GrVkTextureRenderTarget* texRT;
|
| - if (msaaImageResource) {
|
| - texRT = new GrVkTextureRenderTarget(gpu, resourceType, desc,
|
| - imageResource, imageView, msaaImageResource,
|
| - colorAttachmentView,
|
| - resolveAttachmentView);
|
| - msaaImageResource->unref(gpu);
|
| + if (desc.fSampleCnt) {
|
| + if (GrVkImage::kNot_Wrapped == wrapped) {
|
| + texRT = new GrVkTextureRenderTarget(gpu, budgeted, desc,
|
| + info, imageView, msInfo,
|
| + colorAttachmentView,
|
| + resolveAttachmentView);
|
| + } else {
|
| + texRT = new GrVkTextureRenderTarget(gpu, desc,
|
| + info, imageView, msInfo,
|
| + colorAttachmentView,
|
| + resolveAttachmentView, wrapped);
|
| + }
|
| } else {
|
| - texRT = new GrVkTextureRenderTarget(gpu, resourceType, desc,
|
| - imageResource, imageView,
|
| - colorAttachmentView);
|
| + if (GrVkImage::kNot_Wrapped == wrapped) {
|
| + texRT = new GrVkTextureRenderTarget(gpu, budgeted, desc,
|
| + info, imageView,
|
| + colorAttachmentView);
|
| + } else {
|
| + texRT = new GrVkTextureRenderTarget(gpu, desc,
|
| + info, imageView,
|
| + colorAttachmentView, wrapped);
|
| + }
|
| }
|
| return texRT;
|
| }
|
| @@ -128,16 +136,15 @@ GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu,
|
| SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
|
| SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
|
|
|
| - const GrVkImage::Resource* imageRsrc = GrVkImage::CreateResource(gpu, imageDesc);
|
| -
|
| - if (!imageRsrc) {
|
| + GrVkImageInfo info;
|
| + if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
|
| return nullptr;
|
| }
|
|
|
| - GrVkTextureRenderTarget* trt = Create(gpu, budgeted, desc, imageDesc.fFormat,
|
| - imageRsrc);
|
| - // Create() will increment the refCount of the image resource if it succeeds
|
| - imageRsrc->unref(gpu);
|
| + GrVkTextureRenderTarget* trt = Create(gpu, desc, info, budgeted, GrVkImage::kNot_Wrapped);
|
| + if (!trt) {
|
| + GrVkImage::DestroyImageInfo(gpu, &info);
|
| + }
|
|
|
| return trt;
|
| }
|
| @@ -146,35 +153,16 @@ GrVkTextureRenderTarget*
|
| GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(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;
|
| +
|
| + GrVkImage::Wrapped wrapped = kBorrow_GrWrapOwnership == ownership ? GrVkImage::kBorrowed_Wrapped
|
| + : GrVkImage::kAdopted_Wrapped;
|
|
|
| - 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;
|
| - }
|
| - GrVkTextureRenderTarget* trt = Create(gpu, kWrapped, desc, format, imageResource);
|
| - if (trt) {
|
| - trt->fCurrentLayout = info->fImageLayout;
|
| - }
|
| - // Create() will increment the refCount of the image resource if it succeeds
|
| - imageResource->unref(gpu);
|
| + GrVkTextureRenderTarget* trt = Create(gpu, desc, *info, SkBudgeted::kNo, wrapped);
|
|
|
| return trt;
|
| }
|
|
|