123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- /*
- * 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 "src/gpu/vk/GrVkTextureRenderTarget.h"
- #include "src/gpu/GrTexturePriv.h"
- #include "src/gpu/vk/GrVkGpu.h"
- #include "src/gpu/vk/GrVkImageView.h"
- #include "src/gpu/vk/GrVkUtil.h"
- #include "src/core/SkMipMap.h"
- #include "include/gpu/vk/GrVkTypes.h"
- #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
- GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
- SkBudgeted budgeted,
- const GrSurfaceDesc& desc,
- int sampleCnt,
- const GrVkImageInfo& info,
- sk_sp<GrVkImageLayout> layout,
- const GrVkImageView* texView,
- const GrVkImageInfo& msaaInfo,
- sk_sp<GrVkImageLayout> msaaLayout,
- const GrVkImageView* colorAttachmentView,
- const GrVkImageView* resolveAttachmentView,
- GrMipMapsStatus mipMapsStatus)
- : GrSurface(gpu, desc, info.fProtected)
- , GrVkImage(info, layout, GrBackendObjectOwnership::kOwned)
- , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus,
- GrBackendObjectOwnership::kOwned)
- , GrVkRenderTarget(gpu, desc, sampleCnt, info, layout, msaaInfo, std::move(msaaLayout),
- colorAttachmentView, resolveAttachmentView,
- GrBackendObjectOwnership::kOwned) {
- SkASSERT(info.fProtected == msaaInfo.fProtected);
- this->registerWithCache(budgeted);
- }
- GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
- SkBudgeted budgeted,
- const GrSurfaceDesc& desc,
- const GrVkImageInfo& info,
- sk_sp<GrVkImageLayout> layout,
- const GrVkImageView* texView,
- const GrVkImageView* colorAttachmentView,
- GrMipMapsStatus mipMapsStatus)
- : GrSurface(gpu, desc, info.fProtected)
- , GrVkImage(info, layout, GrBackendObjectOwnership::kOwned)
- , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus,
- GrBackendObjectOwnership::kOwned)
- , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView,
- GrBackendObjectOwnership::kOwned) {
- this->registerWithCache(budgeted);
- }
- GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
- const GrSurfaceDesc& desc,
- int sampleCnt,
- const GrVkImageInfo& info,
- sk_sp<GrVkImageLayout> layout,
- const GrVkImageView* texView,
- const GrVkImageInfo& msaaInfo,
- sk_sp<GrVkImageLayout> msaaLayout,
- const GrVkImageView* colorAttachmentView,
- const GrVkImageView* resolveAttachmentView,
- GrMipMapsStatus mipMapsStatus,
- GrBackendObjectOwnership ownership,
- GrWrapCacheable cacheable)
- : GrSurface(gpu, desc, info.fProtected)
- , GrVkImage(info, layout, ownership)
- , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
- , GrVkRenderTarget(gpu, desc, sampleCnt, info, layout, msaaInfo, std::move(msaaLayout),
- colorAttachmentView, resolveAttachmentView, ownership) {
- SkASSERT(info.fProtected == msaaInfo.fProtected);
- this->registerWithCacheWrapped(cacheable);
- }
- GrVkTextureRenderTarget::GrVkTextureRenderTarget(GrVkGpu* gpu,
- const GrSurfaceDesc& desc,
- const GrVkImageInfo& info,
- sk_sp<GrVkImageLayout> layout,
- const GrVkImageView* texView,
- const GrVkImageView* colorAttachmentView,
- GrMipMapsStatus mipMapsStatus,
- GrBackendObjectOwnership ownership,
- GrWrapCacheable cacheable)
- : GrSurface(gpu, desc, info.fProtected)
- , GrVkImage(info, layout, ownership)
- , GrVkTexture(gpu, desc, info, layout, texView, mipMapsStatus, ownership)
- , GrVkRenderTarget(gpu, desc, info, layout, colorAttachmentView, ownership) {
- this->registerWithCacheWrapped(cacheable);
- }
- namespace {
- struct Views {
- const GrVkImageView* imageView = nullptr;
- const GrVkImageView* colorAttachmentView = nullptr;
- const GrVkImageView* resolveAttachmentView = nullptr;
- GrVkImageInfo msInfo;
- sk_sp<GrVkImageLayout> msLayout;
- };
- } // anonymous namespace
- static Views create_views(GrVkGpu* gpu, const GrSurfaceDesc& desc, int sampleCnt,
- const GrVkImageInfo& info) {
- VkImage image = info.fImage;
- // Create the texture ImageView
- Views views;
- views.imageView = GrVkImageView::Create(gpu, image, info.fFormat, GrVkImageView::kColor_Type,
- info.fLevelCount, info.fYcbcrConversionInfo);
- if (!views.imageView) {
- return {};
- }
- VkFormat pixelFormat;
- GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
- VkImage colorImage;
- // create msaa surface if necessary
- if (sampleCnt > 1) {
- 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 = sampleCnt;
- msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
- msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
- VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
- msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
- if (!GrVkImage::InitImageInfo(gpu, msImageDesc, &views.msInfo)) {
- views.imageView->unref(gpu);
- return {};
- }
- // Set color attachment image
- colorImage = views.msInfo.fImage;
- // Create resolve attachment view.
- views.resolveAttachmentView =
- GrVkImageView::Create(gpu, image, pixelFormat, GrVkImageView::kColor_Type,
- info.fLevelCount, GrVkYcbcrConversionInfo());
- if (!views.resolveAttachmentView) {
- GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
- views.imageView->unref(gpu);
- return {};
- }
- views.msLayout.reset(new GrVkImageLayout(views.msInfo.fImageLayout));
- } else {
- // Set color attachment image
- colorImage = info.fImage;
- }
- views.colorAttachmentView = GrVkImageView::Create(
- gpu, colorImage, pixelFormat, GrVkImageView::kColor_Type, 1, GrVkYcbcrConversionInfo());
- if (!views.colorAttachmentView) {
- if (sampleCnt > 1) {
- views.resolveAttachmentView->unref(gpu);
- GrVkImage::DestroyImageInfo(gpu, &views.msInfo);
- }
- views.imageView->unref(gpu);
- return {};
- }
- return views;
- }
- sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::MakeNewTextureRenderTarget(
- GrVkGpu* gpu,
- SkBudgeted budgeted,
- const GrSurfaceDesc& desc,
- int sampleCnt,
- const GrVkImage::ImageDesc& imageDesc,
- GrMipMapsStatus mipMapsStatus) {
- SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
- SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT);
- GrVkImageInfo info;
- if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
- return nullptr;
- }
- sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
- Views views = create_views(gpu, desc, sampleCnt, info);
- if (!views.colorAttachmentView) {
- GrVkImage::DestroyImageInfo(gpu, &info);
- return nullptr;
- }
- if (sampleCnt > 1) {
- return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
- gpu, budgeted, desc, sampleCnt, info, std::move(layout), views.imageView,
- views.msInfo, std::move(views.msLayout), views.colorAttachmentView,
- views.resolveAttachmentView, mipMapsStatus));
- } else {
- return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
- gpu, budgeted, desc, info, std::move(layout), views.imageView,
- views.colorAttachmentView, mipMapsStatus));
- }
- }
- sk_sp<GrVkTextureRenderTarget> GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(
- GrVkGpu* gpu,
- const GrSurfaceDesc& desc,
- int sampleCnt,
- GrWrapOwnership wrapOwnership,
- GrWrapCacheable cacheable,
- const GrVkImageInfo& info,
- sk_sp<GrVkImageLayout> layout) {
- // Adopted textures require both image and allocation because we're responsible for freeing
- SkASSERT(VK_NULL_HANDLE != info.fImage &&
- (kBorrow_GrWrapOwnership == wrapOwnership || VK_NULL_HANDLE != info.fAlloc.fMemory));
- GrMipMapsStatus mipMapsStatus = info.fLevelCount > 1 ? GrMipMapsStatus::kDirty
- : GrMipMapsStatus::kNotAllocated;
- GrBackendObjectOwnership ownership = kBorrow_GrWrapOwnership == wrapOwnership
- ? GrBackendObjectOwnership::kBorrowed : GrBackendObjectOwnership::kOwned;
- Views views = create_views(gpu, desc, sampleCnt, info);
- if (!views.colorAttachmentView) {
- return nullptr;
- }
- if (sampleCnt > 1) {
- return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
- gpu, desc, sampleCnt, info, std::move(layout), views.imageView, views.msInfo,
- std::move(views.msLayout), views.colorAttachmentView, views.resolveAttachmentView,
- mipMapsStatus, ownership, cacheable));
- } else {
- return sk_sp<GrVkTextureRenderTarget>(new GrVkTextureRenderTarget(
- gpu, desc, info, std::move(layout), views.imageView, views.colorAttachmentView,
- mipMapsStatus, ownership, cacheable));
- }
- }
- size_t GrVkTextureRenderTarget::onGpuMemorySize() const {
- int numColorSamples = this->numSamples();
- if (numColorSamples > 1) {
- // Add one to account for the resolve VkImage.
- ++numColorSamples;
- }
- return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
- numColorSamples, // TODO: this still correct?
- this->texturePriv().mipMapped());
- }
|