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

#include "dawn_native/DawnNative.h"

#include "common/RefCounted.h"
#include "common/ityp_span.h"
#include "dawn_native/Error.h"
#include "dawn_native/Features.h"
#include "dawn_native/Limits.h"
#include "dawn_native/dawn_platform.h"

#include <string>

namespace dawn_native {

    class DeviceBase;

    class AdapterBase : public RefCounted {
      public:
        AdapterBase(InstanceBase* instance, wgpu::BackendType backend);
        virtual ~AdapterBase() = default;

        MaybeError Initialize();

        // WebGPU API
        bool APIGetLimits(SupportedLimits* limits) const;
        void APIGetProperties(AdapterProperties* properties) const;
        bool APIHasFeature(wgpu::FeatureName feature) const;
        size_t APIEnumerateFeatures(wgpu::FeatureName* features) const;
        void APIRequestDevice(const DeviceDescriptor* descriptor,
                              WGPURequestDeviceCallback callback,
                              void* userdata);
        DeviceBase* APICreateDevice(const DeviceDescriptor* descriptor = nullptr);

        wgpu::BackendType GetBackendType() const;
        wgpu::AdapterType GetAdapterType() const;
        const std::string& GetDriverDescription() const;
        const PCIInfo& GetPCIInfo() const;
        InstanceBase* GetInstance() const;

        void ResetInternalDeviceForTesting();

        FeaturesSet GetSupportedFeatures() const;
        bool SupportsAllRequiredFeatures(
            const ityp::span<size_t, const wgpu::FeatureName>& features) const;
        WGPUDeviceProperties GetAdapterProperties() const;

        bool GetLimits(SupportedLimits* limits) const;

        void SetUseTieredLimits(bool useTieredLimits);

        virtual bool SupportsExternalImages() const = 0;

      protected:
        PCIInfo mPCIInfo = {};
        wgpu::AdapterType mAdapterType = wgpu::AdapterType::Unknown;
        std::string mDriverDescription;
        FeaturesSet mSupportedFeatures;

      private:
        virtual ResultOrError<Ref<DeviceBase>> CreateDeviceImpl(
            const DeviceDescriptor* descriptor) = 0;

        virtual MaybeError InitializeImpl() = 0;

        // Check base WebGPU features and discover supported featurees.
        virtual MaybeError InitializeSupportedFeaturesImpl() = 0;

        // Check base WebGPU limits and populate supported limits.
        virtual MaybeError InitializeSupportedLimitsImpl(CombinedLimits* limits) = 0;

        ResultOrError<Ref<DeviceBase>> CreateDeviceInternal(const DeviceDescriptor* descriptor);

        virtual MaybeError ResetInternalDeviceForTestingImpl();
        InstanceBase* mInstance = nullptr;
        wgpu::BackendType mBackend;
        CombinedLimits mLimits;
        bool mUseTieredLimits = false;
    };

}  // namespace dawn_native

#endif  // DAWNNATIVE_ADAPTER_H_
