// 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_D3D12_HEAPD3D12_H_
#define DAWNNATIVE_D3D12_HEAPD3D12_H_

#include "common/LinkedList.h"
#include "common/Serial.h"
#include "dawn_native/D3D12Backend.h"
#include "dawn_native/ResourceHeap.h"
#include "dawn_native/d3d12/d3d12_platform.h"

namespace dawn_native { namespace d3d12 {

    class Device;

    // This class is used to represent heap allocations, but also serves as a node within the
    // ResidencyManager's LRU cache. This node is inserted into the LRU-cache when it is first
    // allocated, and any time it is scheduled to be used by the GPU. This node is removed from the
    // LRU cache when it is evicted from resident memory due to budget constraints, or when the heap
    // is destroyed.
    class Heap : public ResourceHeapBase, public LinkNode<Heap> {
      public:
        Heap(ComPtr<ID3D12Pageable> d3d12Pageable, MemorySegment memorySegment, uint64_t size);
        ~Heap();

        ComPtr<ID3D12Heap> GetD3D12Heap() const;
        ComPtr<ID3D12Pageable> GetD3D12Pageable() const;
        MemorySegment GetMemorySegment() const;

        // We set mLastRecordingSerial to denote the serial this heap was last recorded to be used.
        // We must check this serial against the current serial when recording heap usages to ensure
        // we do not process residency for this heap multiple times.
        Serial GetLastUsage() const;
        void SetLastUsage(Serial serial);

        // The residency manager must know the last serial that any portion of the heap was
        // submitted to be used so that we can ensure this heap stays resident in memory at least
        // until that serial has completed.
        uint64_t GetLastSubmission() const;
        void SetLastSubmission(Serial serial);

        uint64_t GetSize() const;

        bool IsInResidencyLRUCache() const;

        // In some scenarios, such as async buffer mapping, we must lock residency to ensure the
        // heap cannot be evicted. Because multiple buffers may be mapped in a single heap, we must
        // track the number of resources currently locked.
        void IncrementResidencyLock();
        void DecrementResidencyLock();
        bool IsResidencyLocked() const;

      private:
        ComPtr<ID3D12Pageable> mD3d12Pageable;
        MemorySegment mMemorySegment;
        // mLastUsage denotes the last time this heap was recorded for use.
        Serial mLastUsage = 0;
        // mLastSubmission denotes the last time this heap was submitted to the GPU. Note that
        // although this variable often contains the same value as mLastUsage, it can differ in some
        // situations. When some asynchronous APIs (like SetSubData) are called, mLastUsage is
        // updated upon the call, but the backend operation is deferred until the next submission
        // to the GPU. This makes mLastSubmission unique from mLastUsage, and allows us to
        // accurately identify when heaps are evictable.
        Serial mLastSubmission = 0;
        uint32_t mResidencyLockRefCount = 0;
        uint64_t mSize = 0;
    };
}}  // namespace dawn_native::d3d12

#endif  // DAWNNATIVE_D3D12_HEAPD3D12_H_