Chromium Code Reviews| Index: src/gpu/vk/GrVkRenderTarget.cpp |
| diff --git a/src/gpu/vk/GrVkRenderTarget.cpp b/src/gpu/vk/GrVkRenderTarget.cpp |
| index 70b73a758a2f7589ddaeb896b4593bc8f2fabe9c..70d3054cddc0056e3906a1f4534f9a8a1281c72b 100644 |
| --- a/src/gpu/vk/GrVkRenderTarget.cpp |
| +++ b/src/gpu/vk/GrVkRenderTarget.cpp |
| @@ -24,17 +24,18 @@ |
| GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| SkBudgeted budgeted, |
| const GrSurfaceDesc& desc, |
| - const GrVkImage::Resource* imageResource, |
| - const GrVkImage::Resource* msaaResource, |
| + const GrVkImageInfo& info, |
| + const GrVkImageInfo& msaaInfo, |
| const GrVkImageView* colorAttachmentView, |
| - const GrVkImageView* resolveAttachmentView) |
| + const GrVkImageView* resolveAttachmentView, |
| + bool isBorrowed) |
| : GrSurface(gpu, desc) |
| - , GrVkImage(imageResource) |
| + , GrVkImage(info, isBorrowed) |
| // for the moment we only support 1:1 color to stencil |
| , GrRenderTarget(gpu, desc, kUnified_SampleConfig) |
| , fFramebuffer(nullptr) |
| , fColorAttachmentView(colorAttachmentView) |
| - , fMSAAImageResource(msaaResource) |
| + , fMSAAImage(new GrVkImage(info, false)) |
| , fResolveAttachmentView(resolveAttachmentView) |
| , fCachedSimpleRenderPass(nullptr) { |
| SkASSERT(desc.fSampleCnt); |
| @@ -42,31 +43,30 @@ GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| fColorValuesPerPixel = desc.fSampleCnt + 1; // TODO: this still correct? |
| this->createFramebuffer(gpu); |
| this->registerWithCache(budgeted); |
| - msaaResource->ref(); |
| } |
| // We're virtually derived from GrSurface (via GrRenderTarget) so its |
| // constructor must be explicitly called. |
| GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| const GrSurfaceDesc& desc, |
| - const GrVkImage::Resource* imageResource, |
| - const GrVkImage::Resource* msaaResource, |
| + const GrVkImageInfo& info, |
| + const GrVkImageInfo& msaaInfo, |
| const GrVkImageView* colorAttachmentView, |
| - const GrVkImageView* resolveAttachmentView) |
| + const GrVkImageView* resolveAttachmentView, |
| + bool isBorrowed) |
| : GrSurface(gpu, desc) |
| - , GrVkImage(imageResource) |
| + , GrVkImage(info, isBorrowed) |
| // for the moment we only support 1:1 color to stencil |
| , GrRenderTarget(gpu, desc, kUnified_SampleConfig) |
| , fFramebuffer(nullptr) |
| , fColorAttachmentView(colorAttachmentView) |
| - , fMSAAImageResource(msaaResource) |
| + , fMSAAImage(new GrVkImage(info, false)) |
| , fResolveAttachmentView(resolveAttachmentView) |
| , fCachedSimpleRenderPass(nullptr) { |
| SkASSERT(desc.fSampleCnt); |
| // The plus 1 is to account for the resolve texture. |
| fColorValuesPerPixel = desc.fSampleCnt + 1; // TODO: this still correct? |
| this->createFramebuffer(gpu); |
| - msaaResource->ref(); |
| } |
| // We're virtually derived from GrSurface (via GrRenderTarget) so its |
| @@ -74,14 +74,15 @@ GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| SkBudgeted budgeted, |
| const GrSurfaceDesc& desc, |
| - const GrVkImage::Resource* imageResource, |
| - const GrVkImageView* colorAttachmentView) |
| + const GrVkImageInfo& info, |
| + const GrVkImageView* colorAttachmentView, |
| + bool isBorrowed) |
| : GrSurface(gpu, desc) |
| - , GrVkImage(imageResource) |
| + , GrVkImage(info, isBorrowed) |
| , GrRenderTarget(gpu, desc, kUnified_SampleConfig) |
| , fFramebuffer(nullptr) |
| , fColorAttachmentView(colorAttachmentView) |
| - , fMSAAImageResource(nullptr) |
| + , fMSAAImage(nullptr) |
| , fResolveAttachmentView(nullptr) |
| , fCachedSimpleRenderPass(nullptr) { |
| SkASSERT(!desc.fSampleCnt); |
| @@ -94,14 +95,15 @@ GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| // constructor must be explicitly called. |
| GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| const GrSurfaceDesc& desc, |
| - const GrVkImage::Resource* imageResource, |
| - const GrVkImageView* colorAttachmentView) |
| + const GrVkImageInfo& info, |
| + const GrVkImageView* colorAttachmentView, |
| + bool isBorrowed) |
| : GrSurface(gpu, desc) |
| - , GrVkImage(imageResource) |
| + , GrVkImage(info, isBorrowed) |
| , GrRenderTarget(gpu, desc, kUnified_SampleConfig) |
| , fFramebuffer(nullptr) |
| , fColorAttachmentView(colorAttachmentView) |
| - , fMSAAImageResource(nullptr) |
| + , fMSAAImage(nullptr) |
| , fResolveAttachmentView(nullptr) |
| , fCachedSimpleRenderPass(nullptr) { |
| SkASSERT(!desc.fSampleCnt); |
| @@ -113,14 +115,15 @@ GrVkRenderTarget* |
| GrVkRenderTarget::Create(GrVkGpu* gpu, |
| SkBudgeted budgeted, |
| const GrSurfaceDesc& desc, |
| - const GrVkImage::Resource* imageResource) { |
| + const GrVkImageInfo& info, |
| + bool isBorrowed) { |
| VkFormat pixelFormat; |
| GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat); |
| VkImage colorImage; |
| // create msaa surface if necessary |
| - const GrVkImage::Resource* msaaResource = nullptr; |
| + GrVkImageInfo msInfo; |
| const GrVkImageView* resolveAttachmentView = nullptr; |
| if (desc.fSampleCnt) { |
| GrVkImage::ImageDesc msImageDesc; |
| @@ -134,46 +137,44 @@ GrVkRenderTarget::Create(GrVkGpu* gpu, |
| msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; |
| msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; |
| - msaaResource = GrVkImage::CreateResource(gpu, msImageDesc); |
| - |
| - if (!msaaResource) { |
| + if (!GrVkImage::GetImageInfo(gpu, msImageDesc, &msInfo)) { |
| return nullptr; |
| } |
| // Set color attachment image |
| - colorImage = msaaResource->fImage; |
| + colorImage = msInfo.fImage; |
| // Create Resolve attachment view |
| - resolveAttachmentView = GrVkImageView::Create(gpu, imageResource->fImage, pixelFormat, |
| + resolveAttachmentView = GrVkImageView::Create(gpu, info.fImage, pixelFormat, |
| GrVkImageView::kColor_Type, 1); |
| if (!resolveAttachmentView) { |
| - msaaResource->unref(gpu); |
| + VK_CALL(gpu, DestroyImage(gpu->device(), msInfo.fImage, nullptr)); |
| + VK_CALL(gpu, FreeMemory(gpu->device(), msInfo.fAlloc, nullptr)); |
| return nullptr; |
| } |
| } else { |
| // Set color attachment image |
| - colorImage = imageResource->fImage; |
| + colorImage = info.fImage; |
| } |
| // Get color attachment view |
| const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat, |
| GrVkImageView::kColor_Type, 1); |
| if (!colorAttachmentView) { |
| - if (msaaResource) { |
| + if (desc.fSampleCnt) { |
| resolveAttachmentView->unref(gpu); |
| - msaaResource->unref(gpu); |
| + VK_CALL(gpu, DestroyImage(gpu->device(), msInfo.fImage, nullptr)); |
| + VK_CALL(gpu, FreeMemory(gpu->device(), msInfo.fAlloc, nullptr)); |
| } |
| - return NULL; |
| + return nullptr; |
| } |
| GrVkRenderTarget* texRT; |
| - if (msaaResource) { |
| - texRT = new GrVkRenderTarget(gpu, budgeted, desc, imageResource, msaaResource, |
| - colorAttachmentView, resolveAttachmentView); |
| - msaaResource->unref(gpu); |
| + if (desc.fSampleCnt) { |
| + texRT = new GrVkRenderTarget(gpu, budgeted, desc, info, msInfo, |
| + colorAttachmentView, resolveAttachmentView, isBorrowed); |
| } else { |
| - texRT = new GrVkRenderTarget(gpu, budgeted, desc, imageResource, |
| - colorAttachmentView); |
| + texRT = new GrVkRenderTarget(gpu, budgeted, desc, info, colorAttachmentView, isBorrowed); |
| } |
| return texRT; |
| @@ -186,14 +187,16 @@ GrVkRenderTarget::CreateNewRenderTarget(GrVkGpu* gpu, |
| const GrVkImage::ImageDesc& imageDesc) { |
| SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
| - const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, imageDesc); |
| - if (!imageResource) { |
| + GrVkImageInfo info; |
| + if (!GrVkImage::GetImageInfo(gpu, imageDesc, &info)) { |
| return nullptr; |
| } |
| - GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, budgeted, desc, imageResource); |
| - // Create() will increment the refCount of the image resource if it succeeds |
| - imageResource->unref(gpu); |
| + GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, budgeted, desc, info, false); |
| + if (!rt) { |
| + VK_CALL(gpu, DestroyImage(gpu->device(), info.fImage, nullptr)); |
|
jvanverth1
2016/05/13 16:14:40
This pattern is repeated in a number of places. Mi
egdaniel
2016/05/13 18:00:05
Done.
|
| + VK_CALL(gpu, FreeMemory(gpu->device(), info.fAlloc, nullptr)); |
| + } |
| return rt; |
| } |
| @@ -201,36 +204,14 @@ GrVkRenderTarget* |
| GrVkRenderTarget::CreateWrappedRenderTarget(GrVkGpu* gpu, |
| const GrSurfaceDesc& desc, |
| GrWrapOwnership ownership, |
| - const GrVkTextureInfo* info) { |
| + const GrVkImageInfo* info) { |
| SkASSERT(info); |
| // We can wrap a rendertarget without its allocation, as long as we don't take ownership |
| SkASSERT(VK_NULL_HANDLE != info->fImage); |
| SkASSERT(VK_NULL_HANDLE != info->fAlloc || kAdopt_GrWrapOwnership != ownership); |
| - 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; |
| - } |
| - |
| - GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, SkBudgeted::kNo, desc, imageResource); |
| - if (rt) { |
| - rt->fCurrentLayout = info->fImageLayout; |
| - } |
| - // Create() will increment the refCount of the image resource if it succeeds |
| - imageResource->unref(gpu); |
| + GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, SkBudgeted::kNo, desc, *info, |
| + kBorrow_GrWrapOwnership == ownership); |
| return rt; |
| } |
| @@ -292,7 +273,7 @@ void GrVkRenderTarget::getAttachmentsDescriptor( |
| GrVkRenderTarget::~GrVkRenderTarget() { |
| // either release or abandon should have been called by the owner of this object. |
| - SkASSERT(!fMSAAImageResource); |
| + SkASSERT(!fMSAAImage); |
| SkASSERT(!fResolveAttachmentView); |
| SkASSERT(!fColorAttachmentView); |
| SkASSERT(!fFramebuffer); |
| @@ -316,9 +297,9 @@ void GrVkRenderTarget::addResources(GrVkCommandBuffer& commandBuffer) const { |
| void GrVkRenderTarget::releaseInternalObjects() { |
| GrVkGpu* gpu = this->getVkGpu(); |
| - if (fMSAAImageResource) { |
| - fMSAAImageResource->unref(gpu); |
| - fMSAAImageResource = nullptr; |
| + if (fMSAAImage) { |
| + fMSAAImage->releaseImage(gpu); |
| + fMSAAImage = nullptr; |
| } |
| if (fResolveAttachmentView) { |
| @@ -340,9 +321,9 @@ void GrVkRenderTarget::releaseInternalObjects() { |
| } |
| void GrVkRenderTarget::abandonInternalObjects() { |
| - if (fMSAAImageResource) { |
| - fMSAAImageResource->unrefAndAbandon(); |
| - fMSAAImageResource = nullptr; |
| + if (fMSAAImage) { |
| + fMSAAImage->abandonImage(); |
| + fMSAAImage = nullptr; |
| } |
| if (fResolveAttachmentView) { |
| @@ -381,7 +362,7 @@ GrBackendObject GrVkRenderTarget::getRenderTargetHandle() const { |
| return (GrBackendObject)&fResource; |
| } |
| -const GrVkImage::Resource* GrVkRenderTarget::stencilImageResource() const { |
| +const GrVkResource* GrVkRenderTarget::stencilImageResource() const { |
| const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment(); |
| if (stencil) { |
| const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil); |