// 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/ResourceHeap.h"
#include "dawn_native/d3d12/d3d12_platform.h"

namespace dawn_native { namespace d3d12 {

    // 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, D3D12_HEAP_TYPE heapType, uint64_t size);
        ~Heap();

        ComPtr<ID3D12Heap> GetD3D12Heap() const;
        ComPtr<ID3D12Pageable> GetD3D12Pageable() const;
        D3D12_HEAP_TYPE GetD3D12HeapType() 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;
        D3D12_HEAP_TYPE mD3d12HeapType;
        // 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_