// Copyright 2018 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 UTILS_COMBORENDERPIPELINEDESCRIPTOR_H_
#define UTILS_COMBORENDERPIPELINEDESCRIPTOR_H_

#include <dawn/dawncpp.h>

#include "common/Constants.h"

#include <array>

namespace utils {

    class ComboVertexInputDescriptor : public dawn::VertexInputDescriptor {
      public:
        ComboVertexInputDescriptor();

        std::array<dawn::VertexBufferDescriptor, kMaxVertexBuffers> cBuffers;
        std::array<dawn::VertexAttributeDescriptor, kMaxVertexAttributes> cAttributes;
    };

    class ComboRenderPipelineDescriptor : public dawn::RenderPipelineDescriptor {
      public:
        ComboRenderPipelineDescriptor(const dawn::Device& device);

        dawn::PipelineStageDescriptor cFragmentStage;

        ComboVertexInputDescriptor cVertexInput;
        dawn::RasterizationStateDescriptor cRasterizationState;
        std::array<dawn::ColorStateDescriptor*, kMaxColorAttachments> cColorStates;
        dawn::DepthStencilStateDescriptor cDepthStencilState;

      private:
        dawn::ColorStateDescriptor mColorStates[kMaxColorAttachments];
    };

}  // namespace utils

#endif  // UTILS_COMBORENDERPIPELINEDESCRIPTOR_H_
