blob: b7f98f3cb6294b2669569f4751863446d47c5f9e [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/lib/escher/vk/image_view.h"
#include "src/ui/lib/escher/escher.h"
#include "src/ui/lib/escher/impl/command_buffer.h"
#include "src/ui/lib/escher/impl/vulkan_utils.h"
#include "src/ui/lib/escher/resources/resource_recycler.h"
#include "src/ui/lib/escher/util/image_utils.h"
#include "src/ui/lib/escher/vk/image.h"
namespace escher {
const ResourceTypeInfo ImageView::kTypeInfo("ImageView", ResourceType::kResource,
ResourceType::kImageView);
ImageView::ImageView(ResourceRecycler* resource_recycler, ImagePtr image,
vk::ImageAspectFlags aspect_mask, void* extension_data)
: Resource(resource_recycler),
image_(std::move(image)),
width_(image_->width()),
height_(image_->height()) {
if (!aspect_mask) {
auto pair = image_utils::IsDepthStencilFormat(image_->format());
if (!pair.first && !pair.second) {
// Assume color.
aspect_mask = vk::ImageAspectFlagBits::eColor;
} else {
if (pair.first) {
aspect_mask |= vk::ImageAspectFlagBits::eDepth;
}
if (pair.second) {
aspect_mask |= vk::ImageAspectFlagBits::eStencil;
}
}
}
vk::ImageViewCreateInfo view_info;
view_info.pNext = extension_data;
view_info.viewType = vk::ImageViewType::e2D;
view_info.subresourceRange.baseMipLevel = 0;
view_info.subresourceRange.levelCount = 1;
view_info.subresourceRange.baseArrayLayer = 0;
view_info.subresourceRange.layerCount = 1;
view_info.subresourceRange.aspectMask = aspect_mask;
view_info.format = image_->format();
view_info.image = image_->vk();
image_view_ = ESCHER_CHECKED_VK_RESULT(vk_device().createImageView(view_info));
}
ImageView::~ImageView() { vk_device().destroyImageView(image_view_); }
ImageViewPtr ImageView::New(ImagePtr image, vk::ImageAspectFlags aspect_mask) {
FX_CHECK(image && image->escher());
return fxl::MakeRefCounted<ImageView>(image->escher()->resource_recycler(), std::move(image),
aspect_mask);
}
ImageViewPtr ImageView::New(ResourceRecycler* recycler, ImagePtr image,
vk::ImageAspectFlags aspect_mask) {
return fxl::MakeRefCounted<ImageView>(recycler, std::move(image), aspect_mask);
}
ImageViewAllocator::ImageViewAllocator(ResourceRecycler* resource_recycler)
: resource_recycler_(resource_recycler) {}
ImageViewPtr ImageViewAllocator::ObtainImageView(ImagePtr image, vk::ImageAspectFlags aspect_mask) {
Hasher h;
h.pointer(image.get());
h.u64(static_cast<VkFlags>(aspect_mask));
auto pair = image_view_cache_.Obtain(h.value());
if (!pair.second) {
pair.first->image_view = ImageView::New(resource_recycler_, image, aspect_mask);
}
return pair.first->image_view;
}
} // namespace escher