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