// 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_PASSRESOURCEUSAGETRACKER_H_
#define DAWNNATIVE_PASSRESOURCEUSAGETRACKER_H_

#include "dawn_native/PassResourceUsage.h"

#include "dawn_native/dawn_platform.h"

#include <map>

namespace dawn_native {

    class BindGroupBase;
    class BufferBase;
    class ExternalTextureBase;
    class QuerySetBase;
    class TextureBase;

    using QueryAvailabilityMap = std::map<QuerySetBase*, std::vector<bool>>;

    // Helper class to build SyncScopeResourceUsages
    class SyncScopeUsageTracker {
      public:
        void BufferUsedAs(BufferBase* buffer, wgpu::BufferUsage usage);
        void TextureViewUsedAs(TextureViewBase* texture, wgpu::TextureUsage usage);
        void AddRenderBundleTextureUsage(TextureBase* texture,
                                         const TextureSubresourceUsage& textureUsage);

        // Walks the bind groups and tracks all its resources.
        void AddBindGroup(BindGroupBase* group);

        // Returns the per-pass usage for use by backends for APIs with explicit barriers.
        SyncScopeResourceUsage AcquireSyncScopeUsage();

      private:
        std::map<BufferBase*, wgpu::BufferUsage> mBufferUsages;
        std::map<TextureBase*, TextureSubresourceUsage> mTextureUsages;
        std::set<ExternalTextureBase*> mExternalTextureUsages;
    };

    // Helper class to build ComputePassResourceUsages
    class ComputePassResourceUsageTracker {
      public:
        void AddDispatch(SyncScopeResourceUsage scope);
        void AddReferencedBuffer(BufferBase* buffer);
        void AddResourcesReferencedByBindGroup(BindGroupBase* group);

        ComputePassResourceUsage AcquireResourceUsage();

      private:
        ComputePassResourceUsage mUsage;
    };

    // Helper class to build RenderPassResourceUsages
    class RenderPassResourceUsageTracker : public SyncScopeUsageTracker {
      public:
        void TrackQueryAvailability(QuerySetBase* querySet, uint32_t queryIndex);
        const QueryAvailabilityMap& GetQueryAvailabilityMap() const;

        RenderPassResourceUsage AcquireResourceUsage();

      private:
        // Hide AcquireSyncScopeUsage since users of this class should use AcquireResourceUsage
        // instead.
        using SyncScopeUsageTracker::AcquireSyncScopeUsage;

        // Tracks queries used in the render pass to validate that they aren't written twice.
        QueryAvailabilityMap mQueryAvailabilities;
    };

}  // namespace dawn_native

#endif  // DAWNNATIVE_PASSRESOURCEUSAGETRACKER_H_
