| Index: src/gpu/vk/GrVkRenderTarget.cpp
|
| diff --git a/src/gpu/vk/GrVkRenderTarget.cpp b/src/gpu/vk/GrVkRenderTarget.cpp
|
| deleted file mode 100644
|
| index 87f1f77e392fb3832cc30556349e8e1fa8e8dd1c..0000000000000000000000000000000000000000
|
| --- a/src/gpu/vk/GrVkRenderTarget.cpp
|
| +++ /dev/null
|
| @@ -1,391 +0,0 @@
|
| -/*
|
| - * Copyright 2015 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#include "GrVkRenderTarget.h"
|
| -
|
| -#include "GrRenderTargetPriv.h"
|
| -#include "GrVkCommandBuffer.h"
|
| -#include "GrVkFramebuffer.h"
|
| -#include "GrVkGpu.h"
|
| -#include "GrVkImageView.h"
|
| -#include "GrVkResourceProvider.h"
|
| -#include "GrVkUtil.h"
|
| -
|
| -#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
|
| -
|
| -// We're virtually derived from GrSurface (via GrRenderTarget) so its
|
| -// constructor must be explicitly called.
|
| -GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
|
| - const GrSurfaceDesc& desc,
|
| - GrGpuResource::LifeCycle lifeCycle,
|
| - const GrVkImage::Resource* imageResource,
|
| - const GrVkImage::Resource* msaaResource,
|
| - const GrVkImageView* colorAttachmentView,
|
| - const GrVkImageView* resolveAttachmentView)
|
| - : GrSurface(gpu, lifeCycle, desc)
|
| - , GrVkImage(imageResource)
|
| - // for the moment we only support 1:1 color to stencil
|
| - , GrRenderTarget(gpu, lifeCycle, desc, kUnified_SampleConfig)
|
| - , fFramebuffer(nullptr)
|
| - , fColorAttachmentView(colorAttachmentView)
|
| - , fMSAAImageResource(msaaResource)
|
| - , 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);
|
| - this->registerWithCache();
|
| - msaaResource->ref();
|
| -}
|
| -
|
| -// We're virtually derived from GrSurface (via GrRenderTarget) so its
|
| -// constructor must be explicitly called.
|
| -GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
|
| - const GrSurfaceDesc& desc,
|
| - GrGpuResource::LifeCycle lifeCycle,
|
| - const GrVkImage::Resource* imageResource,
|
| - const GrVkImage::Resource* msaaResource,
|
| - const GrVkImageView* colorAttachmentView,
|
| - const GrVkImageView* resolveAttachmentView,
|
| - Derived)
|
| - : GrSurface(gpu, lifeCycle, desc)
|
| - , GrVkImage(imageResource)
|
| - // for the moment we only support 1:1 color to stencil
|
| - , GrRenderTarget(gpu, lifeCycle, desc, kUnified_SampleConfig)
|
| - , fFramebuffer(nullptr)
|
| - , fColorAttachmentView(colorAttachmentView)
|
| - , fMSAAImageResource(msaaResource)
|
| - , 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
|
| -// constructor must be explicitly called.
|
| -GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
|
| - const GrSurfaceDesc& desc,
|
| - GrGpuResource::LifeCycle lifeCycle,
|
| - const GrVkImage::Resource* imageResource,
|
| - const GrVkImageView* colorAttachmentView)
|
| - : GrSurface(gpu, lifeCycle, desc)
|
| - , GrVkImage(imageResource)
|
| - , GrRenderTarget(gpu, lifeCycle, desc, kUnified_SampleConfig)
|
| - , fFramebuffer(nullptr)
|
| - , fColorAttachmentView(colorAttachmentView)
|
| - , fMSAAImageResource(nullptr)
|
| - , fResolveAttachmentView(nullptr)
|
| - , fCachedSimpleRenderPass(nullptr) {
|
| - SkASSERT(!desc.fSampleCnt);
|
| - fColorValuesPerPixel = 1;
|
| - this->createFramebuffer(gpu);
|
| - this->registerWithCache();
|
| -}
|
| -
|
| -// We're virtually derived from GrSurface (via GrRenderTarget) so its
|
| -// constructor must be explicitly called.
|
| -GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu,
|
| - const GrSurfaceDesc& desc,
|
| - GrGpuResource::LifeCycle lifeCycle,
|
| - const GrVkImage::Resource* imageResource,
|
| - const GrVkImageView* colorAttachmentView,
|
| - Derived)
|
| - : GrSurface(gpu, lifeCycle, desc)
|
| - , GrVkImage(imageResource)
|
| - , GrRenderTarget(gpu, lifeCycle, desc, kUnified_SampleConfig)
|
| - , fFramebuffer(nullptr)
|
| - , fColorAttachmentView(colorAttachmentView)
|
| - , fMSAAImageResource(nullptr)
|
| - , fResolveAttachmentView(nullptr)
|
| - , fCachedSimpleRenderPass(nullptr) {
|
| - SkASSERT(!desc.fSampleCnt);
|
| - fColorValuesPerPixel = 1;
|
| - this->createFramebuffer(gpu);
|
| -}
|
| -
|
| -GrVkRenderTarget*
|
| -GrVkRenderTarget::Create(GrVkGpu* gpu,
|
| - const GrSurfaceDesc& desc,
|
| - GrGpuResource::LifeCycle lifeCycle,
|
| - const GrVkImage::Resource* imageResource) {
|
| - VkFormat pixelFormat;
|
| - GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
|
| -
|
| - VkImage colorImage;
|
| -
|
| - // create msaa surface if necessary
|
| - const GrVkImage::Resource* msaaResource = nullptr;
|
| - const GrVkImageView* resolveAttachmentView = nullptr;
|
| - if (desc.fSampleCnt) {
|
| - GrVkImage::ImageDesc msImageDesc;
|
| - msImageDesc.fImageType = VK_IMAGE_TYPE_2D;
|
| - msImageDesc.fFormat = pixelFormat;
|
| - msImageDesc.fWidth = desc.fWidth;
|
| - msImageDesc.fHeight = desc.fHeight;
|
| - msImageDesc.fLevels = 1;
|
| - msImageDesc.fSamples = desc.fSampleCnt;
|
| - msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
|
| - msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
| - msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
| -
|
| - msaaResource = GrVkImage::CreateResource(gpu, msImageDesc);
|
| -
|
| - if (!msaaResource) {
|
| - return nullptr;
|
| - }
|
| -
|
| - // Set color attachment image
|
| - colorImage = msaaResource->fImage;
|
| -
|
| - // Create Resolve attachment view
|
| - resolveAttachmentView = GrVkImageView::Create(gpu, imageResource->fImage, pixelFormat,
|
| - GrVkImageView::kColor_Type);
|
| - if (!resolveAttachmentView) {
|
| - msaaResource->unref(gpu);
|
| - return nullptr;
|
| - }
|
| - } else {
|
| - // Set color attachment image
|
| - colorImage = imageResource->fImage;
|
| - }
|
| -
|
| - // Get color attachment view
|
| - const GrVkImageView* colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat,
|
| - GrVkImageView::kColor_Type);
|
| - if (!colorAttachmentView) {
|
| - if (msaaResource) {
|
| - resolveAttachmentView->unref(gpu);
|
| - msaaResource->unref(gpu);
|
| - }
|
| - return NULL;
|
| - }
|
| -
|
| - GrVkRenderTarget* texRT;
|
| - if (msaaResource) {
|
| - texRT = new GrVkRenderTarget(gpu, desc, lifeCycle, imageResource, msaaResource,
|
| - colorAttachmentView, resolveAttachmentView);
|
| - msaaResource->unref(gpu);
|
| - } else {
|
| - texRT = new GrVkRenderTarget(gpu, desc, lifeCycle, imageResource,
|
| - colorAttachmentView);
|
| - }
|
| -
|
| - return texRT;
|
| -}
|
| -
|
| -GrVkRenderTarget*
|
| -GrVkRenderTarget::CreateNewRenderTarget(GrVkGpu* gpu,
|
| - const GrSurfaceDesc& desc,
|
| - GrGpuResource::LifeCycle lifeCycle,
|
| - const GrVkImage::ImageDesc& imageDesc) {
|
| - SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
|
| -
|
| - const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, imageDesc);
|
| - if (!imageResource) {
|
| - return nullptr;
|
| - }
|
| -
|
| - GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, desc, lifeCycle, imageResource);
|
| - // Create() will increment the refCount of the image resource if it succeeds
|
| - imageResource->unref(gpu);
|
| -
|
| - return rt;
|
| -}
|
| -
|
| -GrVkRenderTarget*
|
| -GrVkRenderTarget::CreateWrappedRenderTarget(GrVkGpu* gpu,
|
| - const GrSurfaceDesc& desc,
|
| - GrGpuResource::LifeCycle lifeCycle,
|
| - const GrVkImage::Resource* imageResource) {
|
| - SkASSERT(imageResource);
|
| -
|
| - // Note: we assume the caller will unref the imageResource
|
| - // Create() will increment the refCount, and we'll unref when we're done with it
|
| - return GrVkRenderTarget::Create(gpu, desc, lifeCycle, imageResource);
|
| -}
|
| -
|
| -bool GrVkRenderTarget::completeStencilAttachment() {
|
| - this->createFramebuffer(this->getVkGpu());
|
| - return true;
|
| -}
|
| -
|
| -void GrVkRenderTarget::createFramebuffer(GrVkGpu* gpu) {
|
| - if (fFramebuffer) {
|
| - fFramebuffer->unref(gpu);
|
| - }
|
| - if (fCachedSimpleRenderPass) {
|
| - fCachedSimpleRenderPass->unref(gpu);
|
| - }
|
| -
|
| - // Vulkan requires us to create a compatible renderpass before we can create our framebuffer,
|
| - // so we use this to get a (cached) basic renderpass, only for creation.
|
| - fCachedSimpleRenderPass = gpu->resourceProvider().findOrCreateCompatibleRenderPass(*this);
|
| -
|
| - // Stencil attachment view is stored in the base RT stencil attachment
|
| - const GrVkImageView* stencilView = this->stencilAttachmentView();
|
| - fFramebuffer = GrVkFramebuffer::Create(gpu, this->width(), this->height(),
|
| - fCachedSimpleRenderPass, fColorAttachmentView,
|
| - fResolveAttachmentView, stencilView);
|
| - SkASSERT(fFramebuffer);
|
| -}
|
| -
|
| -void GrVkRenderTarget::getAttachmentsDescriptor(
|
| - GrVkRenderPass::AttachmentsDescriptor* desc,
|
| - GrVkRenderPass::AttachmentFlags* attachmentFlags) const {
|
| - int colorSamples = this->numColorSamples();
|
| - VkFormat colorFormat;
|
| - GrPixelConfigToVkFormat(this->config(), &colorFormat);
|
| - desc->fColor.fFormat = colorFormat;
|
| - desc->fColor.fSamples = colorSamples ? colorSamples : 1;
|
| - *attachmentFlags = GrVkRenderPass::kColor_AttachmentFlag;
|
| - uint32_t attachmentCount = 1;
|
| - if (colorSamples > 0) {
|
| - desc->fResolve.fFormat = colorFormat;
|
| - desc->fResolve.fSamples = 1;
|
| - *attachmentFlags |= GrVkRenderPass::kResolve_AttachmentFlag;
|
| - ++attachmentCount;
|
| - }
|
| -
|
| - const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
|
| - if (stencil) {
|
| - const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
|
| - desc->fStencil.fFormat = vkStencil->vkFormat();
|
| - desc->fStencil.fSamples = vkStencil->numSamples() ? vkStencil->numSamples() : 1;
|
| - // Currently in vulkan stencil and color attachments must all have same number of samples
|
| - SkASSERT(desc->fColor.fSamples == desc->fStencil.fSamples);
|
| - *attachmentFlags |= GrVkRenderPass::kStencil_AttachmentFlag;
|
| - ++attachmentCount;
|
| - }
|
| - desc->fAttachmentCount = attachmentCount;
|
| -}
|
| -
|
| -GrVkRenderTarget::~GrVkRenderTarget() {
|
| - // either release or abandon should have been called by the owner of this object.
|
| - SkASSERT(!fMSAAImageResource);
|
| - SkASSERT(!fResolveAttachmentView);
|
| - SkASSERT(!fColorAttachmentView);
|
| - SkASSERT(!fFramebuffer);
|
| - SkASSERT(!fCachedSimpleRenderPass);
|
| -}
|
| -
|
| -void GrVkRenderTarget::addResources(GrVkCommandBuffer& commandBuffer) const {
|
| - commandBuffer.addResource(this->framebuffer());
|
| - commandBuffer.addResource(this->resource());
|
| - commandBuffer.addResource(this->colorAttachmentView());
|
| - if (this->msaaImageResource()) {
|
| - commandBuffer.addResource(this->msaaImageResource());
|
| - commandBuffer.addResource(this->resolveAttachmentView());
|
| - }
|
| - if (this->stencilImageResource()) {
|
| - commandBuffer.addResource(this->stencilImageResource());
|
| - commandBuffer.addResource(this->stencilAttachmentView());
|
| - }
|
| -}
|
| -
|
| -void GrVkRenderTarget::releaseInternalObjects() {
|
| - GrVkGpu* gpu = this->getVkGpu();
|
| -
|
| - if (fMSAAImageResource) {
|
| - fMSAAImageResource->unref(gpu);
|
| - fMSAAImageResource = nullptr;
|
| - }
|
| -
|
| - if (fResolveAttachmentView) {
|
| - fResolveAttachmentView->unref(gpu);
|
| - fResolveAttachmentView = nullptr;
|
| - }
|
| - if (fColorAttachmentView) {
|
| - fColorAttachmentView->unref(gpu);
|
| - fColorAttachmentView = nullptr;
|
| - }
|
| - if (fFramebuffer) {
|
| - fFramebuffer->unref(gpu);
|
| - fFramebuffer = nullptr;
|
| - }
|
| - if (fCachedSimpleRenderPass) {
|
| - fCachedSimpleRenderPass->unref(gpu);
|
| - fCachedSimpleRenderPass = nullptr;
|
| - }
|
| -}
|
| -
|
| -void GrVkRenderTarget::abandonInternalObjects() {
|
| - if (fMSAAImageResource) {
|
| - fMSAAImageResource->unrefAndAbandon();
|
| - fMSAAImageResource = nullptr;
|
| - }
|
| -
|
| - if (fResolveAttachmentView) {
|
| - fResolveAttachmentView->unrefAndAbandon();
|
| - fResolveAttachmentView = nullptr;
|
| - }
|
| - if (fColorAttachmentView) {
|
| - fColorAttachmentView->unrefAndAbandon();
|
| - fColorAttachmentView = nullptr;
|
| - }
|
| - if (fFramebuffer) {
|
| - fFramebuffer->unrefAndAbandon();
|
| - fFramebuffer = nullptr;
|
| - }
|
| - if (fCachedSimpleRenderPass) {
|
| - fCachedSimpleRenderPass->unrefAndAbandon();
|
| - fCachedSimpleRenderPass = nullptr;
|
| - }
|
| -}
|
| -
|
| -void GrVkRenderTarget::onRelease() {
|
| - this->releaseInternalObjects();
|
| - if (this->shouldFreeResources()) {
|
| - this->releaseImage(this->getVkGpu());
|
| - } else {
|
| - this->abandonImage();
|
| - }
|
| -
|
| - GrRenderTarget::onRelease();
|
| -}
|
| -
|
| -void GrVkRenderTarget::onAbandon() {
|
| - this->abandonInternalObjects();
|
| - this->abandonImage();
|
| - GrRenderTarget::onAbandon();
|
| -}
|
| -
|
| -
|
| -GrBackendObject GrVkRenderTarget::getRenderTargetHandle() const {
|
| - // Currently just passing back the pointer to the main Image::Resource as the handle
|
| - return (GrBackendObject)&fResource;
|
| -}
|
| -
|
| -const GrVkImage::Resource* GrVkRenderTarget::stencilImageResource() const {
|
| - const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
|
| - if (stencil) {
|
| - const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
|
| - return vkStencil->imageResource();
|
| - }
|
| -
|
| - return nullptr;
|
| -}
|
| -
|
| -const GrVkImageView* GrVkRenderTarget::stencilAttachmentView() const {
|
| - const GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment();
|
| - if (stencil) {
|
| - const GrVkStencilAttachment* vkStencil = static_cast<const GrVkStencilAttachment*>(stencil);
|
| - return vkStencil->stencilView();
|
| - }
|
| -
|
| - return nullptr;
|
| -}
|
| -
|
| -
|
| -GrVkGpu* GrVkRenderTarget::getVkGpu() const {
|
| - SkASSERT(!this->wasDestroyed());
|
| - return static_cast<GrVkGpu*>(this->getGpu());
|
| -}
|
| -
|
|
|