// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GPU_VULKAN_VULKAN_SHADER_MODULE_H_
#define GPU_VULKAN_VULKAN_SHADER_MODULE_H_

#include <string>
#include <vulkan/vulkan.h>

#include "base/macros.h"
#include "gpu/vulkan/vulkan_export.h"

namespace gpu {

class VulkanDeviceQueue;

class VULKAN_EXPORT VulkanShaderModule {
 public:
  enum class ShaderType {
    VERTEX,
    FRAGMENT,
  };

  VulkanShaderModule(VulkanDeviceQueue* device_queue);
  ~VulkanShaderModule();

  bool InitializeGLSL(ShaderType type,
                      std::string name,
                      std::string entry_point,
                      std::string source);
  bool InitializeSPIRV(ShaderType type,
                       std::string name,
                       std::string entry_point,
                       std::string source);
  void Destroy();

  bool IsValid() const { return handle_ != VK_NULL_HANDLE; }
  std::string GetErrorMessages() const { return error_messages_; }

  ShaderType shader_type() const { return shader_type_; }
  const std::string& name() const { return name_; }
  VkShaderModule handle() const { return handle_; }
  const std::string& entry_point() const { return entry_point_; }

 private:
  VulkanDeviceQueue* device_queue_ = nullptr;
  ShaderType shader_type_ = ShaderType::VERTEX;
  VkShaderModule handle_ = VK_NULL_HANDLE;
  std::string name_;
  std::string entry_point_;
  std::string error_messages_;

  DISALLOW_COPY_AND_ASSIGN(VulkanShaderModule);
};

}  // namespace gpu

#endif  // GPU_VULKAN_VULKAN_SHADER_MODULE_H_
