// 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
