// Copyright 2019 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_FEATURES_H_
#define DAWNNATIVE_FEATURES_H_

#include <bitset>
#include <unordered_map>
#include <vector>

#include "common/ityp_bitset.h"
#include "dawn/webgpu_cpp.h"
#include "dawn_native/DawnNative.h"

namespace dawn_native {

    enum class Feature {
        TextureCompressionBC,
        TextureCompressionETC2,
        TextureCompressionASTC,
        ShaderFloat16,
        PipelineStatisticsQuery,
        TimestampQuery,
        DepthClamping,
        Depth24UnormStencil8,
        Depth32FloatStencil8,

        // Dawn-specific
        DawnInternalUsages,
        MultiPlanarFormats,
        DawnNative,

        EnumCount,
        InvalidEnum = EnumCount,
        FeatureMin = TextureCompressionBC,
    };

    // A wrapper of the bitset to store if an feature is enabled or not. This wrapper provides the
    // convenience to convert the enums of enum class Feature to the indices of a bitset.
    struct FeaturesSet {
        std::bitset<static_cast<size_t>(Feature::EnumCount)> featuresBitSet;

        void EnableFeature(Feature feature);
        void EnableFeature(wgpu::FeatureName feature);
        bool IsEnabled(Feature feature) const;
        bool IsEnabled(wgpu::FeatureName feature) const;
        // Returns |count|, the number of features. Writes out all |count| values if |features| is
        // non-null.
        uint32_t EnumerateFeatures(wgpu::FeatureName* features) const;
        std::vector<const char*> GetEnabledFeatureNames() const;
        void InitializeDeviceProperties(WGPUDeviceProperties* properties) const;
    };

    wgpu::FeatureName FeatureEnumToAPIFeature(Feature feature);

    class FeaturesInfo {
      public:
        FeaturesInfo();

        // Used to query the details of an feature. Return nullptr if featureName is not a valid
        // name of an feature supported in Dawn
        const FeatureInfo* GetFeatureInfo(wgpu::FeatureName feature) const;
        Feature FeatureNameToEnum(const char* featureName) const;
        wgpu::FeatureName FeatureNameToAPIEnum(const char* featureName) const;

      private:
        std::unordered_map<std::string, Feature> mFeatureNameToEnumMap;
    };

}  // namespace dawn_native

#endif  // DAWNNATIVE_FEATURES_H_
