mirror of
https://github.com/gnif/LookingGlass.git
synced 2025-04-25 16:16:28 +00:00
[idd] driver: make indirectCopy functional
This commit is contained in:
parent
6a4edfc6b6
commit
15eff234ec
@ -14,7 +14,9 @@ void CFrameBufferPool::Reset()
|
||||
m_buffers[i].Reset();
|
||||
}
|
||||
|
||||
CFrameBufferResource * CFrameBufferPool::Get(const CIndirectDeviceContext::PreparedFrameBuffer& buffer, size_t minSize)
|
||||
CFrameBufferResource * CFrameBufferPool::Get(
|
||||
const CIndirectDeviceContext::PreparedFrameBuffer& buffer,
|
||||
size_t minSize)
|
||||
{
|
||||
if (buffer.frameIndex > ARRAYSIZE(m_buffers) - 1)
|
||||
return nullptr;
|
||||
|
@ -16,5 +16,7 @@ class CFrameBufferPool
|
||||
void Init(CSwapChainProcessor * swapChain);
|
||||
void Reset();
|
||||
|
||||
CFrameBufferResource* CFrameBufferPool::Get(const CIndirectDeviceContext::PreparedFrameBuffer& buffer, size_t minSize);
|
||||
CFrameBufferResource* CFrameBufferPool::Get(
|
||||
const CIndirectDeviceContext::PreparedFrameBuffer& buffer,
|
||||
size_t minSize);
|
||||
};
|
@ -50,6 +50,17 @@ bool CFrameBufferResource::Init(CSwapChainProcessor * swapChain, uint8_t * base,
|
||||
IID_PPV_ARGS(&m_res)
|
||||
);
|
||||
resName = L"STAGING";
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
D3D12_RANGE range = {0, 0};
|
||||
hr = m_res->Map(0, &range, &m_map);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
DEBUG_ERROR_HR(hr, "Failed to map the resource");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -84,6 +95,12 @@ bool CFrameBufferResource::Init(CSwapChainProcessor * swapChain, uint8_t * base,
|
||||
|
||||
void CFrameBufferResource::Reset()
|
||||
{
|
||||
if (m_map)
|
||||
{
|
||||
m_res->Unmap(0, NULL);
|
||||
m_map = NULL;
|
||||
}
|
||||
|
||||
m_base = nullptr;
|
||||
m_size = 0;
|
||||
m_res.Reset();
|
||||
|
@ -17,6 +17,7 @@ class CFrameBufferResource
|
||||
uint8_t * m_base;
|
||||
size_t m_size;
|
||||
ComPtr<ID3D12Resource> m_res;
|
||||
void * m_map;
|
||||
|
||||
public:
|
||||
bool Init(CSwapChainProcessor * swapChain, uint8_t * base, size_t size);
|
||||
@ -25,6 +26,7 @@ class CFrameBufferResource
|
||||
bool IsValid() { return m_valid; }
|
||||
uint8_t * GetBase() { return m_base; }
|
||||
size_t GetSize() { return m_size; }
|
||||
void * GetMap() { return m_map; }
|
||||
|
||||
ComPtr<ID3D12Resource> Get() { return m_res; }
|
||||
};
|
||||
|
@ -490,11 +490,22 @@ CIndirectDeviceContext::PreparedFrameBuffer CIndirectDeviceContext::PrepareFrame
|
||||
return result;
|
||||
}
|
||||
|
||||
void CIndirectDeviceContext::WriteFrameBuffer(void* src, size_t offset, size_t len, bool setWritePos)
|
||||
{
|
||||
KVMFRFrame * fi = (KVMFRFrame*)lgmpHostMemPtr(m_frameMemory[m_frameIndex]);
|
||||
FrameBuffer * fb = (FrameBuffer*)(((uint8_t*)fi) + fi->offset);
|
||||
|
||||
memcpy(
|
||||
(void *)((uintptr_t)fb->data + offset),
|
||||
(void *)((uintptr_t)src + offset),
|
||||
len);
|
||||
|
||||
if (setWritePos)
|
||||
fb->wp = (uint32_t)(offset + len);
|
||||
}
|
||||
|
||||
void CIndirectDeviceContext::FinalizeFrameBuffer()
|
||||
{
|
||||
if (!m_lgmp || !m_frameQueue)
|
||||
return;
|
||||
|
||||
KVMFRFrame * fi = (KVMFRFrame*)lgmpHostMemPtr(m_frameMemory[m_frameIndex]);
|
||||
FrameBuffer * fb = (FrameBuffer *)(((uint8_t*)fi) + fi->offset);
|
||||
fb->wp = m_height * m_pitch;
|
||||
|
@ -95,6 +95,7 @@ public:
|
||||
};
|
||||
|
||||
PreparedFrameBuffer PrepareFrameBuffer(int width, int height, int pitch, DXGI_FORMAT format);
|
||||
void WriteFrameBuffer(void* src, size_t offset, size_t len, bool setWritePos);
|
||||
void FinalizeFrameBuffer();
|
||||
|
||||
void SendCursor(const IDARG_OUT_QUERY_HWCURSOR & info, const BYTE * data);
|
||||
|
@ -216,5 +216,8 @@ void CSwapChainProcessor::SwapChainNewFrame(ComPtr<IDXGIResource> acquiredBuffer
|
||||
m_dx12Device->GetCopyQueue().Wait();
|
||||
m_dx12Device->GetCopyQueue().Reset();
|
||||
|
||||
m_devContext->FinalizeFrameBuffer();
|
||||
if (m_dx12Device->IsIndirectCopy())
|
||||
m_devContext->WriteFrameBuffer(fbRes->GetMap(), 0, fbRes->GetSize(), true);
|
||||
else
|
||||
m_devContext->FinalizeFrameBuffer();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user