// Copyright 2020 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_METAL_QUERYSETMTL_H_
#define DAWNNATIVE_METAL_QUERYSETMTL_H_

#include "dawn_native/QuerySet.h"

#include "common/NSRef.h"

#import <Metal/Metal.h>

namespace dawn_native::metal {

    class Device;

    class QuerySet final : public QuerySetBase {
      public:
        static ResultOrError<Ref<QuerySet>> Create(Device* device,
                                                   const QuerySetDescriptor* descriptor);

        id<MTLBuffer> GetVisibilityBuffer() const;
        id<MTLCounterSampleBuffer> GetCounterSampleBuffer() const
            API_AVAILABLE(macos(10.15), ios(14.0));

      private:
        ~QuerySet() override;
        using QuerySetBase::QuerySetBase;
        MaybeError Initialize();

        // Dawn API
        void DestroyImpl() override;

        NSPRef<id<MTLBuffer>> mVisibilityBuffer;
        // Note that mCounterSampleBuffer cannot be an NSRef because the API_AVAILABLE macros don't
        // propagate nicely through templates.
        id<MTLCounterSampleBuffer> mCounterSampleBuffer API_AVAILABLE(macos(10.15),
                                                                      ios(14.0)) = nullptr;
    };

}  // namespace dawn_native::metal

#endif  // DAWNNATIVE_METAL_QUERYSETMTL_H_
