// Copyright 2021 The Dawn Authors
//
// 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.

#ifndef TESTS_VULKANIMAGEWRAPPINGTESTS_H_
#define TESTS_VULKANIMAGEWRAPPINGTESTS_H_

// This must be above all other includes otherwise VulkanBackend.h includes vulkan.h before we had
// time to wrap it with vulkan_platform.h
#include "dawn/common/vulkan_platform.h"

#include "dawn/common/NonCopyable.h"
#include "dawn/native/VulkanBackend.h"
#include "dawn/webgpu_cpp.h"

#include <memory>
#include <vector>

namespace dawn::native::vulkan {

    struct ExternalImageDescriptorVkForTesting;
    struct ExternalImageExportInfoVkForTesting;

    class VulkanImageWrappingTestBackend {
      public:
        static std::unique_ptr<VulkanImageWrappingTestBackend> Create(const wgpu::Device& device);
        virtual ~VulkanImageWrappingTestBackend() = default;

        class ExternalTexture : NonCopyable {
          public:
            virtual ~ExternalTexture() = default;
        };
        class ExternalSemaphore : NonCopyable {
          public:
            virtual ~ExternalSemaphore() = default;
        };

        virtual std::unique_ptr<ExternalTexture> CreateTexture(uint32_t width,
                                                               uint32_t height,
                                                               wgpu::TextureFormat format,
                                                               wgpu::TextureUsage usage) = 0;
        virtual wgpu::Texture WrapImage(
            const wgpu::Device& device,
            const ExternalTexture* texture,
            const ExternalImageDescriptorVkForTesting& descriptor,
            std::vector<std::unique_ptr<ExternalSemaphore>> semaphores) = 0;

        virtual bool ExportImage(const wgpu::Texture& texture,
                                 VkImageLayout layout,
                                 ExternalImageExportInfoVkForTesting* exportInfo) = 0;
    };

    struct ExternalImageDescriptorVkForTesting : public ExternalImageDescriptorVk {
      public:
        ExternalImageDescriptorVkForTesting();
    };

    struct ExternalImageExportInfoVkForTesting : public ExternalImageExportInfoVk {
      public:
        ExternalImageExportInfoVkForTesting();
        std::vector<std::unique_ptr<VulkanImageWrappingTestBackend::ExternalSemaphore>> semaphores;
    };

}  // namespace dawn::native::vulkan

#endif  // TESTS_VULKANIMAGEWRAPPINGTESTS_H_
