Files
LookingGlass/idd/LGIdd/capture/CFrameBufferResource.h
Geoffrey McRae 6725133375 [idd] transport: abstract LGMP implementation
Introduce transport, frame, and control interfaces with an LGMP factory
backend.

Move LGMP and IVSHMEM implementation details under transport/lgmp and
expose direct frame-buffer memory through a neutral capability.
2026-08-07 17:53:00 +10:00

136 lines
4.7 KiB
C++

/**
* 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 <atomic>
#include <stdint.h>
#include "transport/CFrameScheduler.h"
#include "d3d/CInteropResource.h"
struct CD3D12Device;
using namespace Microsoft::WRL;
class CFrameBufferResource
{
private:
enum ResourceType
{
RESOURCE_NONE,
RESOURCE_BUFFER,
RESOURCE_TEXTURE,
};
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;
CFrameScheduler::Schedule m_schedule = {};
unsigned m_timingEffectIndex = 0;
uint64_t m_timingToken = 0;
bool m_fullCopy = false;
RECT m_copyDirtyRects[LG_MAX_DIRTY_RECTS * 2] = {};
unsigned m_nbCopyDirtyRects = 0;
unsigned m_copyPitch = 0;
unsigned m_copyBytesPerPixel = 0;
unsigned m_candidateIndex = 0;
ResourceType m_type = RESOURCE_NONE;
D3D12_RESOURCE_DESC m_desc = {};
std::atomic<bool> m_completionHandled = false;
ComPtr<ID3D12Resource> m_res;
void * m_map = nullptr;
public:
bool Init(CD3D12Device * dx12, unsigned frameIndex, uint8_t * base,
uint64_t heapOffset, size_t size, size_t maxFrameSize,
const D3D12_RESOURCE_DESC * textureDesc = nullptr);
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 SetSchedule(const CFrameScheduler::Schedule& schedule)
{
m_schedule = schedule;
}
const CFrameScheduler::Schedule& GetSchedule() const
{
return m_schedule;
}
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 SetCopyDamage(const RECT dirtyRects[], unsigned nbDirtyRects,
bool fullCopy, unsigned pitch, unsigned bytesPerPixel);
const RECT * GetCopyDirtyRects() const { return m_copyDirtyRects; }
unsigned GetCopyDirtyRectCount() const { return m_nbCopyDirtyRects; }
unsigned GetCopyPitch () const { return m_copyPitch; }
unsigned GetCopyBytesPerPixel () const
{
return m_copyBytesPerPixel;
}
void ResetCompletion()
{
m_completionHandled.store(false, std::memory_order_release);
}
void MarkCompletion()
{
m_completionHandled.store(true, std::memory_order_release);
}
bool CompletionHandled() const
{
return m_completionHandled.load(std::memory_order_acquire);
}
void SetCandidateIndex(unsigned index) { m_candidateIndex = index; }
unsigned GetCandidateIndex() const { return m_candidateIndex; }
ComPtr<ID3D12Resource> Get() { return m_res; }
};