// Copyright 2026 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#ifndef SRC_DAWN_NATIVE_VULKAN_FRAMEBUFFER_FETCH_H_
#define SRC_DAWN_NATIVE_VULKAN_FRAMEBUFFER_FETCH_H_

#include "src/dawn/common/Ref.h"
#include "src/dawn/common/vulkan_platform.h"
#include "src/dawn/native/Commands.h"
#include "src/dawn/native/vulkan/DescriptorSetAllocator.h"
#include "src/dawn/native/vulkan/ResourceTableVk.h"
#include "src/dawn/native/vulkan/VulkanInfo.h"

namespace dawn::native::vulkan {

// Helper to create VkDescriptorSets for binding color attachments as input attachments in order
// to implement FramebufferFetch.
class FramebufferFetchHelper {
  public:
    explicit FramebufferFetchHelper(Device* device);
    ~FramebufferFetchHelper();

    // Returns layout suitable for a render pass with `attachmentCount` color attachments.
    ResultOrError<VkDescriptorSetLayout> GetLayout(uint32_t attachmentCount);

    // Returns a descriptor set that binds all render pass color attachments as input attachments.
    // The returned descriptor set is only valid to use for the current render pass.
    // It will be destroyed after the render pass is submitted to the GPU.
    //
    // Note there is a dependency that GetLayout() was called for appropriate number of input
    // attachments already. This happens as part of creating the VkPipelineLayout.
    ResultOrError<VkDescriptorSet> GetDescriptorsForRenderPass(const BeginRenderPassCmd* cmd);

  private:
    struct DescriptorSetHolder {
        VkDescriptorSetLayout layout = VK_NULL_HANDLE;
        Ref<DescriptorSetAllocator> allocator;
    };

    raw_ptr<Device> mDevice;
    std::array<DescriptorSetHolder, kMaxColorAttachments> mHolders;
};

}  // namespace dawn::native::vulkan

#endif  // SRC_DAWN_NATIVE_VULKAN_FRAMEBUFFER_FETCH_H_
