| Index: src/gpu/vk/GrVkRenderTarget.cpp
|
| diff --git a/src/gpu/vk/GrVkRenderTarget.cpp b/src/gpu/vk/GrVkRenderTarget.cpp
|
| index 70b73a758a2f7589ddaeb896b4593bc8f2fabe9c..277448001e51c7930370088b13b1e8c015d62164 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,
|
| + GrVkImage::Wrapped wrapped)
|
| : GrSurface(gpu, desc)
|
| - , GrVkImage(imageResource)
|
| + , GrVkImage(info, wrapped)
|
| // 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, GrVkImage::kNot_Wrapped))
|
| , 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,
|
| + GrVkImage::Wrapped wrapped)
|
| : GrSurface(gpu, desc)
|
| - , GrVkImage(imageResource)
|
| + , GrVkImage(info, wrapped)
|
| // 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, GrVkImage::kNot_Wrapped))
|
| , 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,
|
| + GrVkImage::Wrapped wrapped)
|
| : GrSurface(gpu, desc)
|
| - , GrVkImage(imageResource)
|
| + , GrVkImage(info, wrapped)
|
| , 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,
|
| + GrVkImage::Wrapped wrapped)
|
| : GrSurface(gpu, desc)
|
| - , GrVkImage(imageResource)
|
| + , GrVkImage(info, wrapped)
|
| , 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,
|
| + GrVkImage::Wrapped wrapped) {
|
| 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,42 @@ 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::InitImageInfo(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);
|
| + GrVkImage::DestroyImageInfo(gpu, &msInfo);
|
| 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);
|
| + GrVkImage::DestroyImageInfo(gpu, &msInfo);
|
| }
|
| - 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, wrapped);
|
| } else {
|
| - texRT = new GrVkRenderTarget(gpu, budgeted, desc, imageResource,
|
| - colorAttachmentView);
|
| + texRT = new GrVkRenderTarget(gpu, budgeted, desc, info, colorAttachmentView, wrapped);
|
| }
|
|
|
| return texRT;
|
| @@ -186,14 +185,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::InitImageInfo(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,
|
| + GrVkImage::kNot_Wrapped);
|
| + if (!rt) {
|
| + GrVkImage::DestroyImageInfo(gpu, &info);
|
| + }
|
| return rt;
|
| }
|
|
|
| @@ -201,36 +202,16 @@ 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;
|
| + 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;
|
| - }
|
| -
|
| - 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, wrapped);
|
|
|
| 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);
|
|
|