////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License.  You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
// License for the specific language governing permissions and limitations
// under the License.
////////////////////////////////////////////////////////////////////////////////

#if !defined(TUTORIAL_01_HEADER)
#define TUTORIAL_01_HEADER

#include "vulkan.h"
#include "OperatingSystem.h"

namespace ApiWithoutSecrets {

  // ************************************************************ //
  // VulkanTutorial01Parameters                                   //
  //                                                              //
  // Vulkan specific parameters                                   //
  // ************************************************************ //
  struct VulkanTutorial01Parameters {
    VkInstance  Instance;
    VkDevice    Device;
    uint32_t    QueueFamilyIndex;
    VkQueue     Queue;

    VulkanTutorial01Parameters() :
      Instance( VK_NULL_HANDLE ),
      Device( VK_NULL_HANDLE ),
      QueueFamilyIndex( 0 ),
      Queue( VK_NULL_HANDLE ) {
    }
  };

  // ************************************************************ //
  // Tutorial01                                                   //
  //                                                              //
  // Class for presenting Vulkan usage topics                     //
  // ************************************************************ //
  class Tutorial01 : public OS::TutorialBase {
  public:
    Tutorial01();
    ~Tutorial01();

    bool OnWindowSizeChanged() override;
    bool Draw() override;

    bool PrepareVulkan();

  private:
    OS::LibraryHandle           VulkanLibrary;
    VulkanTutorial01Parameters  Vulkan;

    bool LoadVulkanLibrary();
    bool LoadExportedEntryPoints();
    bool LoadGlobalLevelEntryPoints();
    bool CreateInstance();
    bool LoadInstanceLevelEntryPoints();
    bool CreateDevice();
    bool CheckPhysicalDeviceProperties( VkPhysicalDevice physical_device, uint32_t &queue_family_index );
    bool LoadDeviceLevelEntryPoints();
    bool GetDeviceQueue();
  };

} // namespace ApiWithoutSecrets

#endif // TUTORIAL_01_HEADER