#pragma once

#include <vulkan/vulkan.hpp>

#include "vkcv/Handles.hpp"
#include "vkcv/ShaderStage.hpp"

namespace vkcv
{
    struct DescriptorSet
    {
        vk::DescriptorSet       vulkanHandle;
        vk::DescriptorSetLayout layout;
        size_t                  poolIndex;
    };

    /*
    * All the types of descriptors (resources) that can be retrieved by the shaders
    */
    enum class DescriptorType
    {
        UNIFORM_BUFFER,
        STORAGE_BUFFER,
        SAMPLER,
        IMAGE_SAMPLED,
		IMAGE_STORAGE,
        UNIFORM_BUFFER_DYNAMIC,
        STORAGE_BUFFER_DYNAMIC
    };    
    
    /*
    * One binding for a descriptor set
    * @param[in] a unique binding ID
    * @param[in] a descriptor type
    * @param[in] the number of descriptors of this type (arrays of the same type possible)
    * @param[in] the shader stage where the descriptor is supposed to be retrieved
    */
    struct DescriptorBinding
    {
        DescriptorBinding(
            uint32_t bindingID,
            DescriptorType descriptorType,
            uint32_t descriptorCount,
            ShaderStage shaderStage
        ) noexcept;
        
        uint32_t bindingID;
        DescriptorType descriptorType;
        uint32_t descriptorCount;
        ShaderStage shaderStage;
    };
}