/**
 * Looking Glass
 * Copyright © 2017-2026 The Looking Glass Authors
 * https://looking-glass.io
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc., 59
 * Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#pragma once

#include <Windows.h>
#include <wdf.h>
#include <wrl.h>
#include <d3d12.h>
#include <stdint.h>

class CSwapChainProcessor;

using namespace Microsoft::WRL;

class CFrameBufferResource
{
  private:
    unsigned               m_frameIndex        = 0;
    uint8_t              * m_base              = nullptr;
    size_t                 m_size              = 0;
    size_t                 m_frameSize         = 0;
    uint64_t               m_captureTime       = 0;
    uint64_t               m_postProcessStart  = 0;
    uint64_t               m_copyStart         = 0;
    unsigned               m_timingEffectIndex = 0;
    uint64_t               m_timingToken       = 0;
    bool                   m_fullCopy          = false;
    unsigned               m_candidateIndex    = 0;
    ComPtr<ID3D12Resource> m_res;
    void                 * m_map               = nullptr;

  public:
    bool Init(CSwapChainProcessor * swapChain, unsigned frameIndex, uint8_t * base, size_t size);
    void Reset();

    unsigned  GetFrameIndex() { return m_frameIndex; }
    size_t    GetFrameSize()  { return m_frameSize;  }
    void *    GetMap()        { return m_map;        }

    void SetTiming(uint64_t captureTime, uint64_t postProcessStart,
      uint64_t copyStart)
    {
      m_captureTime      = captureTime;
      m_postProcessStart = postProcessStart;
      m_copyStart        = copyStart;
    }
    uint64_t GetCaptureTime     () const { return m_captureTime;      }
    uint64_t GetPostProcessStart() const { return m_postProcessStart; }
    uint64_t GetCopyStart       () const { return m_copyStart;        }

    void SetPostProcessSample(
      unsigned effectIndex, uint64_t token, bool fullCopy)
    {
      m_timingEffectIndex = effectIndex;
      m_timingToken       = token;
      m_fullCopy          = fullCopy;
    }
    unsigned GetTimingEffectIndex() const { return m_timingEffectIndex; }
    uint64_t GetTimingToken      () const { return m_timingToken;       }
    bool     IsFullCopy          () const { return m_fullCopy;          }
    void     SetCandidateIndex(unsigned index) { m_candidateIndex = index; }
    unsigned GetCandidateIndex() const         { return m_candidateIndex; }

    ComPtr<ID3D12Resource> Get() { return m_res; }
};
