// Copyright 2017 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 DAWNNATIVE_METAL_PIPELINELAYOUTMTL_H_
#define DAWNNATIVE_METAL_PIPELINELAYOUTMTL_H_

#include "common/ityp_stack_vec.h"
#include "dawn_native/BindingInfo.h"
#include "dawn_native/PipelineLayout.h"

#include "dawn_native/PerStage.h"

#import <Metal/Metal.h>

namespace dawn_native::metal {

    class Device;

    // The number of Metal buffers usable by applications in general
    static constexpr size_t kMetalBufferTableSize = 31;
    // The Metal buffer slot that Dawn reserves for its own use to pass more data to shaders
    static constexpr size_t kBufferLengthBufferSlot = kMetalBufferTableSize - 1;
    // The number of Metal buffers Dawn can use in a generic way (i.e. that aren't reserved)
    static constexpr size_t kGenericMetalBufferSlots = kMetalBufferTableSize - 1;

    static constexpr BindGroupIndex kPullingBufferBindingSet = BindGroupIndex(kMaxBindGroups);

    class PipelineLayout final : public PipelineLayoutBase {
      public:
        static Ref<PipelineLayout> Create(Device* device,
                                          const PipelineLayoutDescriptor* descriptor);

        using BindingIndexInfo =
            ityp::array<BindGroupIndex,
                        ityp::stack_vec<BindingIndex, uint32_t, kMaxOptimalBindingsPerGroup>,
                        kMaxBindGroups>;
        const BindingIndexInfo& GetBindingIndexInfo(SingleShaderStage stage) const;

        // The number of Metal vertex stage buffers used for the whole pipeline layout.
        uint32_t GetBufferBindingCount(SingleShaderStage stage);

      private:
        PipelineLayout(Device* device, const PipelineLayoutDescriptor* descriptor);
        ~PipelineLayout() override = default;
        PerStage<BindingIndexInfo> mIndexInfo;
        PerStage<uint32_t> mBufferBindingCount;
    };

}  // namespace dawn_native::metal

#endif  // DAWNNATIVE_METAL_PIPELINELAYOUTMTL_H_
