// 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.
        size_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_
