// Copyright 2017 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 <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/trace-provider/provider.h>

#include "src/ui/examples/shadertoy/service/app.h"
#include "src/ui/lib/escher/escher.h"
#include "src/ui/lib/escher/escher_process_init.h"
#include "src/ui/lib/escher/vk/vulkan_device_queues.h"
#include "src/ui/lib/escher/vk/vulkan_instance.h"

// This is the main() function for the service that implements the
// ShadertoyFactory API.
int main(int argc, const char** argv) {
  escher::GlslangInitializeProcess();
  {
    // Only enable Vulkan validation layers when in debug mode.
    escher::VulkanInstance::Params instance_params(
        {{},
         {VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
          VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
          VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME,
          VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME},
         false});
#if !defined(NDEBUG)
    auto validation_layer_name = escher::VulkanInstance::GetValidationLayerName();
    if (validation_layer_name) {
      instance_params.layer_names.insert(*validation_layer_name);
    }
#endif
    auto vulkan_instance = escher::VulkanInstance::New(std::move(instance_params));

    auto vulkan_device = escher::VulkanDeviceQueues::New(
        vulkan_instance, {{
                              VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,
                              VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
                              VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
                              VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
                              VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
                              VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME,
                          },
                          {},
                          vk::SurfaceKHR()});

    escher::Escher escher(vulkan_device);

    async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
    trace::TraceProviderWithFdio trace_provider(loop.dispatcher());

    std::unique_ptr<sys::ComponentContext> app_context(
        sys::ComponentContext::CreateAndServeOutgoingDirectory());

    shadertoy::App app(&loop, app_context.get(), escher.GetWeakPtr());
    loop.Run();
  }
  escher::GlslangFinalizeProcess();

  return 0;
}
