// 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 SRC_DAWN_NATIVE_FEATURES_H_
#define SRC_DAWN_NATIVE_FEATURES_H_

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

#include "dawn/common/ityp_bitset.h"
#include "dawn/native/DawnNative.h"
#include "dawn/webgpu_cpp.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();
    ~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  // SRC_DAWN_NATIVE_FEATURES_H_
