// Copyright 2013 The Flutter 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 FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_PASS_BINDINGS_CACHE_H_
#define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_PASS_BINDINGS_CACHE_H_

#include <cstdint>
#include <optional>

#include "flutter/impeller/renderer/backend/vulkan/vk.h"

namespace impeller {

class PassBindingsCache {
 public:
  void BindPipeline(vk::CommandBuffer command_buffer,
                    vk::PipelineBindPoint pipeline_bind_point,
                    vk::Pipeline pipeline);

  void SetStencilReference(vk::CommandBuffer command_buffer,
                           vk::StencilFaceFlags face_mask,
                           uint32_t reference);

  void SetScissor(vk::CommandBuffer command_buffer,
                  uint32_t first_scissor,
                  uint32_t scissor_count,
                  const vk::Rect2D* scissors);

  void SetViewport(vk::CommandBuffer command_buffer,
                   uint32_t first_viewport,
                   uint32_t viewport_count,
                   const vk::Viewport* viewports);

 private:
  // bindPipeline
  std::optional<vk::Pipeline> graphics_pipeline_;
  std::optional<vk::Pipeline> compute_pipeline_;
  // setStencilReference
  std::optional<vk::StencilFaceFlags> stencil_face_flags_;
  uint32_t stencil_reference_ = 0;
  // setScissor
  std::optional<vk::Rect2D> scissors_;
  // setViewport
  std::optional<vk::Viewport> viewport_;
};

}  // namespace impeller

#endif  // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_PASS_BINDINGS_CACHE_H_
