// 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 "garnet/lib/ui/gfx/tests/vk_session_test.h"
#include "garnet/lib/ui/gfx/util/vulkan_utils.h"

namespace scenic_impl {
namespace gfx {
namespace test {

std::unique_ptr<SessionForTest> VkSessionTest::CreateSession() {
  SessionContext session_context = CreateBarebonesSessionContext();

  // Initialize Vulkan.
  escher::VulkanInstance::Params instance_params(
      {{}, {VK_EXT_DEBUG_REPORT_EXTENSION_NAME}, false});

  instance_params.layer_names.insert("VK_LAYER_LUNARG_standard_validation");
  auto vulkan_instance =
      escher::VulkanInstance::New(std::move(instance_params));
  auto vulkan_device = escher::VulkanDeviceQueues::New(
      vulkan_instance,
      {{VK_KHR_EXTERNAL_SEMAPHORE_FUCHSIA_EXTENSION_NAME}, vk::SurfaceKHR()});

  escher_ = std::make_unique<escher::Escher>(vulkan_device);
  release_fence_signaller_ = std::make_unique<escher::ReleaseFenceSignaller>(
      escher_->command_buffer_sequencer());
  image_factory_ = std::make_unique<escher::ImageFactoryAdapter>(
      escher_->gpu_allocator(), escher_->resource_recycler());

  session_context.vk_device = escher_->vk_device();
  session_context.escher = escher_.get();
  session_context.imported_memory_type_index = GetImportedMemoryTypeIndex(
      escher_->vk_physical_device(), escher_->vk_device());
  session_context.escher_resource_recycler = escher_->resource_recycler();
  session_context.escher_image_factory = image_factory_.get();
  session_context.release_fence_signaller = release_fence_signaller_.get();

  return std::make_unique<SessionForTest>(1, std::move(session_context), this,
                                          error_reporter());
}

}  // namespace test
}  // namespace gfx
}  // namespace scenic_impl
