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

#ifndef LIB_ESCHER_IMPL_COMPUTE_SHADER_H_
#define LIB_ESCHER_IMPL_COMPUTE_SHADER_H_

#include "lib/escher/forward_declarations.h"
#include "lib/escher/impl/descriptor_set_pool.h"

namespace escher {
namespace impl {

class GlslToSpirvCompiler;

// Range within the buffer.
struct BufferRange {
  vk::DeviceSize offset;
  vk::DeviceSize size;

  BufferRange(vk::DeviceSize _offset, vk::DeviceSize _size)
      : offset(_offset), size(_size) {}
};

// Simplifies the creation and use of Vulkan compute pipelines.  The current
// implementation is limited to using images, storage/uniform buffers, and
// push-constants for in/output.
class ComputeShader {
 public:
  ComputeShader(EscherWeakPtr escher,
                const std::vector<vk::ImageLayout>& layouts,
                const std::vector<vk::DescriptorType>& buffer_types,
                size_t push_constants_size, const char* source_code);
  ~ComputeShader();

  // Update descriptors and push-constants, then dispatch x * y * z workgroups.
  // |push_constants| must point to data of the size passed to the ComputeShader
  // constructor, or nullptr if that size was 0.
  void Dispatch(const std::vector<TexturePtr>& textures,
                const std::vector<BufferPtr>& buffers,
                CommandBuffer* command_buffer, uint32_t x, uint32_t y,
                uint32_t z, const void* push_constants);

  // TODO(ES-45): Implement a ComputeShaderDispatcher that follows builder
  // pattern and take the necessary arguments only.
  void DispatchWithRanges(const std::vector<TexturePtr>& textures,
                          const std::vector<BufferPtr>& buffers,
                          const std::vector<BufferRange>& buffer_ranges,
                          CommandBuffer* command_buffer, uint32_t x, uint32_t y,
                          uint32_t z, const void* push_constants);

 private:
  const vk::Device device_;
  const std::vector<vk::DescriptorSetLayoutBinding>
      descriptor_set_layout_bindings_;
  const vk::DescriptorSetLayoutCreateInfo descriptor_set_layout_create_info_;
  const uint32_t push_constants_size_;
  DescriptorSetPool pool_;
  const PipelinePtr pipeline_;
  std::vector<vk::WriteDescriptorSet> descriptor_set_writes_;
  std::vector<vk::DescriptorImageInfo> descriptor_image_info_;
  std::vector<vk::DescriptorBufferInfo> descriptor_buffer_info_;
};

}  // namespace impl
}  // namespace escher

#endif  // LIB_ESCHER_IMPL_COMPUTE_SHADER_H_
